Skip to content

Commit 7cf10e1

Browse files
committed
[issue-2375] [issue-2377] Re-enables PermissionTest and SecurityIT tests
* Adds the verify goal to the default set of goals for the Maven failsafe plugin to ensure integration test failures are caught by `mvn test` * Switches from OpenTable's otj-pg-embedded to Zonky embedded-postgres * OpenTable's 0.13.1 doesn't support Apple Silicon * Newer versions of OpenTable use Docker and testcontainers under the hood * OpenTable recommends using Zonky in cases where a non-Docker solution is preferred: opentable/otj-pg-embedded#166
1 parent 318cc95 commit 7cf10e1

File tree

7 files changed

+125
-27
lines changed

7 files changed

+125
-27
lines changed

pom.xml

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@
436436
<version>2.22.2</version>
437437
<configuration>
438438
<skipTests>${skipUnitTests}</skipTests>
439+
<trimStackTrace>false</trimStackTrace>
439440
</configuration>
440441
</plugin>
441442
<plugin>
@@ -465,12 +466,14 @@
465466
<version>2.22.2</version>
466467
<configuration>
467468
<skipITs>${skipITtests}</skipITs>
469+
<trimStackTrace>false</trimStackTrace>
468470
</configuration>
469471
<executions>
470472
<execution>
471473
<phase>test</phase>
472474
<goals>
473475
<goal>integration-test</goal>
476+
<goal>verify</goal>
474477
</goals>
475478
<configuration>
476479
<includes>
@@ -583,6 +586,13 @@
583586
<artifactId>redshift-jdbc42-no-awssdk</artifactId>
584587
<version>1.2.10.1009</version>
585588
</dependency>
589+
<dependency>
590+
<groupId>io.zonky.test.postgres</groupId>
591+
<artifactId>embedded-postgres-binaries-bom</artifactId>
592+
<version>17.6.0</version>
593+
<type>pom</type>
594+
<scope>import</scope>
595+
</dependency>
586596
</dependencies>
587597
</dependencyManagement>
588598

@@ -1218,12 +1228,13 @@
12181228
<groupId>org.ehcache</groupId>
12191229
<artifactId>ehcache</artifactId>
12201230
<version>3.9.11</version>
1221-
</dependency> <dependency>
1222-
<groupId>com.opentable.components</groupId>
1223-
<artifactId>otj-pg-embedded</artifactId>
1224-
<version>0.13.1</version>
1225-
<scope>test</scope>
12261231
</dependency>
1232+
<dependency>
1233+
<groupId>io.zonky.test</groupId>
1234+
<artifactId>embedded-postgres</artifactId>
1235+
<version>2.1.1</version>
1236+
<scope>test</scope>
1237+
</dependency>
12271238
<dependency>
12281239
<groupId>org.springframework.boot</groupId>
12291240
<artifactId>spring-boot-starter-test</artifactId>
@@ -2024,5 +2035,53 @@
20242035
</plugins>
20252036
</build>
20262037
</profile>
2038+
<profile>
2039+
<id>windows-x86-zonky-postgres</id>
2040+
<activation>
2041+
<os>
2042+
<family>Windows</family>
2043+
<arch>amd64</arch>
2044+
</os>
2045+
</activation>
2046+
<dependencies>
2047+
<dependency>
2048+
<groupId>io.zonky.test.postgres</groupId>
2049+
<artifactId>embedded-postgres-binaries-windows-amd64</artifactId>
2050+
<scope>test</scope>
2051+
</dependency>
2052+
</dependencies>
2053+
</profile>
2054+
<profile>
2055+
<id>apple-silicon-zonky-postgres</id>
2056+
<activation>
2057+
<os>
2058+
<family>mac</family>
2059+
<arch>aarch64</arch>
2060+
</os>
2061+
</activation>
2062+
<dependencies>
2063+
<dependency>
2064+
<groupId>io.zonky.test.postgres</groupId>
2065+
<artifactId>embedded-postgres-binaries-darwin-arm64v8</artifactId>
2066+
<scope>test</scope>
2067+
</dependency>
2068+
</dependencies>
2069+
</profile>
2070+
<profile>
2071+
<id>linux-x86-zonky-postgres</id>
2072+
<activation>
2073+
<os>
2074+
<family>unix</family>
2075+
<arch>amd64</arch>
2076+
</os>
2077+
</activation>
2078+
<dependencies>
2079+
<dependency>
2080+
<groupId>io.zonky.test.postgres</groupId>
2081+
<artifactId>embedded-postgres-binaries-linux-amd64-alpine</artifactId>
2082+
<scope>test</scope>
2083+
</dependency>
2084+
</dependencies>
2085+
</profile>
20272086
</profiles>
20282087
</project>

src/test/java/org/ohdsi/webapi/PostgresSingletonRule.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@
3131
import java.io.IOException;
3232
import java.sql.Connection;
3333
import java.sql.SQLException;
34+
35+
import io.zonky.test.db.postgres.embedded.EmbeddedPostgres;
3436
import org.junit.rules.ExternalResource;
3537

36-
import com.opentable.db.postgres.embedded.EmbeddedPostgres;
3738
import org.slf4j.Logger;
3839
import org.slf4j.LoggerFactory;
3940

src/test/java/org/ohdsi/webapi/pathway/PathwayAnalysisTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,19 @@
4242
import org.ohdsi.sql.SqlTranslate;
4343
import org.ohdsi.webapi.AbstractDatabaseTest;
4444
import org.ohdsi.webapi.job.JobExecutionResource;
45+
import org.ohdsi.webapi.pathway.converter.PathwayAnalysisToPathwayVersionConverter;
46+
import org.ohdsi.webapi.pathway.converter.PathwayVersionToPathwayVersionFullDTOConverter;
4547
import org.ohdsi.webapi.pathway.converter.SerializedPathwayAnalysisToPathwayAnalysisConverter;
4648
import org.ohdsi.webapi.pathway.domain.PathwayAnalysisEntity;
4749
import org.ohdsi.webapi.pathway.domain.PathwayAnalysisGenerationEntity;
50+
import org.ohdsi.webapi.pathway.dto.PathwayAnalysisExportDTO;
4851
import org.ohdsi.webapi.source.Source;
4952
import org.ohdsi.webapi.source.SourceDaimon;
5053
import org.ohdsi.webapi.source.SourceRepository;
5154
import org.springframework.beans.factory.annotation.Autowired;
5255
import org.springframework.beans.factory.annotation.Value;
56+
import org.springframework.core.convert.ConversionService;
57+
import org.springframework.core.convert.support.DefaultConversionService;
5358

5459
/**
5560
*
@@ -87,6 +92,9 @@ public class PathwayAnalysisTest extends AbstractDatabaseTest {
8792
@Autowired
8893
private PathwayService pathwayService;
8994

95+
@Autowired
96+
private ConversionService conversionService;
97+
9098
@Value("${datasource.ohdsi.schema}")
9199
private String ohdsiSchema;
92100

@@ -110,7 +118,8 @@ public void setUp() throws Exception {
110118
resetSequence(String.format("%s.%s", ohdsiSchema, "pathway_analysis_sequence"));
111119
truncateTable(String.format("%s.%s", ohdsiSchema, "generation_cache"));
112120
prepareCdmSchema();
113-
prepareResultSchema();
121+
prepareResultSchema();
122+
SerializedPathwayAnalysisToPathwayAnalysisConverter.setConversionService(conversionService);
114123
}
115124

116125
@After

src/test/java/org/ohdsi/webapi/security/PermissionTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import static org.junit.Assert.assertFalse;
2626
import static org.junit.Assert.assertTrue;
2727
import org.junit.Before;
28-
import org.junit.Ignore;
2928
import org.junit.Test;
3029
import org.ohdsi.webapi.AbstractDatabaseTest;
3130
import org.ohdsi.webapi.shiro.PermissionManager;
@@ -65,7 +64,6 @@ public void setup() {
6564
ThreadContext.bind(subject);
6665
}
6766

68-
// @Ignore
6967
@Test
7068
public void permsTest() throws Exception {
7169
// need to clear authorization cache before each test
@@ -88,7 +86,6 @@ public void permsTest() throws Exception {
8886

8987
}
9088

91-
// @Ignore
9289
@Test
9390
public void wildcardTest() throws Exception {
9491
// need to clear authorization cache before each test

src/test/java/org/ohdsi/webapi/test/ITStarter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.ohdsi.webapi.test;
22

3-
import com.opentable.db.postgres.embedded.EmbeddedPostgres;
3+
import io.zonky.test.db.postgres.embedded.EmbeddedPostgres;
44
import org.apache.shiro.subject.SimplePrincipalCollection;
55
import org.apache.shiro.subject.Subject;
66
import org.junit.AfterClass;

src/test/java/org/ohdsi/webapi/test/SecurityIT.java

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package org.ohdsi.webapi.test;
22

33

4+
import com.github.springtestdbunit.DbUnitTestExecutionListener;
45
import com.github.springtestdbunit.annotation.DatabaseOperation;
56
import com.github.springtestdbunit.annotation.DatabaseTearDown;
7+
import com.github.springtestdbunit.annotation.DbUnitConfiguration;
68
import com.google.common.collect.ImmutableMap;
9+
import org.apache.catalina.webresources.TomcatURLStreamHandlerFactory;
710
import org.glassfish.jersey.server.model.Parameter;
811
import org.glassfish.jersey.server.model.Resource;
912
import org.glassfish.jersey.server.model.ResourceMethod;
@@ -12,23 +15,38 @@
1215
import org.junit.Rule;
1316
import org.junit.Test;
1417
import org.junit.rules.ErrorCollector;
18+
import org.junit.runner.RunWith;
1519
import org.ohdsi.webapi.JerseyConfig;
20+
import org.ohdsi.webapi.WebApi;
1621
import org.slf4j.Logger;
1722
import org.slf4j.LoggerFactory;
1823
import org.springframework.beans.factory.annotation.Autowired;
24+
import org.springframework.beans.factory.annotation.Value;
25+
import org.springframework.boot.test.context.SpringBootTest;
1926
import org.springframework.boot.test.web.client.TestRestTemplate;
2027
import org.springframework.http.*;
21-
import org.springframework.test.annotation.DirtiesContext;
28+
import org.springframework.test.context.ActiveProfiles;
29+
import org.springframework.test.context.TestExecutionListeners;
30+
import org.springframework.test.context.TestPropertySource;
31+
import org.springframework.test.context.junit4.SpringRunner;
2232
import org.springframework.web.util.UriComponentsBuilder;
2333

2434
import javax.ws.rs.core.MediaType;
35+
import java.io.IOException;
2536
import java.net.URI;
2637
import java.util.*;
2738

2839
import static org.assertj.core.api.Java6Assertions.assertThat;
40+
import static org.springframework.test.context.TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS;
2941

42+
@RunWith(SpringRunner.class)
43+
@SpringBootTest(classes = {WebApi.class, WebApiIT.DbUnitConfiguration.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
44+
@ActiveProfiles("test")
45+
@DbUnitConfiguration(databaseConnection = "dbUnitDatabaseConnection")
46+
@TestExecutionListeners(value = {DbUnitTestExecutionListener.class}, mergeMode = MERGE_WITH_DEFAULTS)
3047
@DatabaseTearDown(value = "/database/empty.xml", type = DatabaseOperation.DELETE_ALL)
31-
public class SecurityIT extends WebApiIT {
48+
@TestPropertySource(properties = {"security.provider=AtlasRegularSecurity"})
49+
public class SecurityIT {
3250

3351
private final Map<String, HttpStatus> EXPECTED_RESPONSE_CODES = ImmutableMap.<String, HttpStatus>builder()
3452
.put("/info/", HttpStatus.OK)
@@ -47,25 +65,26 @@ public class SecurityIT extends WebApiIT {
4765
@Autowired
4866
private JerseyConfig jerseyConfig;
4967

68+
@Value("${baseUri}")
69+
private String baseUri;
70+
5071
@Rule
5172
public ErrorCollector collector = new ErrorCollector();
5273

5374
private final Logger LOG = LoggerFactory.getLogger(SecurityIT.class);
5475

5576
@BeforeClass
56-
public static void prepare() {
57-
58-
System.setProperty("security.provider", "AtlasRegularSecurity");
77+
public static void before() throws IOException {
78+
TomcatURLStreamHandlerFactory.disable();
79+
ITStarter.before();
5980
}
6081

6182
@AfterClass
62-
public static void disableSecurity() {
63-
64-
System.setProperty("security.provider", "DisabledSecurity");
83+
public static void after() {
84+
ITStarter.tearDownSubject();
6585
}
6686

6787
@Test
68-
@DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
6988
public void testServiceSecurity() {
7089

7190
Map<String, List<ServiceInfo>> serviceMap = getServiceMap();
@@ -76,7 +95,7 @@ public void testServiceSecurity() {
7695
serviceInfo.pathPrefix = "/" + serviceInfo.pathPrefix;
7796
}
7897
serviceInfo.pathPrefix = serviceInfo.pathPrefix.replaceAll("//", "/");
79-
String rawUrl = getBaseUri() + serviceInfo.pathPrefix;
98+
String rawUrl = baseUri + serviceInfo.pathPrefix;
8099
URI uri = null;
81100
try {
82101
Map<String, String> parametersMap = prepareParameters(serviceInfo.parameters);
@@ -195,4 +214,4 @@ public String getMessage() {
195214
return serviceName + ": " + super.getMessage();
196215
}
197216
}
198-
}
217+
}

src/test/java/org/ohdsi/webapi/test/WebApiIT.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.ohdsi.webapi.test;
22

33
import static org.junit.Assert.assertEquals;
4+
import static org.springframework.test.context.TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS;
45

56
import com.github.springtestdbunit.DbUnitTestExecutionListener;
67
import com.github.springtestdbunit.annotation.DbUnitConfiguration;
@@ -9,6 +10,7 @@
910
import java.util.Arrays;
1011
import java.util.Collection;
1112

13+
import com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean;
1214
import com.odysseusinc.arachne.commons.types.DBMSType;
1315
import com.odysseusinc.arachne.execution_engine_common.api.v1.dto.KerberosAuthMechanism;
1416
import org.apache.catalina.webresources.TomcatURLStreamHandlerFactory;
@@ -26,21 +28,23 @@
2628
import org.slf4j.LoggerFactory;
2729
import org.springframework.beans.factory.annotation.Value;
2830
import org.springframework.boot.test.context.SpringBootTest;
31+
import org.springframework.boot.test.context.TestConfiguration;
32+
import org.springframework.context.annotation.Bean;
2933
import org.springframework.jdbc.core.JdbcTemplate;
3034
import org.springframework.test.context.TestExecutionListeners;
3135
import org.springframework.test.context.junit4.SpringRunner;
3236
import org.springframework.http.HttpStatus;
3337
import org.springframework.http.ResponseEntity;
3438
import org.springframework.test.context.ActiveProfiles;
3539
import org.springframework.boot.test.web.client.TestRestTemplate;
36-
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
37-
import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
40+
41+
import javax.sql.DataSource;
3842

3943
@RunWith(SpringRunner.class)
40-
@SpringBootTest(classes = WebApi.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
44+
@SpringBootTest(classes = {WebApi.class, WebApiIT.DbUnitConfiguration.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
4145
@ActiveProfiles("test")
42-
@DbUnitConfiguration(databaseConnection = {"primaryDataSource"})
43-
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DbUnitTestExecutionListener.class, DirtiesContextTestExecutionListener.class})
46+
@DbUnitConfiguration(databaseConnection = "dbUnitDatabaseConnection")
47+
@TestExecutionListeners(value = {DbUnitTestExecutionListener.class}, mergeMode = MERGE_WITH_DEFAULTS)
4448
public abstract class WebApiIT {
4549
protected final Logger log = LoggerFactory.getLogger(getClass());
4650

@@ -68,6 +72,15 @@ public abstract class WebApiIT {
6872
"/ddl/results/achilles_result_concept_count.sql"
6973
);
7074

75+
@TestConfiguration
76+
public static class DbUnitConfiguration {
77+
@Bean
78+
DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection(DataSource primaryDataSource) {
79+
DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection = new DatabaseDataSourceConnectionFactoryBean(primaryDataSource);
80+
dbUnitDatabaseConnection.setSchema("public");
81+
return dbUnitDatabaseConnection;
82+
}
83+
}
7184

7285
@Value("${baseUri}")
7386
private String baseUri;

0 commit comments

Comments
 (0)