H-289: add Captain Skill management API (#46)
* H-289: add Captain Skill management API * H-289: guard Captain Skill updates with CAS * H-289: version all Captain Skill updates --------- Co-authored-by: Rogee <rogee@ipao.vip>
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"gorm.io/driver/postgres"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
|
||||
"github.com/gochat/gochat/internal/model"
|
||||
)
|
||||
|
||||
func TestCaptainSkillSchemaSQLiteRoundTrip(t *testing.T) {
|
||||
db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=shared"), &gorm.Config{Logger: logger.Default.LogMode(logger.Silent)})
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, db.AutoMigrate(&model.CaptainAssistant{}, &model.CaptainSkill{}, &model.CaptainSkillReference{}, &model.CaptainAssistantSkill{}))
|
||||
for _, table := range []string{"captain_skills", "captain_skill_references", "captain_assistant_skills"} {
|
||||
assert.True(t, db.Migrator().HasTable(table), table)
|
||||
require.NoError(t, db.Migrator().DropTable(table))
|
||||
assert.False(t, db.Migrator().HasTable(table), table)
|
||||
}
|
||||
}
|
||||
|
||||
func openCaptainMigrationPostgres(t *testing.T) *gorm.DB {
|
||||
t.Helper()
|
||||
dsn := os.Getenv("GOCHAT_TEST_DB_URL")
|
||||
if dsn == "" {
|
||||
dsn = "host=localhost port=5432 user=postgres password=postgres dbname=gochat_test sslmode=disable"
|
||||
}
|
||||
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Silent)})
|
||||
require.NoError(t, err)
|
||||
sqlDB, err := db.DB()
|
||||
require.NoError(t, err)
|
||||
sqlDB.SetMaxOpenConns(1)
|
||||
t.Cleanup(func() { _ = sqlDB.Close() })
|
||||
schema := "captain_skill_migration_" + time.Now().Format("20060102150405000000000")
|
||||
require.NoError(t, db.Exec("CREATE SCHEMA "+schema).Error)
|
||||
t.Cleanup(func() { _ = db.Exec("DROP SCHEMA " + schema + " CASCADE").Error })
|
||||
require.NoError(t, db.Exec("SET search_path TO "+schema).Error)
|
||||
return db
|
||||
}
|
||||
|
||||
func TestCaptainSkillPostgresMigrationRoundTrip(t *testing.T) {
|
||||
if os.Getenv("GOCHAT_TEST_DB") == "sqlite" {
|
||||
t.Skip("PostgreSQL migration test")
|
||||
}
|
||||
db := openCaptainMigrationPostgres(t)
|
||||
require.NoError(t, db.Exec("CREATE TABLE accounts (id SERIAL PRIMARY KEY); CREATE TABLE captain_assistants (id SERIAL PRIMARY KEY, account_id INTEGER NOT NULL);").Error)
|
||||
|
||||
up, err := os.ReadFile(filepath.Join("..", "..", "migrations", "000080_add_captain_skills.up.sql"))
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, db.Exec(string(up)).Error)
|
||||
for _, table := range []string{"captain_skills", "captain_skill_references", "captain_assistant_skills"} {
|
||||
assert.True(t, db.Migrator().HasTable(table), table)
|
||||
}
|
||||
require.NoError(t, db.Exec("INSERT INTO accounts(id) VALUES (1); INSERT INTO captain_assistants(id, account_id) VALUES (1, 1);").Error)
|
||||
require.NoError(t, db.Exec("INSERT INTO captain_skills(id, account_id, name, description, instructions_md, status) VALUES (1, 1, 'policy', 'Policy', 'Use it', 'active')").Error)
|
||||
require.NoError(t, db.Exec("INSERT INTO captain_skill_references(skill_id, reference_key, content_md, position) VALUES (1, 'standard', 'Terms', 0)").Error)
|
||||
require.NoError(t, db.Exec("INSERT INTO captain_assistant_skills(account_id, assistant_id, skill_id) VALUES (1, 1, 1)").Error)
|
||||
assert.Error(t, db.Exec("INSERT INTO captain_skill_references(skill_id, reference_key, content_md, position) VALUES (1, 'standard', 'Duplicate', 1)").Error)
|
||||
require.NoError(t, db.Exec("DELETE FROM captain_skills WHERE id = 1").Error)
|
||||
for _, table := range []string{"captain_skill_references", "captain_assistant_skills"} {
|
||||
var count int64
|
||||
require.NoError(t, db.Table(table).Count(&count).Error)
|
||||
assert.Zero(t, count, table)
|
||||
}
|
||||
|
||||
down, err := os.ReadFile(filepath.Join("..", "..", "migrations", "000080_add_captain_skills.down.sql"))
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, db.Exec(string(down)).Error)
|
||||
for _, table := range []string{"captain_skills", "captain_skill_references", "captain_assistant_skills"} {
|
||||
assert.False(t, db.Migrator().HasTable(table), table)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user