33import com .google .common .collect .ImmutableList ;
44import com .google .common .collect .ImmutableMap ;
55import io .zonky .test .category .FlywayTestSuite ;
6+ import org .flywaydb .core .api .callback .BaseCallback ;
7+ import org .flywaydb .core .api .callback .Event ;
8+ import org .flywaydb .core .api .migration .BaseJavaMigration ;
9+ import org .flywaydb .core .api .migration .Context ;
610import org .flywaydb .core .api .resolver .MigrationResolver ;
711import org .junit .Test ;
812import org .junit .experimental .categories .Category ;
913import org .springframework .util .ClassUtils ;
1014
1115import javax .sql .DataSource ;
12- import java .lang . reflect . Array ;
16+ import java .util . List ;
1317
1418import static io .zonky .test .db .util .ReflectionUtils .invokeMethod ;
1519import static io .zonky .test .db .util .ReflectionUtils .setField ;
@@ -63,7 +67,7 @@ public void testBasicFields() {
6367 @ Test
6468 public void testDynamicFields () throws ClassNotFoundException {
6569 Object mockResolvers = createMockResolvers ();
66- Object mockCallbacks = createMockCallbacks ();
70+ List < Object > mockCallbacks = createMockCallbacks ();
6771
6872 FlywayWrapper wrapper1 = FlywayWrapper .newInstance ();
6973 Object config1 = wrapper1 .getConfig ();
@@ -72,10 +76,10 @@ public void testDynamicFields() throws ClassNotFoundException {
7276 invokeMethod (config1 , "setPlaceholders" , ImmutableMap .of ("key1" , "value1" , "key2" , "value2" ));
7377 if (flywayVersion .isLessThan ("9.9" )) {
7478 invokeMethod (config1 , "setResolvers" , mockResolvers );
75- invokeMethod ( config1 , " setCallbacks" , mockCallbacks );
79+ wrapper1 . setCallbacks ( mockCallbacks );
7680 } else {
7781 invokeMethod (config1 , "setMigrationResolvers" , ImmutableList .of ("resolver1" , "resolver2" , "resolver3" ));
78- invokeMethod (config1 , "setCallbacks" , ImmutableList .of ("callback1 " , "callback2" , "callback3 " ));
82+ invokeMethod (config1 , "setCallbacks" , ImmutableList .of ("db/migration/beforeMigrate.sql " , "db/migration/afterMigrate.sql " ));
7983 }
8084
8185 FlywayWrapper wrapper2 = FlywayWrapper .newInstance ();
@@ -85,10 +89,10 @@ public void testDynamicFields() throws ClassNotFoundException {
8589 invokeMethod (config2 , "setPlaceholders" , ImmutableMap .of ("key1" , "value1" , "key2" , "value2" ));
8690 if (flywayVersion .isLessThan ("9.9" )) {
8791 invokeMethod (config2 , "setResolvers" , mockResolvers );
88- invokeMethod ( config2 , " setCallbacks" , mockCallbacks );
92+ wrapper2 . setCallbacks ( mockCallbacks );
8993 } else {
9094 invokeMethod (config2 , "setMigrationResolvers" , ImmutableList .of ("resolver1" , "resolver2" , "resolver3" ));
91- invokeMethod (config2 , "setCallbacks" , ImmutableList .of ("callback1 " , "callback2" , "callback3 " ));
95+ invokeMethod (config2 , "setCallbacks" , ImmutableList .of ("db/migration/beforeMigrate.sql " , "db/migration/afterMigrate.sql " ));
9296 }
9397
9498 FlywayDescriptor descriptor1 = FlywayDescriptor .from (wrapper1 );
@@ -103,6 +107,53 @@ public void testDynamicFields() throws ClassNotFoundException {
103107 assertThat (descriptor1 ).isEqualTo (descriptor3 );
104108 }
105109
110+ @ Test
111+ public void testSpecialFields () throws ClassNotFoundException {
112+ List <Object > mockMigrations1 = createMockMigrations ();
113+ List <Object > mockCallbacks1 = createMockCallbacks ();
114+
115+ List <Object > mockMigrations2 = createMockMigrations ();
116+ List <Object > mockCallbacks2 = createMockCallbacks ();
117+
118+ Object resourceProvider = null ;
119+ Object classProvider = null ;
120+
121+ if (flywayVersion .isGreaterThanOrEqualTo ("6.5" )) {
122+ Class <?> resourceProviderType = ClassUtils .forName ("org.flywaydb.core.api.ResourceProvider" , null );
123+ Class <?> classProviderType = ClassUtils .forName ("org.flywaydb.core.api.ClassProvider" , null );
124+ resourceProvider = mock (resourceProviderType );
125+ classProvider = mock (classProviderType );
126+ }
127+
128+ FlywayWrapper wrapper1 = FlywayWrapper .newInstance ();
129+ wrapper1 .setJavaMigration (mockMigrations1 );
130+ wrapper1 .setCallbacks (mockCallbacks1 );
131+ wrapper1 .setResourceProvider (resourceProvider );
132+ wrapper1 .setJavaMigrationClassProvider (classProvider );
133+
134+ FlywayWrapper wrapper2 = FlywayWrapper .newInstance ();
135+ wrapper2 .setJavaMigration (mockMigrations2 );
136+ wrapper2 .setCallbacks (mockCallbacks2 );
137+ wrapper2 .setResourceProvider (resourceProvider );
138+ wrapper2 .setJavaMigrationClassProvider (classProvider );
139+
140+ FlywayDescriptor descriptor1 = FlywayDescriptor .from (wrapper1 );
141+ FlywayDescriptor descriptor2 = FlywayDescriptor .from (wrapper2 );
142+
143+ assertThat (descriptor1 ).isEqualTo (descriptor2 );
144+
145+ FlywayWrapper wrapper3 = FlywayWrapper .newInstance ();
146+ descriptor1 .applyTo (wrapper3 );
147+ FlywayDescriptor descriptor3 = FlywayDescriptor .from (wrapper3 );
148+
149+ assertThat (descriptor1 ).isEqualTo (descriptor3 );
150+
151+ FlywayWrapper wrapper4 = FlywayWrapper .newInstance ();
152+ FlywayDescriptor descriptor4 = FlywayDescriptor .from (wrapper4 );
153+
154+ assertThat (descriptor1 ).isNotEqualTo (descriptor4 );
155+ }
156+
106157 @ Test
107158 public void testEnvsFields () {
108159 FlywayWrapper wrapper1 = FlywayWrapper .newInstance ();
@@ -201,18 +252,60 @@ private static Object createMockResolvers() {
201252 return resolvers ;
202253 }
203254
204- private static Object createMockCallbacks () throws ClassNotFoundException {
205- final Class <?> callbackType ;
206- if (flywayVersion .isGreaterThanOrEqualTo ("5.1" )) {
207- callbackType = ClassUtils .forName ("org.flywaydb.core.api.callback.Callback" , null );
255+ private static List <Object > callbacks ;
256+
257+ private static List <Object > createMockCallbacks () throws ClassNotFoundException {
258+ if (flywayVersion .isGreaterThanOrEqualTo ("6" )) { // Flyway 6 is required for BaseCallback
259+ return ImmutableList .of (
260+ new TestCallback ("1" ),
261+ new TestCallback ("2" ),
262+ new TestCallback ("3" ));
208263 } else {
209- callbackType = ClassUtils .forName ("org.flywaydb.core.api.callback.FlywayCallback" , null );
264+ if (callbacks == null ) {
265+ Class <?> callbackType ;
266+ if (flywayVersion .isGreaterThanOrEqualTo ("5.1" )) {
267+ callbackType = ClassUtils .forName ("org.flywaydb.core.api.callback.Callback" , null );
268+ } else {
269+ callbackType = ClassUtils .forName ("org.flywaydb.core.api.callback.FlywayCallback" , null );
270+ }
271+ callbacks = ImmutableList .of (mock (callbackType ), mock (callbackType ), mock (callbackType ));
272+ }
273+ return callbacks ;
210274 }
275+ }
276+
277+ private static class TestCallback extends BaseCallback {
278+
279+ private final String testParameter ;
211280
212- Object [] callbacks = (Object []) Array .newInstance (callbackType , 3 );
213- for (int i = 0 ; i < callbacks .length ; i ++) {
214- callbacks [i ] = mock (callbackType );
281+ private TestCallback (String testParameter ) {
282+ this .testParameter = testParameter ;
215283 }
216- return callbacks ;
284+
285+ @ Override
286+ public void handle (Event event , org .flywaydb .core .api .callback .Context context ) {}
287+ }
288+
289+ private static List <Object > createMockMigrations () {
290+ if (flywayVersion .isGreaterThanOrEqualTo ("6" )) {
291+ return ImmutableList .of (
292+ new V1__TestJavaMigration ("1" ),
293+ new V1__TestJavaMigration ("2" ),
294+ new V1__TestJavaMigration ("3" ));
295+ } else {
296+ return ImmutableList .of ();
297+ }
298+ }
299+
300+ private static class V1__TestJavaMigration extends BaseJavaMigration {
301+
302+ private final String testParameter ;
303+
304+ private V1__TestJavaMigration (String testParameter ) {
305+ this .testParameter = testParameter ;
306+ }
307+
308+ @ Override
309+ public void migrate (Context context ) throws Exception {}
217310 }
218311}
0 commit comments