125377b899
- directConfig/DirectConfig 加 Email、InstanceName(選配)欄,兩結構同形 - rebuildTray 選單頂加 disabled「連線中:<暱稱||email||未設定>」列; 有 cypher_url 再加一行縮短 host(fyne MenuItem 無 tooltip,取捨見註解) - connectionStatusLabel/shortCypherHost 抽純函式,3+3 案 table test - go vet + go test 全綠(collector 43 通、tray 10 通);tray go build 過
95 lines
2.8 KiB
Go
95 lines
2.8 KiB
Go
package main
|
||
|
||
import (
|
||
"encoding/json"
|
||
"strings"
|
||
"testing"
|
||
)
|
||
|
||
// t26:暱稱 > email > 未設定(leo 07-24 拍板:CF 全程隱形,這條邏輯不該提到 cypher/CF)。
|
||
func TestConnectionStatusLabel(t *testing.T) {
|
||
cases := []struct {
|
||
name string
|
||
instanceName string
|
||
email string
|
||
want string
|
||
}{
|
||
{"暱稱優先於email", "我的書房", "leo21c@gmail.com", "連線中:我的書房"},
|
||
{"無暱稱退回email", "", "leo21c@gmail.com", "連線中:leo21c@gmail.com"},
|
||
{"兩者皆空顯示未設定", "", "", "連線中:未設定"},
|
||
}
|
||
for _, c := range cases {
|
||
t.Run(c.name, func(t *testing.T) {
|
||
got := connectionStatusLabel(c.instanceName, c.email)
|
||
if got != c.want {
|
||
t.Errorf("connectionStatusLabel(%q, %q) = %q, want %q", c.instanceName, c.email, got, c.want)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestShortCypherHost(t *testing.T) {
|
||
cases := []struct {
|
||
name string
|
||
in string
|
||
want string
|
||
}{
|
||
{"完整URL取host", "https://arcrun-cypher-executor.someacct.workers.dev/path", "arcrun-cypher-executor.someacct.workers.dev"},
|
||
{"空字串回空字串", "", ""},
|
||
{"無法解析出host則原樣回傳", "not-a-url", "not-a-url"},
|
||
}
|
||
for _, c := range cases {
|
||
t.Run(c.name, func(t *testing.T) {
|
||
got := shortCypherHost(c.in)
|
||
if got != c.want {
|
||
t.Errorf("shortCypherHost(%q) = %q, want %q", c.in, got, c.want)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
// config 序列化含新欄(email/instance_name)——t26 施工面一驗收項。
|
||
func TestDirectConfigJSONRoundTrip(t *testing.T) {
|
||
c := &directConfig{
|
||
CypherURL: "https://example.workers.dev",
|
||
Namespace: "demo",
|
||
Email: "leo21c@gmail.com",
|
||
InstanceName: "我的書房",
|
||
}
|
||
data, err := json.Marshal(c)
|
||
if err != nil {
|
||
t.Fatalf("marshal 失敗:%v", err)
|
||
}
|
||
s := string(data)
|
||
if !strings.Contains(s, `"email":"leo21c@gmail.com"`) {
|
||
t.Errorf("序列化結果缺 email 欄:%s", s)
|
||
}
|
||
if !strings.Contains(s, `"instance_name":"我的書房"`) {
|
||
t.Errorf("序列化結果缺 instance_name 欄:%s", s)
|
||
}
|
||
|
||
var back directConfig
|
||
if err := json.Unmarshal(data, &back); err != nil {
|
||
t.Fatalf("unmarshal 失敗:%v", err)
|
||
}
|
||
if back.Email != c.Email || back.InstanceName != c.InstanceName {
|
||
t.Errorf("round-trip 不一致:got email=%q instance_name=%q", back.Email, back.InstanceName)
|
||
}
|
||
}
|
||
|
||
// 暱稱空時 config JSON 不應寫出 instance_name 欄(omitempty;對齊面二 installer 端「空就不寫欄位」的約定)。
|
||
func TestDirectConfigJSONOmitsEmptyInstanceName(t *testing.T) {
|
||
c := &directConfig{
|
||
CypherURL: "https://example.workers.dev",
|
||
Namespace: "demo",
|
||
Email: "leo21c@gmail.com",
|
||
}
|
||
data, err := json.Marshal(c)
|
||
if err != nil {
|
||
t.Fatalf("marshal 失敗:%v", err)
|
||
}
|
||
if strings.Contains(string(data), "instance_name") {
|
||
t.Errorf("暱稱空時不該序列化出 instance_name 欄:%s", data)
|
||
}
|
||
}
|