Skip to content

Commit

Permalink
Move basemigrate to internal
Browse files Browse the repository at this point in the history
  • Loading branch information
josephspurrier committed Jul 16, 2018
1 parent 581a873 commit 18abe8b
Show file tree
Hide file tree
Showing 12 changed files with 218 additions and 4 deletions.
6 changes: 3 additions & 3 deletions src/app/webapi/cmd/cliapp/cliapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@ package main
import (
"encoding/base64"
"fmt"
"log"
"os"

"app/webapi/pkg/basemigrate"
"app/webapi/internal/basemigrate"
"app/webapi/pkg/securegen"

kingpin "gopkg.in/alecthomas/kingpin.v2"
Expand Down Expand Up @@ -40,7 +39,8 @@ func main() {
case cGenerate.FullCommand():
b, err := securegen.Bytes(32)
if err != nil {
log.Fatal(err)
fmt.Println(err)
os.Exit(1)
}

enc := base64.StdEncoding.EncodeToString(b)
Expand Down
171 changes: 171 additions & 0 deletions src/app/webapi/cmd/cliapp/cliapp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import (
"os"
"testing"

"app/webapi/internal/testutil"

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

Expand Down Expand Up @@ -37,3 +39,172 @@ func TestGenerate(t *testing.T) {
// Ensure the length is 32 bytes.
assert.Equal(t, 32, len(s))
}

func setEnv() {
os.Setenv("DB_HOSTNAME", "127.0.0.1")
os.Setenv("DB_PORT", "3306")
os.Setenv("DB_USERNAME", "root")
os.Setenv("DB_PASSWORD", "")
os.Setenv("DB_DATABASE", "webapitest")
os.Setenv("DB_PARAMETER", "parseTime=true&allowNativePasswords=true")
}

func unsetEnv() {
os.Unsetenv("DB_HOSTNAME")
os.Unsetenv("DB_PORT")
os.Unsetenv("DB_USERNAME")
os.Unsetenv("DB_PASSWORD")
os.Unsetenv("DB_DATABASE")
os.Unsetenv("DB_PARAMETER")
}
func TestMigrationAll(t *testing.T) {
setEnv()
defer unsetEnv()

testutil.ResetDatabase()
db := testutil.ConnectDatabase(true)

// Set the arguments.
os.Args = make([]string, 4)
os.Args[0] = "cliapp"
os.Args[1] = "migrate"
os.Args[2] = "all"
os.Args[3] = "testdata/success.sql"

// Redirect stdout.
backupd := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w

// Call the application.
main()

// 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)
}

func TestMigrationReset(t *testing.T) {
TestMigrationAll(t)

setEnv()
defer unsetEnv()

db := testutil.ConnectDatabase(true)

// Set the arguments.
os.Args = make([]string, 4)
os.Args[0] = "cliapp"
os.Args[1] = "migrate"
os.Args[2] = "reset"
os.Args[3] = "testdata/success.sql"

// Redirect stdout.
backupd := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w

// Call the application.
main()

// 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)
}

func TestMigrationUp(t *testing.T) {
setEnv()
defer unsetEnv()

testutil.ResetDatabase()
db := testutil.ConnectDatabase(true)

// Set the arguments.
os.Args = make([]string, 5)
os.Args[0] = "cliapp"
os.Args[1] = "migrate"
os.Args[2] = "up"
os.Args[3] = "2"
os.Args[4] = "testdata/success.sql"

// Redirect stdout.
backupd := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w

// Call the application.
main()

// 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)
}

func TestMigrationDown(t *testing.T) {
TestMigrationUp(t)

setEnv()
defer unsetEnv()

db := testutil.ConnectDatabase(true)

// Set the arguments.
os.Args = make([]string, 5)
os.Args[0] = "cliapp"
os.Args[1] = "migrate"
os.Args[2] = "down"
os.Args[3] = "1"
os.Args[4] = "testdata/success.sql"

// Redirect stdout.
backupd := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w

// Call the application.
main()

// 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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import (
"os"
"testing"

"app/webapi/internal/basemigrate"
"app/webapi/internal/testutil"
"app/webapi/pkg/basemigrate"

"github.com/stretchr/testify/assert"
)
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
43 changes: 43 additions & 0 deletions src/app/webapi/internal/basemigrate/testdata/success.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
--changeset josephspurrier:1
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;

--changeset josephspurrier:3
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
CREATE TABLE user (
id VARCHAR(36) NOT NULL,

first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
password CHAR(60) NOT NULL,

status_id TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP DEFAULT 0,

UNIQUE KEY (email),
CONSTRAINT `f_user_status` FOREIGN KEY (`status_id`) REFERENCES `user_status` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

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

0 comments on commit 18abe8b

Please sign in to comment.