public async Task ExecuteHappyPathRawContract()
        {
            var(messageData, metaData) = EventHandlerTestHelper.CreateMessageDataPayload();

            var config = new WebhookConfig
            {
                Uri                  = "http://localhost/webhook",
                HttpMethod           = HttpMethod.Put,
                EventType            = "Event1",
                AuthenticationConfig = new AuthenticationConfig(),
                WebhookRequestRules  = new List <WebhookRequestRule>
                {
                    new WebhookRequestRule
                    {
                        Source = new ParserLocation
                        {
                            Path = "OrderCode"
                        },
                        Destination = new ParserLocation
                        {
                            Location = Location.Uri
                        }
                    }
                }
            };

            var mockHttp       = new MockHttpMessageHandler();
            var webhookRequest = mockHttp.When(HttpMethod.Put, $"{config.Uri}/{metaData["OrderCode"]}")
                                 .WithContentType("application/json", messageData.Payload)
                                 .Respond(HttpStatusCode.OK, "application/json", string.Empty);

            var mockBigBrother = new Mock <IBigBrother>();
            var httpClients    = new Dictionary <string, HttpClient> {
                { new Uri(config.Uri).Host, mockHttp.ToHttpClient() }
            };

            var httpClientBuilder = new HttpClientFactory(httpClients);
            var requestBuilder    = new RequestBuilder();
            var requestLogger     = new RequestLogger(mockBigBrother.Object);

            var genericWebhookHandler = new GenericWebhookHandler(
                httpClientBuilder,
                new Mock <IAuthenticationHandlerFactory>().Object,
                requestBuilder,
                requestLogger,
                mockBigBrother.Object,
                config);

            await genericWebhookHandler.CallAsync(messageData, new Dictionary <string, object>(), _cancellationToken);

            Assert.Equal(1, mockHttp.GetMatchCount(webhookRequest));
        }
        public async Task ExecuteHappyPath()
        {
            var(messageData, metaData) = EventHandlerTestHelper.CreateMessageDataPayload();

            var config = new WebhookConfig
            {
                Uri                  = "http://localhost/webhook",
                HttpVerb             = HttpVerb.Put,
                AuthenticationConfig = new AuthenticationConfig(),
                WebhookRequestRules  = new List <WebhookRequestRule>
                {
                    new WebhookRequestRule
                    {
                        Source = new ParserLocation
                        {
                            Path = "OrderCode"
                        },
                        Destination = new ParserLocation
                        {
                            Location = Location.Uri
                        }
                    }
                }
            };

            var mockHttp       = new MockHttpMessageHandler();
            var webhookRequest = mockHttp.When(HttpMethod.Put, $"{config.Uri}/{metaData["OrderCode"]}")
                                 .WithContentType("application/json", messageData.Payload)
                                 .Respond(HttpStatusCode.OK, "application/json", string.Empty);

            var genericWebhookHandler = new GenericWebhookHandler(
                new Mock <IAcquireTokenHandler>().Object,
                new RequestBuilder(),
                new Mock <IBigBrother>().Object,
                mockHttp.ToHttpClient(),
                config);

            await genericWebhookHandler.Call(messageData);

            Assert.Equal(1, mockHttp.GetMatchCount(webhookRequest));
        }
        public async Task ExecuteDeliveryFailurePath()
        {
            var(messageData, metaData) = EventHandlerTestHelper.CreateMessageDataPayload();

            messageData.IsDlq = true;

            var config = new WebhookConfig
            {
                Uri                   = "http://localhost/webhook",
                HttpMethod            = HttpMethod.Put,
                EventType             = "Event1",
                PayloadTransformation = PayloadContractTypeEnum.WrapperContract,
                AuthenticationConfig  = new AuthenticationConfig(),
                WebhookRequestRules   = new List <WebhookRequestRule>
                {
                    new WebhookRequestRule
                    {
                        Source = new ParserLocation
                        {
                            Path = "OrderCode"
                        },
                        Destination = new ParserLocation
                        {
                            Location = Location.Uri
                        }
                    }
                }
            };

            var mockHttp = new MockHttpMessageHandler();

            var webhookRequest = mockHttp.Expect(HttpMethod.Put, $"{config.Uri}/{metaData["OrderCode"]}")
                                 .With((m) =>
            {
                var str = m.Content.ReadAsStringAsync().ConfigureAwait(false).GetAwaiter().GetResult();
                using (var sr = new StringReader(str))
                {
                    using (var jr = new JsonTextReader(sr))
                    {
                        var wrapperObj = JsonSerializer.CreateDefault().Deserialize <WrapperPayloadContract>(jr);
                        return(JToken.DeepEquals(wrapperObj.Payload, JObject.Parse(messageData.Payload)) && wrapperObj.CallbackType == CallbackTypeEnum.DeliveryFailure);
                    }
                }
            })
                                 .Respond(HttpStatusCode.OK, "application/json", string.Empty);

            var mockBigBrother = new Mock <IBigBrother>();
            var httpClients    = new Dictionary <string, HttpClient> {
                { new Uri(config.Uri).Host, mockHttp.ToHttpClient() }
            };

            var httpClientBuilder = new HttpClientFactory(httpClients);
            var requestBuilder    = new RequestBuilder();
            var requestLogger     = new RequestLogger(mockBigBrother.Object);

            var genericWebhookHandler = new GenericWebhookHandler(
                httpClientBuilder,
                new Mock <IAuthenticationHandlerFactory>().Object,
                requestBuilder,
                requestLogger,
                mockBigBrother.Object,
                config);

            await genericWebhookHandler.CallAsync(messageData, new Dictionary <string, object>(), _cancellationToken);

            Assert.Equal(1, mockHttp.GetMatchCount(webhookRequest));
        }