private async Task ShouldRequestSessionCreateSessionAcceptedResponse()
        {
            var request = new SessionRequest {
                Source = new SessionIdSource {
                    Id = "id"
                }
            };
            var response = new CreateSessionAcceptedResponse
            {
                AuthenticationDate = DateTime.Now,
                ChallengeIndicator = ChallengeIndicatorType.ChallengeRequestedMandate
            };

            _apiClient.Setup(apiClient =>
                             apiClient.Post <HttpMetadata>(Sessions,
                                                           _sdkCredentials.Object.GetSdkAuthorization(SdkAuthorizationType.OAuth),
                                                           SessionResponseMappings, request,
                                                           CancellationToken.None, null))
            .ReturnsAsync(() => response);

            _sessionsClient = new SessionsClient(_apiClient.Object, _configuration.Object);

            var getSessionResponse = await _sessionsClient.RequestSession(request, CancellationToken.None);

            getSessionResponse.ShouldNotBeNull();
            getSessionResponse.Accepted.ShouldNotBeNull();
            getSessionResponse.Accepted.AuthenticationDate.ShouldNotBeNull();
            getSessionResponse.Accepted.ChallengeIndicator.ShouldNotBeNull();
            getSessionResponse.Created.ShouldBeNull();
        }
        private async Task <SessionResponse> CreateSession(SessionRequest sessionRequest,
                                                           CancellationToken cancellationToken = default)
        {
            var resource = await ApiClient.Post <HttpMetadata>(SessionsPath, SdkAuthorization(), SessionResponseMappings,
                                                               sessionRequest, cancellationToken);

            switch (resource)
            {
            case CreateSessionOkResponse createSessionOkResponse:
                return(new SessionResponse(createSessionOkResponse));

            case CreateSessionAcceptedResponse createSessionAcceptedResponse:
                return(new SessionResponse(createSessionAcceptedResponse));

            default:
                throw new InvalidOperationException("Unexpected mapping type " + resource.GetType());
            }
        }
        private async Task ShouldRequestSessionCreateSessionOkResponse()
        {
            var request = new SessionRequest
            {
                Source = new SessionNetworkTokenSource
                {
                    Token = "token", ExpiryMonth = 12, ExpiryYear = 2024, Name = "name"
                }
            };
            var response = new CreateSessionOkResponse
            {
                Acs = new Acs {
                    ChallengeCancelReasonCode = "code"
                },
                SchemeInfo = new SchemeInfo
                {
                    Name = SessionScheme.CartesBancaires, Score = "score", Avalgo = "avalgo"
                }
            };

            _apiClient.Setup(apiClient =>
                             apiClient.Post <HttpMetadata>(Sessions,
                                                           _sdkCredentials.Object.GetSdkAuthorization(SdkAuthorizationType.OAuth),
                                                           SessionResponseMappings, request,
                                                           CancellationToken.None, null))
            .ReturnsAsync(() => response);

            _sessionsClient = new SessionsClient(_apiClient.Object, _configuration.Object);

            var getSessionResponse = await _sessionsClient.RequestSession(request, CancellationToken.None);

            getSessionResponse.ShouldNotBeNull();
            getSessionResponse.Accepted.ShouldBeNull();
            getSessionResponse.Created.ShouldNotBeNull();
            getSessionResponse.Created.Acs.ChallengeCancelReasonCode.ShouldNotBeNull();
            getSessionResponse.Created.SchemeInfo.ShouldNotBeNull();
            getSessionResponse.Created.SchemeInfo.Name.ShouldNotBeNull();
            getSessionResponse.Created.SchemeInfo.Score.ShouldNotBeNull();
            getSessionResponse.Created.SchemeInfo.Avalgo.ShouldNotBeNull();
        }
        protected async Task <SessionResponse> CreateHostedSession()
        {
            var shippingAddress = new SessionAddress
            {
                AddressLine1 = "Checkout.com",
                AddressLine2 = "90 Tottenham Court Road",
                City         = "London",
                State        = "ENG",
                Country      = CountryCode.GB,
                Zip          = "W1T 4TJ"
            };

            var sessionRequest = new SessionRequest
            {
                Source = new SessionCardSource {
                    ExpiryMonth = 1, ExpiryYear = 2030, Number = "4485040371536584"
                },
                Amount                 = 100L,
                Currency               = Currency.USD,
                ProcessingChannelId    = "pc_5jp2az55l3cuths25t5p3xhwru",
                AuthenticationType     = AuthenticationType.Regular,
                AuthenticationCategory = Category.Payment,
                ChallengeIndicator     = ChallengeIndicatorType.NoPreference,
                Reference              = "ORD-5023-4E89",
                TransactionType        = TransactionType.GoodsService,
                ShippingAddress        = shippingAddress,
                Completion             = new HostedCompletionInfo
                {
                    FailureUrl = "https://example.com/sessions/fail",
                    SuccessUrl = "https://example.com/sessions/success",
                }
            };

            return(await Retriable(
                       async() => await DefaultApi.SessionsClient().RequestSession(sessionRequest, CancellationToken.None),
                       HasSessionAccepted));
        }
 public async Task <SessionResponse> RequestSession(SessionRequest sessionRequest,
                                                    CancellationToken cancellationToken = default)
 {
     CheckoutUtils.ValidateParams("sessionRequest", sessionRequest);
     return(await CreateSession(sessionRequest, cancellationToken));
 }
        protected async Task <SessionResponse> CreateNonHostedSession(ChannelData channelData,
                                                                      Category authenticationCategory,
                                                                      ChallengeIndicatorType challengeIndicator,
                                                                      TransactionType transactionType)
        {
            var billingAddress = new SessionAddress
            {
                AddressLine1 = "CheckoutSdk.com",
                AddressLine2 = "90 Tottenham Court Road",
                City         = "London",
                State        = "ENG",
                Country      = CountryCode.GB
            };

            var source = new SessionCardSource
            {
                Number         = TestCardSource.Visa.Number,
                ExpiryMonth    = TestCardSource.Visa.ExpiryMonth,
                ExpiryYear     = TestCardSource.Visa.ExpiryYear,
                Name           = "John Doe",
                Email          = GenerateRandomEmail(),
                BillingAddress = billingAddress,
                HomePhone      = GetPhone(),
                MobilePhone    = GetPhone(),
                WorkPhone      = GetPhone()
            };

            var shippingAddress = new SessionAddress
            {
                AddressLine1 = "Checkout.com",
                AddressLine2 = "ABC building",
                AddressLine3 = "14 Wells Mews",
                City         = "London",
                State        = "ENG",
                Zip          = "W1T 4TJ",
                Country      = CountryCode.GB
            };

            var sessionRequest = new SessionRequest
            {
                Source              = source,
                Amount              = 6540L,
                Currency            = Currency.USD,
                ProcessingChannelId = "pc_5jp2az55l3cuths25t5p3xhwru",
                Marketplace         = new SessionMarketplaceData {
                    SubEntityId = "ent_ocw5i74vowfg2edpy66izhts2u"
                },
                AuthenticationCategory = authenticationCategory,
                ChallengeIndicator     = challengeIndicator,
                BillingDescriptor      = new SessionsBillingDescriptor {
                    Name = "SUPERHEROES.COM"
                },
                Reference       = "ORD-5023-4E89",
                TransactionType = transactionType,
                ShippingAddress = shippingAddress,
                Completion      = new NonHostedCompletionInfo {
                    CallbackUrl = "https://merchant.com/callback"
                },
                ChannelData = channelData
            };

            return(await Retriable(
                       async() => await DefaultApi.SessionsClient().RequestSession(sessionRequest, CancellationToken.None),
                       HasSessionCreated));
        }