diff --git a/Octokit.Tests/Clients/OrganizationMembersClientTests.cs b/Octokit.Tests/Clients/OrganizationMembersClientTests.cs new file mode 100644 index 00000000..04f35e38 --- /dev/null +++ b/Octokit.Tests/Clients/OrganizationMembersClientTests.cs @@ -0,0 +1,294 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using NSubstitute; +using Octokit.Clients; +using Octokit.Internal; +using Octokit.Tests.Helpers; +using Xunit; +using Xunit.Extensions; + +namespace Octokit.Tests.Clients +{ + /// + /// Client tests mostly just need to make sure they call the IApiConnection with the correct + /// relative Uri. No need to fake up the response. All *those* tests are in ApiConnectionTests.cs. + /// + public class OrganizationMembersClientTests + { + public class TheConstructor + { + [Fact] + public void EnsureNonNullArguments() + { + Assert.Throws(() => new OrganizationMembersClient(null)); + } + } + + public class TheGetAllMethod + { + [Fact] + public void RequestsTheCorrectUrl() + { + var client = Substitute.For(); + var orgMembersClient = new OrganizationMembersClient(client); + + orgMembersClient.GetAll("org"); + + client.Received().GetAll(Arg.Is(u => u.ToString() == "orgs/org/members")); + } + + [Fact] + public void EnsureNonNullArguments() + { + var orgMembers = new OrganizationMembersClient(Substitute.For()); + + AssertEx.Throws(async () => await orgMembers.GetAll(null)); + AssertEx.Throws(async () => await orgMembers.GetAll("")); + } + } + + public class TheGetPublicMethod + { + [Fact] + public void RequestsTheCorrectUrl() + { + var client = Substitute.For(); + var orgMembers = new OrganizationMembersClient(client); + + orgMembers.GetPublic("org"); + + client.Received().GetAll(Arg.Is(u => u.ToString() == "orgs/org/public_members")); + } + + [Fact] + public void EnsureNonNullArguments() + { + var orgMembers = new OrganizationMembersClient(Substitute.For()); + + AssertEx.Throws(async () => await orgMembers.GetPublic(null)); + AssertEx.Throws(async () => await orgMembers.GetPublic("")); + } + } + + public class TheCheckMemberMethod + { + [Theory] + [InlineData(HttpStatusCode.NoContent, true)] + [InlineData(HttpStatusCode.NotFound, false)] + [InlineData(HttpStatusCode.Found, false)] + public async Task RequestsCorrectValueForStatusCode(HttpStatusCode status, bool expected) + { + var response = Task.Factory.StartNew>(() => + new ApiResponse { StatusCode = status }); + var connection = Substitute.For(); + connection.GetAsync(Arg.Is(u => u.ToString() == "orgs/org/members/username"), + null, null).Returns(response); + var apiConnection = Substitute.For(); + apiConnection.Connection.Returns(connection); + var client = new OrganizationMembersClient(apiConnection); + + var result = await client.CheckMember("org", "username"); + + Assert.Equal(expected, result); + } + + [Fact] + public async Task ThrowsExceptionForInvalidStatusCode() + { + var response = Task.Factory.StartNew>(() => + new ApiResponse { StatusCode = HttpStatusCode.Conflict }); + var connection = Substitute.For(); + connection.GetAsync(Arg.Is(u => u.ToString() == "orgs/org/members/username"), + null, null).Returns(response); + var apiConnection = Substitute.For(); + apiConnection.Connection.Returns(connection); + var client = new OrganizationMembersClient(apiConnection); + + AssertEx.Throws(async () => await client.CheckMember("org", "username")); + } + + + [Fact] + public async Task EnsureNonNullArguments() + { + var orgMembers = new OrganizationMembersClient(Substitute.For()); + + await AssertEx.Throws(async () => await orgMembers.CheckMember(null, "username")); + await AssertEx.Throws(async () => await orgMembers.CheckMember(null, "")); + await AssertEx.Throws(async () => await orgMembers.CheckMember("org", null)); + await AssertEx.Throws(async () => await orgMembers.CheckMember("", null)); + } + } + + public class TheCheckMemberPublicMethod + { + [Theory] + [InlineData(HttpStatusCode.NoContent, true)] + [InlineData(HttpStatusCode.NotFound, false)] + public async Task RequestsCorrectValueForStatusCode(HttpStatusCode status, bool expected) + { + var response = Task.Factory.StartNew>(() => + new ApiResponse { StatusCode = status }); + var connection = Substitute.For(); + connection.GetAsync(Arg.Is(u => u.ToString() == "orgs/org/public_members/username"), + null, null).Returns(response); + var apiConnection = Substitute.For(); + apiConnection.Connection.Returns(connection); + var client = new OrganizationMembersClient(apiConnection); + + var result = await client.CheckMemberPublic("org", "username"); + + Assert.Equal(expected, result); + } + + [Fact] + public async Task ThrowsExceptionForInvalidStatusCode() + { + var response = Task.Factory.StartNew>(() => + new ApiResponse { StatusCode = HttpStatusCode.Conflict }); + var connection = Substitute.For(); + connection.GetAsync(Arg.Is(u => u.ToString() == "orgs/org/public_members/username"), + null, null).Returns(response); + var apiConnection = Substitute.For(); + apiConnection.Connection.Returns(connection); + var client = new OrganizationMembersClient(apiConnection); + + AssertEx.Throws(async () => await client.CheckMemberPublic("org", "username")); + } + + [Fact] + public async Task EnsureNonNullArguments() + { + var orgMembers = new OrganizationMembersClient(Substitute.For()); + + await AssertEx.Throws(async () => await orgMembers.CheckMemberPublic(null, "username")); + await AssertEx.Throws(async () => await orgMembers.CheckMemberPublic("", "username")); + await AssertEx.Throws(async () => await orgMembers.CheckMemberPublic("org", null)); + await AssertEx.Throws(async () => await orgMembers.CheckMemberPublic("org", "")); + } + } + + public class TheDeleteMethod + { + [Fact] + public void PostsToCorrectUrl() + { + var connection = Substitute.For(); + var client = new OrganizationMembersClient(connection); + + client.Delete("org", "username"); + + connection.Received().Delete(Arg.Is(u => u.ToString() == "orgs/org/members/username")); + } + + [Fact] + public async Task EnsureNonNullArguments() + { + var orgMembers = new OrganizationMembersClient(Substitute.For()); + + await AssertEx.Throws(async () => await orgMembers.Delete(null, "username")); + await AssertEx.Throws(async () => await orgMembers.Delete("", "username")); + await AssertEx.Throws(async () => await orgMembers.Delete("org", null)); + await AssertEx.Throws(async () => await orgMembers.Delete("org", "")); + } + } + + public class ThePublicizeMethod + { + [Theory] + [InlineData(HttpStatusCode.NoContent, true)] + public async Task RequestsCorrectValueForStatusCode(HttpStatusCode status, bool expected) + { + var response = Task.Factory.StartNew>(() => + new ApiResponse { StatusCode = status }); + var connection = Substitute.For(); + connection.PutAsync(Arg.Is(u => u.ToString() == "orgs/org/public_members/username"), + Args.Object).Returns(response); + var apiConnection = Substitute.For(); + apiConnection.Connection.Returns(connection); + var client = new OrganizationMembersClient(apiConnection); + + var result = await client.Publicize("org", "username"); + + Assert.Equal(expected, result); + } + + [Fact] + public async Task ThrowsExceptionForInvalidStatusCode() + { + var response = Task.Factory.StartNew>(() => + new ApiResponse { StatusCode = HttpStatusCode.Conflict }); + var connection = Substitute.For(); + connection.PutAsync(Arg.Is(u => u.ToString() == "orgs/org/public_members/username"), + new { }).Returns(response); + var apiConnection = Substitute.For(); + apiConnection.Connection.Returns(connection); + var client = new OrganizationMembersClient(apiConnection); + + AssertEx.Throws(async () => await client.Publicize("org", "username")); + } + + [Fact] + public async Task EnsureNonNullArguments() + { + var orgMembers = new OrganizationMembersClient(Substitute.For()); + + await AssertEx.Throws(async () => await orgMembers.Publicize(null, "username")); + await AssertEx.Throws(async () => await orgMembers.Publicize("", "username")); + await AssertEx.Throws(async () => await orgMembers.Publicize("org", null)); + await AssertEx.Throws(async () => await orgMembers.Publicize("org", "")); + } + } + + public class TheConcealMethod + { + [Theory] + [InlineData(HttpStatusCode.NoContent, true)] + public async Task RequestsCorrectValueForStatusCode(HttpStatusCode status, bool expected) + { + var response = Task.Factory.StartNew>(() => + new ApiResponse { StatusCode = status }); + var connection = Substitute.For(); + connection.PutAsync(Arg.Is(u => u.ToString() == "orgs/org/public_members/username"), + Args.Object).Returns(response); + var apiConnection = Substitute.For(); + apiConnection.Connection.Returns(connection); + var client = new OrganizationMembersClient(apiConnection); + + var result = await client.Conceal("org", "username"); + + Assert.Equal(expected, result); + } + + [Fact] + public async Task ThrowsExceptionForInvalidStatusCode() + { + var response = Task.Factory.StartNew>(() => + new ApiResponse { StatusCode = HttpStatusCode.Conflict }); + var connection = Substitute.For(); + connection.PutAsync(Arg.Is(u => u.ToString() == "orgs/org/public_members/username"), + new { }).Returns(response); + var apiConnection = Substitute.For(); + apiConnection.Connection.Returns(connection); + var client = new OrganizationMembersClient(apiConnection); + + AssertEx.Throws(async () => await client.Conceal("org", "username")); + } + + [Fact] + public async Task EnsureNonNullArguments() + { + var orgMembers = new OrganizationMembersClient(Substitute.For()); + + await AssertEx.Throws(async () => await orgMembers.Conceal(null, "username")); + await AssertEx.Throws(async () => await orgMembers.Conceal("", "username")); + await AssertEx.Throws(async () => await orgMembers.Conceal("org", null)); + await AssertEx.Throws(async () => await orgMembers.Conceal("org", "")); + } + } + } +} diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index 4cb79a7e..4d660968 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -65,6 +65,7 @@ +