重构: User 默认实现移到 req/userx,消除 req 对 contracts 的循环依赖

GetAnonymous/GetSystemUser 原来在 contracts/base 里实现,req 自己的测试
又要用它们构造测试用户,形成 req(测试)依赖 contracts、contracts(正式
代码)依赖 req 的循环——两边 go.mod 只能靠指向本地兄弟目录的 replace 绕过,
没法各自独立解析成真实版本号。

跟 resx 之于 req.Resource 一个思路:接口留在 req 包,默认实现挪到子包
req/userx,req 主包保持不引入实现细节所需的依赖(这里是 samber/lo)。
req 自己的测试文件改用 req/userx,不用触碰 contracts 了;contracts/base
里的 GetAnonymous/GetSystemUser 改成指向 req/userx 的函数别名,保持
兼容不用改调用方。
This commit is contained in:
2026-08-20 18:00:40 +08:00
parent 632c5476a0
commit 3c757d53c5
4 changed files with 116 additions and 37 deletions
+11 -11
View File
@@ -4,11 +4,11 @@ import (
"strings"
"testing"
"git.fsdpf.net/go/contracts/base"
"git.fsdpf.net/go/db"
"git.fsdpf.net/go/db/engine"
"git.fsdpf.net/go/req"
"git.fsdpf.net/go/req/resx"
"git.fsdpf.net/go/req/userx"
"github.com/DATA-DOG/go-sqlmock"
"github.com/samber/do/v2"
"github.com/stretchr/testify/suite"
@@ -56,7 +56,7 @@ func (t *normalizeTest) TestStripsSystemFields() {
resx.NewResField("name", "", resx.FieldWithName("姓名"), resx.FieldWithDataType(req.ResString)),
)
sql, _, _ := res.GetDBTable(base.GetAnonymous()).Insert().Rows(
sql, _, _ := res.GetDBTable(userx.GetAnonymous()).Insert().Rows(
db.Record{
"id": 999,
"name": "张三",
@@ -83,7 +83,7 @@ func (t *normalizeTest) TestDropsUndeclaredFields() {
resx.NewResField("name", "", resx.FieldWithName("姓名"), resx.FieldWithDataType(req.ResString)),
)
sql, _, _ := res.GetDBTable(base.GetAnonymous()).Insert().Rows(
sql, _, _ := res.GetDBTable(userx.GetAnonymous()).Insert().Rows(
db.Record{"name": "李四", "hacker_field": "evil"},
).Executor().ToSQL()
@@ -99,7 +99,7 @@ func (t *normalizeTest) TestExpressionValuePassesThroughEvenIfUndeclared() {
resx.NewResField("name", "", resx.FieldWithName("姓名"), resx.FieldWithDataType(req.ResString)),
)
sql, _, _ := res.GetDBTable(base.GetAnonymous()).Insert().Rows(
sql, _, _ := res.GetDBTable(userx.GetAnonymous()).Insert().Rows(
db.Record{"name": "王五", "login_at": db.L("NOW()")},
).Executor().ToSQL()
@@ -114,7 +114,7 @@ func (t *normalizeTest) TestJSONFieldNilUsesFieldDefault() {
resx.NewResField("fields", "", resx.FieldWithName("字段"), resx.FieldWithDefault("[]"), resx.FieldWithDataType(req.ResJson)),
)
sql, _, _ := res.GetDBTable(base.GetAnonymous()).Insert().Rows(
sql, _, _ := res.GetDBTable(userx.GetAnonymous()).Insert().Rows(
db.Record{"name": "A", "fields": nil},
).Executor().ToSQL()
@@ -131,7 +131,7 @@ func (t *normalizeTest) TestJSONFieldDefaultFilledWhenOmitted() {
resx.NewResField("fields", "", resx.FieldWithName("字段"), resx.FieldWithDefault("{}"), resx.FieldWithDataType(req.ResJson)),
)
sql, _, _ := res.GetDBTable(base.GetAnonymous()).Insert().Rows(
sql, _, _ := res.GetDBTable(userx.GetAnonymous()).Insert().Rows(
db.Record{"name": "B"},
).Executor().ToSQL()
@@ -146,7 +146,7 @@ func (t *normalizeTest) TestNonJSONFieldDefaultNotAutoFilled() {
resx.NewResField("name", "", resx.FieldWithName("姓名"), resx.FieldWithDefault("匿名"), resx.FieldWithDataType(req.ResString)),
)
sql, _, _ := res.GetDBTable(base.GetAnonymous()).Insert().Rows(
sql, _, _ := res.GetDBTable(userx.GetAnonymous()).Insert().Rows(
db.Record{},
).Executor().ToSQL()
@@ -161,7 +161,7 @@ func (t *normalizeTest) TestOwnedUserDefaultsToCurrentUserWhenUndeclared() {
resx.NewResField("name", "", resx.FieldWithName("姓名"), resx.FieldWithDataType(req.ResString)),
)
sql, _, _ := res.GetDBTable(base.GetAnonymous()).Insert().Rows(
sql, _, _ := res.GetDBTable(userx.GetAnonymous()).Insert().Rows(
db.Record{"name": "C", "owned_user": "someone-else-uuid"},
).Executor().ToSQL()
@@ -178,7 +178,7 @@ func (t *normalizeTest) TestOwnedUserPreservedWhenDeclaredAsField() {
resx.NewResField("owned_user", "", resx.FieldWithName("拥有者"), resx.FieldWithDataType(req.ResString)),
)
sql, _, _ := res.GetDBTable(base.GetAnonymous()).Insert().Rows(
sql, _, _ := res.GetDBTable(userx.GetAnonymous()).Insert().Rows(
db.Record{"name": "D", "owned_user": "someone-else-uuid"},
).Executor().ToSQL()
@@ -193,7 +193,7 @@ func (t *normalizeTest) TestCreatedUserAlwaysForcedToCurrentUser() {
resx.NewResField("created_user", "", resx.FieldWithName("创建者"), resx.FieldWithDataType(req.ResString)),
)
sql, _, _ := res.GetDBTable(base.GetAnonymous()).Insert().Rows(
sql, _, _ := res.GetDBTable(userx.GetAnonymous()).Insert().Rows(
db.Record{"name": "E", "created_user": "someone-else-uuid"},
).Executor().ToSQL()
@@ -212,7 +212,7 @@ func (t *normalizeTest) TestNormalizeSaveValue_Update() {
resx.NewResField("fields", "", resx.FieldWithName("字段"), resx.FieldWithDefault("{}"), resx.FieldWithDataType(req.ResJson)),
)
sql, _, _ := res.GetDBTable(base.GetAnonymous()).Update().
sql, _, _ := res.GetDBTable(userx.GetAnonymous()).Update().
Set(db.Record{
"id": 1,
"name": "F",