feat: 方案100%匹配 — RBAC动态权限+Grafana监控+目录库独立微服务+全国目录中心+标识同步

This commit is contained in:
selfrelease
2026-06-30 13:42:11 +08:00
parent 96e2393c50
commit 29a6b57533
40 changed files with 4159 additions and 7 deletions
+108
View File
@@ -150,6 +150,114 @@ func RunClientConformance(t *testing.T, newClient func(t *testing.T) Client) {
require.NoError(t, err)
assert.Len(t, pub, 1)
})
t.Run("多维度查询_按Hash反查", func(t *testing.T) {
c := newClient(t)
_, err := c.IssueMA(RoleRegulator, issueReq(ma, ctid, fh))
require.NoError(t, err)
// 注册 CP 映射(省级内容编码)
_, err = c.RegisterMapping(RoleCP, model.Mapping{
ContentTwinID: ctid, Party: model.PartyCP, PartyID: "PROV-001", PartyName: "陕西CP",
})
require.NoError(t, err)
// 注册媒资库映射(片库文件 ID
_, err = c.RegisterMapping(RoleReviewer, model.Mapping{
ContentTwinID: ctid, Party: model.PartyReviewer, PartyID: "LIB-001", PartyName: "陕西媒资库",
})
require.NoError(t, err)
// 按 Hash 查询
res, err := c.QueryByHash(fh)
require.NoError(t, err)
assert.True(t, res.Found)
assert.Equal(t, ma, res.Content.MACode)
assert.Equal(t, "契约测试剧", res.Content.Title)
// 按省级内容编码查询
res2, err := c.QueryByProvincialCode("PROV-001")
require.NoError(t, err)
assert.True(t, res2.Found)
assert.Equal(t, ma, res2.Content.MACode)
// 按片库文件 ID 查询
res3, err := c.QueryByLibraryFileID("LIB-001")
require.NoError(t, err)
assert.True(t, res3.Found)
assert.Equal(t, ma, res3.Content.MACode)
// 不存在的 Hash
_, err = c.QueryByHash("nonexistent")
assert.ErrorIs(t, err, ErrNotFound)
})
t.Run("MA合并_仅监管且迁移绑定", func(t *testing.T) {
c := newClient(t)
// 发码两个 MA
_, err := c.IssueMA(RoleRegulator, issueReq(ma, ctid, fh))
require.NoError(t, err)
ma2 := "MA.156.8531.6101/WD/20260000002"
ctid2 := "ctid-conf-002"
fh2 := "fh-conf-002"
_, err = c.IssueMA(RoleRegulator, issueReq(ma2, ctid2, fh2))
require.NoError(t, err)
// 非监管不可合并
_, err = c.MergeMA(RoleCP, model.MergeRequest{
PrimaryMACode: ma, SecondaryMACodes: []string{ma2}, Reason: "重复发码",
})
assert.ErrorIs(t, err, ErrPermissionDenied)
// 监管合并
res, err := c.MergeMA(RoleRegulator, model.MergeRequest{
PrimaryMACode: ma, SecondaryMACodes: []string{ma2}, Reason: "重复发码", Operator: "监管局",
})
require.NoError(t, err)
assert.Equal(t, ma, res.PrimaryMACode)
assert.Contains(t, res.MergedMACodes, ma2)
assert.Greater(t, res.MigratedBindings, 0)
// 被合并的 MA 状态为 merged
got, _ := c.QueryContent(ma2)
assert.Equal(t, model.StatusMerged, got.Status)
// 按 fh2 查询应指向主 MA 码
qr, err := c.QueryByHash(fh2)
require.NoError(t, err)
assert.Equal(t, ma, qr.Content.MACode)
})
t.Run("MA拆分_仅监管且按集迁移", func(t *testing.T) {
c := newClient(t)
_, err := c.IssueMA(RoleRegulator, issueReq(ma, ctid, fh))
require.NoError(t, err)
// 非监管不可拆分
_, err = c.SplitMA(RoleCP, model.SplitRequest{
SourceMACode: ma, Splits: []model.SplitTarget{{NewMACode: "MA.156.8531.6101/WD/20260000010", Title: "拆分剧A", Episodes: []int{1, 2}}},
})
assert.ErrorIs(t, err, ErrPermissionDenied)
// 监管拆分
newMA := "MA.156.8531.6101/WD/20260000011"
res, err := c.SplitMA(RoleRegulator, model.SplitRequest{
SourceMACode: ma,
Splits: []model.SplitTarget{{NewMACode: newMA, Title: "拆分剧A", Episodes: []int{1, 2}}},
Reason: "合集拆分",
Operator: "监管局",
})
require.NoError(t, err)
assert.Contains(t, res.NewMACodes, newMA)
assert.Greater(t, res.MigratedBindings, 0)
// 源 MA 状态为 split
got, _ := c.QueryContent(ma)
assert.Equal(t, model.StatusSplit, got.Status)
// 新 MA 可查询
newContent, err := c.QueryContent(newMA)
require.NoError(t, err)
assert.Equal(t, "拆分剧A", newContent.Title)
})
}
// TestMemoryChain_Conformance 让内存实现跑契约套件(始终运行)。