2525import io .flamingock .internal .util .Trio ;
2626import io .flamingock .internal .util .constants .CommunityPersistenceConstants ;
2727import io .flamingock .targetsystem .sql .SqlTargetSystem ;
28+ import org .junit .jupiter .api .AfterAll ;
29+ import org .junit .jupiter .api .BeforeAll ;
2830import org .junit .jupiter .api .DisplayName ;
31+ import org .junit .jupiter .api .TestInstance ;
2932import org .junit .jupiter .params .ParameterizedTest ;
3033import org .junit .jupiter .params .provider .Arguments ;
3134import org .junit .jupiter .params .provider .MethodSource ;
3942import javax .sql .DataSource ;
4043import java .sql .*;
4144import java .util .Collections ;
45+ import java .util .HashMap ;
46+ import java .util .Map ;
4247import java .util .stream .Stream ;
4348
4449import static org .junit .jupiter .api .Assertions .*;
4550
51+ @ TestInstance (TestInstance .Lifecycle .PER_CLASS )
4652@ Testcontainers
4753class SqlAuditStoreTest {
4854
55+ private static final Map <String , JdbcDatabaseContainer <?>> containers = new HashMap <>();
56+ private static final Map <String , DataSource > dataSources = new HashMap <>();
57+
4958 static Stream <Arguments > dialectProvider () {
5059 return Stream .of (
5160 Arguments .of (SqlDialect .MYSQL , "mysql" ),
@@ -58,6 +67,30 @@ static Stream<Arguments> dialectProvider() {
5867 );
5968 }
6069
70+ @ BeforeAll
71+ void startContainers () {
72+ for (Arguments arg : dialectProvider ().toArray (Arguments []::new )) {
73+ SqlDialect dialect = (SqlDialect ) arg .get ()[0 ];
74+ String dialectName = (String ) arg .get ()[1 ];
75+ if (!"h2" .equals (dialectName ) && !"sqlite" .equals (dialectName )) {
76+ JdbcDatabaseContainer <?> container = SqlAuditTestHelper .createContainer (dialectName );
77+ container .start ();
78+ containers .put (dialectName , container );
79+ dataSources .put (dialectName , SqlAuditTestHelper .createDataSource (container ));
80+ }
81+ }
82+ }
83+
84+ @ AfterAll
85+ void stopContainers () {
86+ containers .values ().forEach (JdbcDatabaseContainer ::stop );
87+ dataSources .values ().forEach (ds -> {
88+ if (ds instanceof HikariDataSource ) {
89+ ((HikariDataSource ) ds ).close ();
90+ }
91+ });
92+ }
93+
6194 private TestContext setupTest (SqlDialect sqlDialect , String dialectName ) throws SQLException {
6295 if ("h2" .equals (dialectName )) {
6396 HikariConfig config = new HikariConfig ();
@@ -109,15 +142,6 @@ private TestContext setupTest(SqlDialect sqlDialect, String dialectName) throws
109142 return new TestContext (dataSource , container , sqlDialect );
110143 }
111144
112- private void tearDown (TestContext context ) throws SQLException {
113- if (context .dataSource instanceof HikariDataSource ) {
114- ((HikariDataSource ) context .dataSource ).close ();
115- }
116- if (context .container != null ) {
117- context .container .stop ();
118- }
119- }
120-
121145 private JdbcDatabaseContainer <?> createContainer (String dialectName ) {
122146 switch (dialectName ) {
123147 case "mysql" :
@@ -263,8 +287,8 @@ private Class<?>[] getChangeClasses(String dialectName, String scenario) {
263287 @ DisplayName ("When standalone runs the driver should persist the audit logs and the test data" )
264288 void happyPathWithMockedPipeline (SqlDialect sqlDialect , String dialectName ) throws Exception {
265289 TestContext context = setupTest (sqlDialect , dialectName );
266- try {
267- try (MockedStatic <Deserializer > mocked = Mockito .mockStatic (Deserializer .class )) {
290+
291+ try (MockedStatic <Deserializer > mocked = Mockito .mockStatic (Deserializer .class )) {
268292 Class <?>[] changeClasses = getChangeClasses (dialectName , "happyPath" );
269293
270294 mocked .when (Deserializer ::readPreviewPipelineFromFile ).thenReturn (PipelineTestHelper .getPreviewPipeline (
@@ -329,18 +353,16 @@ void happyPathWithMockedPipeline(SqlDialect sqlDialect, String dialectName) thro
329353 assertEquals ("Jorge" , rs .getString ("name" ));
330354 }
331355 }
332- } finally {
333- tearDown (context );
334- }
356+
335357 }
336358
337359 @ ParameterizedTest
338360 @ MethodSource ("dialectProvider" )
339361 @ DisplayName ("When standalone runs the driver and execution fails (with rollback method) should persist all the audit logs up to the failed one (ROLLED_BACK)" )
340362 void failedWithRollback (SqlDialect sqlDialect , String dialectName ) throws Exception {
341363 TestContext context = setupTest (sqlDialect , dialectName );
342- try {
343- try (MockedStatic <Deserializer > mocked = Mockito .mockStatic (Deserializer .class )) {
364+
365+ try (MockedStatic <Deserializer > mocked = Mockito .mockStatic (Deserializer .class )) {
344366 Class <?>[] changeClasses = getChangeClasses (dialectName , "failedWithRollback" );
345367
346368 mocked .when (Deserializer ::readPreviewPipelineFromFile ).thenReturn (PipelineTestHelper .getPreviewPipeline (
@@ -418,18 +440,16 @@ void failedWithRollback(SqlDialect sqlDialect, String dialectName) throws Except
418440 }
419441 }
420442 }
421- } finally {
422- tearDown (context );
423- }
443+
424444 }
425445
426446 @ ParameterizedTest
427447 @ MethodSource ("dialectProvider" )
428448 @ DisplayName ("When standalone runs the driver and execution fails (without rollback method) should persist all the audit logs up to the failed one (FAILED)" )
429449 void failedWithoutRollback (SqlDialect sqlDialect , String dialectName ) throws Exception {
430450 TestContext context = setupTest (sqlDialect , dialectName );
431- try {
432- try (MockedStatic <Deserializer > mocked = Mockito .mockStatic (Deserializer .class )) {
451+
452+ try (MockedStatic <Deserializer > mocked = Mockito .mockStatic (Deserializer .class )) {
433453 Class <?>[] changeClasses = getChangeClasses (dialectName , "failedWithoutRollback" );
434454
435455 mocked .when (Deserializer ::readPreviewPipelineFromFile ).thenReturn (PipelineTestHelper .getPreviewPipeline (
@@ -490,9 +510,7 @@ void failedWithoutRollback(SqlDialect sqlDialect, String dialectName) throws Exc
490510 SqlAuditTestHelper .verifyIndexExists (context );
491511 verifyPartialDataState (context );
492512 }
493- } finally {
494- tearDown (context );
495- }
513+
496514 }
497515
498516 private void verifyPartialDataState (TestContext context ) throws SQLException {
0 commit comments