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) } }