public static async Task SignInAsync_FailedSignInWithNullContext_RaisesLoginFailureEvent()
        {
            const string username = "******";

            int eventCount = 0;
            UserLoginFailureEvent raisedEvent = null;

            void EventCallback(UserLoginFailureEvent evt)
            {
                eventCount++;
                raisedEvent = evt;
            }

            using var loginService = new LoginServiceBuilder()
                                     .WithFindUserResult(ApplicationUserBuilder.Create().WithUsername(username).Build())
                                     .WithEventServiceCallback <UserLoginFailureEvent>(EventCallback)
                                     .WithSignInResult(IdentitySignInResult.Failed)
                                     .Build();

            await loginService.SignInAsync(username, "pass", null);

            eventCount.Should().Be(1);
            Assert.NotNull(raisedEvent);
            raisedEvent.ClientId.Should().BeNull();
            raisedEvent.Message.Should().Be(LoginService.ValidateUserMessage);
            raisedEvent.Username.Should().Be(username);
        }
        public static async Task SignInAsync_SuccessfulSignInWithNullContext_RaisesLoginSuccessEvent()
        {
            int eventCount = 0;
            UserLoginSuccessEvent raisedEvent = null;

            void EventCallback(UserLoginSuccessEvent evt)
            {
                eventCount++;
                raisedEvent = evt;
            }

            const string userId   = "UserId";
            const string username = "******";

            using var loginService = new LoginServiceBuilder()
                                     .WithEventServiceCallback <UserLoginSuccessEvent>(EventCallback)
                                     .WithSignInResult(IdentitySignInResult.Success)
                                     .WithFindUserResult(ApplicationUserBuilder
                                                         .Create()
                                                         .WithUserId(userId)
                                                         .WithUsername(username)
                                                         .Build())
                                     .Build();

            await loginService.SignInAsync("user", "pass", new Uri("~/", UriKind.Relative));

            eventCount.Should().Be(1);
            Assert.NotNull(raisedEvent);
            raisedEvent.ClientId.Should().BeNull();
            raisedEvent.DisplayName.Should().Be(username);
            raisedEvent.Message.Should().BeNull();
            raisedEvent.SubjectId.Should().Be(userId);
            raisedEvent.Username.Should().Be(username);
        }
        public static async Task SignInAsync_MissingCredentials_ReturnsExpectedResult(string username, string password)
        {
            using var loginService = new LoginServiceBuilder().Build();

            var result = await loginService.SignInAsync(username, password, null);

            Assert.NotNull(result);
            result.IsSuccess.Should().BeFalse();
        }
        public static async Task SignInAsync_FailedSignIn_NullContext_ReturnsExpectedResult()
        {
            using var loginService = new LoginServiceBuilder()
                                     .WithSignInResult(IdentitySignInResult.Failed)
                                     .Build();

            var result = await loginService.SignInAsync("user", "pass", null);

            Assert.NotNull(result);
            result.IsSuccess.Should().BeFalse();
            result.Value.Should().BeNull();
        }
        public static async Task SignInAsync_SuccessfulSignIn_WithContext_ReturnsExpectedResult()
        {
            using var loginService = new LoginServiceBuilder()
                                     .WithAuthorizationContextResult(new AuthorizationRequest())
                                     .WithSignInResult(IdentitySignInResult.Success)
                                     .Build();

            var result = await loginService.SignInAsync("user", "pass", null);

            Assert.NotNull(result);
            result.IsSuccess.Should().BeTrue();
            result.Value.IsTrustedReturnUrl.Should().BeTrue();
            result.Value.LoginHint.Should().BeNull();
        }
        public static async Task SignInAsync_FailedSignIn_WithContext_ReturnsExpectedResult()
        {
            const string loginHint = "Hint";

            var authorizationRequest = new AuthorizationRequest {
                LoginHint = loginHint
            };

            using var loginService = new LoginServiceBuilder()
                                     .WithAuthorizationContextResult(authorizationRequest)
                                     .WithSignInResult(IdentitySignInResult.Failed)
                                     .Build();

            var result = await loginService.SignInAsync("user", "pass", null);

            Assert.NotNull(result);
            result.IsSuccess.Should().BeFalse();
            result.Value.Should().BeNull();
        }