diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj
index f82e598e..67d9bfc2 100644
--- a/Octokit.Tests/Octokit.Tests.csproj
+++ b/Octokit.Tests/Octokit.Tests.csproj
@@ -213,9 +213,12 @@
+
+
+
diff --git a/Octokit.Tests/Reactive/ObservableIssueCommentReactionsClientTests.cs b/Octokit.Tests/Reactive/ObservableIssueCommentReactionsClientTests.cs
new file mode 100644
index 00000000..1ae5f48b
--- /dev/null
+++ b/Octokit.Tests/Reactive/ObservableIssueCommentReactionsClientTests.cs
@@ -0,0 +1,65 @@
+using NSubstitute;
+using Octokit.Reactive;
+using System;
+using Xunit;
+
+namespace Octokit.Tests.Reactive
+{
+ public class ObservableIssueCommentReactionsClientTests
+ {
+ public class TheCtor
+ {
+ [Fact]
+ public void EnsuresNonNullArguments()
+ {
+ Assert.Throws(() => new ObservableIssueCommentReactionsClient(null));
+ }
+ }
+
+ public class TheGetAllMethod
+ {
+ private readonly IGitHubClient _githubClient;
+ private readonly IObservableReactionsClient _client;
+ private const string owner = "owner";
+ private const string name = "name";
+
+ public TheGetAllMethod()
+ {
+ _githubClient = Substitute.For();
+ _client = new ObservableReactionsClient(_githubClient);
+ }
+
+ [Fact]
+ public void RequestsCorrectUrl()
+ {
+ _client.IssueComment.GetAll("fake", "repo", 42);
+ _githubClient.Received().Reaction.IssueComment.GetAll("fake", "repo", 42);
+ }
+
+ [Fact]
+ public void EnsuresArgumentsNotNull()
+ {
+
+ Assert.Throws(() => _client.IssueComment.Create(null, "name", 1, new NewReaction(ReactionType.Heart)));
+ Assert.Throws(() => _client.IssueComment.Create("", "name", 1, new NewReaction(ReactionType.Heart)));
+ Assert.Throws(() => _client.IssueComment.Create("owner", null, 1, new NewReaction(ReactionType.Heart)));
+ Assert.Throws(() => _client.IssueComment.Create("owner", "", 1, new NewReaction(ReactionType.Heart)));
+ Assert.Throws(() => _client.IssueComment.Create("owner", "name", 1, null));
+ }
+ }
+
+ public class TheCreateMethod
+ {
+ [Fact]
+ public void RequestsCorrectUrl()
+ {
+ var githubClient = Substitute.For();
+ var client = new ObservableReactionsClient(githubClient);
+ var newReaction = new NewReaction(ReactionType.Confused);
+
+ client.IssueComment.Create("fake", "repo", 1, newReaction);
+ githubClient.Received().Reaction.IssueComment.Create("fake", "repo", 1, newReaction);
+ }
+ }
+ }
+}
diff --git a/Octokit.Tests/Reactive/ObservableIssueReactionsClientTests.cs b/Octokit.Tests/Reactive/ObservableIssueReactionsClientTests.cs
new file mode 100644
index 00000000..08d51994
--- /dev/null
+++ b/Octokit.Tests/Reactive/ObservableIssueReactionsClientTests.cs
@@ -0,0 +1,65 @@
+using NSubstitute;
+using Octokit.Reactive;
+using System;
+using Xunit;
+
+namespace Octokit.Tests.Reactive
+{
+ public class ObservableIssueReactionsClientTests
+ {
+ public class TheCtor
+ {
+ [Fact]
+ public void EnsuresNonNullArguments()
+ {
+ Assert.Throws(() => new ObservableIssueReactionsClient(null));
+ }
+ }
+
+ public class TheGetAllMethod
+ {
+ private readonly IGitHubClient _githubClient;
+ private readonly IObservableReactionsClient _client;
+ private const string owner = "owner";
+ private const string name = "name";
+
+ public TheGetAllMethod()
+ {
+ _githubClient = Substitute.For();
+ _client = new ObservableReactionsClient(_githubClient);
+ }
+
+ [Fact]
+ public void RequestsCorrectUrl()
+ {
+ _client.Issue.GetAll("fake", "repo", 42);
+ _githubClient.Received().Reaction.Issue.GetAll("fake", "repo", 42);
+ }
+
+ [Fact]
+ public void EnsuresArgumentsNotNull()
+ {
+
+ Assert.Throws(() => _client.Issue.Create(null, "name", 1, new NewReaction(ReactionType.Heart)));
+ Assert.Throws(() => _client.Issue.Create("", "name", 1, new NewReaction(ReactionType.Heart)));
+ Assert.Throws(() => _client.Issue.Create("owner", null, 1, new NewReaction(ReactionType.Heart)));
+ Assert.Throws(() => _client.Issue.Create("owner", "", 1, new NewReaction(ReactionType.Heart)));
+ Assert.Throws(() => _client.Issue.Create("owner", "name", 1, null));
+ }
+ }
+
+ public class TheCreateMethod
+ {
+ [Fact]
+ public void RequestsCorrectUrl()
+ {
+ var githubClient = Substitute.For();
+ var client = new ObservableReactionsClient(githubClient);
+ var newReaction = new NewReaction(ReactionType.Confused);
+
+ client.Issue.Create("fake", "repo", 1, newReaction);
+ githubClient.Received().Reaction.Issue.Create("fake", "repo", 1, newReaction);
+ }
+ }
+ }
+}
diff --git a/Octokit.Tests/Reactive/ObservableReactionsClientTests.cs b/Octokit.Tests/Reactive/ObservableReactionsClientTests.cs
new file mode 100644
index 00000000..054fe574
--- /dev/null
+++ b/Octokit.Tests/Reactive/ObservableReactionsClientTests.cs
@@ -0,0 +1,35 @@
+using NSubstitute;
+using Octokit.Reactive;
+using System;
+using System.Reactive.Threading.Tasks;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace Octokit.Tests.Reactive
+{
+ public class ObservableReactionsClientTests
+ {
+ public class TheCtor
+ {
+ [Fact]
+ public void EnsuresNonNullArguments()
+ {
+ Assert.Throws(() => new ObservableReactionsClient(null));
+ }
+ }
+
+ public class TheDeleteMethod
+ {
+ [Fact]
+ public void PostsToCorrectUrl()
+ {
+ var gitHubClient = Substitute.For();
+ var client = new ObservableReactionsClient(gitHubClient);
+
+ client.Delete(13);
+
+ gitHubClient.Reaction.Received().Delete(13);
+ }
+ }
+ }
+}