github.com/bishtawi/migrate/v4@v4.8.11/source/file/file_test.go (about)

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