mirror of
https://github.com/truewhile/MeBox.git
synced 2026-09-28 19:26:36 +08:00
b0fe40142a
* Rebrand MMTL to MeBox across codebase and assets Rename the project display name, Go module path, environment variable prefix (MEBOX_*), Docker image references, and UI branding from MMTL/mmtl to MeBox/mebox. Replace logo assets with the new MeBox icon and keep legacy SQLite migration support for existing mmtl.db deployments. Co-authored-by: truewhile <truewhile@users.noreply.github.com> * Fix logo icons: use cube-only crop without truncated text Previous icon generation cropped too much of the source image, including partial MeBox wordmark text that was cut off in square icon containers. Regenerate logo-64/192/512, favicon, and SVG from cube-only region. Co-authored-by: truewhile <truewhile@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: truewhile <truewhile@users.noreply.github.com>
102 lines
2.6 KiB
Go
102 lines
2.6 KiB
Go
package handler
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"github.com/truewhile/MeBox/internal/config"
|
|
"github.com/truewhile/MeBox/internal/service"
|
|
)
|
|
|
|
func TestBuildDSN(t *testing.T) {
|
|
cases := []struct {
|
|
payload DatabaseConnectionPayload
|
|
want string
|
|
}{
|
|
{
|
|
payload: DatabaseConnectionPayload{
|
|
DSN: "postgres://myuser:mypass@10.0.0.1:5432/mydb?sslmode=require",
|
|
},
|
|
want: "postgres://myuser:mypass@10.0.0.1:5432/mydb?sslmode=require",
|
|
},
|
|
{
|
|
payload: DatabaseConnectionPayload{
|
|
Host: "127.0.0.1",
|
|
Port: 5432,
|
|
User: "postgres",
|
|
Password: "secretpassword",
|
|
DBName: "mebox_prod",
|
|
SSLMode: "disable",
|
|
},
|
|
want: "postgres://postgres:secretpassword@127.0.0.1:5432/mebox_prod?sslmode=disable",
|
|
},
|
|
}
|
|
|
|
for _, c := range cases {
|
|
got := c.payload.BuildDSN()
|
|
if got != c.want {
|
|
t.Errorf("BuildDSN() = %q, want %q", got, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGetDatabaseStatusHandler(t *testing.T) {
|
|
gin.SetMode(gin.TestMode)
|
|
cfg := &config.Config{}
|
|
cfg.Database.Type = "sqlite"
|
|
cfg.Database.DBPath = "./data/mebox.db"
|
|
|
|
svc := &service.Container{
|
|
Database: service.NewDatabaseAdminService(cfg, nil, nil, nil),
|
|
}
|
|
|
|
r := gin.New()
|
|
r.GET("/api/admin/database/status", getDatabaseStatusHandler(svc))
|
|
|
|
req := httptest.NewRequest(http.MethodGet, "/api/admin/database/status", nil)
|
|
rec := httptest.NewRecorder()
|
|
r.ServeHTTP(rec, req)
|
|
|
|
if rec.Code != http.StatusOK {
|
|
t.Fatalf("expected status 200, got %d: %s", rec.Code, rec.Body.String())
|
|
}
|
|
|
|
var resp map[string]any
|
|
if err := json.Unmarshal(rec.Body.Bytes(), &resp); err != nil {
|
|
t.Fatalf("unmarshal response: %v", err)
|
|
}
|
|
if resp["type"] != "sqlite" {
|
|
t.Fatalf("expected type=sqlite, got %v", resp["type"])
|
|
}
|
|
}
|
|
|
|
func TestSaveDatabaseConfigHandler(t *testing.T) {
|
|
gin.SetMode(gin.TestMode)
|
|
dir := t.TempDir()
|
|
cfg := &config.Config{}
|
|
cfg.App.DataDir = dir
|
|
cfg.Database.Type = "sqlite"
|
|
|
|
svc := &service.Container{
|
|
Database: service.NewDatabaseAdminService(cfg, nil, nil, nil),
|
|
}
|
|
|
|
r := gin.New()
|
|
r.POST("/api/admin/database/save-config", saveDatabaseConfigHandler(svc))
|
|
|
|
body := bytes.NewBufferString(`{"type":"postgres","host":"localhost","port":5432,"user":"admin","password":"pwd","dbname":"mebox"}`)
|
|
req := httptest.NewRequest(http.MethodPost, "/api/admin/database/save-config", body)
|
|
req.Header.Set("Content-Type", "application/json")
|
|
rec := httptest.NewRecorder()
|
|
r.ServeHTTP(rec, req)
|
|
|
|
if rec.Code != http.StatusOK {
|
|
t.Fatalf("expected status 200, got %d: %s", rec.Code, rec.Body.String())
|
|
}
|
|
}
|