diff --git a/Octokit.Tests/Clients/ReferencesClientTests.cs b/Octokit.Tests/Clients/ReferencesClientTests.cs index c66c9ce9..20f705ff 100644 --- a/Octokit.Tests/Clients/ReferencesClientTests.cs +++ b/Octokit.Tests/Clients/ReferencesClientTests.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using NSubstitute; @@ -10,19 +11,19 @@ namespace Octokit.Tests.Clients { public class ReferencesClientTests { + public class TheCtor + { + [Fact] + public void EnsuresArgument() + { + Assert.Throws(() => new ReferencesClient(null)); + } + } + public class TheGetMethod { - public class TheCtor - { - [Fact] - public void EnsuresArgument() - { - Assert.Throws(() => new ReferencesClient(null)); - } - } - [Fact] - public async void EnsuresNonNullArguments() + public async Task EnsuresNonNullArguments() { var client = new ReferencesClient(Substitute.For()); @@ -35,15 +36,67 @@ namespace Octokit.Tests.Clients } [Fact] - public void RequestsCorrectUrl() + public async Task RequestsCorrectUrl() { var connection = Substitute.For(); var client = new ReferencesClient(connection); - client.Get("owner", "repo", "heads/develop"); + await client.Get("owner", "repo", "heads/develop"); connection.Received().Get(Arg.Is(u => u.ToString() == "repos/owner/repo/git/refs/heads/develop"), null); } } + + public class TheGetAllMethod + { + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new ReferencesClient(Substitute.For()); + + await AssertEx.Throws(async () => await client.GetAll(null, "name", "heads")); + await AssertEx.Throws(async () => await client.GetAll("owner", null, "heads")); + await AssertEx.Throws(async () => await client.GetAll("", "name", "heads")); + await AssertEx.Throws(async () => await client.GetAll("owner", "", "heads")); + } + + [Fact] + public async Task RequestsCorrectUrl() + { + var connection = Substitute.For(); + var client = new ReferencesClient(connection); + + await client.GetAll("owner", "repo", "heads"); + + connection.Received().GetAll(Arg.Is(u => u.ToString() == "repos/owner/repo/git/refs/heads")); + } + } + + public class TheCreateMethod + { + [Fact] + public async Task EnsuresNonNullArguments() + { + var client = new ReferencesClient(Substitute.For()); + + await AssertEx.Throws(async () => await client.Create(null, "name", new NewReference())); + await AssertEx.Throws(async () => await client.Create("owner", null, new NewReference())); + await AssertEx.Throws(async () => await client.Create("owner", "name", null)); + await AssertEx.Throws(async () => await client.Create("", "name", new NewReference())); + await AssertEx.Throws(async () => await client.Create("owner", "", new NewReference())); + } + + [Fact] + public async Task PostsToCorrectUrl() + { + var newReference = new NewReference(); + var connection = Substitute.For(); + var client = new ReferencesClient(connection); + + await client.Create("owner", "repo", newReference); + + connection.Received().Post(Arg.Is(u => u.ToString() == "repos/owner/repo/git/refs"), newReference); + } + } } } \ No newline at end of file diff --git a/Octokit/Clients/IReferencesClient.cs b/Octokit/Clients/IReferencesClient.cs index 9c367aba..fa73e41c 100644 --- a/Octokit/Clients/IReferencesClient.cs +++ b/Octokit/Clients/IReferencesClient.cs @@ -11,7 +11,7 @@ namespace Octokit Task Create(string owner, string name, NewReference reference); - Task Update(string owner, string name, string reference, string sha, bool force = false); + Task Update(string owner, string name, string reference, ReferenceUpdate update); Task Delete(string owner, string name, string reference); } diff --git a/Octokit/Clients/ReferencesClient.cs b/Octokit/Clients/ReferencesClient.cs index a1953c43..b4d557ea 100644 --- a/Octokit/Clients/ReferencesClient.cs +++ b/Octokit/Clients/ReferencesClient.cs @@ -21,22 +21,38 @@ namespace Octokit public Task> GetAll(string owner, string name, string subNamespace = null) { - throw new System.NotImplementedException(); + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + + return ApiConnection.GetAll(ApiUrls.Reference(owner, name, subNamespace)); } public Task Create(string owner, string name, NewReference reference) { - throw new System.NotImplementedException(); + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + Ensure.ArgumentNotNull(reference, "reference"); + + return ApiConnection.Post(ApiUrls.Reference(owner, name), reference); } - public Task Update(string owner, string name, string reference, string sha, bool force = false) + public Task Update(string owner, string name, string reference, ReferenceUpdate update) { - throw new System.NotImplementedException(); + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + Ensure.ArgumentNotNullOrEmptyString(reference, "reference"); + Ensure.ArgumentNotNull(update, "update"); + + return ApiConnection.Patch(ApiUrls.Reference(owner, name, reference), update); } public Task Delete(string owner, string name, string reference) { - throw new System.NotImplementedException(); + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + Ensure.ArgumentNotNullOrEmptyString(reference, "reference"); + + return ApiConnection.Delete(ApiUrls.Reference(owner, name, reference)); } } } diff --git a/Octokit/Helpers/ApiUrls.cs b/Octokit/Helpers/ApiUrls.cs index 9dd7bff3..0b6cb37e 100644 --- a/Octokit/Helpers/ApiUrls.cs +++ b/Octokit/Helpers/ApiUrls.cs @@ -476,8 +476,13 @@ namespace Octokit /// The name of the repository /// The reference name /// - public static Uri Reference(string owner, string name, string reference) + public static Uri Reference(string owner, string name, string reference = null) { + if (string.IsNullOrEmpty(reference)) + { + return "repos/{0}/{1}/git/refs".FormatUri(owner, name); + } + return "repos/{0}/{1}/git/refs/{2}".FormatUri(owner, name, reference); } diff --git a/Octokit/Models/Request/ReferenceUpdate.cs b/Octokit/Models/Request/ReferenceUpdate.cs new file mode 100644 index 00000000..0b719cde --- /dev/null +++ b/Octokit/Models/Request/ReferenceUpdate.cs @@ -0,0 +1,14 @@ +namespace Octokit +{ + public class ReferenceUpdate + { + public ReferenceUpdate(string sha, bool force = false) + { + Sha = sha; + Force = force; + } + + public string Sha { get; set; } + public bool Force { get; set; } + } +} \ No newline at end of file diff --git a/Octokit/Octokit-Mono.csproj b/Octokit/Octokit-Mono.csproj index f262d6e8..3eec02af 100644 --- a/Octokit/Octokit-Mono.csproj +++ b/Octokit/Octokit-Mono.csproj @@ -90,6 +90,7 @@ + diff --git a/Octokit/Octokit-netcore45.csproj b/Octokit/Octokit-netcore45.csproj index 2998c7a1..1e911000 100644 --- a/Octokit/Octokit-netcore45.csproj +++ b/Octokit/Octokit-netcore45.csproj @@ -170,6 +170,7 @@ + diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index 590bdcb2..229f056d 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -58,6 +58,7 @@ +