diff --git a/reportium-java/src/main/java/com/perfecto/reportium/client/PerfectoReportiumClient.java b/reportium-java/src/main/java/com/perfecto/reportium/client/PerfectoReportiumClient.java index 680eaaa..25b3185 100644 --- a/reportium-java/src/main/java/com/perfecto/reportium/client/PerfectoReportiumClient.java +++ b/reportium-java/src/main/java/com/perfecto/reportium/client/PerfectoReportiumClient.java @@ -11,12 +11,15 @@ import com.perfecto.reportium.test.result.TestResult; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; +import org.apache.http.client.utils.URIBuilder; import org.openqa.selenium.HasCapabilities; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import java.util.*; import java.util.logging.Logger; +import java.net.URI; +import java.net.URISyntaxException; import static com.perfecto.reportium.model.util.ExecutionContextPopulator.EQUALS; @@ -218,8 +221,35 @@ public String getReportUrl() { if (value == null) { return null; } + + try { + String reportUrl = String.valueOf(value); + URI originalUri = new URI(reportUrl); + + URIBuilder uriBuilder = new URIBuilder() + .setScheme(originalUri.getScheme()) + .setHost(originalUri.getHost()) + .setPort(originalUri.getPort()) + .setPath(originalUri.getPath()); + + // Parse and add query parameters - URIBuilder will encode them + if (originalUri.getQuery() != null) { + String[] pairs = originalUri.getQuery().split("&"); + for (String pair : pairs) { + String[] keyValue = pair.split("=", 2); + if (keyValue.length == 2) { + uriBuilder.addParameter(keyValue[0], keyValue[1]); + } else { + uriBuilder.addParameter(keyValue[0], ""); + } + } + } + + return uriBuilder.build().toString(); - return String.valueOf(value); + } catch (URISyntaxException e) { + throw new ReportiumException("Failed to create report URL", e); + } } private void executeScript(String script, Map params) { diff --git a/reportium-java/src/test/java/com/perfecto/reportium/client/PerfectoReportiumClientTest.java b/reportium-java/src/test/java/com/perfecto/reportium/client/PerfectoReportiumClientTest.java index b9f58c2..5d912ea 100644 --- a/reportium-java/src/test/java/com/perfecto/reportium/client/PerfectoReportiumClientTest.java +++ b/reportium-java/src/test/java/com/perfecto/reportium/client/PerfectoReportiumClientTest.java @@ -19,6 +19,7 @@ * Test case for {@link PerfectoReportiumClient} */ public class PerfectoReportiumClientTest { + public static final String EXPECTED_REPORT_URL = "https://tenant.reporting.perfectomobile.com/library?externalId%5B0%5D=32f76d03"; /** * Marker interface for EasyMock to simulate a RemoteWebDriver. @@ -48,7 +49,7 @@ public void testWebDriverInteraction() { client.testStep("step1"); client.testStep("step2"); client.testStop(TestResultFactory.createFailure("Just because", new Throwable("Yikes"))); - assertEquals(client.getReportUrl(), "link"); + assertEquals(client.getReportUrl(), "/link"); verify(webDriverMock, capabilitiesMock); } @@ -73,4 +74,26 @@ public void testStop_nullTestContext() { public void testRequiredWebDriver() { new PerfectoExecutionContext.PerfectoExecutionContextBuilder().build(); } + + @Test + public void testGetReportUrl_WithQueryParameters() { + DriverWithCapabilities webDriverMock = createMock(DriverWithCapabilities.class); + PerfectoExecutionContext context = new PerfectoExecutionContext.PerfectoExecutionContextBuilder() + .withWebDriver(webDriverMock) + .build(); + PerfectoReportiumClient client = new PerfectoReportiumClient(context); + Capabilities capabilitiesMock = createMock(Capabilities.class); + + String urlWithParams = "https://tenant.reporting.perfectomobile.com/library?externalId[0]=32f76d03"; + expect(webDriverMock.getCapabilities()).andReturn(capabilitiesMock); + expect(capabilitiesMock.getCapability(eq(Constants.Capabilities.executionReportUrl))).andReturn(urlWithParams); + + replay(webDriverMock, capabilitiesMock); + + String actualUrl = client.getReportUrl(); + assertEquals(actualUrl, EXPECTED_REPORT_URL); + + verify(webDriverMock, capabilitiesMock); + } + }