github.com/mg98/scriptup@v0.1.0/pkg/scriptup/storage/sql_storage_test.go (about) 1 package storage 2 3 import ( 4 "fmt" 5 "testing" 6 ) 7 8 var testPostgresConnDetails = &SQLConnectionDetails{ 9 Dialect: "mysql", 10 Host: "localhost", 11 Port: 6632, 12 User: "root", 13 Password: "123", 14 DatabaseName: "scriptup", 15 SSLMode: "disable", 16 TableName: "migrations", 17 } 18 19 var testMySQLConnDetails = &SQLConnectionDetails{ 20 Dialect: "mysql", 21 Host: "localhost", 22 Port: 6632, 23 User: "root", 24 Password: "123", 25 DatabaseName: "scriptup", 26 SSLMode: "disable", 27 TableName: "migrations", 28 } 29 30 func runTestForEveryDialect(t *testing.T, runTests func(s *SQLStorage)) { 31 for _, s := range []*SQLStorage{ 32 NewSQLStorage(testPostgresConnDetails), 33 NewSQLStorage(testMySQLConnDetails), 34 } { 35 t.Run(fmt.Sprintf("test for dialect %s", s.connDetails.Dialect), func(t *testing.T) { 36 runTests(s) 37 }) 38 } 39 } 40 41 func TestSQLStorage_Open(t *testing.T) { 42 runTestForEveryDialect(t, func(s *SQLStorage) { 43 if err := s.Open(); err != nil { 44 t.Fatalf("Open failed: %v", err) 45 } 46 s.Close() 47 }) 48 } 49 50 func TestSQLStorage_Close(t *testing.T) { 51 runTestForEveryDialect(t, func(s *SQLStorage) { 52 if err := s.Open(); err != nil { 53 panic(err) 54 } 55 if err := s.Close(); err != nil { 56 t.Fatalf("Close failed: %v", err) 57 } 58 }) 59 } 60 61 func TestSQLStorage_Append(t *testing.T) { 62 runTestForEveryDialect(t, func(s *SQLStorage) { 63 if err := s.Open(); err != nil { 64 panic(err) 65 } 66 67 if err := s.Append("20201224000000_dummy1"); err != nil { 68 t.Fatalf("Append failed: %v", err) 69 } 70 defer s.conn.Exec("DELETE FROM migrations WHERE migration_name = '20201224000000_dummy1'") 71 72 t.Run("db record created", func(t *testing.T) { 73 row := s.conn.QueryRow("SELECT * FROM migrations WHERE migration_name = '20201224000000_dummy1'") 74 var name string 75 if err := row.Scan(&name); err != nil { 76 t.Fatalf("record not found: %v", err) 77 } 78 }) 79 t.Run("record is unique", func(t *testing.T) { 80 if err := s.Append("20201224000000_dummy1"); err == nil { 81 t.Fatalf("Append expected to fail") 82 } 83 }) 84 }) 85 } 86 87 func TestSQLStorage_Pop(t *testing.T) { 88 runTestForEveryDialect(t, func(s *SQLStorage) { 89 if err := s.Open(); err != nil { 90 panic(err) 91 } 92 93 if _, err := s.conn.Exec("INSERT INTO migrations VALUES " + 94 "('20220619000000-dummy'), " + 95 "('20221130000000-dummy'), " + 96 "('20210619001000-dummy')"); err != nil { 97 panic(err) 98 } 99 defer s.conn.Exec("DELETE FROM migrations") 100 101 t.Run("pop one migration", func(t *testing.T) { 102 if err := s.Pop(); err != nil { 103 t.Fatalf("Pop failed: %v", err) 104 } 105 106 rows, err := s.conn.Query("SELECT * FROM migrations ORDER BY migration_name ASC") 107 if err != nil { 108 panic(err) 109 } 110 111 var names []string 112 for rows.Next() { 113 var name string 114 if err := rows.Scan(&name); err != nil { 115 panic(err) 116 } 117 names = append(names, name) 118 } 119 120 if len(names) != 2 { 121 t.Fatalf("expected count of migrations to be 2, got %d", len(names)) 122 } 123 if names[0] != "20210619001000-dummy" { 124 t.Fatalf("expected first migration to be %s, got %s", "20210619001000-dummy", names[0]) 125 } 126 if names[1] != "20220619000000-dummy" { 127 t.Fatalf("expected first migration to be %s, got %s", "20220619000000-dummy", names[1]) 128 } 129 }) 130 131 t.Run("pop remaining migrations", func(t *testing.T) { 132 if err := s.Pop(); err != nil { 133 t.Fatalf("Pop failed: %v", err) 134 } 135 if err := s.Pop(); err != nil { 136 t.Fatalf("Pop failed: %v", err) 137 } 138 row := s.conn.QueryRow("SELECT COUNT(*) FROM migrations") 139 var count int 140 if err := row.Scan(&count); err != nil { 141 panic(err) 142 } 143 if count != 0 { 144 t.Fatalf("expected 0 left migrations, found %d", count) 145 } 146 }) 147 148 t.Run("pop one too many", func(t *testing.T) { 149 if err := s.Pop(); err == nil { 150 t.Fatalf("Pop expected to fail") 151 } 152 }) 153 }) 154 } 155 156 func TestSQLStorage_All(t *testing.T) { 157 runTestForEveryDialect(t, func(s *SQLStorage) { 158 if err := s.Open(); err != nil { 159 panic(err) 160 } 161 if _, err := s.conn.Exec("INSERT INTO migrations VALUES " + 162 "('20220619000000-dummy'), " + 163 "('20221130000000-dummy'), " + 164 "('20210619001000-dummy')"); err != nil { 165 panic(err) 166 } 167 defer s.conn.Exec("DELETE FROM migrations") 168 169 entries, err := s.All(OrderAsc) 170 if err != nil { 171 t.Fatalf("All failed: %v", err) 172 } 173 if len(entries) != 3 { 174 t.Fatalf("expected to find 3 entries, got %d", len(entries)) 175 } 176 if entries[0] != "20210619001000-dummy" { 177 t.Fatalf("expected first item to be \"20210619001000-dummy\", got %s", entries[0]) 178 } 179 if entries[1] != "20220619000000-dummy" { 180 t.Fatalf("expected first item to be \"20220619000000-dummy\", got %s", entries[1]) 181 } 182 if entries[2] != "20221130000000-dummy" { 183 t.Fatalf("expected first item to be \"20221130000000-dummy\", got %s", entries[2]) 184 } 185 }) 186 }