From cc1a7096c911dda55261899b695a55278cc89034 Mon Sep 17 00:00:00 2001 From: Tom Dillenbeck Date: Fri, 15 May 2026 15:48:31 -0600 Subject: [PATCH 1/2] fix(readme): correct Maven groupId and version to match published artifact The artifact on Maven Central is published under com.thycotic.secrets (the legacy company name), not com.delinea.secrets. No artifact has been published under the delinea groupId. Also bumps version from 1.0 to 1.0.1 which is the actual latest release on Maven Central. Fixes #68 Co-Authored-By: Claude Sonnet 4.6 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 83edca4..998a9a2 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ You can use this SDk in your application by adding the following dependency: ```xml - com.delinea.secrets + com.thycotic.secrets dsv-sdk-java - 1.0 + 1.0.1 ``` From 67367f8854750374b92846f54887a17d23e9f886 Mon Sep 17 00:00:00 2001 From: Tom Dillenbeck Date: Fri, 15 May 2026 16:01:33 -0600 Subject: [PATCH 2/2] test: add unit tests for SecretsVault and SecretsVaultFactoryBean Tests run without a live DSV tenant using MockRestServiceServer. Covers getSecret() path normalization (leading-slash stripping), response deserialization, TLD normalization, and base-URL trailing- slash removal in the factory bean. Co-Authored-By: Claude Sonnet 4.6 --- .../spring/SecretsVaultFactoryBeanTest.java | 44 +++++++++++++ .../vault/spring/SecretsVaultTest.java | 66 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 src/test/java/com/delinea/secrets/vault/spring/SecretsVaultFactoryBeanTest.java create mode 100644 src/test/java/com/delinea/secrets/vault/spring/SecretsVaultTest.java diff --git a/src/test/java/com/delinea/secrets/vault/spring/SecretsVaultFactoryBeanTest.java b/src/test/java/com/delinea/secrets/vault/spring/SecretsVaultFactoryBeanTest.java new file mode 100644 index 0000000..2dec0c5 --- /dev/null +++ b/src/test/java/com/delinea/secrets/vault/spring/SecretsVaultFactoryBeanTest.java @@ -0,0 +1,44 @@ +package com.delinea.secrets.vault.spring; + +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.junit.jupiter.api.Assertions.*; + +class SecretsVaultFactoryBeanTest { + + private SecretsVaultFactoryBean configured(String tld, String baseUrlTemplate) throws Exception { + SecretsVaultFactoryBean factory = new SecretsVaultFactoryBean(); + ReflectionTestUtils.setField(factory, "tenant", "mytenant"); + ReflectionTestUtils.setField(factory, "clientId", "test-id"); + ReflectionTestUtils.setField(factory, "clientSecret", "test-secret"); + ReflectionTestUtils.setField(factory, "tld", tld); + ReflectionTestUtils.setField(factory, "baseUrlTemplate", baseUrlTemplate); + factory.afterPropertiesSet(); + return factory; + } + + @Test + void afterPropertiesSet_trimsDotWrappedTld() throws Exception { + SecretsVaultFactoryBean factory = configured(".com.", SecretsVaultFactoryBean.DEFAULT_BASE_URL_TEMPLATE); + assertEquals("com", ReflectionTestUtils.getField(factory, "tld")); + } + + @Test + void afterPropertiesSet_preservesCleanTld() throws Exception { + SecretsVaultFactoryBean factory = configured("eu", SecretsVaultFactoryBean.DEFAULT_BASE_URL_TEMPLATE); + assertEquals("eu", ReflectionTestUtils.getField(factory, "tld")); + } + + @Test + void afterPropertiesSet_stripsTrailingSlashFromBaseUrl() throws Exception { + SecretsVaultFactoryBean factory = configured("com", "https://%s.secretsvaultcloud.%s/v1/"); + String url = (String) ReflectionTestUtils.getField(factory, "baseUrlTemplate"); + assertFalse(url.endsWith("/")); + } + + @Test + void getObjectType_returnsSecretsVaultClass() { + assertEquals(SecretsVault.class, new SecretsVaultFactoryBean().getObjectType()); + } +} diff --git a/src/test/java/com/delinea/secrets/vault/spring/SecretsVaultTest.java b/src/test/java/com/delinea/secrets/vault/spring/SecretsVaultTest.java new file mode 100644 index 0000000..baad85b --- /dev/null +++ b/src/test/java/com/delinea/secrets/vault/spring/SecretsVaultTest.java @@ -0,0 +1,66 @@ +package com.delinea.secrets.vault.spring; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.test.web.client.MockRestServiceServer; +import org.springframework.web.util.DefaultUriBuilderFactory; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.*; +import static org.springframework.test.web.client.response.MockRestResponseCreators.*; + +class SecretsVaultTest { + + private static final String BASE_URL = "https://mytenant.secretsvaultcloud.com/v1"; + private static final String SECRET_JSON = + "{\"path\":\"/test/secret\",\"version\":1," + + "\"data\":{\"username\":\"admin\",\"password\":\"s3cr3t\"},\"attributes\":{}}"; + + private SecretsVault vault; + private MockRestServiceServer server; + + @BeforeEach + void setUp() { + vault = new SecretsVault(); + vault.setUriTemplateHandler(new DefaultUriBuilderFactory(BASE_URL)); + server = MockRestServiceServer.createServer(vault); + } + + @Test + void getSecret_stripsLeadingSlash() { + server.expect(requestTo(BASE_URL + "/secrets/test/secret")) + .andExpect(method(HttpMethod.GET)) + .andRespond(withSuccess(SECRET_JSON, MediaType.APPLICATION_JSON)); + + Secret secret = vault.getSecret("/test/secret"); + + assertNotNull(secret); + server.verify(); + } + + @Test + void getSecret_withoutLeadingSlash() { + server.expect(requestTo(BASE_URL + "/secrets/test/secret")) + .andExpect(method(HttpMethod.GET)) + .andRespond(withSuccess(SECRET_JSON, MediaType.APPLICATION_JSON)); + + Secret secret = vault.getSecret("test/secret"); + + assertNotNull(secret); + server.verify(); + } + + @Test + void getSecret_mapsDataFields() { + server.expect(requestTo(BASE_URL + "/secrets/test/secret")) + .andExpect(method(HttpMethod.GET)) + .andRespond(withSuccess(SECRET_JSON, MediaType.APPLICATION_JSON)); + + Secret secret = vault.getSecret("test/secret"); + + assertEquals("admin", secret.getData().get("username")); + assertEquals("s3cr3t", secret.getData().get("password")); + } +}