github.com/scraniel/migrate@v0.0.0-20230320185700-339088f36cee/source/file/file_test.go (about)

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