public async Task AjaxRequestServiceGetResponseReturnsUnsuccessful()
        {
            // Arrange
            const HttpStatusCode expectedStatusCode = HttpStatusCode.NotFound;
            const bool           expectedIsHealthy  = true;
            var requestModel = ValidRequestModel();
            var ajaxRequest  = ValidAjaxRequestModel(expectedIsHealthy);

            using var httpResponse = new HttpResponseMessage
                  {
                      StatusCode = expectedStatusCode,
                      Content    = new ObjectContent(typeof(string), "{ \"data\": \"some response data\" }", new JsonMediaTypeFormatter()),
                  };

            var fakeHttpRequestSender = A.Fake <IFakeHttpRequestSender>();

            A.CallTo(() => fakeHttpRequestSender.Send(A <HttpRequestMessage> .Ignored)).Returns(httpResponse);

            using var fakeHttpMessageHandler = new FakeHttpMessageHandler(fakeHttpRequestSender);
            using var httpClient             = new HttpClient(fakeHttpMessageHandler)
                  {
                      BaseAddress = new Uri("http://SomePathBaseAddress"),
                  };

            var ajaxRequestService = new AjaxRequestService(fakeLogger, fakeAppRegistryDataService, httpClient);

            // Act
            var result = await ajaxRequestService.GetResponseAsync(requestModel, ajaxRequest);

            // Assert
            A.CallTo(() => fakeAppRegistryDataService.SetAjaxRequestHealthState(A <string> .Ignored, A <string> .Ignored, A <bool> .Ignored)).MustNotHaveHappened();

            Assert.Equal(expectedStatusCode, result.Status);
            Assert.Equal(expectedIsHealthy, result.IsHealthy);
        }
        public async Task AjaxRequestServiceGetResponseCatchesTaskCanceledException()
        {
            // Arrange
            const HttpStatusCode expectedStatusCode = HttpStatusCode.OK;
            const bool           expectedIsHealthy  = false;
            var requestModel          = ValidRequestModel();
            var ajaxRequest           = ValidAjaxRequestModel(true);
            var fakeHttpRequestSender = A.Fake <IFakeHttpRequestSender>();

            using var fakeHttpMessageHandler = new FakeHttpMessageHandler(fakeHttpRequestSender);
            using var httpClient             = new HttpClient(fakeHttpMessageHandler)
                  {
                      BaseAddress = new Uri("http://SomePathBaseAddress"),
                  };

            A.CallTo(() => fakeHttpRequestSender.Send(A <HttpRequestMessage> .Ignored)).Throws <TaskCanceledException>();

            var ajaxRequestService = new AjaxRequestService(fakeLogger, fakeAppRegistryDataService, httpClient);

            // Act
            var result = await ajaxRequestService.GetResponseAsync(requestModel, ajaxRequest);

            // Assert
            A.CallTo(() => fakeAppRegistryDataService.SetAjaxRequestHealthState(A <string> .Ignored, A <string> .Ignored, A <bool> .Ignored)).MustHaveHappenedOnceExactly();

            Assert.Equal(expectedStatusCode, result.Status);
            Assert.Equal(expectedIsHealthy, result.IsHealthy);
        }
        public async Task AjaxRequestServiceGetResponseTrowsExceptionForMissingAjaxRequestModel()
        {
            // Arrange
            var requestModel             = ValidRequestModel();
            AjaxRequestModel ajaxRequest = null;

            using var httpClient = new HttpClient();

            var ajaxRequestService = new AjaxRequestService(fakeLogger, fakeAppRegistryDataService, httpClient);

            // Act & Assert
            await Assert.ThrowsAnyAsync <ArgumentNullException>(async() => await ajaxRequestService.GetResponseAsync(requestModel, ajaxRequest));
        }
        public async Task AjaxRequestServiceGetResponseTrowsExceptionForMissingRequestModel()
        {
            // Arrange
            const bool   expectedIsHealthy = true;
            RequestModel requestModel      = null;
            var          ajaxRequest       = ValidAjaxRequestModel(expectedIsHealthy);

            using var httpClient = new HttpClient();

            var ajaxRequestService = new AjaxRequestService(fakeLogger, fakeAppRegistryDataService, httpClient);

            // Act & Assert
            await Assert.ThrowsAnyAsync <ArgumentNullException>(async() => await ajaxRequestService.GetResponseAsync(requestModel, ajaxRequest));
        }
        public async Task AjaxRequestServiceGetResponseReturnsSuccessWhenUnhealthy()
        {
            // Arrange
            const HttpStatusCode expectedStatusCode = HttpStatusCode.OK;
            const bool           expectedIsHealthy  = false;
            var requestModel = ValidRequestModel();
            var ajaxRequest  = ValidAjaxRequestModel(expectedIsHealthy);

            using var httpClient = new HttpClient();

            var ajaxRequestService = new AjaxRequestService(fakeLogger, fakeAppRegistryDataService, httpClient);

            // Act
            var result = await ajaxRequestService.GetResponseAsync(requestModel, ajaxRequest);

            // Assert
            A.CallTo(() => fakeAppRegistryDataService.SetAjaxRequestHealthState(A <string> .Ignored, A <string> .Ignored, A <bool> .Ignored)).MustNotHaveHappened();

            Assert.Equal(expectedStatusCode, result.Status);
            Assert.Equal(expectedIsHealthy, result.IsHealthy);
        }