Migration tests for mysql
invoke: export DB_ENV=mysql export MYSQL_LOGIN='root:psswd@/' go test -v github.com/drone/drone/pkg/database/migrate/testing
This commit is contained in:
parent
202ea95368
commit
1736716baa
5 changed files with 407 additions and 277 deletions
2
Makefile
2
Makefile
|
@ -11,7 +11,7 @@ build/script \
|
||||||
channel \
|
channel \
|
||||||
database \
|
database \
|
||||||
database/encrypt \
|
database/encrypt \
|
||||||
database/migrate \
|
database/migrate/testing \
|
||||||
database/testing \
|
database/testing \
|
||||||
mail \
|
mail \
|
||||||
model \
|
model \
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package migrate_test
|
package migrate
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
@ -15,247 +15,6 @@ import (
|
||||||
"github.com/russross/meddler"
|
"github.com/russross/meddler"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Sample struct {
|
|
||||||
ID int64 `meddler:"id,pk"`
|
|
||||||
Imel string `meddler:"imel"`
|
|
||||||
Name string `meddler:"name"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type RenameSample struct {
|
|
||||||
ID int64 `meddler:"id,pk"`
|
|
||||||
Email string `meddler:"email"`
|
|
||||||
Name string `meddler:"name"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type AddColumnSample struct {
|
|
||||||
ID int64 `meddler:"id,pk"`
|
|
||||||
Imel string `meddler:"imel"`
|
|
||||||
Name string `meddler:"name"`
|
|
||||||
Url string `meddler:"url"`
|
|
||||||
Num int64 `meddler:"num"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- revision 1
|
|
||||||
|
|
||||||
type revision1 struct{}
|
|
||||||
|
|
||||||
func (r *revision1) Up(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.CreateTable("samples", []string{
|
|
||||||
mg.T.Integer("id", PRIMARYKEY, AUTOINCREMENT),
|
|
||||||
mg.T.String("imel", UNIQUE),
|
|
||||||
mg.T.String("name"),
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision1) Down(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.DropTable("samples")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision1) Revision() int64 {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- end of revision 1
|
|
||||||
|
|
||||||
// ---------- revision 2
|
|
||||||
|
|
||||||
type revision2 struct{}
|
|
||||||
|
|
||||||
func (r *revision2) Up(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.RenameTable("samples", "examples")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision2) Down(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.RenameTable("examples", "samples")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision2) Revision() int64 {
|
|
||||||
return 2
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- end of revision 2
|
|
||||||
|
|
||||||
// ---------- revision 3
|
|
||||||
|
|
||||||
type revision3 struct{}
|
|
||||||
|
|
||||||
func (r *revision3) Up(mg *MigrationDriver) error {
|
|
||||||
if _, err := mg.AddColumn("samples", "url VARCHAR(255)"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err := mg.AddColumn("samples", "num INTEGER")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision3) Down(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.DropColumns("samples", "num", "url")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision3) Revision() int64 {
|
|
||||||
return 3
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- end of revision 3
|
|
||||||
|
|
||||||
// ---------- revision 4
|
|
||||||
|
|
||||||
type revision4 struct{}
|
|
||||||
|
|
||||||
func (r *revision4) Up(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.RenameColumns("samples", map[string]string{
|
|
||||||
"imel": "email",
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision4) Down(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.RenameColumns("samples", map[string]string{
|
|
||||||
"email": "imel",
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision4) Revision() int64 {
|
|
||||||
return 4
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- end of revision 4
|
|
||||||
|
|
||||||
// ---------- revision 5
|
|
||||||
|
|
||||||
type revision5 struct{}
|
|
||||||
|
|
||||||
func (r *revision5) Up(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.AddIndex("samples", []string{"url", "name"})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision5) Down(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.DropIndex("samples", []string{"url", "name"})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision5) Revision() int64 {
|
|
||||||
return 5
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- end of revision 5
|
|
||||||
|
|
||||||
// ---------- revision 6
|
|
||||||
type revision6 struct{}
|
|
||||||
|
|
||||||
func (r *revision6) Up(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.RenameColumns("samples", map[string]string{
|
|
||||||
"url": "host",
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision6) Down(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.RenameColumns("samples", map[string]string{
|
|
||||||
"host": "url",
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision6) Revision() int64 {
|
|
||||||
return 6
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- end of revision 6
|
|
||||||
|
|
||||||
// ---------- revision 7
|
|
||||||
type revision7 struct{}
|
|
||||||
|
|
||||||
func (r *revision7) Up(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.DropColumns("samples", "host", "num")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision7) Down(mg *MigrationDriver) error {
|
|
||||||
if _, err := mg.AddColumn("samples", "host VARCHAR(255)"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err := mg.AddColumn("samples", "num INSTEGER")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision7) Revision() int64 {
|
|
||||||
return 7
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- end of revision 7
|
|
||||||
|
|
||||||
// ---------- revision 8
|
|
||||||
type revision8 struct{}
|
|
||||||
|
|
||||||
func (r *revision8) Up(mg *MigrationDriver) error {
|
|
||||||
if _, err := mg.AddColumn("samples", "repo_id INTEGER"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
_, err := mg.AddColumn("samples", "repo VARCHAR(255)")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision8) Down(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.DropColumns("samples", "repo", "repo_id")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision8) Revision() int64 {
|
|
||||||
return 8
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- end of revision 8
|
|
||||||
|
|
||||||
// ---------- revision 9
|
|
||||||
type revision9 struct{}
|
|
||||||
|
|
||||||
func (r *revision9) Up(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.RenameColumns("samples", map[string]string{
|
|
||||||
"repo": "repository",
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision9) Down(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.RenameColumns("samples", map[string]string{
|
|
||||||
"repository": "repo",
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision9) Revision() int64 {
|
|
||||||
return 9
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- end of revision 9
|
|
||||||
|
|
||||||
// ---------- revision 10
|
|
||||||
|
|
||||||
type revision10 struct{}
|
|
||||||
|
|
||||||
func (r *revision10) Revision() int64 {
|
|
||||||
return 10
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision10) Up(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.ChangeColumn("samples", "email", "varchar(512) UNIQUE")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *revision10) Down(mg *MigrationDriver) error {
|
|
||||||
_, err := mg.ChangeColumn("samples", "email", "varchar(255) unique")
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------- end of revision 10
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
db *sql.DB
|
db *sql.DB
|
||||||
driver, dsn string
|
driver, dsn string
|
||||||
|
@ -263,7 +22,7 @@ var (
|
||||||
dbname = "drone_test"
|
dbname = "drone_test"
|
||||||
)
|
)
|
||||||
|
|
||||||
var testSchema = `
|
var sqliteTestSchema = `
|
||||||
CREATE TABLE samples (
|
CREATE TABLE samples (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
imel VARCHAR(255) UNIQUE,
|
imel VARCHAR(255) UNIQUE,
|
||||||
|
@ -271,6 +30,14 @@ CREATE TABLE samples (
|
||||||
);
|
);
|
||||||
`
|
`
|
||||||
|
|
||||||
|
var mysqlTestSchema = `
|
||||||
|
CREATE TABLE samples (
|
||||||
|
id INTEGER PRIMARY KEY AUTO_INCREMENT,
|
||||||
|
imel VARCHAR(255) UNIQUE,
|
||||||
|
name VARCHAR(255)
|
||||||
|
)
|
||||||
|
`
|
||||||
|
|
||||||
var dataDump = []string{
|
var dataDump = []string{
|
||||||
`INSERT INTO samples (imel, name) VALUES ('test@example.com', 'Test Tester');`,
|
`INSERT INTO samples (imel, name) VALUES ('test@example.com', 'Test Tester');`,
|
||||||
`INSERT INTO samples (imel, name) VALUES ('foo@bar.com', 'Foo Bar');`,
|
`INSERT INTO samples (imel, name) VALUES ('foo@bar.com', 'Foo Bar');`,
|
||||||
|
@ -304,6 +71,13 @@ func TestMigrateExistingCreateTable(t *testing.T) {
|
||||||
t.Fatalf("Error preparing database: %q", err)
|
t.Fatalf("Error preparing database: %q", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var testSchema string
|
||||||
|
if driver == "mysql" {
|
||||||
|
testSchema = mysqlTestSchema
|
||||||
|
} else {
|
||||||
|
testSchema = sqliteTestSchema
|
||||||
|
}
|
||||||
|
|
||||||
if _, err := db.Exec(testSchema); err != nil {
|
if _, err := db.Exec(testSchema); err != nil {
|
||||||
t.Fatalf("Can not create database: %q", err)
|
t.Fatalf("Can not create database: %q", err)
|
||||||
}
|
}
|
||||||
|
@ -357,6 +131,15 @@ type TableInfo struct {
|
||||||
PK bool `meddler:"pk"`
|
PK bool `meddler:"pk"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MysqlTableInfo struct {
|
||||||
|
Field string `meddler:"Field"`
|
||||||
|
Type string `meddler:"Type"`
|
||||||
|
Null string `meddler:"Null"`
|
||||||
|
Key interface{} `meddler:"Key"`
|
||||||
|
Default interface{} `meddler:"Default"`
|
||||||
|
Extra interface{} `meddler:"Extra"`
|
||||||
|
}
|
||||||
|
|
||||||
func TestMigrateAddRemoveColumns(t *testing.T) {
|
func TestMigrateAddRemoveColumns(t *testing.T) {
|
||||||
defer tearDown()
|
defer tearDown()
|
||||||
if err := setUp(); err != nil {
|
if err := setUp(); err != nil {
|
||||||
|
@ -368,13 +151,25 @@ func TestMigrateAddRemoveColumns(t *testing.T) {
|
||||||
t.Fatalf("Can not migrate: %q", err)
|
t.Fatalf("Can not migrate: %q", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var columns []*TableInfo
|
switch driver {
|
||||||
if err := meddler.QueryAll(db, &columns, `PRAGMA table_info(samples);`); err != nil {
|
case "mysql":
|
||||||
t.Fatalf("Can not access table info: %q", err)
|
var columns []*MysqlTableInfo
|
||||||
}
|
if err := meddler.QueryAll(db, &columns, `SHOW COLUMNS FROM samples`); err != nil {
|
||||||
|
t.Fatalf("Can not access table infor: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
if len(columns) < 5 {
|
if len(columns) < 5 {
|
||||||
t.Errorf("Expect length columns: %d\nGot: %d", 5, len(columns))
|
t.Errorf("Expect length columns: %d\nGot: %d", 5, len(columns))
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
var columns []*TableInfo
|
||||||
|
if err := meddler.QueryAll(db, &columns, `PRAGMA table_info(samples);`); err != nil {
|
||||||
|
t.Fatalf("Can not access table info: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(columns) < 5 {
|
||||||
|
t.Errorf("Expect length columns: %d\nGot: %d", 5, len(columns))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var row = AddColumnSample{
|
var row = AddColumnSample{
|
||||||
|
@ -392,14 +187,27 @@ func TestMigrateAddRemoveColumns(t *testing.T) {
|
||||||
t.Fatalf("Can not migrate: %q", err)
|
t.Fatalf("Can not migrate: %q", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var another_columns []*TableInfo
|
switch driver {
|
||||||
if err := meddler.QueryAll(db, &another_columns, `PRAGMA table_info(samples);`); err != nil {
|
case "mysql":
|
||||||
t.Fatalf("Can not access table info: %q", err)
|
var columns []*MysqlTableInfo
|
||||||
|
if err := meddler.QueryAll(db, &columns, `SHOW COLUMNS FROM samples`); err != nil {
|
||||||
|
t.Fatalf("Can not access table infor: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(columns) != 3 {
|
||||||
|
t.Errorf("Expect length columns: %d\nGot: %d", 3, len(columns))
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
var columns []*TableInfo
|
||||||
|
if err := meddler.QueryAll(db, &columns, `PRAGMA table_info(samples);`); err != nil {
|
||||||
|
t.Fatalf("Can not access table info: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(columns) != 3 {
|
||||||
|
t.Errorf("Expect length columns: %d\nGot: %d", 3, len(columns))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(another_columns) != 3 {
|
|
||||||
t.Errorf("Expect length columns = %d, got: %d", 3, len(columns))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRenameColumn(t *testing.T) {
|
func TestRenameColumn(t *testing.T) {
|
||||||
|
@ -435,6 +243,13 @@ func TestMigrateExistingTable(t *testing.T) {
|
||||||
t.Fatalf("Error preparing database: %q", err)
|
t.Fatalf("Error preparing database: %q", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var testSchema string
|
||||||
|
if driver == "mysql" {
|
||||||
|
testSchema = mysqlTestSchema
|
||||||
|
} else {
|
||||||
|
testSchema = sqliteTestSchema
|
||||||
|
}
|
||||||
|
|
||||||
if _, err := db.Exec(testSchema); err != nil {
|
if _, err := db.Exec(testSchema); err != nil {
|
||||||
t.Fatalf("Can not create database: %q", err)
|
t.Fatalf("Can not create database: %q", err)
|
||||||
}
|
}
|
||||||
|
@ -478,8 +293,44 @@ func TestIndexOperations(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var esquel []*sqliteMaster
|
var esquel []*sqliteMaster
|
||||||
switch {
|
var mysquel struct {
|
||||||
case driver == "mysql":
|
Table string `meddler:"Table"`
|
||||||
|
CreateTable string `meddler:"Create Table"`
|
||||||
|
}
|
||||||
|
switch driver {
|
||||||
|
case "mysql":
|
||||||
|
query := `SHOW CREATE TABLE samples`
|
||||||
|
if err := meddler.QueryRow(db, &mysquel, query); err != nil {
|
||||||
|
t.Fatalf("Can not fetch table definition: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.Contains(mysquel.CreateTable, "KEY `idx_samples_on_url_and_name` (`url`,`name`)") {
|
||||||
|
t.Errorf("Can not find index, got: %q", mysquel.CreateTable)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := mgr.Add(&revision6{}).Migrate(); err != nil {
|
||||||
|
t.Fatalf("Can not migrate: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := meddler.QueryRow(db, &mysquel, query); err != nil {
|
||||||
|
t.Fatalf("Can not find index: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.Contains(mysquel.CreateTable, "KEY `idx_samples_on_url_and_name` (`host`,`name`)") {
|
||||||
|
t.Errorf("Can not find index, got: %q", mysquel.CreateTable)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := mgr.Add(&revision7{}).Migrate(); err != nil {
|
||||||
|
t.Fatalf("Can not migrate: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := meddler.QueryRow(db, &mysquel, query); err != nil {
|
||||||
|
t.Fatalf("Can not find index: %q", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.Contains(mysquel.CreateTable, "KEY `idx_samples_on_url_and_name` (`host`,`name`)") {
|
||||||
|
t.Errorf("Expect index to be deleted.")
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// Query sqlite_master, check if index is exists.
|
// Query sqlite_master, check if index is exists.
|
||||||
|
@ -535,8 +386,8 @@ func TestColumnRedundancy(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var dummy, query, tableSql string
|
var dummy, query, tableSql string
|
||||||
switch {
|
switch driver {
|
||||||
case driver == "mysql":
|
case "mysql":
|
||||||
query = `SHOW CREATE TABLE samples`
|
query = `SHOW CREATE TABLE samples`
|
||||||
if err := db.QueryRow(query).Scan(&dummy, &tableSql); err != nil {
|
if err := db.QueryRow(query).Scan(&dummy, &tableSql); err != nil {
|
||||||
t.Fatalf("Can not query table's definition: %q", err)
|
t.Fatalf("Can not query table's definition: %q", err)
|
||||||
|
@ -567,8 +418,8 @@ func TestChangeColumnType(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var dummy, tableSql, query string
|
var dummy, tableSql, query string
|
||||||
switch {
|
switch driver {
|
||||||
case driver == "mysql":
|
case "mysql":
|
||||||
query = `SHOW CREATE TABLE samples`
|
query = `SHOW CREATE TABLE samples`
|
||||||
if err := db.QueryRow(query).Scan(&dummy, &tableSql); err != nil {
|
if err := db.QueryRow(query).Scan(&dummy, &tableSql); err != nil {
|
||||||
t.Fatalf("Can not query table's definition: %q", err)
|
t.Fatalf("Can not query table's definition: %q", err)
|
||||||
|
@ -593,6 +444,8 @@ func init() {
|
||||||
}
|
}
|
||||||
if dsn = os.Getenv("MYSQL_LOGIN"); len(dsn) == 0 {
|
if dsn = os.Getenv("MYSQL_LOGIN"); len(dsn) == 0 {
|
||||||
dsn = ":memory:"
|
dsn = ":memory:"
|
||||||
|
} else {
|
||||||
|
dsn = fmt.Sprintf("%s@/?parseTime=true", dsn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -605,10 +458,10 @@ func setUp() error {
|
||||||
if driver == "mysql" {
|
if driver == "mysql" {
|
||||||
Driver = MySQL
|
Driver = MySQL
|
||||||
if _, err := db.Exec(fmt.Sprintf("CREATE DATABASE %s", dbname)); err != nil {
|
if _, err := db.Exec(fmt.Sprintf("CREATE DATABASE %s", dbname)); err != nil {
|
||||||
panic("Can't create database")
|
log.Fatalf("Can't create database: %q", err)
|
||||||
}
|
}
|
||||||
if _, err := db.Exec(fmt.Sprintf("USE %s", dbname)); err != nil {
|
if _, err := db.Exec(fmt.Sprintf("USE %s", dbname)); err != nil {
|
||||||
panic("Can't use database")
|
log.Fatalf("Can't use database: %q", dbname)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
246
pkg/database/migrate/testing/revisions.go
Normal file
246
pkg/database/migrate/testing/revisions.go
Normal file
|
@ -0,0 +1,246 @@
|
||||||
|
package migrate
|
||||||
|
|
||||||
|
import (
|
||||||
|
. "github.com/drone/drone/pkg/database/migrate"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Sample struct {
|
||||||
|
ID int64 `meddler:"id,pk"`
|
||||||
|
Imel string `meddler:"imel"`
|
||||||
|
Name string `meddler:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type RenameSample struct {
|
||||||
|
ID int64 `meddler:"id,pk"`
|
||||||
|
Email string `meddler:"email"`
|
||||||
|
Name string `meddler:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AddColumnSample struct {
|
||||||
|
ID int64 `meddler:"id,pk"`
|
||||||
|
Imel string `meddler:"imel"`
|
||||||
|
Name string `meddler:"name"`
|
||||||
|
Url string `meddler:"url"`
|
||||||
|
Num int64 `meddler:"num"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- revision 1
|
||||||
|
|
||||||
|
type revision1 struct{}
|
||||||
|
|
||||||
|
func (r *revision1) Up(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.CreateTable("samples", []string{
|
||||||
|
mg.T.Integer("id", PRIMARYKEY, AUTOINCREMENT),
|
||||||
|
mg.T.String("imel", UNIQUE),
|
||||||
|
mg.T.String("name"),
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision1) Down(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.DropTable("samples")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision1) Revision() int64 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 1
|
||||||
|
|
||||||
|
// ---------- revision 2
|
||||||
|
|
||||||
|
type revision2 struct{}
|
||||||
|
|
||||||
|
func (r *revision2) Up(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.RenameTable("samples", "examples")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision2) Down(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.RenameTable("examples", "samples")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision2) Revision() int64 {
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 2
|
||||||
|
|
||||||
|
// ---------- revision 3
|
||||||
|
|
||||||
|
type revision3 struct{}
|
||||||
|
|
||||||
|
func (r *revision3) Up(mg *MigrationDriver) error {
|
||||||
|
if _, err := mg.AddColumn("samples", "url VARCHAR(255)"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err := mg.AddColumn("samples", "num INTEGER")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision3) Down(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.DropColumns("samples", "num", "url")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision3) Revision() int64 {
|
||||||
|
return 3
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 3
|
||||||
|
|
||||||
|
// ---------- revision 4
|
||||||
|
|
||||||
|
type revision4 struct{}
|
||||||
|
|
||||||
|
func (r *revision4) Up(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.RenameColumns("samples", map[string]string{
|
||||||
|
"imel": "email",
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision4) Down(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.RenameColumns("samples", map[string]string{
|
||||||
|
"email": "imel",
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision4) Revision() int64 {
|
||||||
|
return 4
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 4
|
||||||
|
|
||||||
|
// ---------- revision 5
|
||||||
|
|
||||||
|
type revision5 struct{}
|
||||||
|
|
||||||
|
func (r *revision5) Up(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.AddIndex("samples", []string{"url", "name"})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision5) Down(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.DropIndex("samples", []string{"url", "name"})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision5) Revision() int64 {
|
||||||
|
return 5
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 5
|
||||||
|
|
||||||
|
// ---------- revision 6
|
||||||
|
type revision6 struct{}
|
||||||
|
|
||||||
|
func (r *revision6) Up(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.RenameColumns("samples", map[string]string{
|
||||||
|
"url": "host",
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision6) Down(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.RenameColumns("samples", map[string]string{
|
||||||
|
"host": "url",
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision6) Revision() int64 {
|
||||||
|
return 6
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 6
|
||||||
|
|
||||||
|
// ---------- revision 7
|
||||||
|
type revision7 struct{}
|
||||||
|
|
||||||
|
func (r *revision7) Up(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.DropColumns("samples", "host", "num")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision7) Down(mg *MigrationDriver) error {
|
||||||
|
if _, err := mg.AddColumn("samples", "host VARCHAR(255)"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err := mg.AddColumn("samples", "num INSTEGER")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision7) Revision() int64 {
|
||||||
|
return 7
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 7
|
||||||
|
|
||||||
|
// ---------- revision 8
|
||||||
|
type revision8 struct{}
|
||||||
|
|
||||||
|
func (r *revision8) Up(mg *MigrationDriver) error {
|
||||||
|
if _, err := mg.AddColumn("samples", "repo_id INTEGER"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err := mg.AddColumn("samples", "repo VARCHAR(255)")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision8) Down(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.DropColumns("samples", "repo", "repo_id")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision8) Revision() int64 {
|
||||||
|
return 8
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 8
|
||||||
|
|
||||||
|
// ---------- revision 9
|
||||||
|
type revision9 struct{}
|
||||||
|
|
||||||
|
func (r *revision9) Up(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.RenameColumns("samples", map[string]string{
|
||||||
|
"repo": "repository",
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision9) Down(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.RenameColumns("samples", map[string]string{
|
||||||
|
"repository": "repo",
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision9) Revision() int64 {
|
||||||
|
return 9
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 9
|
||||||
|
|
||||||
|
// ---------- revision 10
|
||||||
|
|
||||||
|
type revision10 struct{}
|
||||||
|
|
||||||
|
func (r *revision10) Revision() int64 {
|
||||||
|
return 10
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision10) Up(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.ChangeColumn("samples", "email", "varchar(512) UNIQUE")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *revision10) Down(mg *MigrationDriver) error {
|
||||||
|
_, err := mg.ChangeColumn("samples", "email", "varchar(255) unique")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- end of revision 10
|
|
@ -63,11 +63,11 @@ func TestGetRepo(t *testing.T) {
|
||||||
t.Errorf("Exepected Password %s, got %s", "no password", repo.Password)
|
t.Errorf("Exepected Password %s, got %s", "no password", repo.Password)
|
||||||
}
|
}
|
||||||
|
|
||||||
if repo.PublicKey != "public key" {
|
if repo.PublicKey != pubkey {
|
||||||
t.Errorf("Exepected PublicKey %s, got %s", "public key", repo.PublicKey)
|
t.Errorf("Exepected PublicKey %s, got %s", "public key", repo.PublicKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
if repo.PrivateKey != "private key" {
|
if repo.PrivateKey != privkey {
|
||||||
t.Errorf("Exepected PrivateKey %s, got %s", "private key", repo.PrivateKey)
|
t.Errorf("Exepected PrivateKey %s, got %s", "private key", repo.PrivateKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,11 +135,11 @@ func TestGetRepoSlug(t *testing.T) {
|
||||||
t.Errorf("Exepected Password %s, got %s", "no password", repo.Password)
|
t.Errorf("Exepected Password %s, got %s", "no password", repo.Password)
|
||||||
}
|
}
|
||||||
|
|
||||||
if repo.PublicKey != "public key" {
|
if repo.PublicKey != pubkey {
|
||||||
t.Errorf("Exepected PublicKey %s, got %s", "public key", repo.PublicKey)
|
t.Errorf("Exepected PublicKey %s, got %s", "public key", repo.PublicKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
if repo.PrivateKey != "private key" {
|
if repo.PrivateKey != privkey {
|
||||||
t.Errorf("Exepected PrivateKey %s, got %s", "private key", repo.PrivateKey)
|
t.Errorf("Exepected PrivateKey %s, got %s", "private key", repo.PrivateKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,11 +385,11 @@ func TestListReposTeam(t *testing.T) {
|
||||||
t.Errorf("Exepected Password %s, got %s", "no password", repo.Password)
|
t.Errorf("Exepected Password %s, got %s", "no password", repo.Password)
|
||||||
}
|
}
|
||||||
|
|
||||||
if repo.PublicKey != "public key" {
|
if repo.PublicKey != pubkey {
|
||||||
t.Errorf("Exepected PublicKey %s, got %s", "public key", repo.PublicKey)
|
t.Errorf("Exepected PublicKey %s, got %s", "public key", repo.PublicKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
if repo.PrivateKey != "private key" {
|
if repo.PrivateKey != privkey {
|
||||||
t.Errorf("Exepected PrivateKey %s, got %s", "private key", repo.PrivateKey)
|
t.Errorf("Exepected PrivateKey %s, got %s", "private key", repo.PrivateKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,9 +16,40 @@ import (
|
||||||
"github.com/russross/meddler"
|
"github.com/russross/meddler"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
pubkey = `sh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClp9+xjhYj2Wz0nwLNhUiR1RkqfoVZwlJoxdubQy8GskZtY7C7YGa/PeKfdfaKOWtVgg37r/OYS3kc7bIKVup4sx/oW59FMwCZYQ2nxoaPZpPwUJs8D0Wy0b2VSP+vAnJ6jZQEIEiClrzyYafSfqN6L9T/BTkn28ktWalOHqWVKejKeD6M0uhlpyIZFsQ1K2wNt32ACwT/rbanx/r/jfczqxSkLzvIKXXs/RdKQgwRRUYnKkl4Lh6r22n9n3m2VwRor5wdsPK8sr57OsqdRpnvsFs3lxwM8w5ZiAZV3T0xTMGVs3W8Uy5HexAD6TgWBWFjSrgdXF1pE83wmUtJtVBf`
|
||||||
|
privkey = `-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEogIBAAKCAQEApaffsY4WI9ls9J8CzYVIkdUZKn6FWcJSaMXbm0MvBrJGbWOw
|
||||||
|
u2Bmvz3in3X2ijlrVYIN+6/zmEt5HO2yClbqeLMf6FufRTMAmWENp8aGj2aT8FCb
|
||||||
|
PA9FstG9lUj/rwJyeo2UBCBIgpa88mGn0n6jei/U/wU5J9vJLVmpTh6llSnoyng+
|
||||||
|
jNLoZaciGRbENStsDbd9gAsE/622p8f6/433M6sUpC87yCl17P0XSkIMEUVGJypJ
|
||||||
|
eC4eq9tp/Z95tlcEaK+cHbDyvLK+ezrKnUaZ77BbN5ccDPMOWYgGVd09MUzBlbN1
|
||||||
|
vFMuR3sQA+k4FgVhY0q4HVxdaRPN8JlLSbVQXwIDAQABAoIBAA3EqSPxwkdSf+rI
|
||||||
|
+IuqY0CzrHbKszylmQHaSAlciSEOWionWf4I4iFM/HPycv5EDXa663yawC1NQJC1
|
||||||
|
9NFFLhHAGYvPaapvtcIJvf/O0UpD5VHY8T4JqupU4mPxAEdEdc1XzRCWulAYRTYE
|
||||||
|
BdXJ7r5uEU7s2TZF3y+kvxyeEXcXNWK1I4kGBSgH4KI5WIODtNJ6vaIk5Yugqt1N
|
||||||
|
cg5Sprk4bUMRTBH6GmSiJUleA0f/k6MCCmhETKXGt9mmfJ1PXpVlfDn5m26MX6vZ
|
||||||
|
XgaoIHUCy4sh1Fq6vbEI831JcO4kdvl4TtX90SzSadHjewNHy0V2gjAysvqbEDhw
|
||||||
|
Hn8D+MkCgYEA00tTKPp3AUTxT9ZgfPBD3DY7tk7+xp2R2lA6H9TUWe79TRfncFtS
|
||||||
|
8bCfEXd8xALL5cFyzi4q4YJ77mJjlWE7AMYdsFoAW1l3Q71JRRBSwsyIwp4hU8AV
|
||||||
|
K48SDjqecDzY42UvuKGp3opPWb0PzJixJNUgawU/ZGPxqN8jlr0o+K0CgYEAyLSO
|
||||||
|
rZqOvyE5wu8yadHLlQC4usoYtnyDC8PG2SgnZnlnZnkgNy3yLmHYvTvYSQsAv7rA
|
||||||
|
fFsKMt2MJhlclx+sTds/LLHKj/RfVDFenFf6ajBNZ1k+KRcwrV1A4iWinWmBxiEi
|
||||||
|
A8aM9rGs7WRBkqaCONSUQHcmLRRz7hqDtsBpkrsCgYBY2FJ2Z6LEmN2zCVx3DHws
|
||||||
|
S22eQeclUroyhwt5uP81daVy1jtN5kihMfgg2xJORTLBQC9q/MSxIDHGUf63oDO0
|
||||||
|
JpnzPlTqFFtu01fMv4ldOa3Dz8QJuDnun/EipIlcfmlgbHq9ctS/q36kKDhNemL6
|
||||||
|
Lte7yHAYYWIK9RC84Hsq3QKBgAfDbC1s6A6ek2Rl6jZLpitKTtryzEfqwwrmdL+b
|
||||||
|
nQKKuaQuFT/tKAwBPuf685/HrCy+ZYmp39gd17j1jC5QTFLqoyPwcJxm4HUaP8We
|
||||||
|
ZZJL8gKIYi4mtnxOOh9FQ2gBV8K5L16kBHnaX40DLsIkbK8UEfP4Z+Kggud34RZl
|
||||||
|
lO/XAoGAFFZdolsVbSieFhJt7ypzp/19dKJ8Sk6QGCk3uQpTuLJMvwcBT8X5XCTD
|
||||||
|
zFfYARarx87mbD2k5GZ7F0fmGYTUV14qlxJCGMythLM/xZ6EJuJWBz69puNj4yhn
|
||||||
|
exWM7t1BDHy2zIoPfIQLDH2h1zNTRjismMeErOCy0Uha7jrZhW8=
|
||||||
|
-----END RSA PRIVATE KEY-----`
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
dbname, driver, dsn, login string
|
dbname, driver, dsn, login string
|
||||||
db *sql.DB
|
db *sql.DB
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -131,8 +162,8 @@ func Setup() {
|
||||||
URL: "git@github.com:drone/drone.git",
|
URL: "git@github.com:drone/drone.git",
|
||||||
Username: "no username",
|
Username: "no username",
|
||||||
Password: "no password",
|
Password: "no password",
|
||||||
PublicKey: "public key",
|
PublicKey: pubkey,
|
||||||
PrivateKey: "private key",
|
PrivateKey: privkey,
|
||||||
UserID: user1.ID,
|
UserID: user1.ID,
|
||||||
TeamID: team1.ID,
|
TeamID: team1.ID,
|
||||||
}
|
}
|
||||||
|
@ -147,8 +178,8 @@ func Setup() {
|
||||||
URL: "https://bitbucket.org/drone/test",
|
URL: "https://bitbucket.org/drone/test",
|
||||||
Username: "no username",
|
Username: "no username",
|
||||||
Password: "no password",
|
Password: "no password",
|
||||||
PublicKey: "public key",
|
PublicKey: pubkey,
|
||||||
PrivateKey: "private key",
|
PrivateKey: privkey,
|
||||||
UserID: user1.ID,
|
UserID: user1.ID,
|
||||||
TeamID: team1.ID,
|
TeamID: team1.ID,
|
||||||
}
|
}
|
||||||
|
@ -163,8 +194,8 @@ func Setup() {
|
||||||
URL: "https://bitbucket.org/brydzewski/test",
|
URL: "https://bitbucket.org/brydzewski/test",
|
||||||
Username: "no username",
|
Username: "no username",
|
||||||
Password: "no password",
|
Password: "no password",
|
||||||
PublicKey: "public key",
|
PublicKey: pubkey,
|
||||||
PrivateKey: "private key",
|
PrivateKey: privkey,
|
||||||
UserID: user2.ID,
|
UserID: user2.ID,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue