package nationalcatalog import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tcs-iptv/tcs/internal/chain" "github.com/tcs-iptv/tcs/internal/model" syncpkg "github.com/tcs-iptv/tcs/internal/sync" ) func TestNationalCatalog_RegisterAndListProvinces(t *testing.T) { nc := New() err := nc.RegisterProvince(ProvinceInfo{ ProvinceCode: "6101", ProvinceName: "陕西", OrgNode: "6101", }) require.NoError(t, err) provinces := nc.ListProvinces() assert.Len(t, provinces, 1) assert.Equal(t, "陕西", provinces[0].ProvinceName) } func TestNationalCatalog_SyncFromProvince(t *testing.T) { nc := New() nc.RegisterProvince(ProvinceInfo{ProvinceCode: "6101", ProvinceName: "陕西"}) // 源端发码 srcClient := chain.NewMemoryChain() _, err := srcClient.IssueMA(chain.RoleRegulator, chain.IssueRequest{ MACode: "MA.156.8531.6101/WD/20260000001", ContentTwinID: "ctid-nat-001", FileHash: "fh-nat-001", MerkleRoot: "mr-nat-001", Episodes: []model.EpisodeHash{ {Episode: 1, FileSHA256: "fh-nat-001-E1"}, }, Content: model.Content{Title: "全国同步测试剧", MAType: "WD", Issuer: "陕西局"}, }) require.NoError(t, err) _, err = srcClient.RegisterMapping(chain.RoleCP, model.Mapping{ ContentTwinID: "ctid-nat-001", Party: model.PartyCP, PartyID: "PROV-NAT-001", PartyName: "陕西CP", }) require.NoError(t, err) // 同步至全国中心 src := &syncpkg.ChainSource{Client: srcClient} result, err := nc.SyncFromProvince(src, syncpkg.ConflictOverwrite) require.NoError(t, err) assert.Equal(t, 1, result.TotalContents) assert.Equal(t, 1, result.TotalBindings) assert.Equal(t, 1, result.TotalMappings) // 全国中心查询验证 res, err := nc.QueryByMA("MA.156.8531.6101/WD/20260000001") require.NoError(t, err) assert.True(t, res.Found) assert.Equal(t, "全国同步测试剧", res.Content.Title) // 按 Hash 查询 res2, err := nc.QueryByHash("fh-nat-001") require.NoError(t, err) assert.True(t, res2.Found) // 按省级编码查询 res3, err := nc.QueryByProvincialCode("PROV-NAT-001") require.NoError(t, err) assert.True(t, res3.Found) } func TestNationalCatalog_Stats(t *testing.T) { nc := New() nc.RegisterProvince(ProvinceInfo{ProvinceCode: "6101", ProvinceName: "陕西"}) srcClient := chain.NewMemoryChain() _, err := srcClient.IssueMA(chain.RoleRegulator, chain.IssueRequest{ MACode: "MA.156.8531.6101/WD/20260000002", ContentTwinID: "ctid-nat-002", FileHash: "fh-nat-002", MerkleRoot: "mr-nat-002", Content: model.Content{Title: "统计测试剧", MAType: "WD", Issuer: "陕西局"}, }) require.NoError(t, err) _, err = srcClient.RegisterMapping(chain.RoleCP, model.Mapping{ ContentTwinID: "ctid-nat-002", Party: model.PartyCP, PartyID: "PROV-NAT-002", PartyName: "陕西CP", }) require.NoError(t, err) src := &syncpkg.ChainSource{Client: srcClient} _, err = nc.SyncFromProvince(src, syncpkg.ConflictOverwrite) require.NoError(t, err) stats := nc.Stats() assert.Equal(t, 1, stats.TotalContents) assert.Equal(t, 1, stats.TotalProvinces) assert.Equal(t, 1, stats.ByCategory["WD"]) } func TestNationalCatalog_ShareAuditRecord(t *testing.T) { nc := New() nc.ShareAuditRecord("MA.156.8531.6101/WD/20260000003", model.ProvenanceEvent{ MACode: "MA.156.8531.6101/WD/20260000003", Node: model.NodeIssue, Operator: "陕西局", Detail: "跨省审核记录", }) records := nc.QuerySharedAudit("MA.156.8531.6101/WD/20260000003") assert.Len(t, records, 1) assert.Equal(t, "跨省审核记录", records[0].Detail) }