public async Task UpdateTenantMinimal()
        {
            var handler = new MockMessageHandler()
            {
                Response = TenantResponse,
            };
            var auth = CreateFirebaseAuth(handler);
            var args = new TenantArgs()
            {
                DisplayName = "Test Tenant",
            };

            var provider = await auth.TenantManager.UpdateTenantAsync("tenant1", args);

            AssertTenant(provider);
            Assert.Equal(1, handler.Requests.Count);
            var request = handler.Requests[0];

            Assert.Equal(HttpUtils.Patch, request.Method);
            Assert.Equal(
                "/v2/projects/project1/tenants/tenant1?updateMask=displayName",
                request.Url.PathAndQuery);
            AssertClientVersionHeader(request);

            var body = NewtonsoftJsonSerializer.Instance.Deserialize <JObject>(
                handler.LastRequestBody);

            Assert.Single(body);
            Assert.Equal("Test Tenant", body["displayName"]);
        }
        public async Task CreateTenant()
        {
            var handler = new MockMessageHandler()
            {
                Response = TenantResponse,
            };
            var auth = CreateFirebaseAuth(handler);
            var args = new TenantArgs()
            {
                DisplayName            = "Test Tenant",
                PasswordSignUpAllowed  = true,
                EmailLinkSignInEnabled = true,
            };

            var provider = await auth.TenantManager.CreateTenantAsync(args);

            AssertTenant(provider);
            Assert.Equal(1, handler.Requests.Count);
            var request = handler.Requests[0];

            Assert.Equal(HttpMethod.Post, request.Method);
            Assert.Equal("/v2/projects/project1/tenants", request.Url.PathAndQuery);
            AssertClientVersionHeader(request);

            var body = NewtonsoftJsonSerializer.Instance.Deserialize <JObject>(
                handler.LastRequestBody);

            Assert.Equal(3, body.Count);
            Assert.Equal("Test Tenant", body["displayName"]);
            Assert.True((bool)body["allowPasswordSignup"]);
            Assert.True((bool)body["enableEmailLinkSignin"]);
        }
        public async Task UpdateTenant(TestConfig config)
        {
            var handler = new MockMessageHandler()
            {
                Response = TenantResponse,
            };
            var auth = config.CreateFirebaseAuth(handler);
            var args = new TenantArgs()
            {
                DisplayName            = "Test Tenant",
                PasswordSignUpAllowed  = true,
                EmailLinkSignInEnabled = true,
            };

            var provider = await auth.TenantManager.UpdateTenantAsync("tenant1", args);

            AssertTenant(provider);
            Assert.Equal(1, handler.Requests.Count);
            var request = handler.Requests[0];

            Assert.Equal(HttpUtils.Patch, request.Method);
            var mask = "allowPasswordSignup,displayName,enableEmailLinkSignin";

            config.AssertRequest($"tenants/tenant1?updateMask={mask}", request);

            var body = NewtonsoftJsonSerializer.Instance.Deserialize <JObject>(
                handler.LastRequestBody);

            Assert.Equal(3, body.Count);
            Assert.Equal("Test Tenant", body["displayName"]);
            Assert.True((bool)body["allowPasswordSignup"]);
            Assert.True((bool)body["enableEmailLinkSignin"]);
        }
        public async Task UpdateTenantNoId(string tenantId)
        {
            var auth = CreateFirebaseAuth();
            var args = new TenantArgs()
            {
                DisplayName = "Test Tenant",
            };

            var exception = await Assert.ThrowsAsync <ArgumentException>(
                () => auth.TenantManager.UpdateTenantAsync(tenantId, args));

            Assert.Equal("Tenant ID cannot be null or empty.", exception.Message);
        }
        public TenantFixture()
        {
            IntegrationTestUtils.EnsureDefaultApp();
            var tenantManager = FirebaseAuth.DefaultInstance.TenantManager;
            var args          = new TenantArgs
            {
                DisplayName            = "admin-dotnet-tenant",
                PasswordSignUpAllowed  = true,
                EmailLinkSignInEnabled = true,
            };

            this.Tenant   = tenantManager.CreateTenantAsync(args).Result;
            this.Auth     = tenantManager.AuthForTenant(this.Tenant.TenantId);
            this.TenantId = this.Tenant.TenantId;
        }
        public async Task UpdateTenant()
        {
            var args = new TenantArgs
            {
                DisplayName            = "new-dotnet-tenant",
                PasswordSignUpAllowed  = false,
                EmailLinkSignInEnabled = false,
            };

            var tenant = await FirebaseAuth.DefaultInstance.TenantManager
                         .UpdateTenantAsync(this.fixture.TenantId, args);

            Assert.Equal(this.fixture.TenantId, tenant.TenantId);
            Assert.Equal("new-dotnet-tenant", tenant.DisplayName);
            Assert.False(tenant.PasswordSignUpAllowed);
            Assert.False(tenant.EmailLinkSignInEnabled);
        }
        public async Task UpdateTenantError()
        {
            var handler = new MockMessageHandler()
            {
                StatusCode = HttpStatusCode.NotFound,
                Response   = TenantNotFoundResponse,
            };
            var auth = CreateFirebaseAuth(handler);
            var args = new TenantArgs()
            {
                DisplayName = "Test Tenant",
            };

            var exception = await Assert.ThrowsAsync <FirebaseAuthException>(
                () => auth.TenantManager.UpdateTenantAsync("tenant1", args));

            Assert.Equal(ErrorCode.NotFound, exception.ErrorCode);
            Assert.Equal(AuthErrorCode.TenantNotFound, exception.AuthErrorCode);
            Assert.Equal(
                "No tenant found for the given identifier (TENANT_NOT_FOUND).",
                exception.Message);
            Assert.NotNull(exception.HttpResponse);
            Assert.Null(exception.InnerException);
        }