diff --git a/src/main/java/com/auth0/client/mgmt/ManagementApiBuilder.java b/src/main/java/com/auth0/client/mgmt/ManagementApiBuilder.java index 04262141..22debd3f 100644 --- a/src/main/java/com/auth0/client/mgmt/ManagementApiBuilder.java +++ b/src/main/java/com/auth0/client/mgmt/ManagementApiBuilder.java @@ -67,7 +67,8 @@ public ManagementApiBuilder url(String url) { * .build(); * } * - * @param domain The Auth0 domain (e.g., "your-tenant.auth0.com") + * @param domain The Auth0 domain (e.g., "your-tenant.auth0.com"). A leading {@code https://} and a trailing + * slash are accepted. * @return This builder for method chaining */ public ManagementApiBuilder domain(String domain) { @@ -241,7 +242,7 @@ protected ClientOptions buildClientOptions() { */ protected void setEnvironment(ClientOptions.Builder builder) { if (this.domain != null) { - String url = "https://" + this.domain + "/api/v2"; + String url = getBaseUrl() + "/api/v2"; builder.environment(Environment.custom(url)); } else { builder.environment(this.environment); @@ -256,7 +257,11 @@ protected void setEnvironment(ClientOptions.Builder builder) { */ protected String getBaseUrl() { if (this.domain != null) { - return "https://" + this.domain; + String url = this.domain.replaceAll("/+$", ""); + if (!url.startsWith("https://") && !url.startsWith("http://")) { + url = "https://" + url; + } + return url; } // Extract base URL from environment URL by removing /api/v2 suffix String envUrl = this.environment.getUrl(); diff --git a/src/test/java/com/auth0/client/mgmt/ManagementApiBuilderTest.java b/src/test/java/com/auth0/client/mgmt/ManagementApiBuilderTest.java index 5f47ad6f..1b1344df 100644 --- a/src/test/java/com/auth0/client/mgmt/ManagementApiBuilderTest.java +++ b/src/test/java/com/auth0/client/mgmt/ManagementApiBuilderTest.java @@ -1,6 +1,9 @@ package com.auth0.client.mgmt; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; /** * Tests for ManagementApiBuilder domain-based initialization. @@ -43,22 +46,24 @@ public void testAudienceMethodExists() { /** * Test that build() fails when no authentication is provided. */ - @Test(expected = RuntimeException.class) + @Test public void testBuildFailsWithoutAuth() { - ManagementApi.builder().domain("my-tenant.auth0.com").build(); + assertThrows( + RuntimeException.class, + () -> ManagementApi.builder().domain("my-tenant.auth0.com").build()); } /** * Test that build() fails when only clientId is provided without clientSecret. */ - @Test(expected = RuntimeException.class) + @Test public void testBuildFailsWithPartialCredentials() { // This tests an edge case where someone might call clientCredentials incorrectly ManagementApiBuilder builder = ManagementApi.builder(); builder.domain("my-tenant.auth0.com"); // Manually set only clientId to simulate partial configuration // This should fail during build - builder.build(); + assertThrows(RuntimeException.class, builder::build); } /** @@ -138,4 +143,30 @@ public void testFluentChaining() { .build(); assert client != null : "Fluent chaining should work"; } + + /** + * Test that domain() builds the expected URLs from a bare domain. + */ + @Test + public void testDomainUrls() { + ManagementApiBuilder builder = + ManagementApi.builder().domain("my-tenant.auth0.com").token("test-token"); + assertEquals("https://my-tenant.auth0.com", builder.getBaseUrl()); + assertEquals( + "https://my-tenant.auth0.com/api/v2", + builder.buildClientOptions().environment().getUrl()); + } + + /** + * Test that domain() accepts a domain that includes the scheme and a trailing slash. + */ + @Test + public void testDomainWithSchemeAndTrailingSlash() { + ManagementApiBuilder builder = + ManagementApi.builder().domain("https://my-tenant.auth0.com/").token("test-token"); + assertEquals("https://my-tenant.auth0.com", builder.getBaseUrl()); + assertEquals( + "https://my-tenant.auth0.com/api/v2", + builder.buildClientOptions().environment().getUrl()); + } }