Move integration tests to their own module
diff --git a/.travis.yml b/.travis.yml index ce7e86b..7bb6da4 100644 --- a/.travis.yml +++ b/.travis.yml
@@ -15,18 +15,16 @@ # - http://docs.travis-ci.com/user/workers/standard-infrastructure/ sudo: false -install: - - go get -t -tags integration - - go install github.com/mattn/go-sqlite3 # Precompile so test timing is accurate - before_script: - mysql -e 'CREATE DATABASE squirrel;' - psql -c 'CREATE DATABASE squirrel;' -U postgres script: - - go test -tags integration -args -driver sqlite3 - - go test -tags integration -args -driver mysql -dataSource travis@/squirrel - - go test -tags integration -args -driver postgres -dataSource 'postgres://postgres@localhost/squirrel?sslmode=disable' + - go test + - cd integration + - go test -args -driver sqlite3 + - go test -args -driver mysql -dataSource travis@/squirrel + - go test -args -driver postgres -dataSource 'postgres://postgres@localhost/squirrel?sslmode=disable' notifications: irc: "irc.freenode.net#masterminds"
diff --git a/integration/doc.go b/integration/doc.go new file mode 100644 index 0000000..3796ab9 --- /dev/null +++ b/integration/doc.go
@@ -0,0 +1,2 @@ +// This is a tests-only package. +package integration
diff --git a/integration/go.mod b/integration/go.mod new file mode 100644 index 0000000..8029ff8 --- /dev/null +++ b/integration/go.mod
@@ -0,0 +1,14 @@ +module github.com/Masterminds/squirrel/integration + +go 1.12 + +require ( + github.com/Masterminds/squirrel v1.1.0 + github.com/go-sql-driver/mysql v1.4.1 + github.com/lib/pq v1.2.0 + github.com/mattn/go-sqlite3 v1.13.0 + github.com/stretchr/testify v1.4.0 + google.golang.org/appengine v1.6.5 // indirect +) + +replace github.com/Masterminds/squirrel => ../
diff --git a/integration/go.sum b/integration/go.sum new file mode 100644 index 0000000..0bfcfa9 --- /dev/null +++ b/integration/go.sum
@@ -0,0 +1,34 @@ +github.com/Masterminds/squirrel v1.1.0 h1:baP1qLdoQCeTw3ifCdOq2dkYc6vGcmRdaociKLbEJXs= +github.com/Masterminds/squirrel v1.1.0/go.mod h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-sqlite3 v1.13.0 h1:LnJI81JidiW9r7pS/hXe6cFeO5EXNq7KbfvoJLRI69c= +github.com/mattn/go-sqlite3 v1.13.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/integration/integration_test.go b/integration/integration_test.go new file mode 100644 index 0000000..e861e7f --- /dev/null +++ b/integration/integration_test.go
@@ -0,0 +1,135 @@ +package integration + +import ( + "context" + "database/sql" + "flag" + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/assert" + + sqrl "github.com/Masterminds/squirrel" + + _ "github.com/go-sql-driver/mysql" + _ "github.com/lib/pq" + _ "github.com/mattn/go-sqlite3" +) + +const ( + testSchema = ` + CREATE TABLE squirrel_integration ( k INT, v TEXT )` + testData = ` + INSERT INTO squirrel_integration VALUES + (1, 'foo'), + (3, 'bar'), + (2, 'foo'), + (4, 'baz') + ` +) + +var ( + sb sqrl.StatementBuilderType +) + +func TestMain(m *testing.M) { + var driver, dataSource string + flag.StringVar(&driver, "driver", "", "integration database driver") + flag.StringVar(&dataSource, "dataSource", "", "integration database data source") + flag.Parse() + + if driver == "" { + driver = "sqlite3" + } + + if driver == "sqlite3" && dataSource == "" { + dataSource = ":memory:" + } + + db, err := sql.Open(driver, dataSource) + if err != nil { + fmt.Printf("error opening database: %v\n", err) + os.Exit(-1) + } + + _, err = db.Exec(testSchema) + if err != nil { + fmt.Printf("error creating test schema: %v\n", err) + os.Exit(-2) + } + + defer func() { + _, err = db.Exec("DROP TABLE squirrel_integration") + fmt.Printf("error removing test schema: %v\n", err) + }() + + _, err = db.Exec(testData) + if err != nil { + fmt.Printf("error inserting test data: %v\n", err) + os.Exit(-3) + } + + sb = sqrl.StatementBuilder.RunWith(db) + + if driver == "postgres" { + sb = sb.PlaceholderFormat(sqrl.Dollar) + } + + os.Exit(m.Run()) +} + +func assertVals(t *testing.T, s sqrl.SelectBuilder, expected ...string) { + rows, err := s.Query() + assert.NoError(t, err) + defer rows.Close() + + vals := make([]string, len(expected)) + for i := range vals { + assert.True(t, rows.Next()) + assert.NoError(t, rows.Scan(&vals[i])) + } + assert.False(t, rows.Next()) + + if expected != nil { + assert.Equal(t, expected, vals) + } +} + +func TestSimpleSelect(t *testing.T) { + assertVals( + t, + sb.Select("v").From("squirrel_integration"), + "foo", "bar", "foo", "baz") +} + +func TestEq(t *testing.T) { + s := sb.Select("v").From("squirrel_integration") + assertVals(t, s.Where(sqrl.Eq{"k": 4}), "baz") + assertVals(t, s.Where(sqrl.NotEq{"k": 2}), "foo", "bar", "baz") + assertVals(t, s.Where(sqrl.Eq{"k": []int{1, 4}}), "foo", "baz") + assertVals(t, s.Where(sqrl.NotEq{"k": []int{1, 4}}), "bar", "foo") + assertVals(t, s.Where(sqrl.Eq{"k": nil})) + assertVals(t, s.Where(sqrl.NotEq{"k": nil}), "foo", "bar", "foo", "baz") + assertVals(t, s.Where(sqrl.Eq{"k": []int{}})) + assertVals(t, s.Where(sqrl.NotEq{"k": []int{}}), "foo", "bar", "foo", "baz") +} + +func TestIneq(t *testing.T) { + s := sb.Select("v").From("squirrel_integration") + assertVals(t, s.Where(sqrl.Lt{"k": 3}), "foo", "foo") + assertVals(t, s.Where(sqrl.Gt{"k": 3}), "baz") +} + +func TestConj(t *testing.T) { + s := sb.Select("v").From("squirrel_integration") + assertVals(t, s.Where(sqrl.And{sqrl.Gt{"k": 1}, sqrl.Lt{"k": 4}}), "bar", "foo") + assertVals(t, s.Where(sqrl.Or{sqrl.Gt{"k": 3}, sqrl.Lt{"k": 2}}), "foo", "baz") +} + +func TestContext(t *testing.T) { + s := sb.Select("v").From("squirrel_integration") + ctx := context.Background() + _, err := s.QueryContext(ctx) + assert.NoError(t, err) +}
diff --git a/integration_test.go b/integration_test.go deleted file mode 100644 index 743e902..0000000 --- a/integration_test.go +++ /dev/null
@@ -1,131 +0,0 @@ -// +build integration - -package squirrel - -import ( - "context" - "database/sql" - "flag" - "fmt" - "os" - "testing" - - "github.com/stretchr/testify/assert" - - _ "github.com/go-sql-driver/mysql" - _ "github.com/lib/pq" - _ "github.com/mattn/go-sqlite3" -) - -const ( - testSchema = ` - CREATE TABLE squirrel_integration ( k INT, v TEXT )` - testData = ` - INSERT INTO squirrel_integration VALUES - (1, 'foo'), - (3, 'bar'), - (2, 'foo'), - (4, 'baz') - ` -) - -var ( - sqrl StatementBuilderType -) - -func TestMain(m *testing.M) { - var driver, dataSource string - flag.StringVar(&driver, "driver", "", "integration database driver") - flag.StringVar(&dataSource, "dataSource", "", "integration database data source") - flag.Parse() - - if driver == "sqlite3" && dataSource == "" { - dataSource = ":memory:" - } - - db, err := sql.Open(driver, dataSource) - if err != nil { - fmt.Printf("error opening database: %v\n", err) - os.Exit(-1) - } - - _, err = db.Exec(testSchema) - if err != nil { - fmt.Printf("error creating test schema: %v\n", err) - os.Exit(-2) - } - - defer func() { - _, err = db.Exec("DROP TABLE squirrel_integration") - fmt.Printf("error removing test schema: %v\n", err) - }() - - _, err = db.Exec(testData) - if err != nil { - fmt.Printf("error inserting test data: %v\n", err) - os.Exit(-3) - } - - sqrl = StatementBuilder.RunWith(db) - - if driver == "postgres" { - sqrl = sqrl.PlaceholderFormat(Dollar) - } - - os.Exit(m.Run()) -} - -func assertVals(t *testing.T, s SelectBuilder, expected ...string) { - rows, err := s.Query() - assert.NoError(t, err) - defer rows.Close() - - vals := make([]string, len(expected)) - for i := range vals { - assert.True(t, rows.Next()) - assert.NoError(t, rows.Scan(&vals[i])) - } - assert.False(t, rows.Next()) - - if expected != nil { - assert.Equal(t, expected, vals) - } -} - -func TestSimpleSelect(t *testing.T) { - assertVals( - t, - sqrl.Select("v").From("squirrel_integration"), - "foo", "bar", "foo", "baz") -} - -func TestEq(t *testing.T) { - s := sqrl.Select("v").From("squirrel_integration") - assertVals(t, s.Where(Eq{"k": 4}), "baz") - assertVals(t, s.Where(NotEq{"k": 2}), "foo", "bar", "baz") - assertVals(t, s.Where(Eq{"k": []int{1, 4}}), "foo", "baz") - assertVals(t, s.Where(NotEq{"k": []int{1, 4}}), "bar", "foo") - assertVals(t, s.Where(Eq{"k": nil})) - assertVals(t, s.Where(NotEq{"k": nil}), "foo", "bar", "foo", "baz") - assertVals(t, s.Where(Eq{"k": []int{}})) - assertVals(t, s.Where(NotEq{"k": []int{}}), "foo", "bar", "foo", "baz") -} - -func TestIneq(t *testing.T) { - s := sqrl.Select("v").From("squirrel_integration") - assertVals(t, s.Where(Lt{"k": 3}), "foo", "foo") - assertVals(t, s.Where(Gt{"k": 3}), "baz") -} - -func TestConj(t *testing.T) { - s := sqrl.Select("v").From("squirrel_integration") - assertVals(t, s.Where(And{Gt{"k": 1}, Lt{"k": 4}}), "bar", "foo") - assertVals(t, s.Where(Or{Gt{"k": 3}, Lt{"k": 2}}), "foo", "baz") -} - -func TestContext(t *testing.T) { - s := sqrl.Select("v").From("squirrel_integration") - ctx := context.Background() - _, err := s.QueryContext(ctx) - assert.NoError(t, err) -}