Scert/backend/internal/httpapi/reset_boundary_test.go

66 lines
2.6 KiB
Go

package httpapi
import (
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"strings"
"testing"
"git.pcux.cn/xuans/Scert/backend/internal/admin"
)
// newLegacyResetServer 只保留旧处理函数的独立回归,不代表正式产品路由或生产验收。
func newLegacyResetServer(dependencies Dependencies) *Server {
server := New(dependencies)
server.router.GET(admin.ResetPath, server.resetPage)
server.router.POST(admin.ResetPath, server.resetSubmit)
return server
}
func TestProductionResetPathClosedEvenWithLegacyActivation(t *testing.T) {
cfg := readyTestConfig(t.TempDir())
cfg.Web.Hostname = "scert.example.test"
staticDir := t.TempDir()
if err := os.WriteFile(filepath.Join(staticDir, "index.html"), []byte("<html>scert-test-shell</html>"), 0600); err != nil {
t.Fatal(err)
}
controller := admin.New(cfg)
if _, err := controller.Start(); err != nil {
t.Fatal(err)
}
t.Cleanup(func() { _ = controller.Stop() })
server := New(Dependencies{Config: cfg, FrontendDir: staticDir, Repository: &stubDomainRepository{}, ResetStatePath: admin.StatePath(cfg.Paths.Data)})
for _, route := range server.router.Routes() {
if route.Path == "/reset" || strings.HasPrefix(route.Path, "/reset/") {
t.Fatal("正式路由注册了旧密码重置处理器")
}
}
for _, method := range []string{http.MethodGet, http.MethodPost, http.MethodHead} {
for _, path := range []string{"/reset", "/reset/", "/reset/anything", "/%72eset"} {
for _, authenticated := range []bool{false, true} {
request := httptest.NewRequest(method, "http://scert.example.test"+path, strings.NewReader("reset_code=test&new_password=TestPass123"))
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
response := httptest.NewRecorder()
if authenticated {
serveAdminHTTP(server, response, request)
} else {
server.Handler().ServeHTTP(response, request)
}
if response.Code != http.StatusNotFound {
t.Fatalf("正式重置路径必须关闭:%s %s authenticated=%v status=%d", method, path, authenticated, response.Code)
}
if strings.Contains(response.Body.String(), "scert-test-shell") || len(response.Result().Cookies()) != 0 {
t.Fatal("旧重置路径回退到页面或写入了重置 Cookie")
}
}
}
}
response := httptest.NewRecorder()
server.Handler().ServeHTTP(response, httptest.NewRequest(http.MethodGet, "http://scert.example.test/login", nil))
if response.Code != http.StatusOK || !strings.Contains(response.Body.String(), "scert-test-shell") {
t.Fatal("边界测试没有使用启用的真实页面回退处理器")
}
}