public void ProcessedParamsAreValidAndCorrectJson()
        {
            var requestProcessor         = new RequestProcessor(Constants.Iv, Constants.SecretKey, Constants.AccessKey, "KE");
            var paymentRequestParameters = new PaymentRequestParameters
            {
                Amount             = "15000",
                CallBackUrl        = "https://www.example.com/callback",
                CountryCode        = "UG",
                Currency           = "KES",
                CustomerEmail      = "*****@*****.**",
                CustomerFirstName  = "Thomas",
                CustomerLastName   = "Jackson",
                DueDate            = "2018-01-01T00:00:00+00:00",
                FailedCallBackUrl  = "https://www.example.com/callback-failed",
                Language           = "en",
                PhoneNumber        = "254700000000",
                ProductCode        = "TEST001",
                Reference          = "0000001",
                ServiceCode        = "TEST-MERCHANT",
                ServiceDescription = "TEST-DESCRIPTION",
                TransactionId      = "2400",
                WebhookPaymentUrl  = "https://www.example.com/webhook"
            };

            var params_ =
                new Crypto(Constants.Iv, Constants.SecretKey).Decrypt(requestProcessor.Process(paymentRequestParameters)
                                                                      .Params);

            var roundTrippedPaymentRequestParameters = JsonConvert.DeserializeObject <PaymentRequestParameters>(params_);

            roundTrippedPaymentRequestParameters.Should().BeEquivalentTo(paymentRequestParameters);
        }
        public void CanDeserializeJsonToPaymentRequestParameters()
        {
            var target = new PaymentRequestParameters
            {
                Amount             = "15000",
                CallBackUrl        = "https://www.example.com/callback",
                CountryCode        = "KE",
                Currency           = "KES",
                CustomerEmail      = "*****@*****.**",
                CustomerFirstName  = "Thomas",
                CustomerLastName   = "Jackson",
                DueDate            = "2018-01-01T00:00:00+00:00",
                FailedCallBackUrl  = "https://www.example.com/callback-failed",
                Language           = "en",
                PhoneNumber        = "254700000000",
                ProductCode        = "TEST001",
                Reference          = "0000001",
                ServiceCode        = "TEST-MERCHANT",
                ServiceDescription = "TEST-DESCRIPTION",
                TransactionId      = "2400",
                WebhookPaymentUrl  = "https://www.example.com/webhook"
            };

            const string testResultString =
                "{\"amount\" : \"15000\",\"callBackUrl\" : \"https://www.example.com/callback\",\"countryCode\" : \"KE\",\"currency\" : \"KES\",\"customerEmail\" : \"[email protected]\",\"customerFirstName\" : \"Thomas\",\"customerLastName\" : \"Jackson\",\"dueDate\" : \"2018-01-01T00:00:00+00:00\",\"failedCallBackUrl\" : \"https://www.example.com/callback-failed\",\"language\" : \"en\",\"MSISDN\" : \"254700000000\",\"productCode\" : \"TEST001\",\"reference\" : \"0000001\",\"serviceCode\" : \"TEST-MERCHANT\",\"serviceDescription\" : \"TEST-DESCRIPTION\",\"transactionID\" : \"2400\",\"webhookPaymentUrl\" : \"https://www.example.com/webhook\"}";
            var testResult = JsonConvert.DeserializeObject <PaymentRequestParameters>(testResultString);

            testResult.Should().BeEquivalentTo(target);
        }
        public void CanProcessRequestToProduceCorrectAccessKeyAndCountryCode()
        {
            var requestProcessor         = new RequestProcessor(Constants.Iv, Constants.SecretKey, Constants.AccessKey, "KE");
            var paymentRequestParameters = new PaymentRequestParameters
            {
                Amount             = "15000",
                CallBackUrl        = "https://www.example.com/callback",
                CountryCode        = "UG",
                Currency           = "KES",
                CustomerEmail      = "*****@*****.**",
                CustomerFirstName  = "Thomas",
                CustomerLastName   = "Jackson",
                DueDate            = "2018-01-01T00:00:00+00:00",
                FailedCallBackUrl  = "https://www.example.com/callback-failed",
                Language           = "en",
                PhoneNumber        = "254700000000",
                ProductCode        = "TEST001",
                Reference          = "0000001",
                ServiceCode        = "TEST-MERCHANT",
                ServiceDescription = "TEST-DESCRIPTION",
                TransactionId      = "2400",
                WebhookPaymentUrl  = "https://www.example.com/webhook"
            };

            var result = requestProcessor.Process(paymentRequestParameters);

            Assert.Equal(Constants.AccessKey, result.AccessKey);
            Assert.Equal("KE", result.CountryCode);
        }
        public PaymentRequest Process(PaymentRequestParameters parameters)
        {
            var jsonString      = JsonConvert.SerializeObject(parameters);
            var encryptedParams = _crypto.Encrypt(jsonString);

            return(new PaymentRequest
            {
                AccessKey = _accessKey,
                CountryCode = _countryCode,
                Params = encryptedParams
            });
        }