44import static org .junit .jupiter .api .Assertions .assertFalse ;
55import static org .junit .jupiter .api .Assertions .assertTrue ;
66
7+ import dev .dbos .transact .Constants ;
78import dev .dbos .transact .migrations .MigrationManager ;
89
910import java .io .PrintWriter ;
1314import java .util .Objects ;
1415import java .util .concurrent .TimeUnit ;
1516
16- import org .junit .jupiter .api .BeforeAll ;
17- import org .junit .jupiter .api .MethodOrderer ;
18- import org .junit .jupiter .api .Order ;
17+ import org .junit .jupiter .api .BeforeEach ;
1918import org .junit .jupiter .api .Test ;
20- import org .junit .jupiter .api .TestMethodOrder ;
2119import org .junit .jupiter .api .Timeout ;
2220import picocli .CommandLine ;
2321
2422@ Timeout (value = 2 , unit = TimeUnit .MINUTES )
25- @ TestMethodOrder (MethodOrderer .OrderAnnotation .class )
2623public class MigrateCommandTest {
2724
2825 static String db_url = "jdbc:postgresql://localhost:5432/migrate_cmd_test" ;
2926 static String db_user = Objects .requireNonNullElse (System .getenv ("PGUSER" ), "postgres" );
3027 static String db_password = Objects .requireNonNullElse (System .getenv ("PGPASSWORD" ), "dbos" );
3128
32- @ BeforeAll
33- static void setup () throws Exception {
29+ @ BeforeEach
30+ public void setup () throws Exception {
3431 var pair = MigrationManager .extractDbAndPostgresUrl (db_url );
3532 var dropDbSql = String .format ("DROP DATABASE IF EXISTS %s WITH (FORCE)" , pair .database ());
3633 try (var conn = DriverManager .getConnection (pair .url (), db_user , db_password );
@@ -40,10 +37,9 @@ static void setup() throws Exception {
4037 }
4138
4239 @ Test
43- @ Order (1 )
4440 public void migrate () throws Exception {
4541
46- assertFalse (checkConnection (db_url , db_user , db_password ));
42+ assertFalse (checkConnection ());
4743
4844 var cmd = new CommandLine (new DBOSCommand ());
4945 var sw = new StringWriter ();
@@ -52,14 +48,16 @@ public void migrate() throws Exception {
5248 var exitCode = cmd .execute ("migrate" , "-D=" + db_url , "-U=" + db_user );
5349 assertEquals (0 , exitCode );
5450
55- assertTrue (checkConnection (db_url , db_user , db_password ));
51+ assertTrue (checkConnection ());
52+ assertTrue (checkTable (Constants .DB_SCHEMA , "workflow_status" ));
5653 }
5754
5855 @ Test
59- @ Order (2 )
60- public void migrate_again () throws Exception {
56+ public void migrate_twice () throws Exception {
6157
62- assertTrue (checkConnection (db_url , db_user , db_password ));
58+ migrate ();
59+
60+ assertTrue (checkConnection ());
6361
6462 var app = new DBOSCommand ();
6563 var cmd = new CommandLine (app );
@@ -70,16 +68,52 @@ public void migrate_again() throws Exception {
7068 var exitCode = cmd .execute ("migrate" , "-D=" + db_url , "-U=" + db_user );
7169 assertEquals (0 , exitCode );
7270
73- assertTrue (checkConnection (db_url , db_user , db_password ));
71+ assertTrue (checkConnection ());
72+ assertTrue (checkTable (Constants .DB_SCHEMA , "workflow_status" ));
73+ }
74+
75+ @ Test
76+ public void migrate_custom_schema () throws Exception {
77+
78+ assertFalse (checkConnection ());
79+
80+ var schema = "C\" $+0m'" ;
81+
82+ var cmd = new CommandLine (new DBOSCommand ());
83+ var sw = new StringWriter ();
84+ cmd .setOut (new PrintWriter (sw ));
85+
86+ var exitCode = cmd .execute ("migrate" , "-D=" + db_url , "-U=" + db_user , "--schema=" + schema );
87+ assertEquals (0 , exitCode );
88+
89+ assertTrue (checkConnection ());
90+ assertTrue (checkTable (schema , "workflow_status" ));
7491 }
7592
76- static boolean checkConnection (String url , String user , String password ) {
77- try (var conn = DriverManager .getConnection (url , user , password );
93+ static boolean checkConnection () {
94+ try (var conn = DriverManager .getConnection (db_url , db_user , db_password );
7895 var stmt = conn .createStatement ()) {
7996 stmt .execute ("SELECT 1" );
8097 return true ;
8198 } catch (SQLException e ) {
8299 return false ;
83100 }
84101 }
102+
103+ static boolean checkTable (String schema , String table ) throws SQLException {
104+ var sql =
105+ "SELECT EXISTS(SELECT 1 FROM information_schema.tables WHERE table_schema = ? AND table_name = ?)" ;
106+ try (var conn = DriverManager .getConnection (db_url , db_user , db_password );
107+ var stmt = conn .prepareStatement (sql )) {
108+ stmt .setString (1 , schema );
109+ stmt .setString (2 , table );
110+ try (var rs = stmt .executeQuery ()) {
111+ if (rs .next ()) {
112+ return rs .getBoolean ("exists" );
113+ } else {
114+ return false ;
115+ }
116+ }
117+ }
118+ }
85119}
0 commit comments