public void OnRedirect_RedirectContainsError_ErrorLogged()
        {
            OpenIDConnectService oidc         = new OpenIDConnectService();
            IOidcProvider        oidcProvider = A.Fake <IOidcProvider>();
            string errorMsg;

            A.CallTo(() => oidcProvider.ParametersContainError(A <Dictionary <string, string> > .Ignored, out errorMsg))
            .Returns(true)
            .AssignsOutAndRefParameters("This is a simulated fail");
            oidc.OidcProvider = oidcProvider;
            IRedirectServerListener   serverListener            = A.Fake <IRedirectServerListener>();
            RedirectReceivedEventArgs redirectReceivedEventArgs = A.Fake <RedirectReceivedEventArgs>();

            oidc.ServerListener = serverListener;

            LogAssert.Expect(LogType.Error, new Regex(@"\w*This is a simulated fail\w*"));

            oidc.OpenLoginPage();

            serverListener.RedirectReceived += Raise.With(redirectReceivedEventArgs);

            oidc.Update();

            A.CallTo(() => oidcProvider.ParametersContainError(A <Dictionary <string, string> > .Ignored, out errorMsg))
            .MustHaveHappenedOnceExactly();
            Assert.IsTrue(string.IsNullOrEmpty(oidc.AccessToken));
        }
        public void OnRedirect_AuthFlow_RetrievesAccessToken()
        {
            OpenIDConnectService oidc         = new OpenIDConnectService();
            IOidcProvider        oidcProvider = A.Fake <IOidcProvider>();

            A.CallTo(() => oidcProvider.GetAuthorizationCode(A <Dictionary <string, string> > .Ignored)).Returns("myCode");
            A.CallTo(() => oidcProvider.GetAccessTokenFromCodeAsync(A <string> .Ignored, A <string> .Ignored))
            .Returns(Task.FromResult("myAccessToken"));
            A.CallTo(() => oidcProvider.AuthorizationFlow).Returns(AuthorizationFlow.AUTHORIZATION_CODE);
            oidc.OidcProvider = oidcProvider;
            IRedirectServerListener serverListener = A.Fake <IRedirectServerListener>();

            oidc.ServerListener = serverListener;

            oidc.OpenLoginPage();

            RedirectReceivedEventArgs redirectReceivedEventArgs = A.Fake <RedirectReceivedEventArgs>();

            serverListener.RedirectReceived += Raise.With(redirectReceivedEventArgs);

            oidc.Update();

            A.CallTo(() => oidcProvider.GetAccessTokenFromCodeAsync("myCode", A <string> .Ignored)).MustHaveHappenedOnceExactly();
            Assert.AreEqual("myAccessToken", oidc.AccessToken);
        }
        public void OnRedirect_AuthFlow_ExtractsCode()
        {
            OpenIDConnectService oidc         = new OpenIDConnectService();
            IOidcProvider        oidcProvider = A.Fake <IOidcProvider>();

            A.CallTo(() => oidcProvider.AuthorizationFlow).Returns(AuthorizationFlow.AUTHORIZATION_CODE);
            oidc.OidcProvider = oidcProvider;
            IRedirectServerListener serverListener = A.Fake <IRedirectServerListener>();

            oidc.ServerListener = serverListener;

            oidc.OpenLoginPage();

            RedirectReceivedEventArgs redirectReceivedEventArgs = A.Fake <RedirectReceivedEventArgs>();

            serverListener.RedirectReceived += Raise.With(redirectReceivedEventArgs);

            oidc.Update();

            A.CallTo(() => oidcProvider.GetAuthorizationCode(A <Dictionary <string, string> > .Ignored)).MustHaveHappenedOnceExactly();
        }
        public void IsLoggedIn_SuccessfulLogin_ReturnsTrue()
        {
            OpenIDConnectService oidc         = new OpenIDConnectService();
            IOidcProvider        oidcProvider = A.Fake <IOidcProvider>();

            A.CallTo(() => oidcProvider.GetAccessToken(A <Dictionary <string, string> > .Ignored)).Returns("myAccessToken");
            A.CallTo(() => oidcProvider.AuthorizationFlow).Returns(AuthorizationFlow.IMPLICIT);
            oidc.OidcProvider = oidcProvider;
            IRedirectServerListener serverListener = A.Fake <IRedirectServerListener>();

            oidc.ServerListener = serverListener;

            oidc.OpenLoginPage();

            RedirectReceivedEventArgs redirectReceivedEventArgs = A.Fake <RedirectReceivedEventArgs>();

            serverListener.RedirectReceived += Raise.With(redirectReceivedEventArgs);

            oidc.Update();

            Assert.IsTrue(oidc.IsLoggedIn);
        }
        public void OnRedirect_ImplicitFlow_AccessTokenRetrieved()
        {
            OpenIDConnectService oidc         = new OpenIDConnectService();
            IOidcProvider        oidcProvider = A.Fake <IOidcProvider>();

            A.CallTo(() => oidcProvider.GetAccessToken(A <Dictionary <string, string> > .Ignored)).Returns("myAccessToken");
            A.CallTo(() => oidcProvider.AuthorizationFlow).Returns(AuthorizationFlow.IMPLICIT);
            oidc.OidcProvider = oidcProvider;
            IRedirectServerListener serverListener = A.Fake <IRedirectServerListener>();

            oidc.ServerListener = serverListener;

            oidc.OpenLoginPage();

            RedirectReceivedEventArgs redirectReceivedEventArgs = A.Fake <RedirectReceivedEventArgs>();

            serverListener.RedirectReceived += Raise.With(redirectReceivedEventArgs);

            oidc.Update();

            Assert.AreEqual("myAccessToken", oidc.AccessToken);
        }
        public void OnRedirect_Success_EventRaised()
        {
            OpenIDConnectService oidc         = new OpenIDConnectService();
            IOidcProvider        oidcProvider = A.Fake <IOidcProvider>();

            oidc.OidcProvider = oidcProvider;
            IRedirectServerListener serverListener = A.Fake <IRedirectServerListener>();

            oidc.ServerListener = serverListener;
            RedirectReceivedEventArgs redirectReceivedEventArgs = A.Fake <RedirectReceivedEventArgs>();

            int eventCalls = 0;

            oidc.LoginCompleted += delegate
            {
                eventCalls++;
            };
            oidc.OpenLoginPage();

            serverListener.RedirectReceived += Raise.With(redirectReceivedEventArgs);
            oidc.Update();

            Assert.AreEqual(1, eventCalls);
        }