using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using NSubstitute; using Octokit.Tests.Helpers; using Xunit; namespace Octokit.Tests.Clients { public class UserAdministrationClientTests { public class TheCreateMethod { [Fact] public async Task EnsuresNonNullArguments() { var client = new UserAdministrationClient(Substitute.For()); await Assert.ThrowsAsync(() => client.Create(null)); } [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "admin/users"; client.Create(new NewUser("name", "email@company.com")); connection.Received().Post( Arg.Is(u => u.ToString() == expectedUri), Arg.Any()); } [Fact] public void PassesRequestObject() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); client.Create(new NewUser("name", "email@company.com")); connection.Received().Post( Arg.Any(), Arg.Is(a => a.Login == "name" && a.Email == "email@company.com")); } } public class TheRenameMethod { [Fact] public async Task EnsuresNonNullArguments() { var client = new UserAdministrationClient(Substitute.For()); await Assert.ThrowsAsync(() => client.Rename(null, new UserRename("newlogin"))); await Assert.ThrowsAsync(() => client.Rename("login", null)); } [Fact] public async Task EnsuresNonEmptyString() { var client = new UserAdministrationClient(Substitute.For()); var exception = await Assert.ThrowsAsync(() => client.Rename("", new UserRename())); Assert.Equal("login", exception.ParamName); } [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "admin/users/auser"; client.Rename("auser", new UserRename()); connection.Received().Patch( Arg.Is(u => u.ToString() == expectedUri), Arg.Any()); } [Fact] public void PassesRequestObject() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); client.Rename("auser", new UserRename("newlogin")); connection.Received().Patch( Arg.Any(), Arg.Is(a => a.Login == "newlogin")); } } public class TheCreateImpersonationTokenMethod { [Fact] public async Task EnsuresNonNullArguments() { var client = new UserAdministrationClient(Substitute.For()); await Assert.ThrowsAsync(() => client.CreateImpersonationToken(null, new NewImpersonationToken())); await Assert.ThrowsAsync(() => client.CreateImpersonationToken("login", null)); } [Fact] public async Task EnsuresNonEmptyString() { var client = new UserAdministrationClient(Substitute.For()); var exception = await Assert.ThrowsAsync(() => client.CreateImpersonationToken("", new NewImpersonationToken())); Assert.Equal("login", exception.ParamName); } [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "admin/users/auser/authorizations"; client.CreateImpersonationToken("auser", new NewImpersonationToken()); connection.Received().Post( Arg.Is(u => u.ToString() == expectedUri), Arg.Any()); } [Fact] public void PassesRequestObject() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); string[] scopes = new string[] { "public-repo" }; client.CreateImpersonationToken("auser", new NewImpersonationToken(scopes)); connection.Received().Post( Arg.Any(), Arg.Is(a => a.Scopes.Count() == scopes.Count() && a.Scopes.ToList().All(s => scopes.Contains(s)) && scopes.ToList().All(s => a.Scopes.Contains(s)))); } } public class TheDeleteImpersonationTokenMethod { [Fact] public async Task EnsuresNonNullArguments() { var client = new UserAdministrationClient(Substitute.For()); await Assert.ThrowsAsync(() => client.DeleteImpersonationToken(null)); } [Fact] public async Task EnsuresNonEmptyString() { var client = new UserAdministrationClient(Substitute.For()); var exception = await Assert.ThrowsAsync(() => client.DeleteImpersonationToken("")); Assert.Equal("login", exception.ParamName); } [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "admin/users/auser/authorizations"; client.DeleteImpersonationToken("auser"); connection.Connection.Received().Delete( Arg.Is(u => u.ToString() == expectedUri)); } } public class ThePromoteMethod { [Fact] public async Task EnsuresNonNullArguments() { var client = new UserAdministrationClient(Substitute.For()); await Assert.ThrowsAsync(() => client.Promote(null)); } [Fact] public async Task EnsuresNonEmptyString() { var client = new UserAdministrationClient(Substitute.For()); var exception = await Assert.ThrowsAsync(() => client.Promote("")); Assert.Equal("login", exception.ParamName); } [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "users/auser/site_admin"; client.Promote("auser"); connection.Received().Put( Arg.Is(u => u.ToString() == expectedUri)); } } public class TheDemoteMethod { [Fact] public async Task EnsuresNonNullArguments() { var client = new UserAdministrationClient(Substitute.For()); await Assert.ThrowsAsync(() => client.Demote(null)); } [Fact] public async Task EnsuresNonEmptyString() { var client = new UserAdministrationClient(Substitute.For()); var exception = await Assert.ThrowsAsync(() => client.Demote("")); Assert.Equal("login", exception.ParamName); } [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "users/auser/site_admin"; client.Demote("auser"); connection.Received().Delete( Arg.Is(u => u.ToString() == expectedUri)); } } public class TheSuspendMethod { [Fact] public async Task EnsuresNonNullArguments() { var client = new UserAdministrationClient(Substitute.For()); await Assert.ThrowsAsync(() => client.Suspend(null)); } [Fact] public async Task EnsuresNonEmptyString() { var client = new UserAdministrationClient(Substitute.For()); var exception = await Assert.ThrowsAsync(() => client.Suspend("")); Assert.Equal("login", exception.ParamName); } [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "users/auser/suspended"; client.Suspend("auser"); connection.Received().Put( Arg.Is(u => u.ToString() == expectedUri)); } } public class TheUnsuspendMethod { [Fact] public async Task EnsuresNonNullArguments() { var client = new UserAdministrationClient(Substitute.For()); await Assert.ThrowsAsync(() => client.Unsuspend(null)); } [Fact] public async Task EnsuresNonEmptyString() { var client = new UserAdministrationClient(Substitute.For()); var exception = await Assert.ThrowsAsync(() => client.Unsuspend("")); Assert.Equal("login", exception.ParamName); } [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "users/auser/suspended"; client.Unsuspend("auser"); connection.Received().Delete( Arg.Is(u => u.ToString() == expectedUri)); } } public class TheListAllPublicKeysMethod { [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "admin/keys"; client.ListAllPublicKeys(); connection.Received().GetAll( Arg.Is(u => u.ToString() == expectedUri)); } } public class TheDeleteMethod { [Fact] public async Task EnsuresNonNullArguments() { var client = new UserAdministrationClient(Substitute.For()); await Assert.ThrowsAsync(() => client.Delete(null)); } [Fact] public async Task EnsuresNonEmptyString() { var client = new UserAdministrationClient(Substitute.For()); var exception = await Assert.ThrowsAsync(() => client.Delete("")); Assert.Equal("login", exception.ParamName); } [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "admin/users/auser"; client.Delete("auser"); connection.Connection.Received().Delete( Arg.Is(u => u.ToString() == expectedUri)); } } public class TheDeletePublicKeyMethod { [Fact] public void RequestsTheCorrectUrl() { var connection = Substitute.For(); var client = new UserAdministrationClient(connection); var expectedUri = "admin/keys/1"; client.DeletePublicKey(1); connection.Connection.Received().Delete( Arg.Is(u => u.ToString() == expectedUri)); } } } }