Skip to content

Commit

Permalink
Add a few more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
josephspurrier committed Jan 13, 2019
1 parent 1f6ae29 commit 00848e7
Show file tree
Hide file tree
Showing 8 changed files with 233 additions and 7 deletions.
191 changes: 191 additions & 0 deletions mysql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,133 @@ import (
"github.com/stretchr/testify/assert"
)

func TestFileLoadFailure(t *testing.T) {
_, unique := testutil.SetupDatabase()

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

// Set up rove.
r := rove.NewFileMigration(m, "testdata/success.sql")
r.Verbose = true

for v := range []error{
r.Migrate(0),
r.Reset(0),
r.Rollback("none"),
func() error {
_, err := r.Status()
return err
}(),
r.Tag("none"),
} {
assert.NotNil(t, v)
}
}

func TestFileLoadFailure2(t *testing.T) {
_, unique := testutil.SetupDatabase()

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

// Set up rove.
r := rove.NewFileMigration(m, "not-exist")
r.Verbose = true

for v := range []error{
r.Migrate(0),
r.Reset(0),
r.Rollback("none"),
func() error {
_, err := r.Status()
return err
}(),
r.Tag("none"),
} {
assert.NotNil(t, v)
}
}

func TestStringLoadFailure(t *testing.T) {
_, unique := testutil.SetupDatabase()

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

// Set up rove.
r := rove.NewChangesetMigration(m, sFail)
r.Verbose = true

for v := range []error{
r.Migrate(0),
r.Reset(0),
r.Rollback("none"),
func() error {
_, err := r.Status()
return err
}(),
r.Tag("none"),
} {
assert.NotNil(t, v)
}
}

func TestLoadChangesetFailure(t *testing.T) {
_, unique := testutil.SetupDatabase()

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

// Set up rove.
r := rove.NewFileMigration(m, "testdata/fail-duplicate.sql")
r.Verbose = true

for v := range []error{
r.Migrate(0),
r.Reset(0),
r.Rollback("none"),
func() error {
_, err := r.Status()
return err
}(),
r.Tag("none"),
} {
assert.NotNil(t, v)
}
}

func TestLoadChanglogFailure(t *testing.T) {
_, unique := testutil.SetupDatabase()

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

// Set up rove.
r := rove.NewFileMigration(m, "testdata/success.sql")
r.Verbose = true

m.InitializeQuery = "INSERT bad query;"

for v := range []error{
r.Migrate(0),
r.Reset(0),
r.Rollback("none"),
func() error {
_, err := r.Status()
return err
}(),
r.Tag("none"),
} {
assert.NotNil(t, v)
}
}

func TestFileMigration(t *testing.T) {
_, unique := testutil.SetupDatabase()

Expand Down Expand Up @@ -156,6 +283,54 @@ func TestInclude(t *testing.T) {
testutil.TeardownDatabase(unique)
}

func TestFileBadQuery(t *testing.T) {
_, unique := testutil.SetupDatabase()

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

// Set up rove.
r := rove.NewFileMigration(m, "testdata/badquery.sql")
r.Verbose = true

// Run migration.
err = r.Migrate(0)
assert.NotNil(t, err)
}

func TestFileBadSpace(t *testing.T) {
_, unique := testutil.SetupDatabase()

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

// Set up rove.
r := rove.NewFileMigration(m, "testdata/badspace.sql")
r.Verbose = true

// Run migration.
err = r.Migrate(0)
assert.NotNil(t, err)
}

func TestFileMissingHeader(t *testing.T) {
_, unique := testutil.SetupDatabase()

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

// Set up rove.
r := rove.NewFileMigration(m, "testdata/missingheader.sql")
r.Verbose = true

// Run migration.
err = r.Migrate(0)
assert.NotNil(t, err)
}

func TestChangesetMigration(t *testing.T) {
_, unique := testutil.SetupDatabase()

Expand Down Expand Up @@ -284,15 +459,25 @@ func TestChangesetTag(t *testing.T) {
err = r.Tag("jas1")
assert.NotNil(t, err)

// Attempt to tag with an empty string.
err = r.Tag("")
assert.NotNil(t, err)

// Attempt rollback to a tag that doesn't exist.
err = r.Rollback("not-exist")
assert.NotNil(t, err)

// Attempt rollback to an empty tag.
err = r.Rollback("")
assert.NotNil(t, err)

testutil.TeardownDatabase(unique)
}

var sSuccess = `
--changeset josephspurrier:1
--description Create a user_status table.
-- Standard comment.
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
CREATE TABLE user_status (
id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT,
Expand Down Expand Up @@ -335,3 +520,9 @@ CREATE TABLE user (
PRIMARY KEY (id)
);
--rollback DROP TABLE user;`

var sFail = `
--description Create a user_status table.
-- Standard comment.
CREATE TABLE user_status (
--rollback DROP TABLE user_status;`
3 changes: 2 additions & 1 deletion parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,13 +127,14 @@ func parseReaderToMap(r io.Reader, filename string) (map[string]changeset.Record
return parseArrayToMap(arr)
}

// parseArrayToMap will convert an array of changesets to a map of changesets.
func parseArrayToMap(arr []changeset.Record) (map[string]changeset.Record, error) {
m := make(map[string]changeset.Record)

for _, cs := range arr {
id := fmt.Sprintf("%v:%v:%v", cs.Author, cs.ID, cs.Filename)
if _, found := m[id]; found {
return nil, errors.New("Duplicate entry found: " + id)
return nil, errors.New("duplicate entry found: " + id)
}

m[id] = cs
Expand Down
2 changes: 1 addition & 1 deletion rollback.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"fmt"
)

// Rollback will rollback a number of changesets back to a tag.
// Rollback will rollback a number of changesets to a tag.
func (r *Rove) Rollback(tag string) error {
if len(tag) == 0 {
return fmt.Errorf("error - rollback tag cannot be empty")
Expand Down
11 changes: 6 additions & 5 deletions tag.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@ import (
"fmt"
)

// Tag will tag the latest changelog with a string to allow for rollbacks.
// Tag will tag the latest changelog to allow for rollbacks to a tag.
func (r *Rove) Tag(tag string) error {
if len(tag) == 0 {
return fmt.Errorf("error - tag cannot be empty")
}

// Get the changesets.
m, err := r.loadChangesets()
if err != nil {
Expand All @@ -20,10 +24,7 @@ func (r *Rove) Tag(tag string) error {
}

if len(results) == 0 {
if r.Verbose {
fmt.Println("No changesets to tag.")
}
return nil
return errors.New("no changesets to tag")
}

rs := results[0]
Expand Down
3 changes: 3 additions & 0 deletions testdata/badquery.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
--changeset josephspurrier:1
CREATE TABLE user_status (
--rollback DROP TABLE user_status;
9 changes: 9 additions & 0 deletions testdata/badspace.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
--changeset josephspurrier:1
-- Query is missing here on purpose.
--rollback DROP TABLE user_status;

--changeset josephspurrier:2
INSERT INTO `user_status` (`id`, `status`, `created_at`, `updated_at`, `deleted`) VALUES
(1, 'active', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 0),
(2, 'inactive', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 0);
--rollback TRUNCATE TABLE user_status;
19 changes: 19 additions & 0 deletions testdata/missingheader.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
CREATE TABLE user_status (
id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT,

status VARCHAR(25) NOT NULL,

created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,

PRIMARY KEY (id)
);
--rollback DROP TABLE user_status;

--changeset josephspurrier:2
INSERT INTO `user_status` (`id`, `status`, `created_at`, `updated_at`, `deleted`) VALUES
(1, 'active', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 0),
(2, 'inactive', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 0);
--rollback TRUNCATE TABLE user_status;
2 changes: 2 additions & 0 deletions testdata/success.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
--changeset josephspurrier:1
--description Create a user_status table.
-- Standard comment.
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
CREATE TABLE user_status (
id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT,
Expand Down

0 comments on commit 00848e7

Please sign in to comment.