github.com/schemalex/git-schemalex@v0.0.0-20170921120917-b690b7f9e063/gitschemalex_test.go (about)

     1  package gitschemalex
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  	"io/ioutil"
     7  	"os"
     8  	"os/exec"
     9  	"path/filepath"
    10  	"regexp"
    11  	"strconv"
    12  	"testing"
    13  
    14  	_ "github.com/go-sql-driver/mysql"
    15  	"github.com/lestrrat/go-test-mysqld"
    16  )
    17  
    18  func TestRunner(t *testing.T) {
    19  	var dsn = "root:@tcp(127.0.0.1:3306)/mysql"
    20  	if ok, _ := strconv.ParseBool(os.Getenv("TRAVIS")); !ok {
    21  		mysqld, err := mysqltest.NewMysqld(nil)
    22  		if err != nil {
    23  			t.Fatal(err)
    24  		}
    25  		defer mysqld.Stop()
    26  		dsn = mysqld.DSN()
    27  	}
    28  
    29  	db, err := sql.Open("mysql", dsn)
    30  	if err != nil {
    31  		t.Fatal(err)
    32  	}
    33  	defer db.Close()
    34  
    35  	if _, err := db.Exec("CREATE DATABASE IF NOT EXISTS `test`"); err != nil {
    36  		t.Fatal(err)
    37  	}
    38  
    39  	if _, err := db.Exec("USE `test`"); err != nil {
    40  		t.Fatal(err)
    41  	}
    42  
    43  	dir, err := ioutil.TempDir("", "gitschemalex")
    44  	if err != nil {
    45  		t.Fatal(err)
    46  	}
    47  	defer os.RemoveAll(dir)
    48  
    49  	if err := os.Chdir(dir); err != nil {
    50  		t.Fatal(err)
    51  	}
    52  
    53  	if err := exec.Command("git", "init").Run(); err != nil {
    54  		t.Fatal(err)
    55  	}
    56  
    57  	if err := exec.Command("git", "config", "user.email", "hoge@example.com").Run(); err != nil {
    58  		t.Fatal(err)
    59  	}
    60  
    61  	if err := exec.Command("git", "config", "user.name", "hoge").Run(); err != nil {
    62  		t.Fatal(err)
    63  	}
    64  
    65  	schema, err := os.Create(filepath.Join(dir, "schema.sql"))
    66  	if err != nil {
    67  		t.Fatal(err)
    68  	}
    69  
    70  	// first table
    71  
    72  	if _, err := schema.WriteString("CREATE TABLE hoge ( `id` INTEGER NOT NULL, `c` VARCHAR(20) );\n"); err != nil {
    73  		t.Fatal(err)
    74  	}
    75  
    76  	if err := exec.Command("git", "add", "schema.sql").Run(); err != nil {
    77  		t.Fatal(err)
    78  	}
    79  
    80  	if err := exec.Command("git", "commit", "-m", "initial commit").Run(); err != nil {
    81  		t.Fatal(err)
    82  	}
    83  
    84  	// This is a silly hack, but we need to change the DSN from "mysql" or
    85  	// whatever to "test"
    86  	re := regexp.MustCompile(`/[^/]+$`)
    87  	dsn = re.ReplaceAllString(dsn, `/test`)
    88  	r := &Runner{
    89  		Workspace: dir,
    90  		Deploy:    true,
    91  		DSN:       dsn,
    92  		Table:     "git_schemalex_version",
    93  		Schema:    "schema.sql",
    94  	}
    95  	if err := r.Run(context.TODO()); err != nil {
    96  		t.Fatal(err)
    97  	}
    98  
    99  	// deployed
   100  	if _, err := db.Exec("INSERT INTO `hoge` (`id`, `c`) VALUES (1, '2')"); err != nil {
   101  		t.Fatal(err)
   102  	}
   103  
   104  	// second table
   105  
   106  	if _, err := schema.WriteString("CREATE TABLE fuga ( `id` INTEGER NOT NULL, `c` VARCHAR(20) );\n"); err != nil {
   107  		t.Fatal(err)
   108  	}
   109  
   110  	if err := exec.Command("git", "add", "schema.sql").Run(); err != nil {
   111  		t.Fatal(err)
   112  	}
   113  	if err := exec.Command("git", "commit", "--author", "hoge <hoge@example.com>", "-m", "second commit").Run(); err != nil {
   114  		t.Fatal(err)
   115  	}
   116  
   117  	if err := r.Run(context.TODO()); err != nil {
   118  		t.Fatal(err)
   119  	}
   120  
   121  	if _, err := db.Exec("INSERT INTO `fuga` (`id`, `c`) VALUES (1, '2')"); err != nil {
   122  		t.Fatal(err)
   123  	}
   124  
   125  	// equal version
   126  	if err := r.Run(context.TODO()); err != ErrEqualVersion {
   127  		t.Fatal("should %v got %v", err, ErrEqualVersion)
   128  	}
   129  }