diff --git a/src/main/java/com/adyen/Service.java b/src/main/java/com/adyen/Service.java index 65b60a53f..0e52eb3b5 100644 --- a/src/main/java/com/adyen/Service.java +++ b/src/main/java/com/adyen/Service.java @@ -21,6 +21,7 @@ package com.adyen; import com.adyen.enums.Environment; +import com.adyen.enums.Region; /** * A generic service that provides shared functionality for all API services. It handles client and @@ -139,6 +140,22 @@ protected String createBaseURL(String url) { } } + if (url.contains("device-api-")) { + if (config.getTerminalApiRegion() == null + || config.getTerminalApiRegion().equals(Region.EU)) { + url = + url.replaceFirst( + "https://device-api-test.adyen.com", "https://device-api-live.adyen.com"); + } else { + url = + url.replaceFirst( + "https://device-api-test.adyen.com", + String.format( + "https://device-api-live-%s.adyen.com", + config.getTerminalApiRegion().name().toLowerCase())); + } + } + return url.replaceFirst("-test", "-live"); } } diff --git a/src/test/java/com/adyen/ServiceTest.java b/src/test/java/com/adyen/ServiceTest.java index 70a0d69e1..8d1a0a08d 100644 --- a/src/test/java/com/adyen/ServiceTest.java +++ b/src/test/java/com/adyen/ServiceTest.java @@ -3,8 +3,13 @@ import static org.junit.jupiter.api.Assertions.*; import com.adyen.enums.Environment; +import com.adyen.enums.Region; +import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; /** Tests for {@link Service#createBaseURL(String)}. */ public class ServiceTest extends BaseTest { @@ -122,4 +127,41 @@ public void testLiveRecurringUrlWithoutPrefix() { assertThrows(IllegalArgumentException.class, () -> service.createBaseURL(testUrl)); assertEquals("please provide a live url prefix in the client", e.getMessage()); } + + @Test + public void testDeviceApiTestEnvironment() { + config.setEnvironment(Environment.TEST); + String testUrl = "https://device-api-test.adyen.com/device/v1"; + + String actualUrl = service.createBaseURL(testUrl); + assertEquals(testUrl, actualUrl); + } + + static Stream deviceApiRegionToLiveUrl() { + return Stream.of( + Arguments.of(null, "https://device-api-live.adyen.com/device/v1"), + Arguments.of(Region.EU, "https://device-api-live.adyen.com/device/v1"), + Arguments.of(Region.AU, "https://device-api-live-au.adyen.com/device/v1"), + Arguments.of(Region.US, "https://device-api-live-us.adyen.com/device/v1"), + Arguments.of(Region.APSE, "https://device-api-live-apse.adyen.com/device/v1")); + } + + @ParameterizedTest + @MethodSource("deviceApiRegionToLiveUrl") + public void testDeviceApiLiveUrlPerRegion(Region region, String expectedUrl) { + config.setTerminalApiRegion(region); + String testUrl = "https://device-api-test.adyen.com/device/v1"; + + String actualUrl = service.createBaseURL(testUrl); + assertEquals(expectedUrl, actualUrl); + } + + @Test + public void testDeviceApiCustomDomainFallsBackToGenericReplacement() { + String testUrl = "https://my-proxy-test.example.com/device-api-v1/path"; + String expectedUrl = "https://my-proxy-live.example.com/device-api-v1/path"; + + String actualUrl = service.createBaseURL(testUrl); + assertEquals(expectedUrl, actualUrl); + } } diff --git a/src/test/java/com/adyen/service/clouddevice/CloudDeviceApiTest.java b/src/test/java/com/adyen/service/clouddevice/CloudDeviceApiTest.java index a79859458..3b5988a16 100644 --- a/src/test/java/com/adyen/service/clouddevice/CloudDeviceApiTest.java +++ b/src/test/java/com/adyen/service/clouddevice/CloudDeviceApiTest.java @@ -1,10 +1,14 @@ package com.adyen.service.clouddevice; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.verify; import com.adyen.BaseTest; import com.adyen.Client; +import com.adyen.Config; import com.adyen.constants.ApiConstants; +import com.adyen.enums.Environment; +import com.adyen.enums.Region; import com.adyen.model.clouddevice.*; import com.adyen.model.tapi.*; import java.math.BigDecimal; @@ -16,6 +20,60 @@ public class CloudDeviceApiTest extends BaseTest { + @Test + public void baseUrlOnTest() { + Client client = new Client(new Config().apiKey("test").environment(Environment.TEST)); + + CloudDeviceApi cloudDeviceApi = new CloudDeviceApi(client); + assertEquals( + String.format("https://device-api-test.adyen.com/v%s", CloudDeviceApi.API_VERSION), + cloudDeviceApi.baseURL); + } + + @Test + public void baseUrlOnLive() { + Client client = new Client(new Config().apiKey("test").environment(Environment.LIVE)); + + CloudDeviceApi cloudDeviceApi = new CloudDeviceApi(client); + assertEquals( + String.format("https://device-api-live.adyen.com/v%s", CloudDeviceApi.API_VERSION), + cloudDeviceApi.baseURL); + } + + @Test + public void baseUrlOnLivePreservesVersionPath() { + Client client = new Client(new Config().apiKey("test").environment(Environment.LIVE)); + + CloudDeviceApi cloudDeviceApi = new CloudDeviceApi(client); + assertEquals( + String.format("https://device-api-live.adyen.com/v%s", CloudDeviceApi.API_VERSION), + cloudDeviceApi.baseURL); + } + + @Test + public void baseUrlOnLiveWithEuRegion() { + Client client = + new Client( + new Config().apiKey("test").environment(Environment.LIVE).terminalApiRegion(Region.EU)); + + CloudDeviceApi cloudDeviceApi = new CloudDeviceApi(client); + assertEquals( + String.format("https://device-api-live.adyen.com/v%s", CloudDeviceApi.API_VERSION), + cloudDeviceApi.baseURL); + } + + @Test + public void baseUrlOnLiveWithRegion() { + Client client = + new Client( + new Config().apiKey("test").environment(Environment.LIVE).terminalApiRegion(Region.US)); + + CloudDeviceApi cloudDeviceApi = new CloudDeviceApi(client); + assertEquals( + String.format("https://device-api-live-us.adyen.com/v%s", CloudDeviceApi.API_VERSION), + cloudDeviceApi.baseURL); + } + @Test public void sendSync() throws Exception { Client client = createMockClientFromFile("mocks/clouddevice/payment-sync-success.json");