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  }