Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<Arguments> adapters() {
return Stream.of(
Arguments.of(Named.<StubProductAdapterBase>of("Jira", new StubJiraProductAdapter())),
Arguments.of(
Named.<StubProductAdapterBase>of("Confluence", new StubConfluenceProductAdapter())),
Arguments.of(Named.<StubProductAdapterBase>of("Other", new StubOtherProductAdapter())));
}

private static AtlassianHost sampleHost() {
AtlassianHost host = new AtlassianHost();
host.setInstallationId("inst-1");
Expand All @@ -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;
}
Expand Down
Loading