Ejemplo n.º 1
0
            public async Task ShouldCacheReturnedUserIds(
                ulong userId,
                Guid remoteId,
                [Frozen, Substitute] IUserIdCache cache,
                [Frozen, Substitute] ILoginProvidersClient client,
                [Target] DefaultUserService service
                )
            {
                var user = new Models.User {
                    Id = userId
                };
                var login = new UserLogin {
                    LoginProvider = "discord", Enabled = true
                };
                var remoteUser = new Identity.Client.User {
                    Id = remoteId, Logins = new List <UserLogin> {
                        login
                    }
                };
                var cancellationToken = new CancellationToken(false);

                cache.ContainsKey(Any <Snowflake>()).Returns(false);
                client.GetUserByLoginProviderKey(Any <string>(), Any <string>(), Any <CancellationToken>()).Returns(remoteUser);

                await service.IsUserRegistered(user, cancellationToken);

                cache.Received().Add(Is(user.Id), Is <UserId>(id => id.Id == remoteId && id.Enabled));
            }
Ejemplo n.º 2
0
            public async Task ShouldReturnFalseIfLoginProvidersClientThrows(
                ulong userId,
                Guid remoteId,
                string errorMessage,
                ApiException exception,
                [Frozen, Substitute] IUserIdCache cache,
                [Frozen, Substitute] ILoginProvidersClient client,
                [Target] DefaultUserService service
                )
            {
                var user = new Models.User {
                    Id = userId
                };
                var remoteUser = new Identity.Client.User {
                    Id = remoteId
                };
                var cancellationToken = new CancellationToken(false);

                cache.ContainsKey(Any <Snowflake>()).Returns(false);
                client.GetUserByLoginProviderKey(Any <string>(), Any <string>(), Any <CancellationToken>()).Returns <Identity.Client.User>(x =>
                {
                    throw exception;
                });

                var result = await service.IsUserRegistered(user, cancellationToken);

                result.Should().BeFalse();

                await client.Received().GetUserByLoginProviderKey(Is("discord"), Is(userId.ToString()), Is(cancellationToken));
            }
Ejemplo n.º 3
0
            public async Task ShouldReturnTrueIfUserIdNotInCacheButReturnsFromTheApi(
                ulong userId,
                Guid remoteId,
                [Frozen, Substitute] IUserIdCache cache,
                [Frozen, Substitute] ILoginProvidersClient client,
                [Target] DefaultUserService service
                )
            {
                var user = new Models.User {
                    Id = userId
                };
                var login = new UserLogin {
                    LoginProvider = "discord", Enabled = true
                };
                var remoteUser = new Identity.Client.User {
                    Id = remoteId, Logins = new List <UserLogin> {
                        login
                    }
                };
                var cancellationToken = new CancellationToken(false);

                cache.ContainsKey(Any <Snowflake>()).Returns(false);
                client.GetUserByLoginProviderKey(Any <string>(), Any <string>(), Any <CancellationToken>()).Returns(remoteUser);

                var result = await service.IsUserRegistered(user, cancellationToken);

                result.Should().BeTrue();

                await client.Received().GetUserByLoginProviderKey(Is("discord"), Is(userId.ToString()), Is(cancellationToken));
            }
Ejemplo n.º 4
0
            public void ShouldReturnTheUserId(
                [Target] DefaultUserService service
                )
            {
                var token = "eyJhbGciOiJSUzI1NiIsImtpZCI6IjRDRDI0ODY0Njc3RTE5REMyMTY5RTVDODRFRjQyQzNDOTVBMzc0OEEiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoidGFsZW4uZmlzaGVyQGN5dGhyYWwuY29tIiwic3ViIjoiMjhkOGE1NzUtZmY1Zi00NTZkLThhYmUtODM3ZmI2YTQ1Y2IyIiwicm9sZSI6WyJCYXNpYyIsIkFkbWluaXN0cmF0b3IiXSwibmJmIjoxNjIyMzIwMzA5LCJleHAiOjE2MjIzMjM5MDksImlzcyI6Imh0dHBzOi8vbG9jYWxob3N0LyJ9.";

                var result = service.GetUserIdFromIdentityToken(token);

                result.Should().Be(Guid.Parse("28d8a575-ff5f-456d-8abe-837fb6a45cb2"));
            }
Ejemplo n.º 5
0
            public async Task ShouldCreateALoginsClientWithTheGivenToken(
                Snowflake discordUserId,
                Guid identityUserId,
                string accessToken,
                [Frozen, Substitute] IUsersClientFactory factory,
                [Target] DefaultUserService service,
                CancellationToken cancellationToken
                )
            {
                await service.LinkDiscordIdToUser(discordUserId, identityUserId, accessToken, cancellationToken);

                factory.Received().Create(Is(accessToken));
            }
Ejemplo n.º 6
0
            public async Task ShouldReturnTheAccessTokenFromTheBody(
                string code,
                string accessToken,
                [Frozen] AdapterOptions adapterOptions,
                [Frozen] MockHttpMessageHandler handler,
                [Target] DefaultUserService service,
                CancellationToken cancellationToken
                )
            {
                handler
                .Expect(HttpMethod.Post, adapterOptions.OAuth2TokenEndpoint.ToString())
                .Respond("application/json", @$ "{{" "access_token" ":" "{accessToken}" "}}");

                var result = await service.ExchangeOAuth2CodeForToken(code, cancellationToken);

                result.Should().Be(accessToken);
            }
Ejemplo n.º 7
0
            public async Task ShouldMakeARequestToDiscordsTokenEndpointWithTheGrantType(
                string code,
                string accessToken,
                [Frozen] AdapterOptions adapterOptions,
                [Frozen] MockHttpMessageHandler handler,
                [Target] DefaultUserService service,
                CancellationToken cancellationToken
                )
            {
                handler
                .Expect(HttpMethod.Post, adapterOptions.OAuth2TokenEndpoint.ToString())
                .WithFormData("grant_type", "authorization_code")
                .Respond("application/json", @$ "{{" "access_token" ":" "{accessToken}" "}}");

                await service.ExchangeOAuth2CodeForToken(code, cancellationToken);

                handler.VerifyNoOutstandingExpectation();
            }
Ejemplo n.º 8
0
            public async Task ShouldReturnTrueIfUserIdExistsInCache(
                ulong userId,
                [Frozen, Substitute] IUserIdCache cache,
                [Target] DefaultUserService service
                )
            {
                var user = new Models.User {
                    Id = userId
                };
                var cancellationToken = new CancellationToken(false);

                cache.ContainsKey(Any <Snowflake>()).Returns(true);

                var result = await service.IsUserRegistered(user, cancellationToken);

                result.Should().BeTrue();
                cache.Received().ContainsKey(Is(user.Id));
            }
Ejemplo n.º 9
0
            public async Task ShouldSendARequestToTheMeEndpointAndReturnTheUserId(
                Snowflake userId,
                string token,
                [Frozen] AdapterOptions adapterOptions,
                [Frozen] MockHttpMessageHandler handler,
                [Target] DefaultUserService service,
                CancellationToken cancellationToken
                )
            {
                handler
                .Expect(HttpMethod.Get, adapterOptions.OAuth2UserInfoEndpoint.ToString())
                .WithHeaders("authorization", $"Bearer {token}")
                .Respond("application/json", $@"{{""id"":""{userId.Value}""}}");

                var result = await service.GetDiscordUserInfo(token, cancellationToken);

                result.Id.Should().Be(userId);
                handler.VerifyNoOutstandingExpectation();
            }
Ejemplo n.º 10
0
            public async Task ShouldRetrieveUserIdFromCacheIfPresent(
                Models.User user,
                UserId expectedId,
                [Frozen, Substitute] IUserIdCache userIdCache,
                [Frozen, Substitute] ILoginProvidersClient loginProvidersClient,
                [Target] DefaultUserService service,
                CancellationToken cancellationToken
                )
            {
                userIdCache.TryGetValue(Any <Snowflake>(), out Any <UserId>()).Returns(x =>
                {
                    x[1] = expectedId;
                    return(true);
                });

                var result = await service.GetIdentityServiceUserId(user, cancellationToken);

                result.Should().Be(expectedId);
                await loginProvidersClient.DidNotReceive().GetUserByLoginProviderKey(Is("discord"), Is(user.Id.Value.ToString()), Is(cancellationToken));
            }
Ejemplo n.º 11
0
            public async Task ShouldSetDebugOnTheUserIdIfUserHasDebugFlag(
                Models.User user,
                [Frozen] Identity.Client.User identityUser,
                [Frozen, Substitute] ILoginProvidersClient loginProvidersClient,
                [Target] DefaultUserService service,
                CancellationToken cancellationToken
                )
            {
                var login = new UserLogin {
                    LoginProvider = "discord", Enabled = true
                };

                identityUser.Logins.Add(login);
                identityUser.Flags = (long)UserFlags.Debug;

                var result = await service.GetIdentityServiceUserId(user, cancellationToken);

                result.Id.Should().Be(identityUser.Id);
                result.Debug.Should().BeTrue();
            }
Ejemplo n.º 12
0
            public async Task ShouldCreateAUserLoginWithTheGivenInfo(
                Snowflake discordUserId,
                Guid identityUserId,
                string accessToken,
                [Frozen, Substitute] IUsersClient usersClient,
                [Target] DefaultUserService service,
                CancellationToken cancellationToken
                )
            {
                await service.LinkDiscordIdToUser(discordUserId, identityUserId, accessToken, cancellationToken);

                await usersClient.Received().CreateLogin(
                    Is(identityUserId),
                    Is <CreateUserLoginRequest>(userLogin =>
                                                userLogin.LoginProvider == "discord" &&
                                                userLogin.ProviderKey == discordUserId
                                                ),
                    Is(cancellationToken)
                    );
            }
Ejemplo n.º 13
0
            public async Task ShouldFetchTheUserIdFromTheIdentityService(
                Models.User user,
                [Frozen] Identity.Client.User identityUser,
                [Frozen, Substitute] ILoginProvidersClient loginProvidersClient,
                [Target] DefaultUserService service,
                CancellationToken cancellationToken
                )
            {
                var login = new UserLogin {
                    LoginProvider = "discord", Enabled = true
                };

                identityUser.Logins.Add(login);
                identityUser.Flags = (long)UserFlags.None;

                var result = await service.GetIdentityServiceUserId(user, cancellationToken);

                result.Id.Should().Be(identityUser.Id);
                result.Debug.Should().BeFalse();
                result.Enabled.Should().BeTrue();

                await loginProvidersClient.Received().GetUserByLoginProviderKey(Is("discord"), Is(user.Id.Value.ToString()), Is(cancellationToken));
            }