using System; using System.Collections.Generic; using System.Net; using System.Threading.Tasks; using NSubstitute; using Octokit.Internal; using Octokit.Tests.Helpers; using Xunit; 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 async Task EnsureNonNullArguments() { var orgMembers = new OrganizationMembersClient(Substitute.For()); await Assert.ThrowsAsync(() => orgMembers.GetAll(null)); await Assert.ThrowsAsync(() => orgMembers.GetAll("")); } [Fact] public void AllFilterRequestTheCorrectUrl() { var client = Substitute.For(); var orgMembersClient = new OrganizationMembersClient(client); orgMembersClient.GetAll("org", OrganizationMembersFilter.All); client.Received().GetAll(Arg.Is(u => u.ToString() == "orgs/org/members?filter=all")); } [Fact] public void TwoFactorFilterRequestTheCorrectUrl() { var client = Substitute.For(); var orgMembersClient = new OrganizationMembersClient(client); orgMembersClient.GetAll("org", OrganizationMembersFilter.TwoFactorAuthenticationDisabled); client.Received().GetAll(Arg.Is(u => u.ToString() == "orgs/org/members?filter=2fa_disabled")); } } public class TheGetPublicMethod { [Fact] public void RequestsTheCorrectUrl() { var client = Substitute.For(); var orgMembers = new OrganizationMembersClient(client); orgMembers.GetAllPublic("org"); client.Received().GetAll(Arg.Is(u => u.ToString() == "orgs/org/public_members")); } [Fact] public async Task EnsureNonNullArguments() { var orgMembers = new OrganizationMembersClient(Substitute.For()); await Assert.ThrowsAsync(() => orgMembers.GetAllPublic(null)); await Assert.ThrowsAsync(() => orgMembers.GetAllPublic("")); } } 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(new Response(status, null, new Dictionary(), "application/json"))); var connection = Substitute.For(); connection.Get(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(new Response(HttpStatusCode.Conflict, null, new Dictionary(), "application/json"))); var connection = Substitute.For(); connection.Get(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); await Assert.ThrowsAsync(() => client.CheckMember("org", "username")); } [Fact] public async Task EnsureNonNullArguments() { var orgMembers = new OrganizationMembersClient(Substitute.For()); await Assert.ThrowsAsync(() => orgMembers.CheckMember(null, "username")); await Assert.ThrowsAsync(() => orgMembers.CheckMember(null, "")); await Assert.ThrowsAsync(() => orgMembers.CheckMember("org", null)); await Assert.ThrowsAsync(() => 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(new Response(status, null, new Dictionary(), "application/json"))); var connection = Substitute.For(); connection.Get(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(new Response(HttpStatusCode.Conflict, null, new Dictionary(), "application/json"))); var connection = Substitute.For(); connection.Get(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); await Assert.ThrowsAsync(() => client.CheckMemberPublic("org", "username")); } [Fact] public async Task EnsureNonNullArguments() { var orgMembers = new OrganizationMembersClient(Substitute.For()); await Assert.ThrowsAsync(() => orgMembers.CheckMemberPublic(null, "username")); await Assert.ThrowsAsync(() => orgMembers.CheckMemberPublic("", "username")); await Assert.ThrowsAsync(() => orgMembers.CheckMemberPublic("org", null)); await Assert.ThrowsAsync(() => 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 Assert.ThrowsAsync(() => orgMembers.Delete(null, "username")); await Assert.ThrowsAsync(() => orgMembers.Delete("", "username")); await Assert.ThrowsAsync(() => orgMembers.Delete("org", null)); await Assert.ThrowsAsync(() => 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(new Response(status, null, new Dictionary(), "application/json"))); var connection = Substitute.For(); connection.Put(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(new Response(HttpStatusCode.Conflict, null, new Dictionary(), "application/json"))); var connection = Substitute.For(); connection.Put(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); await Assert.ThrowsAsync(() => client.Publicize("org", "username")); } [Fact] public async Task EnsureNonNullArguments() { var orgMembers = new OrganizationMembersClient(Substitute.For()); await Assert.ThrowsAsync(() => orgMembers.Publicize(null, "username")); await Assert.ThrowsAsync(() => orgMembers.Publicize("", "username")); await Assert.ThrowsAsync(() => orgMembers.Publicize("org", null)); await Assert.ThrowsAsync(() => orgMembers.Publicize("org", "")); } } public class TheConcealMethod { [Fact] public void PostsToCorrectUrl() { var connection = Substitute.For(); var client = new OrganizationMembersClient(connection); client.Conceal("org", "username"); connection.Received().Delete(Arg.Is(u => u.ToString() == "orgs/org/public_members/username")); } [Fact] public async Task EnsureNonNullArguments() { var orgMembers = new OrganizationMembersClient(Substitute.For()); await Assert.ThrowsAsync(() => orgMembers.Conceal(null, "username")); await Assert.ThrowsAsync(() => orgMembers.Conceal("", "username")); await Assert.ThrowsAsync(() => orgMembers.Conceal("org", null)); await Assert.ThrowsAsync(() => orgMembers.Conceal("org", "")); } } } }