Files
MyGoNavi/internal/webserver/auth_pages_test.go
Syngnat 8d186fc066 feat(web-auth): 支持六位密码与环境变量托管
- 密码策略统一为至少六个可见字符,覆盖初始化与设置中心改密
- 支持 GONAVI_WEB_PASSWORD 启动同步并保留既有 2FA 与会话配置
- 设置中心识别环境托管状态并禁用临时改密
- Compose、env 示例及双语文档补充密码配置和容器重建说明
- 增加认证持久化、环境覆盖、前端状态与 Docker 登录回归校验
2026-07-10 10:34:03 +08:00

96 lines
2.9 KiB
Go

package webserver
import (
"net/http"
"net/http/httptest"
"strings"
"testing"
"GoNavi-Wails/shared/i18n"
)
func TestResolveWebAuthLanguagePriority(t *testing.T) {
t.Run("query overrides cookie and accept-language", func(t *testing.T) {
request := httptest.NewRequest("GET", "/login?lang=ja-JP", nil)
request.AddCookie(&http.Cookie{Name: webAuthLanguageCookieName, Value: "de-DE"})
request.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
if got := resolveWebAuthLanguage(request); got != i18n.LanguageJaJP {
t.Fatalf("resolveWebAuthLanguage()=%q, want %q", got, i18n.LanguageJaJP)
}
})
t.Run("cookie overrides accept-language", func(t *testing.T) {
request := httptest.NewRequest("GET", "/login", nil)
request.AddCookie(&http.Cookie{Name: webAuthLanguageCookieName, Value: "de-DE"})
request.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
if got := resolveWebAuthLanguage(request); got != i18n.LanguageDeDE {
t.Fatalf("resolveWebAuthLanguage()=%q, want %q", got, i18n.LanguageDeDE)
}
})
t.Run("accept-language is used as fallback", func(t *testing.T) {
request := httptest.NewRequest("GET", "/login", nil)
request.Header.Set("Accept-Language", "zh-TW,zh;q=0.9,en;q=0.8")
if got := resolveWebAuthLanguage(request); got != i18n.LanguageZhTW {
t.Fatalf("resolveWebAuthLanguage()=%q, want %q", got, i18n.LanguageZhTW)
}
})
}
func TestRenderAuthPageUsesLocalizedCopyAndSolidColors(t *testing.T) {
localizer := newWebAuthLocalizer(i18n.LanguageZhCN)
if localizer == nil {
t.Fatal("expected localized auth page localizer")
}
page := renderAuthPage(
i18n.LanguageZhCN,
webAuthText(localizer, "web_auth.page.setup.title", nil),
webAuthText(localizer, "web_auth.page.setup.subtitle", nil),
renderSetupBody(localizer),
renderSetupScript(localizer),
)
for _, fragment := range []string{
`lang="zh-CN"`,
"初始化 GoNavi Web",
"发行方",
"账户",
"至少 6 位",
} {
if !strings.Contains(page, fragment) {
t.Fatalf("expected rendered page to contain %q", fragment)
}
}
if strings.Contains(page, "radial-gradient") || strings.Contains(page, "linear-gradient") {
t.Fatalf("expected auth page to use solid colors only")
}
for _, fragment := range []string{
`class="wizard-nav"`,
`data-step-panel="0"`,
`data-step-panel="1" hidden`,
`data-step-panel="2" hidden`,
"创建管理员密码",
"绑定验证器",
"确认会话策略",
`id="next-step"`,
`id="back-step"`,
`id="totp-disabled-note"`,
} {
if !strings.Contains(page, fragment) {
t.Fatalf("expected setup wizard page to contain %q", fragment)
}
}
if strings.Contains(page, "至少 10 位") {
t.Fatal("expected setup page to stop advertising the old ten-character minimum")
}
if !strings.Contains(page, "Array.from(password).length < 6") {
t.Fatal("expected setup page to count visible password characters consistently with the backend")
}
}