43 lines
1.9 KiB
Go
43 lines
1.9 KiB
Go
package mysql
|
|
|
|
import (
|
|
"context"
|
|
"regexp"
|
|
"testing"
|
|
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
)
|
|
|
|
func TestMigrateAddsLoginAuditClientVersionColumnsAndIndex(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
if err != nil {
|
|
t.Fatalf("create sqlmock: %v", err)
|
|
}
|
|
defer db.Close()
|
|
repository := &Repository{db: db}
|
|
|
|
columnProbe := `(?s)SELECT COUNT\(\*\).*FROM information_schema\.COLUMNS.*TABLE_SCHEMA = DATABASE\(\).*TABLE_NAME = \?.*COLUMN_NAME = \?`
|
|
mock.ExpectQuery(columnProbe).
|
|
WithArgs("login_audit", "app_version").
|
|
WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(0))
|
|
mock.ExpectExec(regexp.QuoteMeta("ALTER TABLE login_audit ADD COLUMN app_version VARCHAR(64) NOT NULL DEFAULT '' COMMENT '本次认证客户端版本' AFTER platform")).
|
|
WillReturnResult(sqlmock.NewResult(0, 0))
|
|
mock.ExpectQuery(columnProbe).
|
|
WithArgs("login_audit", "build_number").
|
|
WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(0))
|
|
mock.ExpectExec(regexp.QuoteMeta("ALTER TABLE login_audit ADD COLUMN build_number VARCHAR(64) NOT NULL DEFAULT '' COMMENT '本次认证客户端构建号' AFTER app_version")).
|
|
WillReturnResult(sqlmock.NewResult(0, 0))
|
|
mock.ExpectQuery(`(?s)SELECT COLUMN_NAME.*FROM information_schema\.STATISTICS.*TABLE_SCHEMA = DATABASE\(\).*TABLE_NAME = \?.*INDEX_NAME = \?.*ORDER BY SEQ_IN_INDEX`).
|
|
WithArgs("login_audit", "idx_login_audit_latest_success").
|
|
WillReturnRows(sqlmock.NewRows([]string{"COLUMN_NAME"}))
|
|
mock.ExpectExec(regexp.QuoteMeta("ALTER TABLE login_audit ADD INDEX idx_login_audit_latest_success (app_code, user_id, result, blocked, login_type, created_at_ms, id)")).
|
|
WillReturnResult(sqlmock.NewResult(0, 0))
|
|
|
|
if err := repository.Migrate(context.Background()); err != nil {
|
|
t.Fatalf("migrate login audit client version schema: %v", err)
|
|
}
|
|
if err := mock.ExpectationsWereMet(); err != nil {
|
|
t.Fatalf("migration expectations mismatch: %v", err)
|
|
}
|
|
}
|