github.com/mmrath/gobase@v0.0.1/apps/db_migration/internal/dir_migrate_test.go (about) 1 package internal 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path" 8 "path/filepath" 9 "testing" 10 11 st "github.com/golang-migrate/migrate/v4/source/testing" 12 ) 13 14 func Test(t *testing.T) { 15 tmpDir, err := ioutil.TempDir("", "") 16 if err != nil { 17 t.Fatal(err) 18 } 19 defer os.RemoveAll(tmpDir) 20 21 // write files that meet driver test requirements 22 mustWriteFile(t, tmpDir, "1_foobar", "up.sql", "1 up") 23 mustWriteFile(t, tmpDir, "1_foobar", "down.sql", "1 down") 24 mustWriteFile(t, tmpDir, "3_foobar", "up.sql", "3 up") 25 mustWriteFile(t, tmpDir, "4_foobar", "up.sql", "4 up") 26 mustWriteFile(t, tmpDir, "4_foobar", "down.sql", "4 down") 27 mustWriteFile(t, tmpDir, "5_foobar", "down.sql", "5 down") 28 mustWriteFile(t, tmpDir, "7_foobar", "up.sql", "7 up") 29 mustWriteFile(t, tmpDir, "7_foobar", "down.sql", "7 down") 30 31 f := &File{} 32 d, err := f.Open("file://" + tmpDir) 33 if err != nil { 34 t.Fatal(err) 35 } 36 37 st.Test(t, d) 38 } 39 40 func TestOpen(t *testing.T) { 41 tmpDir, err := ioutil.TempDir("", "TestOpen") 42 if err != nil { 43 t.Fatal(err) 44 } 45 defer os.RemoveAll(tmpDir) 46 47 mustWriteFile(t, tmpDir, "1_foobar", "up.sql", "") 48 mustWriteFile(t, tmpDir, "1_foobar", "down.sql", "") 49 50 if !filepath.IsAbs(tmpDir) { 51 t.Fatal("expected tmpDir to be absolute path") 52 } 53 54 f := &File{} 55 _, err = f.Open("file://" + tmpDir) // absolute path 56 if err != nil { 57 t.Fatal(err) 58 } 59 } 60 61 func TestOpenWithRelativePath(t *testing.T) { 62 tmpDir, err := ioutil.TempDir("", "TestOpen") 63 if err != nil { 64 t.Fatal(err) 65 } 66 defer os.RemoveAll(tmpDir) 67 68 wd, err := os.Getwd() 69 if err != nil { 70 t.Fatal(err) 71 } 72 defer os.Chdir(wd) // rescue working dir after we are done 73 74 if err := os.Chdir(tmpDir); err != nil { 75 t.Fatal(err) 76 } 77 78 if err := os.Mkdir(filepath.Join(tmpDir, "foo"), os.ModePerm); err != nil { 79 t.Fatal(err) 80 } 81 82 mustWriteFile(t, filepath.Join(tmpDir, "foo"), "1_foobar", "up.sql", "") 83 84 f := &File{} 85 86 // dir: foo 87 d, err := f.Open("file://foo") 88 if err != nil { 89 t.Fatal(err) 90 } 91 _, err = d.First() 92 if err != nil { 93 t.Fatalf("expected first file in working dir %v for foo", tmpDir) 94 } 95 96 // dir: ./foo 97 d, err = f.Open("file://./foo") 98 if err != nil { 99 t.Fatal(err) 100 } 101 _, err = d.First() 102 if err != nil { 103 t.Fatalf("expected first file in working dir %v for ./foo", tmpDir) 104 } 105 } 106 107 func TestOpenDefaultsToCurrentDirectory(t *testing.T) { 108 wd, err := os.Getwd() 109 if err != nil { 110 t.Fatal(err) 111 } 112 113 f := &File{} 114 d, err := f.Open("file://") 115 if err != nil { 116 t.Fatal(err) 117 } 118 119 if d.(*File).path != wd { 120 t.Fatal("expected driver to default to current directory") 121 } 122 } 123 124 func TestOpenWithDuplicateVersion(t *testing.T) { 125 tmpDir, err := ioutil.TempDir("", "TestOpenWithDuplicateVersion") 126 if err != nil { 127 t.Fatal(err) 128 } 129 defer os.RemoveAll(tmpDir) 130 131 mustWriteFile(t, tmpDir, "1_foo", "up.sql", "") // 1 up 132 mustWriteFile(t, tmpDir, "1_bar", "up.sql", "") // 1 up 133 134 f := &File{} 135 _, err = f.Open("file://" + tmpDir) 136 if err == nil { 137 t.Fatal("expected err") 138 } 139 } 140 141 func TestClose(t *testing.T) { 142 tmpDir, err := ioutil.TempDir("", "TestOpen") 143 if err != nil { 144 t.Fatal(err) 145 } 146 defer os.RemoveAll(tmpDir) 147 148 f := &File{} 149 d, err := f.Open("file://" + tmpDir) 150 if err != nil { 151 t.Fatal(err) 152 } 153 154 if d.Close() != nil { 155 t.Fatal("expected nil") 156 } 157 } 158 159 func mustWriteFile(t testing.TB, dir, mpath string, file string, body string) { 160 os.Mkdir(path.Join(dir, mpath), 0777) 161 if err := ioutil.WriteFile(path.Join(dir, mpath, file), []byte(body), 06444); err != nil { 162 t.Fatal(err) 163 } 164 } 165 166 func mustCreateBenchmarkDir(t *testing.B) (dir string) { 167 tmpDir, err := ioutil.TempDir("", "Benchmark") 168 if err != nil { 169 t.Fatal(err) 170 } 171 172 for i := 0; i < 1000; i++ { 173 mustWriteFile(t, tmpDir, fmt.Sprintf("%v_foobar", i), "up.sql", "") 174 mustWriteFile(t, tmpDir, fmt.Sprintf("%v_foobar", i), "down.sql", "") 175 } 176 177 return tmpDir 178 } 179 180 func BenchmarkOpen(b *testing.B) { 181 dir := mustCreateBenchmarkDir(b) 182 defer os.RemoveAll(dir) 183 b.ResetTimer() 184 for n := 0; n < b.N; n++ { 185 f := &File{} 186 f.Open("file://" + dir) 187 } 188 b.StopTimer() 189 } 190 191 func BenchmarkNext(b *testing.B) { 192 dir := mustCreateBenchmarkDir(b) 193 defer os.RemoveAll(dir) 194 f := &File{} 195 d, _ := f.Open("file://" + dir) 196 b.ResetTimer() 197 v, err := d.First() 198 for n := 0; n < b.N; n++ { 199 for !os.IsNotExist(err) { 200 v, err = d.Next(v) 201 } 202 } 203 b.StopTimer() 204 }