public async Task Then_The_Endpoint_Is_Called_With_Authentication_Header_And_Data_Returned(
            List <string> testObject,
            EmployerDemandApi config)
        {
            //Arrange
            config.BaseUrl = $"https://{config.BaseUrl}/";
            var configMock = new Mock <IOptions <EmployerDemandApi> >();

            configMock.Setup(x => x.Value).Returns(config);
            var getTestRequest = new GetTestRequest();

            var response = new HttpResponseMessage
            {
                Content    = new StringContent(JsonConvert.SerializeObject(testObject)),
                StatusCode = HttpStatusCode.Accepted
            };
            var httpMessageHandler = MessageHandler.SetupMessageHandlerMock(response, config.BaseUrl + getTestRequest.GetUrl, config.Key, HttpMethod.Get);
            var client             = new HttpClient(httpMessageHandler.Object);
            var apiClient          = new ApiClient(client, configMock.Object);

            //Act
            var actual = await apiClient.Get <List <string> >(getTestRequest);

            //Assert
            actual.Should().BeEquivalentTo(testObject);
        }
        public void Then_If_It_Is_Not_Successful_An_Exception_Is_Thrown(
            PostData postContent,
            int id,
            EmployerDemandApi config)
        {
            //Arrange
            config.BaseUrl = $"https://{config.BaseUrl}/";
            var configMock = new Mock <IOptions <EmployerDemandApi> >();

            configMock.Setup(x => x.Value).Returns(config);
            var response = new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.BadRequest
            };
            var postTestRequest = new PostTestRequest(id)
            {
                Data = postContent
            };
            var expectedUrl        = config.BaseUrl + postTestRequest.PostUrl;
            var httpMessageHandler = MessageHandler.SetupMessageHandlerMock(response, expectedUrl, config.Key, HttpMethod.Post);
            var client             = new HttpClient(httpMessageHandler.Object);
            var apiClient          = new ApiClient(client, configMock.Object);

            //Act Assert
            Assert.ThrowsAsync <HttpRequestException>(() => apiClient.Post <Guid, PostData>(postTestRequest));
        }
        public async Task Then_The_Endpoint_Is_Called(
            Guid responseId,
            PostData postContent,
            int id,
            EmployerDemandApi config)
        {
            //Arrange
            config.BaseUrl = $"https://{config.BaseUrl}/";
            var configMock = new Mock <IOptions <EmployerDemandApi> >();

            configMock.Setup(x => x.Value).Returns(config);
            var response = new HttpResponseMessage
            {
                Content    = new StringContent($"'{responseId}'"),
                StatusCode = HttpStatusCode.Accepted
            };
            var postTestRequest = new PostTestRequest(id)
            {
                Data = postContent
            };
            var expectedUrl        = config.BaseUrl + postTestRequest.PostUrl;
            var httpMessageHandler = MessageHandler.SetupMessageHandlerMock(response, expectedUrl, config.Key, HttpMethod.Post);
            var client             = new HttpClient(httpMessageHandler.Object);
            var apiClient          = new ApiClient(client, configMock.Object);


            //Act
            var actual = await apiClient.Post <string, PostData>(postTestRequest);

            //Assert
            httpMessageHandler.Protected()
            .Verify <Task <HttpResponseMessage> >(
                "SendAsync", Times.Once(),
                ItExpr.Is <HttpRequestMessage>(c =>
                                               c.Method.Equals(HttpMethod.Post) &&
                                               c.RequestUri.AbsoluteUri.Contains(postTestRequest.PostUrl)),
                ItExpr.IsAny <CancellationToken>()
                );
            Guid.Parse(actual).Should().Be(responseId);
        }
        public void Then_If_It_Is_Not_Successful_An_Exception_Is_Thrown(
            EmployerDemandApi config)
        {
            //Arrange
            config.BaseUrl = $"https://{config.BaseUrl}/";
            var configMock = new Mock <IOptions <EmployerDemandApi> >();

            configMock.Setup(x => x.Value).Returns(config);
            var getTestRequest = new GetTestRequest();
            var response       = new HttpResponseMessage
            {
                Content    = new StringContent(""),
                StatusCode = HttpStatusCode.BadRequest
            };

            var httpMessageHandler = MessageHandler.SetupMessageHandlerMock(response, config.BaseUrl + getTestRequest.GetUrl, config.Key, HttpMethod.Get);
            var client             = new HttpClient(httpMessageHandler.Object);
            var apiClient          = new ApiClient(client, configMock.Object);

            //Act Assert
            Assert.ThrowsAsync <HttpRequestException>(() => apiClient.Get <List <string> >(getTestRequest));
        }
        public async Task Then_If_It_Is_Not_Found_Default_Is_Returned(
            EmployerDemandApi config)
        {
            //Arrange
            config.BaseUrl = $"https://{config.BaseUrl}/";
            var configMock = new Mock <IOptions <EmployerDemandApi> >();

            configMock.Setup(x => x.Value).Returns(config);
            var getTestRequest = new GetTestRequest();
            var response       = new HttpResponseMessage
            {
                Content    = new StringContent(""),
                StatusCode = HttpStatusCode.NotFound
            };

            var httpMessageHandler = MessageHandler.SetupMessageHandlerMock(response, config.BaseUrl + getTestRequest.GetUrl, config.Key, HttpMethod.Get);
            var client             = new HttpClient(httpMessageHandler.Object);
            var apiClient          = new ApiClient(client, configMock.Object);

            //Act Assert
            var actual = await apiClient.Get <List <string> >(getTestRequest);

            actual.Should().BeNull();
        }
 public ApiClient(HttpClient httpClient, IOptions <EmployerDemandApi> config)
 {
     _httpClient             = httpClient;
     _config                 = config.Value;
     _httpClient.BaseAddress = new Uri(_config.BaseUrl);
 }