fix: resolve P1 backend consistency issues
This commit is contained in:
+125
-6
@@ -2364,7 +2364,7 @@ func TestServeIMSecurityChallengeVerifyIssuesActionToken(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestServeIMSecurityChallengeCreateSkipsRateLimitWhenDisabled(t *testing.T) {
|
||||
func TestServeIMSecurityChallengeCreateEnforcesResendLimit(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
expectIMBearer(t, ctrl, "token-1", 7, 42)
|
||||
@@ -2405,11 +2405,26 @@ func TestServeIMSecurityChallengeCreateSkipsRateLimitWhenDisabled(t *testing.T)
|
||||
|
||||
serveIMSecurityChallenges(rec, req)
|
||||
|
||||
if rec.Code != http.StatusOK {
|
||||
t.Fatalf("status: got %d, want %d; body=%s", rec.Code, http.StatusOK, rec.Body.String())
|
||||
if rec.Code != http.StatusTooManyRequests {
|
||||
t.Fatalf("status: got %d, want %d; body=%s", rec.Code, http.StatusTooManyRequests, rec.Body.String())
|
||||
}
|
||||
if verifications.created == nil || verifications.created.Action != "close_youth_mode" {
|
||||
t.Fatalf("expected a new challenge while sensitive challenge rate limit is disabled: %#v", verifications.created)
|
||||
if verifications.created != nil {
|
||||
t.Fatalf("rate-limited request created a challenge: %#v", verifications.created)
|
||||
}
|
||||
}
|
||||
|
||||
func TestServeIMSecurityChallengeCreateRejectsUnknownScene(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
expectIMBearer(t, ctrl, "token-1", 7, 42)
|
||||
|
||||
req := httptest.NewRequest(http.MethodPost, "/v1/im/security/challenges",
|
||||
bytes.NewBufferString(`{"scene":"made_up_action","channel":"sms"}`))
|
||||
req.Header.Set("Authorization", "Bearer token-1")
|
||||
rec := httptest.NewRecorder()
|
||||
serveIMSecurityChallenges(rec, req)
|
||||
if rec.Code != http.StatusBadRequest {
|
||||
t.Fatalf("status: got %d, want %d; body=%s", rec.Code, http.StatusBadRequest, rec.Body.String())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4868,6 +4883,71 @@ func TestServeIMFavoritesListDetailBatchDelete(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestServeIMFavoritesListSupportsRefOnlyAttachment(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
expectIMBearer(t, ctrl, "token-1", 7, 42)
|
||||
oldFavorites := store.Favorites
|
||||
oldSubs := store.Subs
|
||||
oldMessages := store.Messages
|
||||
now := time.Date(2026, 9, 6, 9, 0, 0, 0, time.UTC)
|
||||
store.Favorites = &testFavoritesStore{items: []types.FavoriteItem{{
|
||||
TenantID: 7, FavoriteID: "fav_ref", UserID: 42, ItemType: "file",
|
||||
SourceTopic: "grpAlpha", SourceSeq: 8, Availability: "available", CollectedAt: now,
|
||||
}}}
|
||||
subs := mock_store.NewMockSubsPersistenceInterface(ctrl)
|
||||
messages := mock_store.NewMockMessagesPersistenceInterface(ctrl)
|
||||
store.Subs = subs
|
||||
store.Messages = messages
|
||||
defer func() {
|
||||
store.Favorites = oldFavorites
|
||||
store.Subs = oldSubs
|
||||
store.Messages = oldMessages
|
||||
}()
|
||||
subs.EXPECT().Get(types.TenantID(7), "grpAlpha", types.Uid(42), false).Return(&types.Subscription{
|
||||
TenantID: 7, User: types.Uid(42).String(), Topic: "grpAlpha",
|
||||
ModeWant: types.ModeCPublic, ModeGiven: types.ModeCPublic,
|
||||
}, nil)
|
||||
messages.EXPECT().GetOne(types.TenantID(7), "grpAlpha", int64(8)).Return(&types.Message{
|
||||
TenantID: 7, Topic: "grpAlpha", SeqId: 8, From: types.Uid(42).String(),
|
||||
Head: types.KVMap{"type": "file"}, Content: map[string]any{
|
||||
"txt": " ",
|
||||
"fmt": []any{map[string]any{"at": 0, "len": 1, "key": 0}},
|
||||
"ent": []any{map[string]any{"tp": "EX", "data": map[string]any{
|
||||
"mime": "application/pdf", "name": "large.pdf", "ref": "https://oss.example/large.pdf",
|
||||
}}},
|
||||
}, ObjHeader: types.ObjHeader{CreatedAt: now},
|
||||
}, nil)
|
||||
|
||||
req := httptest.NewRequest(http.MethodGet, "/v1/im/favorites?type=all&limit=1", nil)
|
||||
req.Header.Set("Authorization", "Bearer token-1")
|
||||
rec := httptest.NewRecorder()
|
||||
serveIMFavorites(rec, req)
|
||||
if rec.Code != http.StatusOK {
|
||||
t.Fatalf("status: got %d, want %d; body=%s", rec.Code, http.StatusOK, rec.Body.String())
|
||||
}
|
||||
data := decodeIMHTTPResponse(t, rec).Data.(map[string]any)
|
||||
if items := data["items"].([]any); len(items) != 1 || items[0].(map[string]any)["favorite_id"] != "fav_ref" {
|
||||
t.Fatalf("unexpected ref-only favorite response: %#v", data)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNormalizeIMUserVisibleTopicSelf(t *testing.T) {
|
||||
uid := types.Uid(42)
|
||||
got, ok := normalizeIMUserVisibleTopic(uid, "slf")
|
||||
if !ok || got != uid.SlfName() {
|
||||
t.Fatalf("normalize slf: got=%q ok=%v want=%q", got, ok, uid.SlfName())
|
||||
}
|
||||
}
|
||||
|
||||
func TestMergeGroupSettingsPayloadPreservesTopicVersion(t *testing.T) {
|
||||
payload := map[string]any{"version": 7}
|
||||
mergeGroupSettingsPayload(payload, &types.GroupSettings{Version: 2})
|
||||
if payload["version"] != 7 {
|
||||
t.Fatalf("topic version was overwritten: %#v", payload)
|
||||
}
|
||||
}
|
||||
|
||||
func TestServeIMFavoriteBatchCreateCountsExisting(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
@@ -6806,7 +6886,7 @@ func TestServeIMFriendRequestCreate(t *testing.T) {
|
||||
mockStore.EXPECT().GetUidString().Return("request-1")
|
||||
oldRelations := store.Relations
|
||||
oldProfiles := store.Profiles
|
||||
relations := &testRelationsStore{}
|
||||
relations := &testRelationsStore{context: &types.RelationshipContext{Relationship: types.RelationshipNone}}
|
||||
store.Relations = relations
|
||||
store.Profiles = &testProfilesStore{}
|
||||
defer func() {
|
||||
@@ -6831,6 +6911,45 @@ func TestServeIMFriendRequestCreate(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestServeIMFriendRequestCreateHonorsGroupPrivateChatSetting(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
expectIMBearer(t, ctrl, "token-1", 7, 1)
|
||||
oldRelations := store.Relations
|
||||
oldProfiles := store.Profiles
|
||||
oldSubs := store.Subs
|
||||
oldGroups := store.GroupBusiness
|
||||
store.Relations = &testRelationsStore{context: &types.RelationshipContext{Relationship: types.RelationshipNone}}
|
||||
store.Profiles = &testProfilesStore{}
|
||||
subs := mock_store.NewMockSubsPersistenceInterface(ctrl)
|
||||
store.Subs = subs
|
||||
store.GroupBusiness = &testGroupBusinessStore{settings: &types.GroupSettings{
|
||||
Topic: "grpAlpha", MemberPrivateChat: false, GroupStatus: types.GroupStatusActive,
|
||||
}}
|
||||
defer func() {
|
||||
store.Relations = oldRelations
|
||||
store.Profiles = oldProfiles
|
||||
store.Subs = oldSubs
|
||||
store.GroupBusiness = oldGroups
|
||||
}()
|
||||
memberMode := types.ModeCPublic
|
||||
for _, uid := range []types.Uid{1, 2} {
|
||||
subs.EXPECT().Get(types.TenantID(7), "grpAlpha", uid, false).Return(&types.Subscription{
|
||||
TenantID: 7, Topic: "grpAlpha", User: uid.String(), ModeWant: memberMode, ModeGiven: memberMode,
|
||||
}, nil)
|
||||
}
|
||||
|
||||
req := httptest.NewRequest(http.MethodPost, "/v1/im/friend-requests",
|
||||
bytes.NewBufferString(`{"target_user_id":"`+types.Uid(2).UserId()+`","source":"group","source_topic":"grpAlpha"}`))
|
||||
req.Header.Set("Authorization", "Bearer token-1")
|
||||
req.Header.Set("Idempotency-Key", "fr-group-1")
|
||||
rec := httptest.NewRecorder()
|
||||
serveIMFriendRequests(rec, req)
|
||||
if rec.Code != http.StatusForbidden {
|
||||
t.Fatalf("status: got %d, want %d; body=%s", rec.Code, http.StatusForbidden, rec.Body.String())
|
||||
}
|
||||
}
|
||||
|
||||
func TestServeIMFriendRequestList(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
|
||||
Reference in New Issue
Block a user