using System; using System.Text; using System.Threading.Tasks; using NSubstitute; 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 RepositoriesClientTests { public class TheConstructor { [Fact] public void EnsuresNonNullArguments() { Assert.Throws(() => new RepositoriesClient(null)); } } public class TheCreateMethodForUser { [Fact] public async Task EnsuresNonNullArguments() { var client = new RepositoriesClient(Substitute.For()); await AssertEx.Throws(async () => await client.Create(null)); await AssertEx.Throws(async () => await client.Create(new NewRepository { Name = null })); } [Fact] public void UsesTheUserReposUrl() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); client.Create(new NewRepository { Name = "aName" }); connection.Received().Post(Arg.Is(u => u.ToString() == "user/repos"), Arg.Any()); } [Fact] public void TheNewRepositoryDescription() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); var newRepository = new NewRepository { Name = "aName" }; client.Create(newRepository); connection.Received().Post(Arg.Any(), newRepository); } } public class TheCreateMethodForOrganization { [Fact] public async Task EnsuresNonNullArguments() { var client = new RepositoriesClient(Substitute.For()); await AssertEx.Throws(async () => await client.Create(null, new NewRepository { Name = "aName" })); await AssertEx.Throws(async () => await client.Create("aLogin", null)); await AssertEx.Throws(async () => await client.Create("aLogin", new NewRepository { Name = null })); } [Fact] public async Task UsesTheOrganizatinosReposUrl() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); await client.Create("theLogin", new NewRepository { Name = "aName" }); connection.Received().Post( Arg.Is(u => u.ToString() == "orgs/theLogin/repos"), Args.NewRepository); } [Fact] public async Task TheNewRepositoryDescription() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); var newRepository = new NewRepository { Name = "aName" }; await client.Create("aLogin", newRepository); connection.Received().Post(Arg.Any(), newRepository); } } public class TheDeleteMethod { [Fact] public async Task EnsuresNonNullArguments() { var client = new RepositoriesClient(Substitute.For()); await AssertEx.Throws(async () => await client.Delete(null, "aRepoName")); await AssertEx.Throws(async () => await client.Delete("anOwner", null)); } [Fact] public async Task RequestsCorrectUrl() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); await client.Delete("theOwner", "theRepoName"); connection.Received().Delete(Arg.Is(u => u.ToString() == "repos/theOwner/theRepoName")); } } public class TheGetMethod { [Fact] public void RequestsCorrectUrl() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); client.Get("fake", "repo"); connection.Received().Get(Arg.Is(u => u.ToString() == "repos/fake/repo"), null); } [Fact] public async Task EnsuresNonNullArguments() { var client = new RepositoriesClient(Substitute.For()); await AssertEx.Throws(async () => await client.Get(null, "name")); await AssertEx.Throws(async () => await client.Get("owner", null)); } } public class TheGetAllForCurrentMethod { [Fact] public void RequestsTheCorrectUrlAndReturnsOrganizations() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); client.GetAllForCurrent(); connection.Received() .GetAll(Arg.Is(u => u.ToString() == "user/repos")); } } public class TheGetAllForUserMethod { [Fact] public void RequestsTheCorrectUrlAndReturnsOrganizations() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); client.GetAllForUser("username"); connection.Received() .GetAll(Arg.Is(u => u.ToString() == "users/username/repos")); } [Fact] public async Task EnsuresNonNullArguments() { var reposEndpoint = new RepositoriesClient(Substitute.For()); AssertEx.Throws(async () => await reposEndpoint.GetAllForUser(null)); } } public class TheGetAllForOrgMethod { [Fact] public void RequestsTheCorrectUrlAndReturnsOrganizations() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); client.GetAllForOrg("orgname"); connection.Received() .GetAll(Arg.Is(u => u.ToString() == "orgs/orgname/repos")); } [Fact] public void EnsuresNonNullArguments() { var reposEndpoint = new RepositoriesClient(Substitute.For()); AssertEx.Throws(async () => await reposEndpoint.GetAllForOrg(null)); } } public class TheGetReadmeMethod { [Fact] public async Task ReturnsReadme() { string encodedContent = Convert.ToBase64String(Encoding.UTF8.GetBytes("Hello world")); var readmeInfo = new ReadmeResponse { Content = encodedContent, Encoding = "base64", Name = "README.md", Url = "https://github.example.com/readme.md", HtmlUrl = "https://github.example.com/readme" }; var connection = Substitute.For(); connection.Get(Args.Uri, null).Returns(Task.FromResult(readmeInfo)); connection.GetHtml(Args.Uri, null).Returns(Task.FromResult("README")); var reposEndpoint = new RepositoriesClient(connection); var readme = await reposEndpoint.GetReadme("fake", "repo"); Assert.Equal("README.md", readme.Name); connection.Received().Get(Arg.Is(u => u.ToString() == "repos/fake/repo/readme"), null); connection.DidNotReceive().GetHtml(Arg.Is(u => u.ToString() == "https://github.example.com/readme"), null); var htmlReadme = await readme.GetHtmlContent(); Assert.Equal("README", htmlReadme); connection.Received().GetHtml(Arg.Is(u => u.ToString() == "https://github.example.com/readme"), null); } } public class TheGetReadmeHtmlMethod { [Fact] public async Task ReturnsReadmeHtml() { var connection = Substitute.For(); connection.GetHtml(Args.Uri, null).Returns(Task.FromResult("README")); var reposEndpoint = new RepositoriesClient(connection); var readme = await reposEndpoint.GetReadmeHtml("fake", "repo"); connection.Received().GetHtml(Arg.Is(u => u.ToString() == "repos/fake/repo/readme"), null); Assert.Equal("README", readme); } } public class TheGetMethodForRepositoryHooks { [Fact] public void RequestsCorrectUrl() { var connection = Substitute.For(); var client = new RepositoriesClient(connection); client.Hooks.GetHooks("fake", "repo"); connection.Received().GetAll(Arg.Is(u => u.ToString() == "repos/fake/repo/hooks")); } [Fact] public async Task EnsuresNonNullArguments() { var client = new RepositoriesClient(Substitute.For()); await AssertEx.Throws(async () => await client.Get(null, "name")); await AssertEx.Throws(async () => await client.Get("owner", null)); } } } }