public async Task DispatcherMappingTest(string category, string @event, bool throwException)
        {
            var resolve     = new TestRequestResolver();
            var dispatcher  = new SignalRTriggerDispatcher(resolve);
            var key         = (hub : Guid.NewGuid().ToString(), category, @event);
            var tcs         = new TaskCompletionSource <ITriggeredFunctionExecutor>(TaskCreationOptions.RunContinuationsAsynchronously);
            var executorMoc = new Mock <ITriggeredFunctionExecutor>();

            executorMoc.Setup(f => f.TryExecuteAsync(It.IsAny <TriggeredFunctionData>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(new FunctionResult(true)));
            var executor = executorMoc.Object;

            if (throwException)
            {
                Assert.ThrowsAny <Exception>(() => dispatcher.Map(key, new ExecutionContext {
                    Executor = executor, AccessKeys = null
                }));
                return;
            }

            dispatcher.Map(key, new ExecutionContext {
                Executor = executor, AccessKeys = null
            });
            var request = TestHelpers.CreateHttpRequestMessage(key.hub, key.category, key.@event, Guid.NewGuid().ToString());
            await dispatcher.ExecuteAsync(request);

            executorMoc.Verify(e => e.TryExecuteAsync(It.IsAny <TriggeredFunctionData>(), It.IsAny <CancellationToken>()), Times.Once);

            // We can handle different word cases
            request = TestHelpers.CreateHttpRequestMessage(key.hub.ToUpper(), key.category.ToUpper(), [email protected](), Guid.NewGuid().ToString());
            await dispatcher.ExecuteAsync(request);

            executorMoc.Verify(e => e.TryExecuteAsync(It.IsAny <TriggeredFunctionData>(), It.IsAny <CancellationToken>()), Times.Exactly(2));
        }
        public async Task ResolverInfluenceTests(string category, string @event, bool throwException)
        {
            if (throwException)
            {
                return;
            }
            var resolver    = new TestRequestResolver();
            var dispatcher  = new SignalRTriggerDispatcher(resolver);
            var key         = (hub : Guid.NewGuid().ToString(), category, @event);
            var tcs         = new TaskCompletionSource <ITriggeredFunctionExecutor>(TaskCreationOptions.RunContinuationsAsynchronously);
            var executorMoc = new Mock <ITriggeredFunctionExecutor>();

            executorMoc.Setup(f => f.TryExecuteAsync(It.IsAny <TriggeredFunctionData>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(new FunctionResult(true)));
            var executor = executorMoc.Object;

            dispatcher.Map(key, new ExecutionContext {
                Executor = executor, AccessKeys = null
            });

            // Test content type
            resolver.ValidateContentTypeResult = false;
            var request = TestHelpers.CreateHttpRequestMessage(key.hub, key.category, key.@event, Guid.NewGuid().ToString());
            var res     = await dispatcher.ExecuteAsync(request);

            Assert.Equal(HttpStatusCode.UnsupportedMediaType, res.StatusCode);
            resolver.ValidateContentTypeResult = true;

            // Test signature
            resolver.ValidateSignatureResult = false;
            request = TestHelpers.CreateHttpRequestMessage(key.hub, key.category, key.@event, Guid.NewGuid().ToString());
            res     = await dispatcher.ExecuteAsync(request);

            Assert.Equal(HttpStatusCode.Unauthorized, res.StatusCode);
            resolver.ValidateSignatureResult = true;

            // Test GetInvocationContext
            resolver.GetInvocationContextResult = false;
            request = TestHelpers.CreateHttpRequestMessage(key.hub, key.category, key.@event, Guid.NewGuid().ToString());
            res     = await dispatcher.ExecuteAsync(request);

            Assert.Equal(HttpStatusCode.InternalServerError, res.StatusCode);
            resolver.GetInvocationContextResult = true;
        }