使用 go:embed 嵌入迁移 SQL 到二进制,移除 runtime.Caller 源码路径依赖, server 和 desktop 发布产物均可在无源码目录环境下完成数据库初始化和迁移。
72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
package database
|
|
|
|
import (
|
|
"io/fs"
|
|
"testing"
|
|
|
|
"nex/backend/migrations"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestEmbeddedMigrations_SQLiteResourcesPresent(t *testing.T) {
|
|
entries, err := fs.ReadDir(migrations.FS, "sqlite")
|
|
require.NoError(t, err)
|
|
|
|
var sqlFiles []string
|
|
for _, entry := range entries {
|
|
if !entry.IsDir() {
|
|
sqlFiles = append(sqlFiles, entry.Name())
|
|
}
|
|
}
|
|
assert.NotEmpty(t, sqlFiles, "SQLite 迁移资源应至少包含一个 .sql 文件")
|
|
}
|
|
|
|
func TestEmbeddedMigrations_MySQLResourcesPresent(t *testing.T) {
|
|
entries, err := fs.ReadDir(migrations.FS, "mysql")
|
|
require.NoError(t, err)
|
|
|
|
var sqlFiles []string
|
|
for _, entry := range entries {
|
|
if !entry.IsDir() {
|
|
sqlFiles = append(sqlFiles, entry.Name())
|
|
}
|
|
}
|
|
assert.NotEmpty(t, sqlFiles, "MySQL 迁移资源应至少包含一个 .sql 文件")
|
|
}
|
|
|
|
func TestEmbeddedMigrations_SQLiteSQLParsable(t *testing.T) {
|
|
subFS, err := fs.Sub(migrations.FS, "sqlite")
|
|
require.NoError(t, err)
|
|
|
|
entries, err := fs.ReadDir(subFS, ".")
|
|
require.NoError(t, err)
|
|
|
|
for _, entry := range entries {
|
|
if entry.IsDir() {
|
|
continue
|
|
}
|
|
data, err := fs.ReadFile(subFS, entry.Name())
|
|
require.NoError(t, err, "无法读取迁移文件: %s", entry.Name())
|
|
assert.NotEmpty(t, data, "迁移文件内容不应为空: %s", entry.Name())
|
|
}
|
|
}
|
|
|
|
func TestEmbeddedMigrations_MySQLSQLParsable(t *testing.T) {
|
|
subFS, err := fs.Sub(migrations.FS, "mysql")
|
|
require.NoError(t, err)
|
|
|
|
entries, err := fs.ReadDir(subFS, ".")
|
|
require.NoError(t, err)
|
|
|
|
for _, entry := range entries {
|
|
if entry.IsDir() {
|
|
continue
|
|
}
|
|
data, err := fs.ReadFile(subFS, entry.Name())
|
|
require.NoError(t, err, "无法读取迁移文件: %s", entry.Name())
|
|
assert.NotEmpty(t, data, "迁移文件内容不应为空: %s", entry.Name())
|
|
}
|
|
}
|