public async Task ResolveCurrentAsync_ValidatesArguments()
        {
            // Arrange
            var featureStateProvider = CreateFeatureStateProvider();
            var resolver             = new TenantResolver(featureStateProvider);

            // Act

            // Assert
            await Assert.ThrowsAsync <ArgumentNullException>(async() => await resolver.ResolveCurrentAsync(null /* httpContext */));
        }
        public async Task ResolveCurrentAsync_ReturnsDefault_IfTenancyNotEnabled()
        {
            // Arrange
            var configuration = CreateConfiguration(new Dictionary <string, string>
            {
                ["Features:Core.Tenancy:Enabled"] = "false"
            });
            var featureStateProvider = CreateFeatureStateProvider(
                state: new FeatureState(CoreInfo.TenancyFeatureId, configuration.GetSection("Features:Core.Tenancy"), false));
            var httpContext = CreateHttpContext(new HostString("localhost:5000"));
            var resolver    = new TenantResolver(featureStateProvider);

            // Act
            var tenantId = await resolver.ResolveCurrentAsync(httpContext);

            // Assert
            Assert.Equal(TenantId.Default, tenantId);
        }
        public async Task ResolveCurrentAsync_ReturnsEmpty_ForMissingTenantId()
        {
            // Arrange
            var configuration = CreateConfiguration(new Dictionary <string, string>
            {
                ["Features:Core.Tenancy:Enabled"] = "true",
                ["Features:Core.Tenancy:Tenants:Tenant01:HostNames:0"] = "localhost:5000"
            });
            var featureStateProvider = CreateFeatureStateProvider(
                state: new FeatureState(CoreInfo.TenancyFeatureId, configuration.GetSection("Features:Core.Tenancy"), true));
            var httpContext = CreateHttpContext(new HostString("localhost:5001"));
            var resolver    = new TenantResolver(featureStateProvider);

            // Act
            var tenantId = await resolver.ResolveCurrentAsync(httpContext);

            // Assert
            Assert.Equal(TenantId.Empty, tenantId);
        }
        public async Task ResolveCurrentAsync_BeginsFeatureStateTenantScope_ForMatchingHostName()
        {
            // Arrange
            var matchedTenantId = TenantId.Empty;
            var configuration   = CreateConfiguration(new Dictionary <string, string>
            {
                ["Features:Core.Tenancy:Enabled"] = "true",
                ["Features:Core.Tenancy:Tenants:Tenant01:HostNames:0"] = "localhost:5000"
            });
            var featureStateProvider = CreateFeatureStateProvider(
                state: new FeatureState(CoreInfo.TenancyFeatureId, configuration.GetSection("Features:Core.Tenancy"), true),
                onBeginTenantScope: t => matchedTenantId = t);
            var httpContext = CreateHttpContext(new HostString("localhost:5000"));
            var resolver    = new TenantResolver(featureStateProvider);

            // Act
            var tenantId = await resolver.ResolveCurrentAsync(httpContext);

            // Assert
            Assert.Equal(tenantId, matchedTenantId);
        }