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  }