95 lines
2.8 KiB
Go
95 lines
2.8 KiB
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// newSQLiteFile 建一个 sqlite 测试库文件并执行建表/插数语句,返回 ConnReq。
|
|
func newSQLiteFile(t *testing.T, stmts ...string) ConnReq {
|
|
t.Helper()
|
|
path := filepath.Join(t.TempDir(), "test.db")
|
|
if err := os.WriteFile(path, []byte{}, 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, s := range stmts {
|
|
res := ExecSQL(context.Background(), ConnReq{Driver: "sqlite", Database: path, SQL: s})
|
|
if res.Error != "" {
|
|
t.Fatalf("初始化语句失败 %q: %s", s, res.Error)
|
|
}
|
|
}
|
|
return ConnReq{Driver: "sqlite", Database: path}
|
|
}
|
|
|
|
// R2-B5:sqlite 返回 sqlite_master 中的原始建表语句。
|
|
func TestGetDDLSQLite(t *testing.T) {
|
|
c := newSQLiteFile(t, `CREATE TABLE t_person (id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER)`)
|
|
c.Table = "t_person"
|
|
ddl, err := GetDDL(context.Background(), c)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !strings.Contains(ddl, "CREATE TABLE t_person") || !strings.Contains(ddl, "name TEXT") {
|
|
t.Fatalf("DDL 内容不符: %s", ddl)
|
|
}
|
|
|
|
c.Table = "no_such_table"
|
|
if _, err := GetDDL(context.Background(), c); err == nil {
|
|
t.Fatal("不存在的表应报错")
|
|
}
|
|
}
|
|
|
|
func TestGetDDLRedis(t *testing.T) {
|
|
_, err := GetDDL(context.Background(), ConnReq{Driver: "redis", Table: "k"})
|
|
if err == nil || !strings.Contains(err.Error(), "不支持") {
|
|
t.Fatalf("redis 应报不支持: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestGetDDLMissingTable(t *testing.T) {
|
|
_, err := GetDDL(context.Background(), ConnReq{Driver: "sqlite", Table: ""})
|
|
if err == nil {
|
|
t.Fatal("空表名应报错")
|
|
}
|
|
}
|
|
|
|
// R2-B5:pg/mssql/oracle 族用列元数据拼装,各 family 引号不同。
|
|
func TestBuildDDLFromColumns(t *testing.T) {
|
|
cols := []ColumnInfo{
|
|
{Name: "id", Type: "integer", Nullable: false, Key: "PRI"},
|
|
{Name: "na\"me", Type: "text", Nullable: true},
|
|
}
|
|
// pg:双引号加倍
|
|
ddl, err := buildDDLFromColumns("postgres", "public.t", cols)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !strings.Contains(ddl, `"public"."t"`) || !strings.Contains(ddl, `"na""me" text`) ||
|
|
!strings.Contains(ddl, `"id" integer NOT NULL,`) || !strings.Contains(ddl, `PRIMARY KEY ("id")`) {
|
|
t.Fatalf("pg DDL 不符:\n%s", ddl)
|
|
}
|
|
// mssql:中括号
|
|
ddl, err = buildDDLFromColumns("mssql", "dbo.t", cols)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !strings.Contains(ddl, `[id] integer NOT NULL`) || !strings.Contains(ddl, `PRIMARY KEY ([id])`) {
|
|
t.Fatalf("mssql DDL 不符:\n%s", ddl)
|
|
}
|
|
// oracle:原名
|
|
ddl, err = buildDDLFromColumns("oracle", "T", cols)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !strings.Contains(ddl, `CREATE TABLE T (`) || !strings.Contains(ddl, `PRIMARY KEY (id)`) {
|
|
t.Fatalf("oracle DDL 不符:\n%s", ddl)
|
|
}
|
|
// 无列报错
|
|
if _, err := buildDDLFromColumns("postgres", "t", nil); err == nil {
|
|
t.Fatal("无列应报错")
|
|
}
|
|
}
|