From a3d4238f9196f28d8fc0f40de475fd484b3770b2 Mon Sep 17 00:00:00 2001 From: Haacked Date: Thu, 10 Oct 2013 14:52:05 -0700 Subject: [PATCH] Add unit test for reactive auth method --- .../Clients/AuthorizationsClientTests.cs | 15 ++- Octokit.Tests/Octokit.Tests.csproj | 14 ++ .../Reactive/AuthorizationExtensionsTests.cs | 120 ++++++++++++++++++ Octokit.Tests/packages.config | 3 + 4 files changed, 145 insertions(+), 7 deletions(-) create mode 100644 Octokit.Tests/Reactive/AuthorizationExtensionsTests.cs diff --git a/Octokit.Tests/Clients/AuthorizationsClientTests.cs b/Octokit.Tests/Clients/AuthorizationsClientTests.cs index ba372b6b..716f2976 100644 --- a/Octokit.Tests/Clients/AuthorizationsClientTests.cs +++ b/Octokit.Tests/Clients/AuthorizationsClientTests.cs @@ -165,24 +165,25 @@ namespace Octokit.Tests.Clients "secret", Arg.Any(), "two-factor-code") - .Returns(Task.Factory.StartNew(() => new Authorization { Token = "xyz" })); + .Returns(Task.Factory.StartNew(() => new Authorization { Token = "OAUTHSECRET" })); var result = await client.GetOrCreateApplicationAuthentication("clientId", "secret", data, e => Task.Factory.StartNew(() => challengeResults.Dequeue())); + client.Received(2).GetOrCreateApplicationAuthentication("clientId", + "secret", + Args.NewAuthorization); client.Received().GetOrCreateApplicationAuthentication("clientId", "secret", - Arg.Any()); - client.Received().GetOrCreateApplicationAuthentication("clientId", - "secret", - Arg.Any(), "two-factor-code"); - Assert.Equal("xyz", result.Token); + Args.NewAuthorization, + "two-factor-code"); + Assert.Equal("OAUTHSECRET", result.Token); } [Fact] - public async Task CallsCallbackAgainWhenUserSubmitsBadCode() + public async Task ThrowsTwoFactorChallengeFailedExceptionWhenProvidedCodeIsIncorrect() { var challengeResults = new Queue(new[] { diff --git a/Octokit.Tests/Octokit.Tests.csproj b/Octokit.Tests/Octokit.Tests.csproj index 378a5f6d..b02129cb 100644 --- a/Octokit.Tests/Octokit.Tests.csproj +++ b/Octokit.Tests/Octokit.Tests.csproj @@ -38,6 +38,15 @@ + + ..\packages\Rx-Core.2.1.30214.0\lib\Net45\System.Reactive.Core.dll + + + ..\packages\Rx-Interfaces.2.1.30214.0\lib\Net45\System.Reactive.Interfaces.dll + + + ..\packages\Rx-Linq.2.1.30214.0\lib\Net45\System.Reactive.Linq.dll + @@ -78,10 +87,15 @@ + + + {674b69b8-0780-4d54-ae2b-c15821fa51cb} + Octokit.Reactive + {08dd4305-7787-4823-a53f-4d0f725a07f3} Octokit diff --git a/Octokit.Tests/Reactive/AuthorizationExtensionsTests.cs b/Octokit.Tests/Reactive/AuthorizationExtensionsTests.cs new file mode 100644 index 00000000..1027008e --- /dev/null +++ b/Octokit.Tests/Reactive/AuthorizationExtensionsTests.cs @@ -0,0 +1,120 @@ +using System.Collections.Generic; +using System.Reactive.Linq; +using System.Threading.Tasks; +using NSubstitute; +using Octokit.Reactive; +using Octokit.Tests.Helpers; +using Xunit; + +namespace Octokit.Tests.Reactive +{ + public class AuthorizationExtensionsTests + { + public class TheGetOrCreateApplicationAuthenticationMethod + { + [Fact] + public async Task UsesCallbackToRetrievTwoFactorCode() + { + var firstResponse = new TwoFactorRequiredException("doh", TwoFactorType.AuthenticatorApp); + var twoFactorChallengeResult = new TwoFactorChallengeResult("two-factor-code"); + var secondResponse = new Authorization {Token = "OAUTHSECRET"}; + + var client = Substitute.For(); + client.GetOrCreateApplicationAuthentication(Args.String, Args.String, Args.NewAuthorization) + .Returns(Observable.Throw(firstResponse)); + client.GetOrCreateApplicationAuthentication( + Args.String, + Args.String, + Args.NewAuthorization, + "two-factor-code") + .Returns(Observable.Return(secondResponse)); + + var result = await client.GetOrCreateApplicationAuthentication( + "clientId", + "secret", + new NewAuthorization { Note = "Was it this one?"}, + _ => Observable.Return(twoFactorChallengeResult)); + + Assert.Equal("OAUTHSECRET", result.Token); + client.Received().GetOrCreateApplicationAuthentication( + "clientId", "secret", Arg.Is(a => a.Note == "Was it this one?")); + client.Received().GetOrCreateApplicationAuthentication( + "clientId", "secret", Arg.Is(a => a.Note == "Was it this one?"), + "two-factor-code"); + } + + [Fact] + public async Task RetriesWhenResendRequested() + { + var firstResponse = new TwoFactorRequiredException("doh", TwoFactorType.AuthenticatorApp); + var challengeResults = new Queue(new[] + { + TwoFactorChallengeResult.RequestResendCode, + new TwoFactorChallengeResult("two-factor-code") + }); + var secondResponse = new Authorization { Token = "OAUTHSECRET" }; + + var client = Substitute.For(); + client.GetOrCreateApplicationAuthentication(Args.String, Args.String, Args.NewAuthorization) + .Returns(Observable.Throw(firstResponse)); + client.GetOrCreateApplicationAuthentication( + Args.String, + Args.String, + Args.NewAuthorization, + "two-factor-code") + .Returns(Observable.Return(secondResponse)); + + var result = await client.GetOrCreateApplicationAuthentication( + "clientId", + "secret", + new NewAuthorization { Note = "Was it this one?" }, + _ => Observable.Return(challengeResults.Dequeue())); + + client.Received(2).GetOrCreateApplicationAuthentication("clientId", + "secret", + Arg.Any()); + client.Received().GetOrCreateApplicationAuthentication("clientId", + "secret", + Arg.Any(), "two-factor-code"); + Assert.Equal("OAUTHSECRET", result.Token); + } + + [Fact] + public void ThrowsTwoFactorChallengeFailedExceptionWhenProvidedCodeIsIncorrect() + { + var challengeResults = new Queue(new[] + { + TwoFactorChallengeResult.RequestResendCode, + new TwoFactorChallengeResult("wrong-code"), + }); + var twoFactorFailedException = new TwoFactorChallengeFailedException(); + var data = new NewAuthorization(); + var client = Substitute.For(); + client.GetOrCreateApplicationAuthentication("clientId", "secret", Arg.Any()) + .Returns(Observable.Throw(new TwoFactorRequiredException())); + client.GetOrCreateApplicationAuthentication("clientId", + "secret", + Arg.Any(), + "wrong-code") + .Returns(Observable.Throw(twoFactorFailedException)); + var observer = Substitute.For>(); + + client.GetOrCreateApplicationAuthentication( + "clientId", + "secret", + data, + _ => Observable.Return(challengeResults.Dequeue())) + .Subscribe(observer); + + observer.Received().OnError(twoFactorFailedException); + client.Received().GetOrCreateApplicationAuthentication("clientId", + "secret", + Arg.Any()); + client.Received().GetOrCreateApplicationAuthentication("clientId", + "secret", + Arg.Any(), + "wrong-code"); + } + } + } +} diff --git a/Octokit.Tests/packages.config b/Octokit.Tests/packages.config index cfd166d9..6d60e7d3 100644 --- a/Octokit.Tests/packages.config +++ b/Octokit.Tests/packages.config @@ -1,6 +1,9 @@  + + + \ No newline at end of file