package paneldecl import ( "git.yeij.top/AskaEth/Cyrene_v2/pkg/plugins/sdk" ) // 本文件是区块层的拒绝用例:类型闭集、id/标题必填、以及 §5.2.1 接入点表的形状矩阵 // (哪些键必须出现、哪些不许出现、哪些是只读区块上的写面)。 // rejectCasesSectionCommon 是区块的通用必填与唯一性。 func rejectCasesSectionCommon() []rejectCase { return []rejectCase{ { name: "区块类型不在闭集", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[0].Type = "chart" }) }, want: ErrUnknownSectionType, wantPath: "adminPanels[0].sections[0].type", }, { name: "区块 id 缺失", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[0].ID = "" }) }, want: ErrMissingField, wantPath: "adminPanels[0].sections[0].id", }, { name: "区块标题缺失", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[0].Title = "" }) }, want: ErrMissingField, wantPath: "adminPanels[0].sections[0].title", }, { name: "区块 id 在面板内重复", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[1].ID = "add" }) }, want: ErrDuplicateID, wantPath: "adminPanels[0].sections[1].id", }, } } // rejectCasesFormShape 是 form 区块的形状(§5.2.1 section.form 只消费 fields[] + submit.action)。 func rejectCasesFormShape() []rejectCase { return []rejectCase{ { name: "form 缺 submit", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[0].Submit = nil }) }, want: ErrMissingField, wantPath: "adminPanels[0].sections[0].submit", }, { name: "form 缺 fields", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[0].Fields = nil }) }, want: ErrMissingField, wantPath: "adminPanels[0].sections[0].fields", }, { name: "form 声明 source(形状错误)", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[0].Source = &sdk.Source{Action: "plugin.listProviders"} }) }, want: ErrSectionShape, wantPath: "adminPanels[0].sections[0].source", }, { name: "form 声明 columns(形状错误)", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[0].Columns = []sdk.Column{{Key: "k"}} }) }, want: ErrSectionShape, wantPath: "adminPanels[0].sections[0].columns", }, } } // rejectCasesTableShape 是 table 区块的形状(§5.2.1 section.table 消费 columns[]/rowActions[]/source)。 func rejectCasesTableShape() []rejectCase { return []rejectCase{ { name: "table 缺 columns", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[1].Columns = nil }) }, want: ErrMissingField, wantPath: "adminPanels[0].sections[1].columns", }, { name: "table 缺 source", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[1].Source = nil }) }, want: ErrMissingField, wantPath: "adminPanels[0].sections[1].source", }, { name: "table 上出现写面 submit", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[1].Submit = &sdk.Submit{Action: "plugin.saveProvider"} }) }, want: ErrReadOnlySection, wantPath: "adminPanels[0].sections[1].submit", }, { name: "table 声明字段(形状错误)", panels: func() []sdk.Panel { return panelsOf(samplePanel(), func(p *sdk.Panel) { p.Sections[1].Fields = []sdk.Field{{Key: "state", Type: sdk.FieldText}} }) }, want: ErrSectionShape, wantPath: "adminPanels[0].sections[1].fields", }, } } // rejectCasesReadOnlySections 是只读区块(status / log)的写面与形状。 func rejectCasesReadOnlySections() []rejectCase { return []rejectCase{ { name: "status 上出现写面 submit", panels: func() []sdk.Panel { return panelsOf(statusPanel(), func(p *sdk.Panel) { p.Sections[0].Submit = &sdk.Submit{Action: "plugin.saveProvider"} }) }, want: ErrReadOnlySection, wantPath: "adminPanels[0].sections[0].submit", }, { name: "status 上出现行内动作", panels: func() []sdk.Panel { return panelsOf(statusPanel(), func(p *sdk.Panel) { p.Sections[0].RowActions = []sdk.RowAction{{ID: "test", Label: "测试", Action: "plugin.t"}} }) }, want: ErrReadOnlySection, wantPath: "adminPanels[0].sections[0].rowActions", }, { name: "status 声明 source(形状错误)", panels: func() []sdk.Panel { return panelsOf(statusPanel(), func(p *sdk.Panel) { p.Sections[0].Source = &sdk.Source{Action: "plugin.chain"} }) }, want: ErrSectionShape, wantPath: "adminPanels[0].sections[0].source", }, { name: "log 缺 source", panels: func() []sdk.Panel { return panelsOf(logPanel(), func(p *sdk.Panel) { p.Sections[0].Source = nil }) }, want: ErrMissingField, wantPath: "adminPanels[0].sections[0].source", }, { name: "log 的 limit 越界", panels: func() []sdk.Panel { return panelsOf(logPanel(), func(p *sdk.Panel) { p.Sections[0].Limit = 5000 }) }, want: ErrInvalidLimit, wantPath: "adminPanels[0].sections[0].limit", }, { name: "log 声明 fields(形状错误)", panels: func() []sdk.Panel { return panelsOf(logPanel(), func(p *sdk.Panel) { p.Sections[0].Fields = []sdk.Field{{Key: "line", Type: sdk.FieldText}} }) }, want: ErrSectionShape, wantPath: "adminPanels[0].sections[0].fields", }, } }