9154afab6b
- 新增驱动抽象层 driver_adapter(go-ora/godror 双驱动切换) - 新增 Update/Delete/Query 回调,完善 RETURNING INTO 子句 - 修复 create.go 事务悬挂行 BUG、批量 RowsAffected、主键 WHERE 注入 - 版本感知体系:分页/自增/序列默认值/BOOLEAN/32k VARCHAR2 分级能力判定 - 11g 序列+触发器自增、ON UPDATE 触发器、默认值智能转换 - 升级 go-ora v2.8.19 → v2.9.0 - 单元测试+模块测试+集成测试共 96 个,真实 Oracle 11g 全绿 - 测试 DSN 密码移除,改为 ORACLE_DSN 环境变量注入
101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
package clauses
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
func TestWhenMatchedName(t *testing.T) {
|
|
var w WhenMatched
|
|
if got := w.Name(); got != "WHEN MATCHED" {
|
|
t.Errorf("WhenMatched.Name() = %q, want %q", got, "WHEN MATCHED")
|
|
}
|
|
}
|
|
|
|
func TestWhenMatchedBuild(t *testing.T) {
|
|
w := WhenMatched{
|
|
Set: clause.Set{{Column: clause.Column{Name: "name"}, Value: "x"}},
|
|
}
|
|
|
|
sql := buildSQL(t, w)
|
|
// 期望: THEN UPDATE WHEN MATCHED SET name=:1
|
|
for _, want := range []string{
|
|
"THEN UPDATE",
|
|
"WHEN MATCHED",
|
|
"SET name=:1",
|
|
} {
|
|
if !strings.Contains(sql, want) {
|
|
t.Errorf("WhenMatched SQL %q does not contain %q", sql, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestWhenMatchedBuildMultipleSet(t *testing.T) {
|
|
w := WhenMatched{
|
|
Set: clause.Set{
|
|
{Column: clause.Column{Name: "name"}, Value: "x"},
|
|
{Column: clause.Column{Name: "age"}, Value: 1},
|
|
},
|
|
}
|
|
|
|
sql := buildSQL(t, w)
|
|
if want := "SET name=:1,age=:2"; !strings.Contains(sql, want) {
|
|
t.Errorf("WhenMatched SQL %q does not contain %q", sql, want)
|
|
}
|
|
}
|
|
|
|
func TestWhenMatchedBuildWithWhereAndDelete(t *testing.T) {
|
|
w := WhenMatched{
|
|
Set: clause.Set{{Column: clause.Column{Name: "name"}, Value: "x"}},
|
|
Where: clause.Where{Exprs: []clause.Expression{
|
|
clause.Eq{Column: clause.Column{Name: "id"}, Value: 1},
|
|
}},
|
|
Delete: clause.Where{Exprs: []clause.Expression{
|
|
clause.Eq{Column: clause.Column{Name: "flag"}, Value: 0},
|
|
}},
|
|
}
|
|
|
|
sql := buildSQL(t, w)
|
|
// 期望: THEN UPDATE WHEN MATCHED SET name=:1WHERE id = :2 DELETE WHERE flag = :3
|
|
for _, want := range []string{
|
|
"THEN UPDATE",
|
|
"WHEN MATCHED",
|
|
"SET name=:1",
|
|
"WHERE id = :2",
|
|
"DELETE WHERE flag = :3",
|
|
} {
|
|
if !strings.Contains(sql, want) {
|
|
t.Errorf("WhenMatched SQL %q does not contain %q", sql, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestWhenMatchedClauseBuild 验证通过 clause.Clause(gorm 真实构建流程)时的完整输出。
|
|
func TestWhenMatchedClauseBuild(t *testing.T) {
|
|
w := WhenMatched{
|
|
Set: clause.Set{{Column: clause.Column{Name: "name"}, Value: "x"}},
|
|
}
|
|
|
|
sql := buildClauseSQL(t, "WHEN MATCHED", w)
|
|
for _, want := range []string{
|
|
"WHEN MATCHED",
|
|
"THEN UPDATE",
|
|
"SET name=:1",
|
|
} {
|
|
if !strings.Contains(sql, want) {
|
|
t.Errorf("WhenMatched SQL %q does not contain %q", sql, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestWhenMatchedBuildEmptySet(t *testing.T) {
|
|
var w WhenMatched
|
|
|
|
sql := buildSQL(t, w)
|
|
if sql != "" {
|
|
t.Errorf("WhenMatched with empty Set should generate no SQL, got %q", sql)
|
|
}
|
|
}
|