diff --git a/Octokit.Reactive/Clients/ObservableAssigneesClient.cs b/Octokit.Reactive/Clients/ObservableAssigneesClient.cs index beabc06d..de7eb9c9 100644 --- a/Octokit.Reactive/Clients/ObservableAssigneesClient.cs +++ b/Octokit.Reactive/Clients/ObservableAssigneesClient.cs @@ -25,6 +25,9 @@ namespace Octokit.Reactive /// public IObservable GetAllForRepository(string owner, string name) { + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "name"); + return GetAllForRepository(owner, name, ApiOptions.None); } diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index 8fd268a0..842cb3bc 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -198,6 +198,7 @@ + diff --git a/Octokit.Tests/Reactive/ObservableAssigneesClientTests.cs b/Octokit.Tests/Reactive/ObservableAssigneesClientTests.cs new file mode 100644 index 00000000..92c75485 --- /dev/null +++ b/Octokit.Tests/Reactive/ObservableAssigneesClientTests.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using NSubstitute; +using Octokit.Reactive; +using Xunit; + +namespace Octokit.Tests.Reactive +{ + public class ObservableAssigneesClientTests + { + private const string owner = "owner"; + private const string name = "name"; + private const string assignee = "assignee"; + + public class TheGetAllMethod + { + private readonly Uri _expectedUri; + + public TheGetAllMethod() + { + var uri = string.Format("repos/{0}/{1}/assignees", owner, name); + _expectedUri = new Uri(uri, UriKind.Relative); + } + + [Fact] + public void RequestsCorrectUrl() + { + var github = Substitute.For(); + var client = new ObservableAssigneesClient(github); + + client.GetAllForRepository(owner, name); + + github.Connection.Received(1).Get>(_expectedUri, + Arg.Is>(dictionary => dictionary.Count == 0), null); + } + + [Fact] + public void RequestsCorrectUrlWithApiOption() + { + var github = Substitute.For(); + var client = new ObservableAssigneesClient(github); + + client.GetAllForRepository(owner, name, new ApiOptions {PageSize = 1, StartPage = 1}); + + github.Connection.Received(1).Get>(_expectedUri, + Arg.Is>(dictionary => dictionary.Count == 2), null); + } + + [Fact] + public async Task EnsuresNonNullArguments() + { + var github = Substitute.For(); + var client = new ObservableAssigneesClient(github); + + Assert.Throws(() => client.GetAllForRepository(null, name)); + Assert.Throws(() => client.GetAllForRepository(owner, null)); + Assert.Throws(() => client.GetAllForRepository(owner, name, null)); + } + + [Fact] + public void EnsuresNonEmptyArguments() + { + var client = CreateFixtureWithNonReactiveClient(); + + Assert.Throws(() => client.GetAllForRepository(string.Empty, name)); + Assert.Throws(() => client.GetAllForRepository(owner, string.Empty)); + } + } + + private static ObservableAssigneesClient CreateFixtureWithNonReactiveClient() + { + var nonreactiveClient = new AssigneesClient(Substitute.For()); + var github = Substitute.For(); + github.Issue.Assignee.Returns(nonreactiveClient); + return new ObservableAssigneesClient(github); + } + + public class TheCheckAssigneeMethod + { + [Fact] + public void CallsCheckAssigneeOnClient() + { + var github = Substitute.For(); + var client = new ObservableAssigneesClient(github); + + client.CheckAssignee(owner, name, assignee); + + github.Issue.Assignee.Received(1).CheckAssignee(Arg.Is(owner), Arg.Is(name), Arg.Is(assignee)); + } + + [Fact] + public void EnsuresNonNullArguments() + { + var client = CreateFixtureWithNonReactiveClient(); + + Assert.Throws(() => client.CheckAssignee(null, name, assignee)); + Assert.Throws(() => client.CheckAssignee(owner, null, assignee)); + Assert.Throws(() => client.CheckAssignee(owner, name, null)); + } + + [Fact] + public void EnsuresNonEmptyArguments() + { + var client = CreateFixtureWithNonReactiveClient(); + + Assert.Throws(() => client.CheckAssignee(string.Empty, name, assignee)); + Assert.Throws(() => client.CheckAssignee(owner, string.Empty, assignee)); + Assert.Throws(() => client.CheckAssignee(owner, name, string.Empty)); + } + } + + public class TheCtor + { + [Fact] + public void EnsuresNonNullArguments() + { + Assert.Throws( + () => new ObservableAssigneesClient(null)); + } + } + } +} \ No newline at end of file