CI 测试 / go vet + go test (push) Successful in 49s
- 全项目版本号统一:v3.x 迭代号(26.9/26.9/26.9/26.9 及裸 v2/v3)→ 26.9, 覆盖 Go 注释 / 文档 / openapi.yaml / README×4 / 前端源码(80+ 处) - v31_test.go 更名 custom_code_test.go;TestV2AccessorDefaults → TestKVAccessorDefaults - docs/api/00-overview.md 更新日志合并为单条 26.9 条目(修复错位拼接) - .goreleaser.yaml 头部注释与实际一致(Pro 2.18.1 / GITEA_TOKEN / semver tag 要求) - CI:release-image.yml → ci.yml,仅保留 vet+test 门禁; 镜像发布移交 GoReleaser Pro(原 build-push 的 tag 校验与 26.9 版本方案冲突,历史 9 次失败) - 前端重建:server/web/dist 与 web-embed 同步(docs 文案嵌入更新)
92 lines
2.8 KiB
Go
92 lines
2.8 KiB
Go
// schema 同步测试:保证 config.KVSchema() 的默认值/键集合与 defaults() 完全一致,
|
||
// 与 settings 包 re-export 的键名常量同源。新增键时任何一处漏改都会在此失败。
|
||
package config
|
||
|
||
import (
|
||
"encoding/json"
|
||
"testing"
|
||
)
|
||
|
||
// TestKVSchemaDefaultsMatchDefaults KVSchema 的 Default 必须 === defaults() 中同名键。
|
||
func TestKVSchemaDefaultsMatchDefaults(t *testing.T) {
|
||
def := defaults()
|
||
for _, e := range KVSchema() {
|
||
want, ok := def[e.Key]
|
||
if !ok {
|
||
t.Fatalf("schema 键 %q 缺少 defaults() 默认值", e.Key)
|
||
}
|
||
// 类型规范化比较(JSON 序列化可比较 []string / int / float)
|
||
a, _ := json.Marshal(e.Default)
|
||
b, _ := json.Marshal(want)
|
||
if string(a) != string(b) {
|
||
t.Fatalf("键 %q 默认值不一致: schema=%s defaults=%s", e.Key, a, b)
|
||
}
|
||
}
|
||
}
|
||
|
||
// TestKVSchemaNoDuplicates 键名不得重复。
|
||
func TestKVSchemaNoDuplicates(t *testing.T) {
|
||
seen := map[string]bool{}
|
||
for _, e := range KVSchema() {
|
||
if seen[e.Key] {
|
||
t.Fatalf("schema 键 %q 重复定义", e.Key)
|
||
}
|
||
seen[e.Key] = true
|
||
}
|
||
}
|
||
|
||
// TestV2NewKeysPresent 26.9 新增键必须在 schema 与 defaults 中同时存在。
|
||
func TestV2NewKeysPresent(t *testing.T) {
|
||
def := defaults()
|
||
newKeys := []string{
|
||
KeyBackgroundURL, KeyFooterText, KeyFooterBeian,
|
||
KeyNotifyEnabled, KeyMaxSaveCount, KeyMaxFileSize,
|
||
}
|
||
for _, k := range newKeys {
|
||
if _, ok := def[k]; !ok {
|
||
t.Fatalf("26.9 新键 %q 缺少默认值", k)
|
||
}
|
||
}
|
||
}
|
||
|
||
// TestKVAccessorDefaults 26.9 便捷访问器默认语义。
|
||
func TestKVAccessorDefaults(t *testing.T) {
|
||
t.Setenv("FCB_DB_DRIVER", "sqlite")
|
||
t.Setenv("FCB_DB_DSN", "")
|
||
c, err := New()
|
||
if err != nil {
|
||
t.Fatalf("New: %v", err)
|
||
}
|
||
// 背景图:background_url 与 background 均空 → 空
|
||
if c.BackgroundURL() != "" {
|
||
t.Fatalf("背景图默认应为空: %q", c.BackgroundURL())
|
||
}
|
||
// legacy background 键兜底
|
||
c.ApplyKV(map[string]any{KeyBackground: "/legacy/bg.jpg"})
|
||
if c.BackgroundURL() != "/legacy/bg.jpg" {
|
||
t.Fatalf("legacy background 应回落生效: %q", c.BackgroundURL())
|
||
}
|
||
// max_file_size > 0 时优先于 uploadSize
|
||
c.ApplyKV(map[string]any{KeyMaxFileSize: int64(1024), KeyUploadSize: int64(2048)})
|
||
if c.MaxFileSize() != 1024 {
|
||
t.Fatalf("max_file_size 应优先: %d", c.MaxFileSize())
|
||
}
|
||
// max_file_size = 0 回落 uploadSize
|
||
c.ApplyKV(map[string]any{KeyMaxFileSize: int64(0)})
|
||
if c.MaxFileSize() != 2048 {
|
||
t.Fatalf("max_file_size=0 应回落 uploadSize: %d", c.MaxFileSize())
|
||
}
|
||
// 通知默认开启
|
||
if !c.NotifyEnabled() {
|
||
t.Fatal("notify_enabled 默认应开启")
|
||
}
|
||
// 保存次数上限默认不限制
|
||
if c.MaxSaveCount() != 0 {
|
||
t.Fatalf("max_save_count 默认应 0: %d", c.MaxSaveCount())
|
||
}
|
||
// 页脚默认空
|
||
if c.FooterText() != "" || c.FooterBeian() != "" {
|
||
t.Fatal("页脚默认应为空")
|
||
}
|
||
}
|