public async Task ThrowsError_If_EventType_IsMissing()
        {
            var config = new EventGridOutputConfiguration()
            {
                SasKey        = "1234594949=",
                TopicEndpoint = "https://xxxx.westeurope-1.eventgrid.azure.net/api/events",
                Subject       = "Test/1"
            };

            var attr = new EventGridOutputAttribute()
            {
            };

            HttpRequestMessage message = null;
            var httpMessageHandler     = new HttpMessageHandlerMock()
                                         .SetupHandler(req =>
            {
                message = req;
                return(new HttpResponseMessage(HttpStatusCode.OK));
            });

            var httpClient = new HttpClient(httpMessageHandler);

            var httpClientFactory = new Mock <IHttpClientFactory>();

            var target = new EventGridOutputAsyncCollector(config, attr, httpClientFactory.Object);

            var exception = await Assert.ThrowsAsync <ArgumentException>(() => target.AddAsync(new EventGridOutput(new { test = true })));

            Assert.Equal("eventType", exception.ParamName);
        }
        public async Task SendsMessage_If_All_IsCorrect()
        {
            var config = new EventGridOutputConfiguration()
            {
                SasKey        = "1234594949=",
                TopicEndpoint = "https://xxxx.westeurope-1.eventgrid.azure.net/api/events",
                EventType     = "My.Test",
                Subject       = "Test/1"
            };

            var attr = new EventGridOutputAttribute()
            {
            };

            HttpRequestMessage message = null;
            var httpMessageHandler     = new HttpMessageHandlerMock()
                                         .SetupHandler(req =>
            {
                message = req;
                return(new HttpResponseMessage(HttpStatusCode.OK));
            });

            var httpClient = new HttpClient(httpMessageHandler);

            var httpClientFactory = new Mock <IHttpClientFactory>();

            httpClientFactory.Setup(x => x.Create()).Returns(httpClient);

            var target = new EventGridOutputAsyncCollector(config, attr, httpClientFactory.Object);

            await target.AddAsync(new EventGridOutput(new { test = true }));

            await target.FlushAsync();


            httpClientFactory.VerifyAll();

            Assert.True(message.Content.Headers.Contains("aeg-sas-key"), "aeg-sas-key header is missing");
            Assert.Equal(message.Content.Headers.GetValues("aeg-sas-key").First(), config.SasKey);
            Assert.NotNull(message);
            Assert.Equal("https://xxxx.westeurope-1.eventgrid.azure.net/api/events", message.RequestUri.ToString());
            Assert.Equal(HttpMethod.Post, message.Method);
            Assert.NotNull(message.Content);
            var requestBody = await((StringContent)message.Content).ReadAsStringAsync();
            var requestJson = (JArray)JsonConvert.DeserializeObject(requestBody);

            Assert.Single(requestJson);
            Assert.True(!string.IsNullOrEmpty(requestJson[0]["data"].ToString()), "Required EventGrid property data was not sent");
            Assert.True(!string.IsNullOrEmpty(requestJson[0]["id"].ToString()), "Required EventGrid property id was not sent");
            Assert.True(!string.IsNullOrEmpty(requestJson[0]["eventTime"].ToString()), "Required EventGrid property eventTime was not sent");
            Assert.Equal(config.EventType, requestJson[0]["eventType"].ToString());
            Assert.Equal(config.Subject, requestJson[0]["subject"].ToString());
            Assert.Equal("true", requestJson[0]["data"]["test"].ToString().ToLowerInvariant());
        }
        public async Task ThrowsError_If_SasKey_IsMissing()
        {
            var config = new EventGridOutputConfiguration()
            {
                EventType = "My.Test",
                Subject   = "Test/1"
            };

            var attr = new EventGridOutputAttribute()
            {
            };

            var httpClientFactory = new Mock <IHttpClientFactory>();

            var target = new EventGridOutputAsyncCollector(config, attr, httpClientFactory.Object);

            await target.AddAsync(new EventGridOutput(new { test = true }));

            var exception = await Assert.ThrowsAsync <ArgumentException>(() => target.FlushAsync());

            Assert.Equal("sasKey", exception.ParamName);
        }
        public async Task Do_Nothing_If_No_Event_Was_Created()
        {
            var config = new EventGridOutputConfiguration()
            {
                SasKey        = "1234594949=",
                TopicEndpoint = "https://xxxx.westeurope-1.eventgrid.azure.net/api/events",
                EventType     = "My.Test",
                Subject       = "Test/1"
            };

            var attr = new EventGridOutputAttribute()
            {
            };

            HttpRequestMessage message = null;
            var httpMessageHandler     = new HttpMessageHandlerMock()
                                         .SetupHandler(req =>
            {
                message = req;
                return(new HttpResponseMessage(HttpStatusCode.OK));
            });

            var httpClient = new HttpClient(httpMessageHandler);

            var httpClientFactory = new Mock <IHttpClientFactory>();

            httpClientFactory.Setup(x => x.Create()).Returns(httpClient);

            var target = new EventGridOutputAsyncCollector(config, attr, httpClientFactory.Object);

            await target.FlushAsync();


            //httpClientFactory.VerifyAll();

            Assert.Null(message);
        }