public async Task Enrol_Handles_SuccessfulResponse()
        {
            #region Setup Mocked Client

            var responseHistory = new Dictionary <string, CreateOrderResponse>();

            var handler = new MockHttpHandler();

            handler.AddMock
            (
                HttpMethod.Post, "https://api-ci.partpay.co.nz/pos/terminal/enrol",
                (httpRequest) =>
            {
                return(Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent
                              (
                        System.Text.Json.JsonSerializer.Serialize
                        (
                            new
                    {
                        client_id = "3D888947-1CA3-428B-A428-F53532FB8593",
                        client_secret = "6FFD61D3-76CA-4059-8AE2-C246B52FF452"
                    },
                            _SerialiserOptions
                        ),
                        System.Text.UTF8Encoding.UTF8,
                        "application/json"
                              )
                }));
            }
            );

            var httpClient = new HttpClient(handler);

            #endregion

            using (var client = CreateTestClient(httpClient))
            {
                var request = new EnrolRequest()
                {
                    ActivationCode = "ABC123",
                    Secret         = "zipme!",
                    Terminal       = "2531"
                };

                var result = await client.EnrolAsync(request);

                Assert.IsNotNull(result);
                Assert.AreEqual("3D888947-1CA3-428B-A428-F53532FB8593", result.ClientId);
                Assert.AreEqual("6FFD61D3-76CA-4059-8AE2-C246B52FF452", result.ClientSecret);
            }
        }
        public async Task CreateOrder_ThrowsOnRedirectResponseWithNoLocation()
        {
            #region Setup Mocked Client

            var responseHistory = new Dictionary <string, CreateOrderResponse>();

            var handler = new MockHttpHandler();

            handler.AddMock
            (
                HttpMethod.Post, "https://api-ci.partpay.co.nz/pos/order",
                async(httpRequest) =>
            {
                HttpStatusCode responseCode = HttpStatusCode.Created;
                var order = System.Text.Json.JsonSerializer.Deserialize <ZipOrder>(await httpRequest.Content.ReadAsStringAsync(), _SerialiserOptions);

                var key = order.MerchantReference;
                if (!responseHistory.TryGetValue(key, out var responseBody))
                {
                    responseBody = responseHistory[key] = new CreateOrderResponse()
                    {
                        OrderId     = System.Guid.NewGuid().ToString(),
                        OrderExpiry = DateTime.UtcNow.AddHours(1)
                    };
                }
                else
                {
                    responseCode = HttpStatusCode.Found;
                }

                var retVal = new HttpResponseMessage(responseCode)
                {
                    Content = responseCode == HttpStatusCode.Found ? null : new StringContent(System.Text.Json.JsonSerializer.Serialize(responseBody, _SerialiserOptions), System.Text.UTF8Encoding.UTF8, "application/json")
                };

                return(retVal);
            }
            );

            var httpClient = new HttpClient(handler);

            #endregion

            using (var client = CreateTestClient(httpClient))
            {
                var request = new CreateOrderRequest()
                {
                    TerminalId = "2531",
                    EnableUniqueMerchantReferenceCheck = true,
                    Order = new ZipOrder()
                    {
                        Amount = 50M,
                        CustomerApprovalCode = "206931",
                        MerchantReference    = System.Guid.NewGuid().ToString(),
                        Operator             = "Test",
                        PaymentFlow          = ZipPaymentFlow.Payment,
                        Items = new System.Collections.Generic.List <ZipOrderItem>()
                        {
                            new ZipOrderItem()
                            {
                                Name        = "Test Item",
                                Description = "0110A Blue 12",
                                Price       = 50M,
                                Quantity    = 1,
                                Sku         = "123"
                            }
                        }
                    }
                };

                var result1 = await client.CreateOrderAsync(request);

                Assert.IsNotNull(result1);
                Assert.IsFalse(String.IsNullOrWhiteSpace(result1.OrderId));
                Assert.IsNotNull(result1.OrderExpiry);

                await Assert.ThrowsExceptionAsync <ZipApiException>
                (
                    async() => { var result2 = await client.CreateOrderAsync(request); }
                );
            }
        }