public async Task TestResolutionMiddleware_WithUriResolver_TenantDoesNotExist_ShouldThrowArgumentNullException()
        {
            // Arrange
            IOwinRequest        request     = Mock.Of <IOwinRequest>();
            Mock <IOwinRequest> requestMock = Mock.Get(request);

            requestMock.Setup(_ => _.Uri).Returns(new Uri($"https://tenant3.dimescheduler.com"));
            requestMock.Setup(_ => _.User.Identity.IsAuthenticated).Returns(true);
            requestMock.Setup(_ => _.Headers.Append(It.IsAny <string>(), It.IsAny <string>()));

            OwinResponse response = new OwinResponse();

            ConcurrentDictionary <string, object> owinEnvironment = new ConcurrentDictionary <string, object>();

            owinEnvironment.TryAdd("uri", $"https://tenant3.dimescheduler.com");
            OwinContext        context     = Mock.Of <OwinContext>();
            Mock <OwinContext> contextMock = Mock.Get(context);

            contextMock.CallBase = true;
            contextMock.Setup(_ => _.Environment).Returns(owinEnvironment);
            contextMock.Setup(_ => _.Request).Returns(request);
            contextMock.Setup(_ => _.Response).Returns(response);

            Func <IDictionary <string, object>, Task> next = _ => Task.FromResult((object)null);
            TenantResolutionMiddleware <Tenant>       multiTenancyMiddleware = new TenantResolutionMiddleware <Tenant>(next, () => new TenantResolver());

            // Assert
            await Assert.ThrowsExceptionAsync <ArgumentNullException>(async() => await multiTenancyMiddleware.Invoke(context.Environment));
        }
        public async Task TestResolutionMiddleware_WithUriResolver_ShouldResolveTenants(string subdomain, string name)
        {
            // Arrange
            IOwinRequest        request     = Mock.Of <IOwinRequest>();
            Mock <IOwinRequest> requestMock = Mock.Get(request);

            requestMock.Setup(_ => _.Uri).Returns(new Uri($"https://{subdomain}.dimescheduler.com"));
            requestMock.Setup(_ => _.User.Identity.IsAuthenticated).Returns(true);
            requestMock.Setup(_ => _.Headers.Append(It.IsAny <string>(), It.IsAny <string>()));

            OwinResponse response = new OwinResponse();

            ConcurrentDictionary <string, object> owinEnvironment = new ConcurrentDictionary <string, object>();

            owinEnvironment.TryAdd("uri", $"https://{subdomain}.dimescheduler.com");
            OwinContext        context     = Mock.Of <OwinContext>();
            Mock <OwinContext> contextMock = Mock.Get(context);

            contextMock.CallBase = true;
            contextMock.Setup(_ => _.Environment).Returns(owinEnvironment);
            contextMock.Setup(_ => _.Request).Returns(request);
            contextMock.Setup(_ => _.Response).Returns(response);

            Func <IDictionary <string, object>, Task> next = _ => Task.FromResult((object)null);
            TenantResolutionMiddleware <Tenant>       multiTenancyMiddleware = new TenantResolutionMiddleware <Tenant>(next, () => new TenantResolver());

            // Act
            await multiTenancyMiddleware.Invoke(context.Environment);

            TenantContext <Tenant> tenantContext = context.Environment.GetTenantContext <Tenant>();

            // Assert
            Assert.IsTrue(tenantContext.Tenant.Name == name);
        }