private async Task <Provider[]> SendRequestAsync(ProviderQueryRequest request, CancellationToken cancellationToken)
        {
            var requestXml  = _requestSerializer.Serialize(request);
            var httpRequest = new HttpRequestMessage
            {
                Method  = HttpMethod.Post,
                Headers =
                {
                    { "SOAPAction", "retrieveAllProviders" }
                },
                Content = new StringContent(requestXml, Encoding.UTF8, "text/xml"),
            };

            var response = await _httpClient.SendAsync(httpRequest, cancellationToken);

            var responseXml = await response.Content.ReadAsStringAsync();

            var result = _responseDeserializer.DeserializeResponse(responseXml);

            if (!response.IsSuccessStatusCode)
            {
                // If we are here then we got a failed response without a SOAP fault
                throw new Exception($"Error calling UKRLP SOAP Api. Not fault returned. Http Status {(int) response.StatusCode}");
            }

            return(result);
        }
        public void ThenItShouldIncludeProviderUpdatedSinceWhenSpecifiedInQuery(DateTime providerUpdatedSince)
        {
            var serializer = new RequestSerializer();
            var request    = new ProviderQueryRequest
            {
                SelectionCriteria = new SelectionCriteria
                {
                    CriteriaCondition     = CriteriaConditionEnum.OR,
                    ProviderStatus        = ProviderStatusEnum.A,
                    StakeholderId         = 123,
                    ApprovedProvidersOnly = ApprovedProvidersOnlyEnum.Yes,
                    ProviderUpdatedSince  = providerUpdatedSince,
                },
                QueryId = "123213",
            };

            var actual = serializer.Serialize(request);

            var doc            = XDocument.Parse(actual);
            var requestElement = doc?
                                 .Element(RequestSerializer.SoapNs + "Envelope")?
                                 .Element(RequestSerializer.SoapNs + "Body")?
                                 .Element(RequestSerializer.UkrlpNs + "ProviderQueryRequest");
            var expectedElement = requestElement?
                                  .Element("SelectionCriteria")?
                                  .Element("ProviderUpdatedSince");

            Assert.IsNotNull(expectedElement);
            Assert.AreEqual(providerUpdatedSince.ToUniversalTime().ToString("O"), expectedElement.Value);
        }
        public void ThenItShouldIncludeUkprnsWhenSpecifiedInQuery(long ukprn1, long ukprn2)
        {
            var serializer = new RequestSerializer();
            var request    = new ProviderQueryRequest
            {
                SelectionCriteria = new SelectionCriteria
                {
                    CriteriaCondition     = CriteriaConditionEnum.OR,
                    ProviderStatus        = ProviderStatusEnum.A,
                    StakeholderId         = 123,
                    ApprovedProvidersOnly = ApprovedProvidersOnlyEnum.Yes,
                    UnitedKingdomProviderReferenceNumberList = new[] { ukprn1, ukprn2 },
                },
                QueryId = "123213",
            };

            var actual = serializer.Serialize(request);

            var doc            = XDocument.Parse(actual);
            var requestElement = doc?
                                 .Element(RequestSerializer.SoapNs + "Envelope")?
                                 .Element(RequestSerializer.SoapNs + "Body")?
                                 .Element(RequestSerializer.UkrlpNs + "ProviderQueryRequest");
            var expectedElement = requestElement?
                                  .Element("SelectionCriteria")?
                                  .Element("UnitedKingdomProviderReferenceNumberList");

            Assert.IsNotNull(expectedElement);
            Assert.AreEqual(2, expectedElement.Elements().Count());
            Assert.AreEqual("UnitedKingdomProviderReferenceNumber", expectedElement.Elements().ElementAt(0).Name.LocalName);
            Assert.AreEqual(ukprn1.ToString(), expectedElement.Elements().ElementAt(0).Value);
            Assert.AreEqual("UnitedKingdomProviderReferenceNumber", expectedElement.Elements().ElementAt(1).Name.LocalName);
            Assert.AreEqual(ukprn2.ToString(), expectedElement.Elements().ElementAt(1).Value);
        }
        public string Serialize(ProviderQueryRequest request)
        {
            var requestElement  = SerializeRequest(request);
            var envelopeElement = WrapRequestInSoapEnvelope(requestElement);

            return(envelopeElement.ToString());
        }
        private XElement SerializeRequest(ProviderQueryRequest request)
        {
            var selectionCriteriaElement = SerializeSelectionCriteria(request.SelectionCriteria);

            var requestElement = new XElement(UkrlpNs + "ProviderQueryRequest",
                                              selectionCriteriaElement,
                                              new XElement("QueryId", request.QueryId));

            return(requestElement);
        }
        public void ThenItShouldReturnValidXml(ProviderQueryRequest request)
        {
            var serializer = new RequestSerializer();

            var actual = serializer.Serialize(request);

            XDocument doc = null;

            Assert.DoesNotThrow(() => doc = XDocument.Parse(actual));
            Assert.IsNotNull(doc);
        }
        public void ThenItShouldIncludeTheRequestQueryId(ProviderQueryRequest request)
        {
            var serializer = new RequestSerializer();

            var actual = serializer.Serialize(request);

            var doc            = XDocument.Parse(actual);
            var requestElement = doc?
                                 .Element(RequestSerializer.SoapNs + "Envelope")?
                                 .Element(RequestSerializer.SoapNs + "Body")?
                                 .Element(RequestSerializer.UkrlpNs + "ProviderQueryRequest");
            var expectedElement = requestElement?.Element("QueryId");

            Assert.IsNotNull(expectedElement);
            Assert.AreEqual(request.QueryId.ToString(), expectedElement.Value);
        }
        public void ThenItShouldIncludeApprovedProvidersOnly(ProviderQueryRequest request)
        {
            var serializer = new RequestSerializer();

            var actual = serializer.Serialize(request);

            var doc            = XDocument.Parse(actual);
            var requestElement = doc?
                                 .Element(RequestSerializer.SoapNs + "Envelope")?
                                 .Element(RequestSerializer.SoapNs + "Body")?
                                 .Element(RequestSerializer.UkrlpNs + "ProviderQueryRequest");
            var expectedElement = requestElement?
                                  .Element("SelectionCriteria")?
                                  .Element("ApprovedProvidersOnly");

            Assert.IsNotNull(expectedElement);
            Assert.AreEqual(request.SelectionCriteria.ApprovedProvidersOnly.ToString(), expectedElement.Value);
        }
        public void ThenItShouldWrapTheRequestInASoapPackage(ProviderQueryRequest request)
        {
            var serializer = new RequestSerializer();

            var actual = serializer.Serialize(request);

            XDocument doc = XDocument.Parse(actual);

            Assert.IsNotNull(doc.Root.Name == RequestSerializer.SoapNs + "Envelope");
            Assert.IsNotNull(doc?
                             .Element(RequestSerializer.SoapNs + "Envelope")?
                             .Element(RequestSerializer.SoapNs + "Header"));
            Assert.IsNotNull(doc?
                             .Element(RequestSerializer.SoapNs + "Envelope")?
                             .Element(RequestSerializer.SoapNs + "Body"));
            Assert.IsNotNull(doc?
                             .Element(RequestSerializer.SoapNs + "Envelope")?
                             .Element(RequestSerializer.SoapNs + "Body")?
                             .Element(RequestSerializer.UkrlpNs + "ProviderQueryRequest"));
        }
        public async Task <Provider[]> GetProvidersChangedSinceAsync(DateTime changedSince, CancellationToken cancellationToken)
        {
            var statusesToQuery = new[]
            {
                ProviderStatusEnum.A,
                ProviderStatusEnum.V,
                ProviderStatusEnum.PD1,
                ProviderStatusEnum.PD2,
            };

            var results = new List <Provider>();

            foreach (var status in statusesToQuery)
            {
                var request = new ProviderQueryRequest
                {
                    SelectionCriteria = new SelectionCriteria
                    {
                        ProviderUpdatedSince  = changedSince,
                        CriteriaCondition     = CriteriaConditionEnum.OR,
                        ProviderStatus        = status,
                        ApprovedProvidersOnly = ApprovedProvidersOnlyEnum.No,
                        StakeholderId         = _configuration.StakeholderId,
                    },
                    QueryId = DateTime.Now.Ticks.ToString(),
                };
                var providersOfStatus = await SendRequestAsync(request, cancellationToken);

                var unreadProviders = providersOfStatus
                                      .Where(p1 => !results.Any(p2 => p1.UnitedKingdomProviderReferenceNumber == p2.UnitedKingdomProviderReferenceNumber))
                                      .ToArray();
                if (unreadProviders.Any())
                {
                    results.AddRange(unreadProviders);
                }
            }

            return(results.ToArray());
        }