Files
ttstd-infinite-canvas/backend/internal/auth/registration_agreement_test.go

141 lines
4.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package auth
import (
"testing"
"yingce/backend/internal/kernel"
"yingce/backend/internal/model"
"yingce/backend/internal/repository"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func TestRegistrationAgreementFollowsBrandNameWhenUnset(t *testing.T) {
svc := New(repository.New(newAgreementTestDB(t)), brandHost{name: "星野"}, nil)
title, content := svc.RegistrationAgreement()
if title != "星野服务协议" {
t.Fatalf("default agreement title = %q", title)
}
if content != "" {
t.Fatalf("default agreement content = %q", content)
}
settings, err := svc.PublicAuthSettings()
if err != nil {
t.Fatal(err)
}
if settings.AgreementTitle != "星野服务协议" || settings.AgreementContent != "" {
t.Fatalf("public settings agreement = %q / %q", settings.AgreementTitle, settings.AgreementContent)
}
}
func TestUpdateRegistrationSettingStoresAgreement(t *testing.T) {
db := newAgreementTestDB(t)
svc := New(repository.New(db), brandHost{name: "星野"}, nil)
if err := db.Create(&model.User{ID: "admin", Username: "admin", Role: model.UserRoleAdmin, Status: model.UserStatusActive}).Error; err != nil {
t.Fatal(err)
}
admin := &model.User{ID: "admin", Username: "admin", Role: model.UserRoleAdmin, Status: model.UserStatusActive}
saved, err := svc.UpdateRegistrationSetting(admin, RegistrationSettingRequest{
Enabled: true,
AgreementTitle: strPtr("《星野平台服务条款》"),
AgreementContent: strPtr("第一条 服务说明\n\n第二条 内容合规"),
})
if err != nil {
t.Fatal(err)
}
if !saved.Enabled || saved.AgreementTitle != "《星野平台服务条款》" {
t.Fatalf("saved setting = %#v", saved)
}
reloaded, err := svc.AdminRegistrationSetting(admin)
if err != nil {
t.Fatal(err)
}
if reloaded.AgreementContent != "第一条 服务说明\n\n第二条 内容合规" {
t.Fatalf("reloaded content = %q", reloaded.AgreementContent)
}
// 展示用标题去掉书名号,避免注册页出现双书名号。
title, content := svc.RegistrationAgreement()
if title != "星野平台服务条款" || content != "第一条 服务说明\n\n第二条 内容合规" {
t.Fatalf("agreement = %q / %q", title, content)
}
settings, err := svc.PublicAuthSettings()
if err != nil {
t.Fatal(err)
}
if settings.AgreementTitle != "星野平台服务条款" || settings.AgreementContent != "第一条 服务说明\n\n第二条 内容合规" {
t.Fatalf("public settings agreement = %q / %q", settings.AgreementTitle, settings.AgreementContent)
}
}
func TestRegistrationToggleKeepsSavedAgreement(t *testing.T) {
db := newAgreementTestDB(t)
svc := New(repository.New(db), brandHost{name: "星野"}, nil)
admin := &model.User{ID: "admin", Username: "admin", Role: model.UserRoleAdmin, Status: model.UserStatusActive}
if _, err := svc.UpdateRegistrationSetting(admin, RegistrationSettingRequest{Enabled: true, AgreementContent: strPtr("条款正文")}); err != nil {
t.Fatal(err)
}
enabled, err := svc.RegistrationEnabled()
if err != nil || !enabled {
t.Fatalf("RegistrationEnabled() = %v, %v", enabled, err)
}
// 管理面板切换注册开关时只提交 enabled,已保存的协议正文不能被清空。
switched, err := svc.UpdateRegistrationSetting(admin, RegistrationSettingRequest{Enabled: false})
if err != nil {
t.Fatal(err)
}
if switched.Enabled || switched.AgreementContent != "条款正文" {
t.Fatalf("toggle wiped agreement: %#v", switched)
}
cleared, err := svc.UpdateRegistrationSetting(admin, RegistrationSettingRequest{Enabled: true, AgreementContent: strPtr("")})
if err != nil {
t.Fatal(err)
}
if cleared.AgreementContent != "" {
t.Fatalf("explicit clear ignored: %#v", cleared)
}
}
func strPtr(value string) *string { return &value }
// 配置损坏时不能再返回品牌名兜底标题:注册页会据此展示,与后台真实配置不符。
func TestRegistrationAgreementDegradesWhenSettingUnreadable(t *testing.T) {
db := newAgreementTestDB(t)
svc := New(repository.New(db), brandHost{name: "星野"}, nil)
if err := db.Create(&model.SystemSetting{Key: registrationSettingKey, ValueJSON: "{not-json"}).Error; err != nil {
t.Fatal(err)
}
title, content := svc.RegistrationAgreement()
if title != "" || content != "" {
t.Fatalf("broken setting should degrade to empty, got %q / %q", title, content)
}
// 错误提示仍需给出可读文案,但不能是凭空拼出来的协议名。
if message := svc.AgreementTitleForMessage(); message != "服务协议" {
t.Fatalf("fallback message title = %q", message)
}
}
func newAgreementTestDB(t *testing.T) *gorm.DB {
t.Helper()
db, err := gorm.Open(sqlite.Open("file:"+kernel.NewID()+"?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatal(err)
}
if err := db.AutoMigrate(&model.User{}, &model.SystemSetting{}); err != nil {
t.Fatal(err)
}
return db
}