package paneldecl import ( "testing" "git.yeij.top/AskaEth/Cyrene_v2/pkg/plugins/sdk" ) // 本文件是测试夹具:一份**逐字对齐 design/09 §5.2 示例**的合法声明。 // // 为什么所有非法用例都从它派生:只有这样才能保证「被拒的是那一处改动,而不是碰巧别处也不 // 合法」—— 否则一个用例变红,无法区分是目标规则生效还是夹具本身有毛病。 // boolPtr 是 &true / &false 的简写(sdk.When.Enabled 是三态指针)。 func boolPtr(v bool) *bool { return &v } // floatPtr 是 &x 的简写(sdk.Field.Min / Max)。 func floatPtr(v float64) *float64 { return &v } // samplePanel 返回 §5.2 示例里的面板(web-search 的 providers 页):form + table 两段, // 覆盖 secret / select(optsFrom) / text 三种字段与两个行内动作。 func samplePanel() sdk.Panel { return sdk.Panel{ ID: "providers", Title: "搜索提供商", Group: sdk.GroupPlugins, Order: 20, Icon: "search", When: &sdk.When{Enabled: boolPtr(true)}, Sections: []sdk.Section{ { Type: sdk.SectionForm, ID: "add", Title: "添加提供商", Fields: []sdk.Field{ {Key: "provider", Label: "提供商", Type: sdk.FieldSelect, OptionsFrom: "plugin:providers", Required: true}, {Key: "apiKey", Label: "API Key", Type: sdk.FieldSecret, Required: true}, {Key: "endpoint", Label: "接口地址", Type: sdk.FieldText, Placeholder: "https://..."}, }, Submit: &sdk.Submit{Action: "plugin.saveProvider"}, }, { Type: sdk.SectionTable, ID: "list", Title: "已配置的提供商", Source: &sdk.Source{Action: "plugin.listProviders"}, Columns: []sdk.Column{ {Key: "provider", Label: "提供商"}, {Key: "state", Label: "状态"}, }, RowActions: []sdk.RowAction{ {ID: "test", Label: "测试连通", Action: "plugin.testProvider"}, {ID: "reauth", Label: "重配凭据", Action: "plugin.reauthProvider"}, }, }, }, } } // statusPanel 是只读事实面夹具(§5.2.1 section.status)。 func statusPanel() sdk.Panel { return sdk.Panel{ ID: "chain", Title: "降级链", Group: sdk.GroupPlugins, Order: 10, Sections: []sdk.Section{{ Type: sdk.SectionStatus, ID: "chain", Title: "当前生效的降级链", Fields: []sdk.Field{ {Key: "active", Label: "实际应答者", Type: sdk.FieldText}, }, }}, } } // logPanel 是只读日志卡夹具(§5.2.1 section.log)。 func logPanel() sdk.Panel { return sdk.Panel{ ID: "trace", Title: "最近调用", Group: sdk.GroupPlugins, Order: 30, Sections: []sdk.Section{{ Type: sdk.SectionLog, ID: "recent", Title: "最近 N 条", Source: &sdk.Source{Action: "plugin.recentCalls"}, Limit: 50, }}, } } // mustPanelIDs 抽取目录快照里的面板 id 序列(顺序敏感,用于稳定序断言)。 func mustPanelIDs(t *testing.T, entries []Entry) []string { t.Helper() ids := make([]string, 0, len(entries)) for _, e := range entries { ids = append(ids, e.Panel.ID) } return ids } // alwaysEnabled / neverEnabled 是两种最简 Resolver 桩。 func alwaysEnabled(string) Context { return Context{Enabled: true} } func neverEnabled(string) Context { return Context{} }