113 lines
3.1 KiB
Go
113 lines
3.1 KiB
Go
package service
|
||
|
||
import (
|
||
"net/http"
|
||
"os"
|
||
"path/filepath"
|
||
"testing"
|
||
)
|
||
|
||
func TestOpenCreatesUninitializedRuntime(t *testing.T) {
|
||
baseDir := t.TempDir()
|
||
runtime, err := Open(filepath.Join(baseDir, "config", "scert.json"), baseDir)
|
||
if err != nil {
|
||
t.Fatalf("打开桌面核心服务失败:%v", err)
|
||
}
|
||
defer runtime.Close()
|
||
if runtime.core != nil {
|
||
t.Fatal("桌面首次初始化不应创建正式应用")
|
||
}
|
||
if _, err := os.Stat(defaultConfig(baseDir).Database.DSN); !os.IsNotExist(err) {
|
||
t.Fatalf("桌面初始化提前创建数据库:%v", err)
|
||
}
|
||
|
||
request, err := http.NewRequest(http.MethodGet, "http://127.0.0.1/api/v1/setup/status", nil)
|
||
if err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
request.RemoteAddr = "127.0.0.1:1234"
|
||
response := newRecordingResponse()
|
||
runtime.Handler().ServeHTTP(response, request)
|
||
if response.status != http.StatusOK {
|
||
t.Fatalf("初始化状态接口状态码错误:%d,响应:%s", response.status, response.body)
|
||
}
|
||
}
|
||
|
||
func TestOpenRejectsInvalidConfiguration(t *testing.T) {
|
||
baseDir := t.TempDir()
|
||
configPath := filepath.Join(baseDir, "config", "scert.json")
|
||
if err := os.MkdirAll(filepath.Dir(configPath), 0o755); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
if err := os.WriteFile(configPath, []byte("{invalid"), 0o600); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
if _, err := Open(configPath, baseDir); err == nil {
|
||
t.Fatal("无效配置不应打开成功")
|
||
}
|
||
}
|
||
|
||
type recordingResponse struct {
|
||
header http.Header
|
||
status int
|
||
body string
|
||
}
|
||
|
||
func newRecordingResponse() *recordingResponse {
|
||
return &recordingResponse{header: make(http.Header)}
|
||
}
|
||
|
||
func (r *recordingResponse) Header() http.Header {
|
||
return r.header
|
||
}
|
||
|
||
func (r *recordingResponse) WriteHeader(status int) {
|
||
r.status = status
|
||
}
|
||
|
||
func (r *recordingResponse) Write(body []byte) (int, error) {
|
||
if r.status == 0 {
|
||
r.status = http.StatusOK
|
||
}
|
||
r.body += string(body)
|
||
return len(body), nil
|
||
}
|
||
|
||
func TestOpenAppliesEnvironmentOverrides(t *testing.T) {
|
||
baseDir := t.TempDir()
|
||
configPath := filepath.Join(baseDir, "config", "scert.json")
|
||
cfg := defaultConfig(baseDir)
|
||
if err := cfg.Save(configPath); err != nil {
|
||
t.Fatalf("保存测试配置失败:%v", err)
|
||
}
|
||
t.Setenv("SCERT_WEB_ENABLED", "false")
|
||
runtime, err := Open(configPath, baseDir)
|
||
if err != nil {
|
||
t.Fatalf("应用环境覆盖后打开桌面核心服务失败:%v", err)
|
||
}
|
||
defer runtime.Close()
|
||
|
||
request, err := http.NewRequest(http.MethodGet, "http://127.0.0.1/", nil)
|
||
if err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
request.RemoteAddr = "127.0.0.1:1234"
|
||
response := newRecordingResponse()
|
||
runtime.Handler().ServeHTTP(response, request)
|
||
if response.status != http.StatusNotFound {
|
||
t.Fatalf("SCERT_WEB_ENABLED=false 未关闭 Web 页面,状态码:%d", response.status)
|
||
}
|
||
}
|
||
|
||
func TestOpenRejectsInvalidEnvironmentOverride(t *testing.T) {
|
||
baseDir := t.TempDir()
|
||
configPath := filepath.Join(baseDir, "config", "scert.json")
|
||
if err := defaultConfig(baseDir).Save(configPath); err != nil {
|
||
t.Fatalf("保存测试配置失败:%v", err)
|
||
}
|
||
t.Setenv("SCERT_WEB_ENABLED", "无效")
|
||
if _, err := Open(configPath, baseDir); err == nil {
|
||
t.Fatal("无效环境覆盖不应打开桌面核心服务")
|
||
}
|
||
}
|