Skip to content

Commit

Permalink
Move testutil to it's own package
Browse files Browse the repository at this point in the history
Allow user to set the database name. Remove reliance on evironment variables in tests. Change md5 to checksum column name.
  • Loading branch information
josephspurrier committed Jan 12, 2019
1 parent b9fe40e commit a78c8f0
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 147 deletions.
63 changes: 26 additions & 37 deletions cmd/rove/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@ import (
"os"
"testing"

"github.com/josephspurrier/rove/pkg/adapter/mysql"
"github.com/josephspurrier/rove/pkg/adapter/mysql/testutil"

"github.com/jmoiron/sqlx"
"github.com/stretchr/testify/assert"
)

func TestMigrationAll(t *testing.T) {
_, unique := migrateAll(t)
mysql.TeardownDatabase(unique)
testutil.TeardownDatabase(unique)
}

func migrateAll(t *testing.T) (*sqlx.DB, string) {
db, unique := mysql.SetupDatabase()
db, unique := testutil.SetupDatabase()

// Set the arguments.
os.Args = []string{
Expand All @@ -34,27 +34,25 @@ func migrateAll(t *testing.T) (*sqlx.DB, string) {
os.Stdout = w

// Call the application.
testutil.SetEnv(unique)
main()
testutil.UnsetEnv(unique)

// Get the output.
w.Close()
out, err := ioutil.ReadAll(r)
assert.Nil(t, err)
os.Stdout = backupd

assert.Contains(t, string(out), "Changeset applied")

// Count the records.
rows := 0
err = db.Get(&rows, `SELECT count(*) from databasechangelog`)
assert.Nil(t, err)
assert.Equal(t, 3, rows)
assert.Contains(t, string(out), "josephspurrier:1")
assert.Contains(t, string(out), "josephspurrier:2")
assert.Contains(t, string(out), "josephspurrier:3")

return db, unique
}

func TestMigrationReset(t *testing.T) {
db, unique := migrateAll(t)
_, unique := migrateAll(t)

// Set the arguments.
os.Args = []string{
Expand All @@ -71,32 +69,30 @@ func TestMigrationReset(t *testing.T) {
os.Stdout = w

// Call the application.
testutil.SetEnv(unique)
main()
testutil.UnsetEnv(unique)

// Get the output.
w.Close()
out, err := ioutil.ReadAll(r)
assert.Nil(t, err)
os.Stdout = backupd

assert.Contains(t, string(out), "Rollback applied")

// Count the records.
rows := 0
err = db.Get(&rows, `SELECT count(*) from databasechangelog`)
assert.Nil(t, err)
assert.Equal(t, 0, rows)
assert.Contains(t, string(out), "Rollback applied: josephspurrier:3")
assert.Contains(t, string(out), "Rollback applied: josephspurrier:2")
assert.Contains(t, string(out), "Rollback applied: josephspurrier:1")

mysql.TeardownDatabase(unique)
testutil.TeardownDatabase(unique)
}

func TestMigrationUp(t *testing.T) {
_, unique := migrateUp(t)
mysql.TeardownDatabase(unique)
testutil.TeardownDatabase(unique)
}

func migrateUp(t *testing.T) (*sqlx.DB, string) {
db, unique := mysql.SetupDatabase()
db, unique := testutil.SetupDatabase()

// Set the arguments.
os.Args = []string{
Expand All @@ -114,27 +110,24 @@ func migrateUp(t *testing.T) (*sqlx.DB, string) {
os.Stdout = w

// Call the application.
testutil.SetEnv(unique)
main()
testutil.UnsetEnv(unique)

// Get the output.
w.Close()
out, err := ioutil.ReadAll(r)
assert.Nil(t, err)
os.Stdout = backupd

assert.Contains(t, string(out), "Changeset applied")

// Count the records.
rows := 0
err = db.Get(&rows, `SELECT count(*) from databasechangelog`)
assert.Nil(t, err)
assert.Equal(t, 2, rows)
assert.Contains(t, string(out), "Changeset applied: josephspurrier:1")
assert.Contains(t, string(out), "Changeset applied: josephspurrier:2")

return db, unique
}

func TestMigrationDown(t *testing.T) {
db, unique := migrateUp(t)
_, unique := migrateUp(t)

// Set the arguments.
os.Args = []string{
Expand All @@ -152,21 +145,17 @@ func TestMigrationDown(t *testing.T) {
os.Stdout = w

// Call the application.
testutil.SetEnv(unique)
main()
testutil.UnsetEnv(unique)

// Get the output.
w.Close()
out, err := ioutil.ReadAll(r)
assert.Nil(t, err)
os.Stdout = backupd

assert.Contains(t, string(out), "Rollback applied")

// Count the records.
rows := 0
err = db.Get(&rows, `SELECT count(*) from databasechangelog`)
assert.Nil(t, err)
assert.Equal(t, 1, rows)
assert.Contains(t, string(out), "Rollback applied: josephspurrier:2")

mysql.TeardownDatabase(unique)
testutil.TeardownDatabase(unique)
}
37 changes: 21 additions & 16 deletions pkg/adapter/jsonfile/jsonfile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,19 @@ import (
"github.com/josephspurrier/rove"
"github.com/josephspurrier/rove/pkg/adapter/jsonfile"
"github.com/josephspurrier/rove/pkg/adapter/mysql"
"github.com/josephspurrier/rove/pkg/adapter/mysql/testutil"

"github.com/stretchr/testify/assert"
)

func TestFileMigration(t *testing.T) {
db, unique := mysql.SetupDatabase()
_, unique := testutil.SetupDatabase()
_ = os.Remove("test.json")

// Create a new MySQL database object.
m := new(mysql.MySQL)
m.DB = db
m, err := mysql.New(testutil.Connection(unique))
assert.Nil(t, err)

js, err := jsonfile.New("test.json", m)
assert.Nil(t, err)

Expand Down Expand Up @@ -70,16 +72,17 @@ func TestFileMigration(t *testing.T) {
assert.Equal(t, "josephspurrier:1", s)

_ = os.Remove("test.json")
mysql.TeardownDatabase(unique)
testutil.TeardownDatabase(unique)
}

func TestMigrationFailDuplicate(t *testing.T) {
db, unique := mysql.SetupDatabase()
_, unique := testutil.SetupDatabase()
_ = os.Remove("test.json")

// Create a new MySQL database object.
m := new(mysql.MySQL)
m.DB = db
m, err := mysql.New(testutil.Connection(unique))
assert.Nil(t, err)

js, err := jsonfile.New("test.json", m)
assert.Nil(t, err)

Expand All @@ -97,16 +100,17 @@ func TestMigrationFailDuplicate(t *testing.T) {
assert.Equal(t, "josephspurrier:2", s)

_ = os.Remove("test.json")
mysql.TeardownDatabase(unique)
testutil.TeardownDatabase(unique)
}

func TestInclude(t *testing.T) {
db, unique := mysql.SetupDatabase()
_, unique := testutil.SetupDatabase()
_ = os.Remove("test.json")

// Create a new MySQL database object.
m := new(mysql.MySQL)
m.DB = db
m, err := mysql.New(testutil.Connection(unique))
assert.Nil(t, err)

js, err := jsonfile.New("test.json", m)
assert.Nil(t, err)

Expand Down Expand Up @@ -159,16 +163,17 @@ func TestInclude(t *testing.T) {
assert.Equal(t, "josephspurrier:1", s)

_ = os.Remove("test.json")
mysql.TeardownDatabase(unique)
testutil.TeardownDatabase(unique)
}

func TestChangesetMigration(t *testing.T) {
db, unique := mysql.SetupDatabase()
_, unique := testutil.SetupDatabase()
_ = os.Remove("test.json")

// Create a new MySQL database object.
m := new(mysql.MySQL)
m.DB = db
m, err := mysql.New(testutil.Connection(unique))
assert.Nil(t, err)

js, err := jsonfile.New("test.json", m)
assert.Nil(t, err)

Expand Down Expand Up @@ -221,7 +226,7 @@ func TestChangesetMigration(t *testing.T) {
assert.Equal(t, "josephspurrier:1", s)

_ = os.Remove("test.json")
mysql.TeardownDatabase(unique)
testutil.TeardownDatabase(unique)
}

var sSuccess = `
Expand Down
31 changes: 19 additions & 12 deletions pkg/adapter/mysql/mysql.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ import (
)

const (
sqlChangelog = `CREATE TABLE IF NOT EXISTS databasechangelog (
tableName = "rovechangelog"
createQuery = `CREATE TABLE IF NOT EXISTS ` + tableName + ` (
id varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
author varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
filename varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
dateexecuted datetime NOT NULL,
orderexecuted int(11) NOT NULL,
md5sum varchar(35) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
checksum varchar(35) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
description varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
tag varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
version varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL
Expand All @@ -33,8 +34,9 @@ type dbchangeset struct {

// MySQL is a MySQL database changelog.
type MySQL struct {
DB *sqlx.DB
tablename string
DB *sqlx.DB
TableName string
InitializeQuery string
}

// New connects to the database and returns an object that satisfies the
Expand All @@ -43,13 +45,18 @@ func New(c *Connection) (m *MySQL, err error) {
// Connect to the database.
m = new(MySQL)
m.DB, err = c.Connect(true)

// Set the default table and create query
m.TableName = tableName
m.InitializeQuery = createQuery

return m, err
}

// Initialize will create the changelog table or return an error.
func (m *MySQL) Initialize() (err error) {
// Create the table.
_, err = m.DB.Exec(sqlChangelog)
_, err = m.DB.Exec(m.InitializeQuery)
if err != nil {
return err
}
Expand All @@ -61,8 +68,8 @@ func (m *MySQL) Initialize() (err error) {
// error if there was an issue, or a blank checksum with no error if it's not
// found.
func (m *MySQL) ChangesetApplied(id, author, filename string) (checksum string, err error) {
err = m.DB.Get(&checksum, `SELECT md5sum
FROM databasechangelog
err = m.DB.Get(&checksum, `SELECT checksum
FROM `+m.TableName+`
WHERE id = ?
AND author = ?
AND filename = ?`, id, author, filename)
Expand All @@ -87,7 +94,7 @@ func (m *MySQL) BeginTx() (rove.Transaction, error) {

// Count returns the number of changesets in the database.
func (m *MySQL) Count() (count int, err error) {
err = m.DB.Get(&count, `SELECT COUNT(*) FROM databasechangelog`)
err = m.DB.Get(&count, `SELECT COUNT(*) FROM `+m.TableName)
if err != nil {
return 0, err
}
Expand All @@ -98,8 +105,8 @@ func (m *MySQL) Count() (count int, err error) {
// Insert will insert a new record into the database.
func (m *MySQL) Insert(id, author, filename string, count int, checksum, description, version string) error {
_, err := m.DB.Exec(`
INSERT INTO databasechangelog
(id,author,filename,dateexecuted,orderexecuted,md5sum,description,version)
INSERT INTO `+m.TableName+`
(id,author,filename,dateexecuted,orderexecuted,checksum,description,version)
VALUES(?,?,?,NOW(),?,?,?,?)`,
id, author, filename, count, checksum, description, version)
return err
Expand All @@ -116,7 +123,7 @@ func (m *MySQL) Changesets(reverse bool) ([]rove.Changeset, error) {
results := make([]dbchangeset, 0)
err := m.DB.Select(&results, `
SELECT id, author, filename, orderexecuted
FROM databasechangelog
FROM `+m.TableName+`
ORDER BY orderexecuted `+order)

// Copy from one struct to another.
Expand All @@ -137,7 +144,7 @@ func (m *MySQL) Changesets(reverse bool) ([]rove.Changeset, error) {
func (m *MySQL) Delete(id, author, filename string) error {
// Delete the record.
_, err := m.DB.Exec(`
DELETE FROM databasechangelog
DELETE FROM `+m.TableName+`
WHERE id = ? AND author = ? AND filename = ? LIMIT 1`, id, author, filename)
return err
}
Loading

0 comments on commit a78c8f0

Please sign in to comment.