Smail/backend/services/dbmigration/portable_manager_test.go
smail f265cc62f5
Some checks are pending
Security Checks / security (push) Waiting to run
补充云端验收证据并加固测试凭据检查
2026-09-21 00:21:50 +08:00

81 lines
3.1 KiB
Go

package dbmigration
import (
"encoding/json"
"os"
"path/filepath"
"testing"
"git.pcux.cn/xuans/Smail/config"
)
// 使用正式部署布局和配置管理器,避免把替代回调误认为配置事务验收。
func portableIntegrationManager(t *testing.T, root string, source config.DatabaseConfig) *config.ConfigManager {
t.Helper()
if err := config.InitializeDeployment(root); err != nil {
t.Fatal("integration deployment initialization failed")
}
directory := filepath.Join(root, "config")
if err := os.MkdirAll(directory, 0700); err != nil {
t.Fatal(err)
}
meta := config.SectionMeta{Schema: config.CurrentSectionSchema, Generation: 1}
tls := config.SSLConfig{Mode: "default", DefaultDirectory: "ssl"}
sections := map[config.Section]any{
config.SectionSMTP: config.SMTPSectionConfig{Meta: meta},
config.SectionEmail: config.EmailSectionConfig{Meta: meta, Policy: config.EmailConfig{
SMTPPort: 25, IMAPPort: 143, POP3Port: 110,
}},
config.SectionSSL: config.SSLSectionConfig{Meta: meta, TLS: tls},
config.SectionPlugins: config.PluginsSectionConfig{Meta: meta, Plugins: map[string]config.PluginInstance{}},
}
references := map[config.Section]config.SectionRef{}
for section, value := range sections {
data, err := json.MarshalIndent(value, "", " ")
if err != nil {
t.Fatal(err)
}
name, _ := config.FixedSectionFile(section)
schema, _ := config.FixedSectionSchema(section)
references[section] = config.SectionRef{File: name, Schema: schema, Generation: 1, SHA256: config.SectionDigest(data)}
if err := os.WriteFile(filepath.Join(directory, name), data, 0600); err != nil {
t.Fatal(err)
}
}
settings := config.RootConfig{
SchemaVersion: config.CurrentSchemaVersion, Generation: 1, SetupState: config.SetupStateReady,
Database: source, Sections: references, SSL: tls,
Domains: config.DomainConfig{Primary: "runtime.invalid", Web: "mail.runtime.invalid", Accepted: []string{"runtime.invalid"}},
HTTP: config.HTTPConfig{Port: 80, HTTPSPort: 443, HTTPSEnabled: true},
Security: config.SecurityConfig{PasswordVersion: "argon2id"},
}
data, err := json.MarshalIndent(settings, "", " ")
if err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(directory, "config.json"), data, 0600); err != nil {
t.Fatal(err)
}
manager := reopenPortableManager(t, root)
store := config.NewTransactionStore(root, config.RuntimeValidationOptions{HasSuperAdmin: true, Production: true})
if _, err := store.CreateBackup(manager.Snapshot()); err != nil {
t.Fatal("integration configuration backup failed")
}
return manager
}
func reopenPortableManager(t *testing.T, root string) *config.ConfigManager {
t.Helper()
manager, err := config.NewConfigManagerWithSecurity(root,
config.ConfigLoaderOptions{Validation: config.RuntimeValidationOptions{HasSuperAdmin: true, Production: true}},
config.ConfigSecurity{Audit: &config.MemoryAuditWriter{}})
if err != nil {
t.Fatal("integration configuration manager could not reopen")
}
return manager
}
func TestPortableSQLiteWithRealConfigurationSwitch(t *testing.T) {
runPortableIntegrationChain(t, nil)
}