package main import ( "bytes" "encoding/gob" "errors" "testing" "time" "github.com/tinode/chat/server/store/types" ) func TestClusterGobRegistersSystemMessagePayloadTypes(t *testing.T) { registerClusterGobTypes() msg := &ClusterRoute{ SrvMsg: &ServerComMessage{ TenantID: types.TenantID(10001), RcptTo: "grpTest", Data: &MsgServerData{ Topic: "grpTest", Timestamp: time.Now().UTC().Round(time.Millisecond), SeqId: 1, Head: map[string]any{ "x-im-type": "system_action", "x-im-template": "group_member_joined", }, Content: map[string]any{ "text": "成员加入了群聊", "template": "group_member_joined", "actors": []imSystemMessageActor{{ UserID: "usr123", Click: map[string]any{"type": "user_profile", "target_id": "usr123"}, }}, "actions": []imSystemMessageAction{{ Type: "group_profile", Label: "查看群聊", TargetID: "grpTest", }}, }, }, }, } var buf bytes.Buffer if err := gob.NewEncoder(&buf).Encode(msg); err != nil { t.Fatalf("encode cluster route with system message payload: %v", err) } var decoded ClusterRoute if err := gob.NewDecoder(&buf).Decode(&decoded); err != nil { t.Fatalf("decode cluster route with system message payload: %v", err) } } func TestClusterRouteLeaveIgnoresStaleLocalProxyOwner(t *testing.T) { cluster := &Cluster{ thisNodeName: "node-a", nodes: map[string]*ClusterNode{}, } cluster.rehash([]string{"node-a"}) err := cluster.routeToTopicMaster(ProxyReqLeave, nil, "grpStaleProxy", &Session{tenantID: types.TenantID(10001)}) if !errors.Is(err, errClusterTopicOwnerUnavailable) { t.Fatalf("expected stale proxy leave to return owner unavailable, got %v", err) } err = cluster.topicProxyGone(types.TenantID(10001), "grpStaleProxy") if !errors.Is(err, errClusterTopicOwnerUnavailable) { t.Fatalf("expected stale proxy shutdown to return owner unavailable, got %v", err) } }