public void WhenISendARequest()
        {
            var httpMessageHelper = new HttpMessageHelper();

            var request         = this.scenarioContext.GetValueOrDefault <HttpRequestMessage>(ContextKey.Request);
            var responseMessage = httpMessageHelper.GetResponseMessage(request, scenarioContext);

            scenarioContext[ContextKey.ResponseMessage] = responseMessage;
            scenarioContext[ContextKey.StatusCode]      = responseMessage.StatusCode;

            if (!responseMessage.IsSuccessStatusCode)
            {
                var result = (string)scenarioContext[ContextKey.Result];

                Assert.IsFalse(string.IsNullOrWhiteSpace(result), $"Expected response to have a result. {request.RequestUri.PathAndQuery}");

                var errorMessageContent = JsonConvert.DeserializeObject <ErrorMessage>(result);
                var jsonErrorMessage    = JsonConvert.DeserializeObject <ErrorResponseBody>(result);

                if ((int)responseMessage.StatusCode <= 500)
                {
                    scenarioContext[ContextKey.ErrorMessage] = jsonErrorMessage.Detail;
                }
                else
                {
                    scenarioContext[ContextKey.ErrorMessage] = errorMessageContent.Message;
                }
            }
        }
        public static async Task <HttpResponseMessage> CreateNewAsync(Stream responseStream, HttpMethod requestMethod)
        {
            // https://tools.ietf.org/html/rfc7230#section-3
            // The normal procedure for parsing an HTTP message is to read the
            // start - line into a structure, read each header field into a hash table
            // by field name until the empty line, and then use the parsed data to
            // determine if a message body is expected.If a message body has been
            // indicated, then it is read as a stream until an amount of octets
            // equal to the message body length is read or the connection is closed.

            // https://tools.ietf.org/html/rfc7230#section-3
            // All HTTP/ 1.1 messages consist of a start - line followed by a sequence
            // of octets in a format similar to the Internet Message Format
            // [RFC5322]: zero or more header fields(collectively referred to as
            // the "headers" or the "header section"), an empty line indicating the
            // end of the header section, and an optional message body.
            // HTTP - message = start - line
            //					* (header - field CRLF )
            //					CRLF
            //					[message - body]

            string startLine = await HttpMessageHelper.ReadStartLineAsync(responseStream).ConfigureAwait(false);

            var statusLine = StatusLine.Parse(startLine);
            var response   = new HttpResponseMessage(statusLine.StatusCode);

            string headers = await HttpMessageHelper.ReadHeadersAsync(responseStream).ConfigureAwait(false);

            var headerSection = await HeaderSection.CreateNewAsync(headers).ConfigureAwait(false);

            var headerStruct = headerSection.ToHttpResponseHeaders();

            HttpMessageHelper.AssertValidHeaders(headerStruct.ResponseHeaders, headerStruct.ContentHeaders);
            byte[]? contentBytes = await HttpMessageHelper.GetContentBytesAsync(responseStream, headerStruct, requestMethod, statusLine).ConfigureAwait(false);

            contentBytes     = HttpMessageHelper.HandleGzipCompression(headerStruct.ContentHeaders, contentBytes);
            response.Content = contentBytes is null ? null : new ByteArrayContent(contentBytes);

            HttpMessageHelper.CopyHeaders(headerStruct.ResponseHeaders, response.Headers);
            if (response.Content is { })
        public void WhenICallTheInsolvenciesService(string searchDate)
        {
            var url = scenarioContext.GetMandatoryValue <string>(ContextKey.Url);
            var httpMessageHelper = new HttpMessageHelper();
            var requestMessage    = httpMessageHelper.CreateRequestMessage(url, "GET");
            var headers           = scenarioContext.GetValueOrDefault <Dictionary <string, string> >(ContextKey.Headers);

            foreach (var item in headers)
            {
                requestMessage.Headers.Add(item.Key, item.Value);
            }

            if (searchDate == null)
            {
                searchDate = "current";
            }

            switch (searchDate)
            {
            case OperationDateTypes.Current:
                break;

            case OperationDateTypes.CurrentMinus0Days:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentMinus1Day:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentMinus1Year:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddYears(-1).ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentMinus2Years:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddYears(-2).ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentMinus3Years:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddYears(-3).ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentMinus4Years:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddYears(-4).ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentMinus5Years:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddYears(-5).ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentMinus6Years:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddYears(-6).ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentMinus7Years:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddYears(-7).ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentMinus8Years:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddYears(-8).ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentMinus9Years:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddYears(-9).ToString("yyyy-MM-dd"));
                break;

            case OperationDateTypes.CurrentPlus6Years:
                requestMessage.Headers.Add("Operation-Date", DateTime.Now.AddYears(6).ToString("yyyy-MM-dd"));
                break;

            default:
                throw new ArgumentException($"search Date Type {searchDate} is not in a list of Operation Date Types");
            }

            scenarioContext[ContextKey.Request] = requestMessage;

            var request         = scenarioContext.GetValueOrDefault <HttpRequestMessage>(ContextKey.Request);
            var responseMessage = httpMessageHelper.GetResponseMessage(request, scenarioContext);

            scenarioContext[ContextKey.ResponseMessage] = responseMessage;
            scenarioContext[ContextKey.StatusCode]      = responseMessage.StatusCode;

            if (responseMessage.IsSuccessStatusCode)
            {
                return;
            }

            var result = (string)this.scenarioContext[ContextKey.Result];

            Assert.IsFalse(string.IsNullOrWhiteSpace(result), $"Expected response to have a result. {request.RequestUri.PathAndQuery}");
        }