Files
octokit.net/Octokit.Tests/Reactive/ObservableOrganizationSecretsClientTests.cs
Keegan Campbell 131ba87e3f Replay #2221: Implement GitHub Actions Secrets API for both Organization and Repository (#2598)
* created the interface and models for the repository secrets client

* created a repository actions client to sit between repository and secrets for future extensibility

* created the repository secret client and supporting objects to enable data transfer

* created object for create or update secret body and made fixes to pass unit tests

* created repository action unit tests

* created unit tests for RepositorySecretsClient

* removed set from secrets interface

* fixed docs and added observable actions client

* added Actions to repository client

* created IObservable repository secrets client

* fixed property in wrong interface
fixed wrong Ctor unit test

* created repository decrets reactive tests and clients

* created organization actions and scerets classes and made them available through the oprganizations client

* fixed intellisense text

* removed uneeded getall call after return type change

* created organization secret client and classes to support it

* created the observable org secrets client and fixed a typo in a method name

* added more ensure checks

* removed unused xml doc setting

* created the unit tests for the organization secrets client
fixed broken unit test for repository secrets client

* created observable organization actions and secrets client unit tests

* added sodium.core to the integration tests to test secret creation

* fixed keyid type

* added actions client integration test classes (empty since the class currently doesn't have any native methods)

* fixed deserialization issue

* changed property name for deserialization issues

* added doc for repoid on orginzation secrets url generator

* created integration tests for repository and organization secrets

* changed how return occurs for setting list of repos for secret

* fixed some names and removed reset org name

* created integration tests for observable org secrets client

* removed  default org value

* created the integration tests for the observable repository secrets client

* removed default owner project value

* fixed unit tests

* Update links to new docs site

* Update doc links to new docs site

* Update docs links to new docs site

* Fix doc link to point to new docs site

* Update links to new docs site

* Update doc links to new docs site

* Update docs links

* Update docs

* Update docs

* Update doc links

* Update docs

* Update doc links

* Update doc links

* Update doc links

* updated documentation links in actions and secrets clients

* Update Octokit/Models/Response/SecretsPublicKey.cs

Removing line for consistency.

Co-authored-by: Thomas Hughes <iamhughes@github.com>

* Update Octokit/Models/Response/RepositorySecret.cs

Removing line for consistency.

Co-authored-by: Thomas Hughes <iamhughes@github.com>

* set default owner and repo

* switched to using the Helper.Organization from a ORG constant set at the top of the file

* swapped out variable at top of file for the Helper.Organization property

* switched to helper method to create new repositories

* Protected setters --> private setters in response models

* RepositorySecret needs protected setters

Co-authored-by: Mike Tolly <mike.tolly@takeda.com>
Co-authored-by: Thomas Hughes <iamhughes@github.com>
Co-authored-by: mptolly-takeda <61791994+mptolly-takeda@users.noreply.github.com>
2022-10-20 14:59:31 -07:00

283 lines
12 KiB
C#

using NSubstitute;
using Octokit.Reactive;
using System;
using System.Collections.Generic;
using System.Reactive.Linq;
using System.Reactive.Threading.Tasks;
using System.Threading.Tasks;
using Xunit;
namespace Octokit.Tests.Reactive
{
public class ObservableOrganizationSecretsClientTests
{
public class TheCtor
{
[Fact]
public void EnsuresNonNullArguments()
{
Assert.Throws<ArgumentNullException>(() => new ObservableOrganizationSecretsClient(null));
}
}
public class GetPublicKeyMethod
{
[Fact]
public async Task RequestsTheCorrectUrl()
{
var gitHubClient = Substitute.For<IGitHubClient>();
var client = new ObservableOrganizationSecretsClient(gitHubClient);
await client.GetPublicKey("org");
gitHubClient.Received().Organization.Actions.Secrets.GetPublicKey("org");
}
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new ObservableOrganizationSecretsClient(Substitute.For<IGitHubClient>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetPublicKey(null).ToTask());
await Assert.ThrowsAsync<ArgumentException>(() => client.GetPublicKey("").ToTask());
}
}
public class GetAllMethod
{
[Fact]
public async Task RequestsTheCorrectUrl()
{
var gitHubClient = Substitute.For<IGitHubClient>();
var client = new ObservableOrganizationSecretsClient(gitHubClient);
await client.GetAll("org");
gitHubClient.Received().Organization.Actions.Secrets.GetAll("org");
}
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new ObservableOrganizationSecretsClient(Substitute.For<IGitHubClient>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetAll(null).ToTask());
await Assert.ThrowsAsync<ArgumentException>(() => client.GetAll("").ToTask());
}
}
public class GetMethod
{
[Fact]
public async Task RequestsTheCorrectUrl()
{
var gitHubClient = Substitute.For<IGitHubClient>();
var client = new ObservableOrganizationSecretsClient(gitHubClient);
await client.Get("org", "secret");
gitHubClient.Received().Organization.Actions.Secrets.Get("org", "secret");
}
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new ObservableOrganizationSecretsClient(Substitute.For<IGitHubClient>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.Get(null, "secret").ToTask());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.Get("org", null).ToTask());
await Assert.ThrowsAsync<ArgumentException>(() => client.Get("", "secret").ToTask());
await Assert.ThrowsAsync<ArgumentException>(() => client.Get("org", "").ToTask());
}
}
public class CreateOrUpdateMethod
{
[Fact]
public async Task PostsTheCorrectUrl()
{
var gitHubClient = Substitute.For<IGitHubClient>();
var client = new ObservableOrganizationSecretsClient(gitHubClient);
var upsertSecret = new UpsertOrganizationSecret
{
EncryptedValue = "encryptedValue",
KeyId = "keyId",
Visibility = "private"
};
await client.CreateOrUpdate("org", "secret", upsertSecret);
gitHubClient.Received().Organization.Actions.Secrets.CreateOrUpdate("org", "secret", upsertSecret);
}
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new ObservableOrganizationSecretsClient(Substitute.For<IGitHubClient>());
var upsertSecret = new UpsertOrganizationSecret
{
EncryptedValue = "encryptedValue",
KeyId = "keyId"
};
await Assert.ThrowsAsync<ArgumentNullException>(() => client.CreateOrUpdate(null, "secret", upsertSecret).ToTask());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.CreateOrUpdate("owner", null, upsertSecret).ToTask());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.CreateOrUpdate("owner", "secret", null).ToTask());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.CreateOrUpdate("owner", "secret", new UpsertOrganizationSecret()).ToTask());
await Assert.ThrowsAsync<ArgumentException>(() => client.CreateOrUpdate("", "secret", upsertSecret).ToTask());
await Assert.ThrowsAsync<ArgumentException>(() => client.CreateOrUpdate("owner", "", upsertSecret).ToTask());
}
}
public class DeleteMethod
{
[Fact]
public async Task DeletesTheCorrectUrl()
{
var gitHubClient = Substitute.For<IGitHubClient>();
var client = new ObservableOrganizationSecretsClient(gitHubClient);
await client.Delete("org", "secret");
gitHubClient.Received().Organization.Actions.Secrets.Delete("org", "secret");
}
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new ObservableOrganizationSecretsClient(Substitute.For<IGitHubClient>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.Delete(null, "secret").ToTask());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.Delete("owner", null).ToTask());
await Assert.ThrowsAsync<ArgumentException>(() => client.Delete("", "secret").ToTask());
await Assert.ThrowsAsync<ArgumentException>(() => client.Delete("owner", "").ToTask());
}
}
public class GetSelectedRepositoriesForSecretMethod
{
[Fact]
public async Task RequestsTheCorrectUrl()
{
var gitHubClient = Substitute.For<IGitHubClient>();
var client = new ObservableOrganizationSecretsClient(gitHubClient);
await client.GetSelectedRepositoriesForSecret("org", "secret");
gitHubClient.Received().Organization.Actions.Secrets.GetSelectedRepositoriesForSecret("org", "secret");
}
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new ObservableOrganizationSecretsClient(Substitute.For<IGitHubClient>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetSelectedRepositoriesForSecret(null, "secret").ToTask());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetSelectedRepositoriesForSecret("org", null).ToTask());
await Assert.ThrowsAsync<ArgumentException>(() => client.GetSelectedRepositoriesForSecret("", "secret").ToTask());
await Assert.ThrowsAsync<ArgumentException>(() => client.GetSelectedRepositoriesForSecret("org", "").ToTask());
}
}
public class SetSelectedRepositoriesForSecretMethod
{
[Fact]
public async Task RequestsTheCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new OrganizationSecretsClient(connection);
var repoIds = new List<long>
{
1,
2,
3
};
var repos = new SelectedRepositoryCollection(repoIds);
await client.SetSelectedRepositoriesForSecret("org", "secret", repos);
connection.Received()
.Put<SelectedRepositoryCollection>(Arg.Is<Uri>(u => u.ToString() == "orgs/org/actions/secrets/secret/repositories"), repos);
}
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new OrganizationSecretsClient(Substitute.For<IApiConnection>());
var repoIds = new List<long>
{
1,
2,
3
};
var repos = new SelectedRepositoryCollection(repoIds);
await Assert.ThrowsAsync<ArgumentNullException>(() => client.SetSelectedRepositoriesForSecret(null, "secret", repos));
await Assert.ThrowsAsync<ArgumentNullException>(() => client.SetSelectedRepositoriesForSecret("org", null, repos));
await Assert.ThrowsAsync<ArgumentNullException>(() => client.SetSelectedRepositoriesForSecret("org", "secret", null));
await Assert.ThrowsAsync<ArgumentNullException>(() => client.SetSelectedRepositoriesForSecret("org", "secret", new SelectedRepositoryCollection()));
await Assert.ThrowsAsync<ArgumentException>(() => client.SetSelectedRepositoriesForSecret("", "secret", repos));
await Assert.ThrowsAsync<ArgumentException>(() => client.SetSelectedRepositoriesForSecret("org", "", repos));
}
}
public class AddRepoToOrganizationSecretMethod
{
[Fact]
public async Task RequestsTheCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new OrganizationSecretsClient(connection);
await client.AddRepoToOrganizationSecret("org", "secret", 1);
connection.Received()
.Put(Arg.Is<Uri>(u => u.ToString() == "orgs/org/actions/secrets/secret/repositories/1"));
}
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new OrganizationSecretsClient(Substitute.For<IApiConnection>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.AddRepoToOrganizationSecret(null, "secret", 1));
await Assert.ThrowsAsync<ArgumentNullException>(() => client.AddRepoToOrganizationSecret("org", null, 1));
await Assert.ThrowsAsync<ArgumentException>(() => client.AddRepoToOrganizationSecret("", "secret", 1));
await Assert.ThrowsAsync<ArgumentException>(() => client.AddRepoToOrganizationSecret("org", "", 1));
}
}
public class RemoveRepoFromOrganizationSecretMethod
{
[Fact]
public async Task RequestsTheCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new OrganizationSecretsClient(connection);
await client.RemoveRepoFromOrganizationSecret("org", "secret", 1);
connection.Received()
.Delete(Arg.Is<Uri>(u => u.ToString() == "orgs/org/actions/secrets/secret/repositories/1"));
}
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new OrganizationSecretsClient(Substitute.For<IApiConnection>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.RemoveRepoFromOrganizationSecret(null, "secret", 1));
await Assert.ThrowsAsync<ArgumentNullException>(() => client.RemoveRepoFromOrganizationSecret("org", null, 1));
await Assert.ThrowsAsync<ArgumentException>(() => client.RemoveRepoFromOrganizationSecret("", "secret", 1));
await Assert.ThrowsAsync<ArgumentException>(() => client.RemoveRepoFromOrganizationSecret("org", "", 1));
}
}
}
}