public async Task CreateConfigUnknownError()
        {
            var handler = new MockMessageHandler()
            {
                StatusCode = HttpStatusCode.InternalServerError,
                Response   = ProviderConfigTestUtils.UnknownErrorResponse,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var args = new SamlProviderConfigArgs()
            {
                ProviderId       = "saml.minimal-provider",
                IdpEntityId      = "IDP_ENTITY_ID",
                SsoUrl           = "https://example.com/login",
                X509Certificates = new List <string>()
                {
                    "CERT1", "CERT2"
                },
                RpEntityId  = "RP_ENTITY_ID",
                CallbackUrl = "https://projectId.firebaseapp.com/__/auth/handler",
            };

            var exception = await Assert.ThrowsAsync <FirebaseAuthException>(
                () => auth.CreateProviderConfigAsync(args));

            Assert.Equal(ErrorCode.Internal, exception.ErrorCode);
            Assert.Null(exception.AuthErrorCode);
            Assert.StartsWith(
                "Unexpected HTTP response with status: 500 (InternalServerError)",
                exception.Message);
            Assert.NotNull(exception.HttpResponse);
            Assert.Null(exception.InnerException);
        }
        public async Task UpdateConfigMinimal()
        {
            var handler = new MockMessageHandler()
            {
                Response = OidcProviderConfigResponse,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var args = new OidcProviderConfigArgs()
            {
                ProviderId = "oidc.minimal-provider",
                ClientId = "CLIENT_ID",
            };

            var provider = await auth.UpdateProviderConfigAsync(args);

            this.AssertOidcProviderConfig(provider);
            Assert.Equal(1, handler.Requests.Count);
            var request = handler.Requests[0];
            Assert.Equal(ProviderConfigTestUtils.PatchMethod, request.Method);
            Assert.Equal(
                "/v2/projects/project1/oauthIdpConfigs/oidc.minimal-provider?updateMask=clientId",
                request.Url.PathAndQuery);
            ProviderConfigTestUtils.AssertClientVersionHeader(request);

            var body = NewtonsoftJsonSerializer.Instance.Deserialize<JObject>(
                handler.LastRequestBody);
            Assert.Single(body);
            Assert.Equal("CLIENT_ID", body["clientId"]);
        }
        public async Task UpdateConfigNullArgs()
        {
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth();

            await Assert.ThrowsAsync<ArgumentNullException>(
                () => auth.UpdateProviderConfigAsync(null as OidcProviderConfigArgs));
        }
        public async Task CreateConfig()
        {
            var handler = new MockMessageHandler()
            {
                Response = OidcProviderConfigResponse,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var args = new OidcProviderConfigArgs()
            {
                ProviderId = "oidc.provider",
                DisplayName = "oidcProviderName",
                Enabled = true,
                ClientId = "CLIENT_ID",
                Issuer = "https://oidc.com/issuer",
            };

            var provider = await auth.CreateProviderConfigAsync(args);

            this.AssertOidcProviderConfig(provider);
            Assert.Equal(1, handler.Requests.Count);
            var request = handler.Requests[0];
            Assert.Equal(HttpMethod.Post, request.Method);
            Assert.Equal(
                "/v2/projects/project1/oauthIdpConfigs?oauthIdpConfigId=oidc.provider",
                request.Url.PathAndQuery);
            ProviderConfigTestUtils.AssertClientVersionHeader(request);

            var body = NewtonsoftJsonSerializer.Instance.Deserialize<JObject>(
                handler.LastRequestBody);
            Assert.Equal(4, body.Count);
            Assert.Equal("oidcProviderName", body["displayName"]);
            Assert.True((bool)body["enabled"]);
            Assert.Equal("CLIENT_ID", body["clientId"]);
            Assert.Equal("https://oidc.com/issuer", body["issuer"]);
        }
        public async Task CreateConfigUnknownError()
        {
            var handler = new MockMessageHandler()
            {
                StatusCode = HttpStatusCode.InternalServerError,
                Response = ProviderConfigTestUtils.UnknownErrorResponse,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var args = new OidcProviderConfigArgs()
            {
                ProviderId = "oidc.provider",
                ClientId = "CLIENT_ID",
                Issuer = "https://oidc.com/issuer",
            };

            var exception = await Assert.ThrowsAsync<FirebaseAuthException>(
                () => auth.CreateProviderConfigAsync(args));
            Assert.Equal(ErrorCode.Internal, exception.ErrorCode);
            Assert.Null(exception.AuthErrorCode);
            Assert.StartsWith(
                "Unexpected HTTP response with status: 500 (InternalServerError)",
                exception.Message);
            Assert.NotNull(exception.HttpResponse);
            Assert.Null(exception.InnerException);
        }
        public async Task ListConfigs()
        {
            var handler = new MockMessageHandler()
            {
                Response = ListConfigsResponses,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var configs = new List<OidcProviderConfig>();

            var pagedEnumerable = auth.ListOidcProviderConfigsAsync(null);
            var enumerator = pagedEnumerable.GetEnumerator();
            while (await enumerator.MoveNext())
            {
                configs.Add(enumerator.Current);
            }

            Assert.Equal(5, configs.Count);
            Assert.All(configs, this.AssertOidcProviderConfig);

            Assert.Equal(2, handler.Requests.Count);
            var query = ProviderConfigTestUtils.ExtractQueryParams(handler.Requests[0]);
            Assert.Single(query);
            Assert.Equal("100", query["pageSize"]);

            query = ProviderConfigTestUtils.ExtractQueryParams(handler.Requests[1]);
            Assert.Equal(2, query.Count);
            Assert.Equal("100", query["pageSize"]);
            Assert.Equal("token", query["pageToken"]);

            Assert.All(handler.Requests, ProviderConfigTestUtils.AssertClientVersionHeader);
        }
        public async Task DeleteConfigNoProviderId(string providerId)
        {
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth();

            await Assert.ThrowsAsync<ArgumentException>(
                () => auth.DeleteProviderConfigAsync(providerId));
        }
        public void ListOidcForEach()
        {
            var handler = new MockMessageHandler()
            {
                Response = ListConfigsResponses,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var configs = new List<OidcProviderConfig>();

            var pagedEnumerable = auth.ListOidcProviderConfigsAsync(null);
            foreach (var user in pagedEnumerable.ToEnumerable())
            {
                configs.Add(user);
            }

            Assert.Equal(5, configs.Count);
            Assert.All(configs, this.AssertOidcProviderConfig);

            Assert.Equal(2, handler.Requests.Count);
            var query = ProviderConfigTestUtils.ExtractQueryParams(handler.Requests[0]);
            Assert.Single(query);
            Assert.Equal("100", query["pageSize"]);

            query = ProviderConfigTestUtils.ExtractQueryParams(handler.Requests[1]);
            Assert.Equal(2, query.Count);
            Assert.Equal("100", query["pageSize"]);
            Assert.Equal("token", query["pageToken"]);

            Assert.All(handler.Requests, ProviderConfigTestUtils.AssertClientVersionHeader);
        }
        public async Task UpdateConfigMinimal()
        {
            var handler = new MockMessageHandler()
            {
                Response = SamlProviderConfigResponse,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var args = new SamlProviderConfigArgs()
            {
                ProviderId  = "saml.minimal-provider",
                IdpEntityId = "IDP_ENTITY_ID",
            };

            var provider = await auth.UpdateProviderConfigAsync(args);

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

            Assert.Equal(ProviderConfigTestUtils.PatchMethod, request.Method);
            Assert.Equal(
                "/v2/projects/project1/inboundSamlConfigs/saml.minimal-provider?updateMask=idpConfig.idpEntityId",
                request.Url.PathAndQuery);
            ProviderConfigTestUtils.AssertClientVersionHeader(request);

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

            Assert.Single(body);
            var idpConfig = (JObject)body["idpConfig"];

            Assert.Equal("IDP_ENTITY_ID", idpConfig["idpEntityId"]);
        }
        public async Task ListOidcAsRawResponses()
        {
            var handler = new MockMessageHandler()
            {
                Response = ListConfigsResponses,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var configs = new List<OidcProviderConfig>();
            var tokens = new List<string>();

            var pagedEnumerable = auth.ListOidcProviderConfigsAsync(null);
            var responses = pagedEnumerable.AsRawResponses().GetEnumerator();
            while (await responses.MoveNext())
            {
                configs.AddRange(responses.Current.ProviderConfigs);
                tokens.Add(responses.Current.NextPageToken);
                Assert.Equal(tokens.Count, handler.Requests.Count);
            }

            Assert.Equal(new List<string>() { "token", null }, tokens);
            Assert.Equal(5, configs.Count);
            Assert.All(configs, this.AssertOidcProviderConfig);

            Assert.Equal(2, handler.Requests.Count);
            var query = ProviderConfigTestUtils.ExtractQueryParams(handler.Requests[0]);
            Assert.Single(query);
            Assert.Equal("100", query["pageSize"]);

            query = ProviderConfigTestUtils.ExtractQueryParams(handler.Requests[1]);
            Assert.Equal(2, query.Count);
            Assert.Equal("100", query["pageSize"]);
            Assert.Equal("token", query["pageToken"]);
        }
        public async Task UpdateConfigNotFoundError()
        {
            var handler = new MockMessageHandler()
            {
                StatusCode = HttpStatusCode.NotFound,
                Response = ProviderConfigTestUtils.ConfigNotFoundResponse,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var args = new OidcProviderConfigArgs()
            {
                ProviderId = "oidc.provider",
                ClientId = "CLIENT_ID",
            };

            var exception = await Assert.ThrowsAsync<FirebaseAuthException>(
                () => auth.UpdateProviderConfigAsync(args));

            Assert.Equal(ErrorCode.NotFound, exception.ErrorCode);
            Assert.Equal(AuthErrorCode.ConfigurationNotFound, exception.AuthErrorCode);
            Assert.Equal(
                "No identity provider configuration found for the given identifier "
                + "(CONFIGURATION_NOT_FOUND).",
                exception.Message);
            Assert.NotNull(exception.HttpResponse);
            Assert.Null(exception.InnerException);
        }
        public async Task UpdateConfigInvalidArgs(OidcProviderConfigArgs args, string expected)
        {
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth();

            var exception = await Assert.ThrowsAsync<ArgumentException>(
                () => auth.UpdateProviderConfigAsync(args));
            Assert.Equal(expected, exception.Message);
        }
        public async Task GetConfigInvalidProviderId()
        {
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth();

            var exception = await Assert.ThrowsAsync<ArgumentException>(
                () => auth.GetOidcProviderConfigAsync("saml.provider"));
            Assert.Equal("OIDC provider ID must have the prefix 'oidc.'.", exception.Message);
        }
        public async Task GetConfigNoProviderId(string providerId)
        {
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth();

            var exception = await Assert.ThrowsAsync<ArgumentException>(
                () => auth.GetOidcProviderConfigAsync(providerId));
            Assert.Equal("Provider ID cannot be null or empty.", exception.Message);
        }
        public async Task DeleteConfigInvalidProviderId()
        {
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth();

            var exception = await Assert.ThrowsAsync<ArgumentException>(
                () => auth.DeleteProviderConfigAsync("unknown.provider"));
            Assert.Equal(
                "Provider ID must have 'oidc.' or 'saml.' as the prefix.",
                exception.Message);
        }
        public async Task ListOidcReadPageSizeTooLarge()
        {
            var handler = new MockMessageHandler()
            {
                Response = ListConfigsResponses,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var pagedEnumerable = auth.ListOidcProviderConfigsAsync(null);

            await Assert.ThrowsAsync<ArgumentException>(
                async () => await pagedEnumerable.ReadPageAsync(101));

            Assert.Empty(handler.Requests);
        }
        public void ListOidcInvalidOptions(ListProviderConfigsOptions options, string expected)
        {
            var handler = new MockMessageHandler()
            {
                Response = ListConfigsResponses,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);

            var exception = Assert.Throws<ArgumentException>(
                () => auth.ListOidcProviderConfigsAsync(options));

            Assert.Equal(expected, exception.Message);
            Assert.Empty(handler.Requests);
        }
        public async Task UpdateConfig()
        {
            var handler = new MockMessageHandler()
            {
                Response = SamlProviderConfigResponse,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var args = new SamlProviderConfigArgs()
            {
                ProviderId       = "saml.provider",
                DisplayName      = "samlProviderName",
                Enabled          = true,
                IdpEntityId      = "IDP_ENTITY_ID",
                SsoUrl           = "https://example.com/login",
                X509Certificates = new List <string>()
                {
                    "CERT1", "CERT2"
                },
                RpEntityId  = "RP_ENTITY_ID",
                CallbackUrl = "https://projectId.firebaseapp.com/__/auth/handler",
            };

            var provider = await auth.UpdateProviderConfigAsync(args);

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

            Assert.Equal(ProviderConfigTestUtils.PatchMethod, request.Method);
            var mask = "displayName,enabled,idpConfig.idpCertificates,idpConfig.idpEntityId,idpConfig.ssoUrl,"
                       + "spConfig.callbackUri,spConfig.spEntityId";

            Assert.Equal(
                $"/v2/projects/project1/inboundSamlConfigs/saml.provider?updateMask={mask}",
                request.Url.PathAndQuery);
            ProviderConfigTestUtils.AssertClientVersionHeader(request);

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

            Assert.Equal(4, body.Count);
            Assert.Equal("samlProviderName", body["displayName"]);
            Assert.True((bool)body["enabled"]);
            this.AssertIdpConfig((JObject)body["idpConfig"]);
            this.AssertSpConfig((JObject)body["spConfig"]);
        }
        public async Task DeleteConfig()
        {
            var handler = new MockMessageHandler()
            {
                Response = "{}",
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);

            await auth.DeleteProviderConfigAsync("oidc.provider");

            Assert.Equal(1, handler.Requests.Count);
            var request = handler.Requests[0];
            Assert.Equal(HttpMethod.Delete, request.Method);
            Assert.Equal(
                "/v2/projects/project1/oauthIdpConfigs/oidc.provider",
                request.Url.PathAndQuery);
            ProviderConfigTestUtils.AssertClientVersionHeader(request);
        }
        public async Task ListSamlByPages()
        {
            var handler = new MockMessageHandler()
            {
                Response = ListConfigsResponses,
            };
            var auth    = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var configs = new List <SamlProviderConfig>();

            // Read page 1.
            var pagedEnumerable = auth.ListSamlProviderConfigsAsync(null);
            var configPage      = await pagedEnumerable.ReadPageAsync(3);

            Assert.Equal(3, configPage.Count());
            Assert.Equal("token", configPage.NextPageToken);

            Assert.Single(handler.Requests);
            var query = ProviderConfigTestUtils.ExtractQueryParams(handler.Requests[0]);

            Assert.Single(query);
            Assert.Equal("3", query["pageSize"]);
            configs.AddRange(configPage);

            // Read page 2.
            pagedEnumerable = auth.ListSamlProviderConfigsAsync(new ListProviderConfigsOptions()
            {
                PageToken = configPage.NextPageToken,
            });
            configPage = await pagedEnumerable.ReadPageAsync(3);

            Assert.Equal(2, configPage.Count());
            Assert.Null(configPage.NextPageToken);

            Assert.Equal(2, handler.Requests.Count);
            query = ProviderConfigTestUtils.ExtractQueryParams(handler.Requests[1]);
            Assert.Equal(2, query.Count);
            Assert.Equal("3", query["pageSize"]);
            Assert.Equal("token", query["pageToken"]);
            configs.AddRange(configPage);

            Assert.Equal(5, configs.Count);
            Assert.All(configs, this.AssertSamlProviderConfig);
        }
        public async Task GetConfig()
        {
            var handler = new MockMessageHandler()
            {
                Response = SamlProviderConfigResponse,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);

            var provider = await auth.GetSamlProviderConfigAsync("saml.provider");

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

            Assert.Equal(HttpMethod.Get, request.Method);
            Assert.Equal(
                "/v2/projects/project1/inboundSamlConfigs/saml.provider",
                request.Url.PathAndQuery);
            ProviderConfigTestUtils.AssertClientVersionHeader(request);
        }
        public async Task CreateConfigMinimal()
        {
            var handler = new MockMessageHandler()
            {
                Response = SamlProviderConfigResponse,
            };
            var auth = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var args = new SamlProviderConfigArgs()
            {
                ProviderId       = "saml.minimal-provider",
                IdpEntityId      = "IDP_ENTITY_ID",
                SsoUrl           = "https://example.com/login",
                X509Certificates = new List <string>()
                {
                    "CERT1", "CERT2"
                },
                RpEntityId  = "RP_ENTITY_ID",
                CallbackUrl = "https://projectId.firebaseapp.com/__/auth/handler",
            };

            var provider = await auth.CreateProviderConfigAsync(args);

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

            Assert.Equal(HttpMethod.Post, request.Method);
            Assert.Equal(
                "/v2/projects/project1/inboundSamlConfigs?inboundSamlConfigId=saml.minimal-provider",
                request.Url.PathAndQuery);
            ProviderConfigTestUtils.AssertClientVersionHeader(request);

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

            Assert.Equal(2, body.Count);
            this.AssertIdpConfig((JObject)body["idpConfig"]);
            this.AssertSpConfig((JObject)body["spConfig"]);
        }
        public void ListSamlOptions()
        {
            var handler = new MockMessageHandler()
            {
                Response = ListConfigsResponses,
            };
            var auth          = ProviderConfigTestUtils.CreateFirebaseAuth(handler);
            var configs       = new List <SamlProviderConfig>();
            var customOptions = new ListProviderConfigsOptions()
            {
                PageSize  = 3,
                PageToken = "custom-token",
            };

            var pagedEnumerable = auth.ListSamlProviderConfigsAsync(customOptions);

            foreach (var user in pagedEnumerable.ToEnumerable())
            {
                configs.Add(user);
            }

            Assert.Equal(5, configs.Count);
            Assert.All(configs, this.AssertSamlProviderConfig);

            Assert.Equal(2, handler.Requests.Count);
            var query = ProviderConfigTestUtils.ExtractQueryParams(handler.Requests[0]);

            Assert.Equal(2, query.Count);
            Assert.Equal("3", query["pageSize"]);
            Assert.Equal("custom-token", query["pageToken"]);

            query = ProviderConfigTestUtils.ExtractQueryParams(handler.Requests[1]);
            Assert.Equal(2, query.Count);
            Assert.Equal("3", query["pageSize"]);
            Assert.Equal("token", query["pageToken"]);

            Assert.All(handler.Requests, ProviderConfigTestUtils.AssertClientVersionHeader);
        }