diff --git a/atlassian-runtime-bridge-common/src/test/java/com/github/vzakharchenko/runtime/bridge/common/ProductAdaptersContractTest.java b/atlassian-runtime-bridge-common/src/test/java/com/github/vzakharchenko/runtime/bridge/common/ProductAdaptersContractTest.java index b7bb4fe..d5bf474 100644 --- a/atlassian-runtime-bridge-common/src/test/java/com/github/vzakharchenko/runtime/bridge/common/ProductAdaptersContractTest.java +++ b/atlassian-runtime-bridge-common/src/test/java/com/github/vzakharchenko/runtime/bridge/common/ProductAdaptersContractTest.java @@ -4,17 +4,32 @@ import com.atlassian.connect.spring.AtlassianHost; import com.atlassian.connect.spring.AtlassianHostUser; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; +import java.util.stream.Stream; +import org.junit.jupiter.api.Named; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.springframework.web.client.RestTemplate; /** * Contract tests for product adapter interfaces: each exposes addon, current-user, and - * impersonation {@link RestTemplate} entry points with the expected arguments. + * impersonation {@link RestTemplate} entry points with the expected arguments. The same five + * assertions run against Jira, Confluence, and Other stubs via {@link ParameterizedTest}. */ class ProductAdaptersContractTest { + private static final String ADAPTERS_SOURCE = "adapters"; + private static final String DISPLAY_NAME = "{0}"; + + @SuppressWarnings("UnusedMethod") // referenced by @MethodSource(ADAPTERS_SOURCE) via reflection + private static Stream adapters() { + return Stream.of( + Arguments.of(Named.of("Jira", new StubJiraProductAdapter())), + Arguments.of( + Named.of("Confluence", new StubConfluenceProductAdapter())), + Arguments.of(Named.of("Other", new StubOtherProductAdapter()))); + } + private static AtlassianHost sampleHost() { AtlassianHost host = new AtlassianHost(); host.setInstallationId("inst-1"); @@ -26,178 +41,68 @@ private static AtlassianHostUser sampleUser(AtlassianHost host) { return AtlassianHostUser.builder(host).withUserAccountId("ari:cloud:identity::user/1").build(); } - @Nested - class JiraProductAdapterContract { - - private StubJiraProductAdapter adapter; - - @BeforeEach - void createAdapter() { - adapter = new StubJiraProductAdapter(); - } - - @Test - void authenticatedAsAddonReturnsConfiguredTemplate() { - AtlassianHost host = sampleHost(); - RestTemplate expected = new RestTemplate(); - adapter.configureAddon(expected); - - assertThat(adapter.authenticatedAsAddon(host)).isSameAs(expected); - } - - @Test - void authenticatedAsAddonReceivesHost() { - AtlassianHost host = sampleHost(); - adapter.authenticatedAsAddon(host); - - assertThat(adapter.lastAddonHost).isSameAs(host); - } - - @Test - void authenticatedAsCurrentUserReturnsConfiguredTemplate() { - RestTemplate expected = new RestTemplate(); - adapter.configureCurrentUser(expected); - - assertThat(adapter.authenticatedAsCurrentUser()).isSameAs(expected); - } - - @Test - void impersonationReturnsConfiguredTemplate() { - AtlassianHost host = sampleHost(); - AtlassianHostUser user = sampleUser(host); - RestTemplate expected = new RestTemplate(); - adapter.configureImpersonation(expected); - - assertThat(adapter.impersonation(user)).isSameAs(expected); - } + @ParameterizedTest(name = DISPLAY_NAME) + @MethodSource(ADAPTERS_SOURCE) + void authenticatedAsAddonReturnsConfiguredTemplate(StubProductAdapterBase adapter) { + AtlassianHost host = sampleHost(); + RestTemplate expected = new RestTemplate(); + adapter.configureAddon(expected); - @Test - void impersonationReceivesHostUser() { - AtlassianHost host = sampleHost(); - AtlassianHostUser user = sampleUser(host); - adapter.impersonation(user); - - assertThat(adapter.lastImpersonationUser).isSameAs(user); - } + assertThat(adapter.authenticatedAsAddon(host)).isSameAs(expected); } - @Nested - class ConfluenceProductAdapterContract { - - private StubConfluenceProductAdapter adapter; + @ParameterizedTest(name = DISPLAY_NAME) + @MethodSource(ADAPTERS_SOURCE) + void authenticatedAsAddonReceivesHost(StubProductAdapterBase adapter) { + AtlassianHost host = sampleHost(); + adapter.authenticatedAsAddon(host); - @BeforeEach - void createAdapter() { - adapter = new StubConfluenceProductAdapter(); - } - - @Test - void authenticatedAsAddonReturnsConfiguredTemplate() { - AtlassianHost host = sampleHost(); - RestTemplate expected = new RestTemplate(); - adapter.configureAddon(expected); - - assertThat(adapter.authenticatedAsAddon(host)).isSameAs(expected); - } - - @Test - void authenticatedAsAddonReceivesHost() { - AtlassianHost host = sampleHost(); - adapter.authenticatedAsAddon(host); - - assertThat(adapter.lastAddonHost).isSameAs(host); - } - - @Test - void authenticatedAsCurrentUserReturnsConfiguredTemplate() { - RestTemplate expected = new RestTemplate(); - adapter.configureCurrentUser(expected); - - assertThat(adapter.authenticatedAsCurrentUser()).isSameAs(expected); - } - - @Test - void impersonationReturnsConfiguredTemplate() { - AtlassianHost host = sampleHost(); - AtlassianHostUser user = sampleUser(host); - RestTemplate expected = new RestTemplate(); - adapter.configureImpersonation(expected); - - assertThat(adapter.impersonation(user)).isSameAs(expected); - } - - @Test - void impersonationReceivesHostUser() { - AtlassianHost host = sampleHost(); - AtlassianHostUser user = sampleUser(host); - adapter.impersonation(user); - - assertThat(adapter.lastImpersonationUser).isSameAs(user); - } + assertThat(adapter.lastAddonHost).isSameAs(host); } - @Nested - class OtherProductAdapterContract { + @ParameterizedTest(name = DISPLAY_NAME) + @MethodSource(ADAPTERS_SOURCE) + void authenticatedAsCurrentUserReturnsConfiguredTemplate(StubProductAdapterBase adapter) { + RestTemplate expected = new RestTemplate(); + adapter.configureCurrentUser(expected); - private StubOtherProductAdapter adapter; - - @BeforeEach - void createAdapter() { - adapter = new StubOtherProductAdapter(); - } - - @Test - void authenticatedAsAddonReturnsConfiguredTemplate() { - AtlassianHost host = sampleHost(); - RestTemplate expected = new RestTemplate(); - adapter.configureAddon(expected); - - assertThat(adapter.authenticatedAsAddon(host)).isSameAs(expected); - } - - @Test - void authenticatedAsAddonReceivesHost() { - AtlassianHost host = sampleHost(); - adapter.authenticatedAsAddon(host); - - assertThat(adapter.lastAddonHost).isSameAs(host); - } - - @Test - void authenticatedAsCurrentUserReturnsConfiguredTemplate() { - RestTemplate expected = new RestTemplate(); - adapter.configureCurrentUser(expected); - - assertThat(adapter.authenticatedAsCurrentUser()).isSameAs(expected); - } + assertThat(adapter.authenticatedAsCurrentUser()).isSameAs(expected); + } - @Test - void impersonationReturnsConfiguredTemplate() { - AtlassianHost host = sampleHost(); - AtlassianHostUser user = sampleUser(host); - RestTemplate expected = new RestTemplate(); - adapter.configureImpersonation(expected); + @ParameterizedTest(name = DISPLAY_NAME) + @MethodSource(ADAPTERS_SOURCE) + void impersonationReturnsConfiguredTemplate(StubProductAdapterBase adapter) { + AtlassianHost host = sampleHost(); + AtlassianHostUser user = sampleUser(host); + RestTemplate expected = new RestTemplate(); + adapter.configureImpersonation(expected); - assertThat(adapter.impersonation(user)).isSameAs(expected); - } + assertThat(adapter.impersonation(user)).isSameAs(expected); + } - @Test - void impersonationReceivesHostUser() { - AtlassianHost host = sampleHost(); - AtlassianHostUser user = sampleUser(host); - adapter.impersonation(user); + @ParameterizedTest(name = DISPLAY_NAME) + @MethodSource(ADAPTERS_SOURCE) + void impersonationReceivesHostUser(StubProductAdapterBase adapter) { + AtlassianHost host = sampleHost(); + AtlassianHostUser user = sampleUser(host); + adapter.impersonation(user); - assertThat(adapter.lastImpersonationUser).isSameAs(user); - } + assertThat(adapter.lastImpersonationUser).isSameAs(user); } - private static class StubProductAdapterBase { + private abstract static class StubProductAdapterBase { AtlassianHost lastAddonHost; AtlassianHostUser lastImpersonationUser; private RestTemplate addonClient = new RestTemplate(); private RestTemplate currentUserClient = new RestTemplate(); private RestTemplate impersonationClient = new RestTemplate(); + abstract RestTemplate authenticatedAsAddon(AtlassianHost host); + + abstract RestTemplate authenticatedAsCurrentUser(); + + abstract RestTemplate impersonation(AtlassianHostUser hostUser); + void configureAddon(RestTemplate template) { addonClient = template; }