package main import ( "encoding/json" "testing" "github.com/golang/mock/gomock" "github.com/tinode/chat/server/store/types" ) func TestHandleP2PPermissionsRefreshReloadsLoadedTopic(t *testing.T) { helper := TopicTestHelper{} helper.setUp(t, 2, types.TopicCatP2P, "p2p-test", true) defer helper.tearDown() uid := helper.uids[0] stale := types.ModeCP2P &^ types.ModeWrite pud := helper.topic.perUser[uid] pud.modeWant = stale pud.modeGiven = stale helper.topic.perUser[uid] = pud helper.ss.EXPECT().Get(types.TenantID(1), "p2p-test", uid, true).Return(&types.Subscription{ TenantID: 1, User: uid.String(), Topic: "p2p-test", ModeWant: types.ModeCP2P, ModeGiven: types.ModeCP2P, }, nil) payload, err := json.Marshal(p2pPermissionsPayload{UserIDs: []string{uid.UserId()}}) if err != nil { t.Fatal(err) } helper.topic.handleServerMsg(&ServerComMessage{ TenantID: 1, Info: &MsgServerInfo{What: "p2p", Event: p2pPermissionsRefreshedEvent, Payload: payload}, }) helper.finish() got := helper.topic.perUser[uid] if !got.modeWant.IsWriter() || !got.modeGiven.IsWriter() { t.Fatalf("permissions were not refreshed: want=%s given=%s", got.modeWant, got.modeGiven) } } func TestP2PPublishReloadsStalePermissions(t *testing.T) { helper := TopicTestHelper{} helper.setUp(t, 2, types.TopicCatP2P, "p2p-test", true) defer helper.tearDown() uid := helper.uids[0] stale := types.ModeCP2P &^ types.ModeWrite pud := helper.topic.perUser[uid] pud.modeWant = stale pud.modeGiven = stale helper.topic.perUser[uid] = pud helper.ss.EXPECT().Get(types.TenantID(1), "p2p-test", uid, true).Return(&types.Subscription{ TenantID: 1, User: uid.String(), Topic: "p2p-test", ModeWant: types.ModeCP2P, ModeGiven: types.ModeCP2P, }, nil) helper.mm.EXPECT().Save(types.TenantID(1), gomock.Any(), gomock.Any(), gomock.Any()). Return(&types.MessageSaveResult{SeqId: 1, MarkedReadBySender: true}, nil) err := helper.topic.saveAndBroadcastMessage(&ClientComMessage{ Id: "pub-1", Original: "p2p-test", Timestamp: types.TimeNow(), sess: helper.sessions[0], }, uid, true, nil, nil, "test") helper.finish() if err != nil { t.Fatalf("publish failed after permission reload: %v", err) } }