public async Task UserTriesToRegister_FirstAttemptFailed_WrongPasswordInCredentials_PasswordMismatchErrorReturned()
        {
            _emailRestritionsServiceMock.Setup(x => x.IsEmailAllowed(It.IsAny <string>()))
            .Returns(true);
            _credentialsClient
            .Setup(x => x.Api.CreateAsync(It.IsAny <CredentialsCreateRequest>()))
            .ReturnsAsync(new CredentialsCreateResponse {
                Error = CredentialsError.LoginAlreadyExists
            });
            var response = new CredentialsValidationResponse {
                Error = CredentialsError.PasswordMismatch
            };

            _credentialsClient
            .Setup(x => x.Api.ValidateCredentialsAsync(It.IsAny <CredentialsValidationRequest>()))
            .ReturnsAsync(response);

            _customerProfileClient.Setup(x => x.CustomerProfiles.GetByEmailAsync(It.IsAny <GetByEmailRequestModel>()))
            .ReturnsAsync(new CustomerProfileResponse());

            var registrationService = CreateSutInstance();

            var result = await registrationService.RegisterAsync(
                new RegistrationRequestDto { Email = "email", Password = "******", ReferralCode = null });

            Assert.NotNull(result);
            Assert.Equal(ServicesError.RegisteredWithAnotherPassword.ToString(), result.Error.ToString());
            Assert.Null(result.CustomerId);
        }
        public async Task UserTriesToLogIn_WithWrongPassword_PasswordMismatchErrorReturned()
        {
            var sessionsServiceClient = new Mock <ISessionsServiceClient>();
            var credentialsClient     = new Mock <ICredentialsClient>();
            var customerProfileClient = new Mock <ICustomerProfileClient>();

            var response = new CredentialsValidationResponse {
                Error = CredentialsError.PasswordMismatch
            };

            credentialsClient
            .Setup(x => x.Api.ValidateCredentialsAsync(It.IsAny <CredentialsValidationRequest>()))
            .ReturnsAsync(response);

            var customerService = new Mock <ICustomersService>();

            AuthService authService;

            using (var logFactory = LogFactory.Create().AddUnbufferedConsole())
            {
                authService = new AuthService(
                    sessionsServiceClient.Object,
                    credentialsClient.Object,
                    customerProfileClient.Object,
                    customerService.Object,
                    logFactory);
            }

            var result = await authService.AuthAsync("email", "password");

            Assert.Equal(response.Error.ToString(), result.Error.ToString());
            Assert.Null(result.CustomerId);
            Assert.Null(result.Token);
        }
        public async Task UserTriesToLogIn_UnexpectedErrorInValidation_InvalidOperationIsThrown()
        {
            var sessionsServiceClient = new Mock <ISessionsServiceClient>();
            var credentialsClient     = new Mock <ICredentialsClient>();
            var customerProfileClient = new Mock <ICustomerProfileClient>();

            var response = new CredentialsValidationResponse {
                Error = CredentialsError.LoginAlreadyExists
            };

            credentialsClient
            .Setup(x => x.Api.ValidateCredentialsAsync(It.IsAny <CredentialsValidationRequest>()))
            .ReturnsAsync(response);

            var customerService = new Mock <ICustomersService>();

            AuthService authService;

            using (var logFactory = LogFactory.Create().AddUnbufferedConsole())
            {
                authService = new AuthService(
                    sessionsServiceClient.Object,
                    credentialsClient.Object,
                    customerProfileClient.Object,
                    customerService.Object,
                    logFactory);
            }

            await Assert.ThrowsAsync <InvalidOperationException>(() => authService.AuthAsync("email", "password"));
        }
        public async Task UserTriesToLogIn_WithValidCredentials_SuccessfullyAuthenticated()
        {
            var sessionsServiceClient = new Mock <ISessionsServiceClient>();
            var credentialsClient     = new Mock <ICredentialsClient>();
            var customerProfileClient = new Mock <ICustomerProfileClient>();

            var credentialsResponse = new CredentialsValidationResponse {
                CustomerId = "1"
            };

            credentialsClient
            .Setup(x => x.Api.ValidateCredentialsAsync(It.IsAny <CredentialsValidationRequest>()))
            .ReturnsAsync(credentialsResponse);

            customerProfileClient.Setup(x => x.CustomerProfiles.GetByCustomerIdAsync(It.IsAny <string>(), true, true))
            .ReturnsAsync(new CustomerProfileResponse
            {
                Profile = new CustomerProfile.Client.Models.Responses.CustomerProfile
                {
                    Status = CustomerProfileStatus.Active
                }
            });

            var sessionResponse = new ClientSession {
                SessionToken = "token"
            };

            sessionsServiceClient
            .Setup(x => x.SessionsApi.AuthenticateAsync(credentialsResponse.CustomerId, It.IsNotNull <CreateSessionRequest>()))
            .ReturnsAsync(sessionResponse);

            var customerService = new Mock <ICustomersService>();

            customerService
            .Setup(x => x.IsCustomerBlockedAsync(It.IsAny <string>()))
            .ReturnsAsync(false);

            AuthService authService;

            using (var logFactory = LogFactory.Create().AddUnbufferedConsole())
            {
                authService = new AuthService(
                    sessionsServiceClient.Object,
                    credentialsClient.Object,
                    customerProfileClient.Object,
                    customerService.Object,
                    logFactory);
            }

            var result = await authService.AuthAsync("email", "password");

            Assert.Equal(credentialsResponse.CustomerId, result.CustomerId);
            Assert.Equal(sessionResponse.SessionToken, result.Token);
            Assert.Equal(ServicesError.None, result.Error);
        }
        public async Task UserTriesToLogIn_CustomerIsBlocked_CustomerBlockedErrorReturned()
        {
            var sessionsServiceClient  = new Mock <ISessionsServiceClient>();
            var credentialsClient      = new Mock <ICredentialsClient>();
            var customersProfileClient = new Mock <ICustomerProfileClient>();

            var credentialsResponse = new CredentialsValidationResponse {
                CustomerId = "1"
            };

            credentialsClient
            .Setup(x => x.Api.ValidateCredentialsAsync(It.IsAny <CredentialsValidationRequest>()))
            .ReturnsAsync(credentialsResponse);

            customersProfileClient.Setup(x => x.CustomerProfiles.GetByCustomerIdAsync(It.IsAny <string>(), true, true))
            .ReturnsAsync(new CustomerProfileResponse
            {
                Profile = new CustomerProfile.Client.Models.Responses.CustomerProfile
                {
                    Status = CustomerProfileStatus.Active
                }
            });

            var customerService = new Mock <ICustomersService>();

            customerService
            .Setup(x => x.IsCustomerBlockedAsync(It.IsAny <string>()))
            .ReturnsAsync(true);

            AuthService authService;

            using (var logFactory = LogFactory.Create().AddUnbufferedConsole())
            {
                authService = new AuthService(
                    sessionsServiceClient.Object,
                    credentialsClient.Object,
                    customersProfileClient.Object,
                    customerService.Object,
                    logFactory);
            }

            var result = await authService.AuthAsync("email", "password");

            Assert.Equal(CustomerManagementError.CustomerBlocked.ToString(), result.Error.ToString());
            Assert.Null(result.CustomerId);
            Assert.Null(result.Token);
        }
        public async Task UserTriesToRegister_FirstAttemptFailed_CorrectPasswordInCredentials_SuccessfullyFinished()
        {
            _emailRestritionsServiceMock.Setup(x => x.IsEmailAllowed(It.IsAny <string>()))
            .Returns(true);
            _credentialsClient
            .Setup(x => x.Api.CreateAsync(It.IsAny <CredentialsCreateRequest>()))
            .ReturnsAsync(new CredentialsCreateResponse {
                Error = CredentialsError.LoginAlreadyExists
            });
            var response = new CredentialsValidationResponse {
                CustomerId = FakeCustomerId
            };

            _credentialsClient
            .Setup(x => x.Api.ValidateCredentialsAsync(It.IsAny <CredentialsValidationRequest>()))
            .ReturnsAsync(response);

            _customerProfileClient.Setup(x => x.CustomerProfiles.GetByEmailAsync(It.IsAny <GetByEmailRequestModel>()))
            .ReturnsAsync(new CustomerProfileResponse());
            _customerProfileClient
            .Setup(x => x.CustomerProfiles.CreateIfNotExistAsync(It.IsAny <CustomerProfileRequestModel>()))
            .ReturnsAsync(CustomerProfileErrorCodes.None);

            _pbfClient
            .Setup(x => x.WalletsApi.CreateAsync(It.IsAny <CustomerWalletCreationRequestModel>()))
            .ReturnsAsync(new CustomerWalletCreationResponseModel {
                Error = CustomerWalletCreationError.None
            });

            _pbfClient
            .Setup(x => x.CustomersApi.GetWalletAddress(It.IsAny <Guid>()))
            .ReturnsAsync(new CustomerWalletAddressResponseModel {
                WalletAddress = null
            });

            var registrationService = CreateSutInstance();

            var result = await registrationService.RegisterAsync(
                new RegistrationRequestDto { Email = "email", Password = "******", ReferralCode = null });

            Assert.NotNull(result);
            Assert.Equal(response.CustomerId, result.CustomerId);
            Assert.Equal(ServicesError.None, result.Error);
        }