@stream-io/feeds-client 0.2.18 → 0.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/cjs/index.js +94 -25
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react-bindings.js +26 -55
- package/dist/cjs/react-bindings.js.map +1 -1
- package/dist/es/index.mjs +86 -17
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/react-bindings.mjs +19 -48
- package/dist/es/react-bindings.mjs.map +1 -1
- package/dist/{index-Zde8UE5f.mjs → feeds-client-BObWT4vl.mjs} +191 -92
- package/dist/feeds-client-BObWT4vl.mjs.map +1 -0
- package/dist/{index--koeDtxd.js → feeds-client-BlR_3zy2.js} +178 -79
- package/dist/feeds-client-BlR_3zy2.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.d.ts +2 -32
- package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.d.ts.map +1 -1
- package/dist/types/common/real-time/event-models.d.ts +7 -2
- package/dist/types/common/real-time/event-models.d.ts.map +1 -1
- package/dist/types/common/types.d.ts +1 -0
- package/dist/types/common/types.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/activity/handle-activity-updated.d.ts.map +1 -1
- package/dist/types/feed/feed.d.ts +1 -1
- package/dist/types/feed/feed.d.ts.map +1 -1
- package/dist/types/feeds-client/feeds-client.d.ts +9 -1
- package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
- package/dist/types/utils/throttling/index.d.ts +3 -0
- package/dist/types/utils/throttling/index.d.ts.map +1 -0
- package/dist/types/utils/throttling/throttle.d.ts +34 -0
- package/dist/types/utils/throttling/throttle.d.ts.map +1 -0
- package/dist/types/utils/throttling/throttled-get-batched-own-capabilities.d.ts +14 -0
- package/dist/types/utils/throttling/throttled-get-batched-own-capabilities.d.ts.map +1 -0
- package/package.json +7 -3
- package/react-bindings.d.ts +11 -0
- package/react-bindings.js +7 -0
- package/react-bindings.mjs +11 -0
- package/src/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.ts +21 -73
- package/src/common/real-time/event-models.ts +8 -2
- package/src/common/types.ts +1 -0
- package/src/feed/event-handlers/activity/handle-activity-added.ts +9 -1
- package/src/feed/event-handlers/activity/handle-activity-updated.ts +4 -0
- package/src/feed/feed.ts +18 -3
- package/src/feeds-client/feeds-client.ts +106 -3
- package/src/utils/throttling/index.ts +2 -0
- package/src/utils/throttling/throttle.ts +123 -0
- package/src/utils/throttling/throttled-get-batched-own-capabilities.ts +44 -0
- package/dist/index--koeDtxd.js.map +0 -1
- package/dist/index-Zde8UE5f.mjs.map +0 -1
- package/src/feed/event-handlers/activity/activity-marked-utils.test.ts +0 -208
- package/src/feed/event-handlers/activity/activity-reaction-utils.test.ts +0 -371
- package/src/feed/event-handlers/activity/handle-activity-added.test.ts +0 -97
- package/src/feed/event-handlers/activity/handle-activity-deleted.test.ts +0 -117
- package/src/feed/event-handlers/activity/handle-activity-pinned.test.ts +0 -60
- package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +0 -257
- package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +0 -317
- package/src/feed/event-handlers/activity/handle-activity-reaction-updated.test.ts +0 -282
- package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +0 -95
- package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +0 -245
- package/src/feed/event-handlers/add-aggregated-activities-to-state.test.ts +0 -510
- package/src/feed/event-handlers/bookmark/bookmark-utils.test.ts +0 -521
- package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +0 -178
- package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +0 -188
- package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +0 -196
- package/src/feed/event-handlers/comment/handle-comment-added.test.ts +0 -271
- package/src/feed/event-handlers/comment/handle-comment-deleted.test.ts +0 -255
- package/src/feed/event-handlers/comment/handle-comment-reaction-added.test.ts +0 -329
- package/src/feed/event-handlers/comment/handle-comment-reaction-deleted.test.ts +0 -343
- package/src/feed/event-handlers/comment/handle-comment-reaction-updated.test.ts +0 -350
- package/src/feed/event-handlers/comment/handle-comment-updated.test.ts +0 -267
- package/src/feed/event-handlers/comment/utils/update-comment-count.test.ts +0 -322
- package/src/feed/event-handlers/feed-member/handle-feed-member-added.test.ts +0 -75
- package/src/feed/event-handlers/feed-member/handle-feed-member-removed.test.ts +0 -82
- package/src/feed/event-handlers/feed-member/handle-feed-member-updated.test.ts +0 -84
- package/src/feed/event-handlers/follow/follow-state-update-queue.test.ts +0 -219
- package/src/feed/event-handlers/follow/handle-follow-created.test.ts +0 -250
- package/src/feed/event-handlers/follow/handle-follow-deleted.test.ts +0 -268
- package/src/feed/event-handlers/follow/handle-follow-updated.test.ts +0 -131
- package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.test.ts +0 -182
- package/src/feed/event-handlers/story-feeds/handle-story-feeds-updated.test.ts +0 -45
- package/src/feed/feed.test.ts +0 -90
- package/src/feeds-client/event-handlers/user/handle-user-updated.test.ts +0 -53
- package/src/utils/event-triggered-by-connected-user.test.ts +0 -73
- package/src/utils/state-update-queue.test.ts +0 -129
- package/src/utils/unique-array-merge.test.ts +0 -179
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
FollowResponse,
|
|
3
|
-
FeedResponse,
|
|
4
|
-
UserResponse,
|
|
5
|
-
} from '../../../gen/models';
|
|
6
|
-
import { generateFollowResponse } from '../../../test-utils';
|
|
7
|
-
import { updateStateFollowDeleted } from './handle-follow-deleted';
|
|
8
|
-
|
|
9
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
10
|
-
|
|
11
|
-
describe('handle-follow-deleted', () => {
|
|
12
|
-
describe(updateStateFollowDeleted.name, () => {
|
|
13
|
-
let mockFollow: FollowResponse;
|
|
14
|
-
let mockFeed: FeedResponse;
|
|
15
|
-
let mockUser: UserResponse;
|
|
16
|
-
|
|
17
|
-
beforeEach(() => {
|
|
18
|
-
mockFollow = generateFollowResponse();
|
|
19
|
-
mockFeed = mockFollow.source_feed;
|
|
20
|
-
mockUser = mockFeed.created_by;
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('should handle when this feed unfollows someone', () => {
|
|
24
|
-
const existingFollow: FollowResponse = {
|
|
25
|
-
...mockFollow,
|
|
26
|
-
source_feed: {
|
|
27
|
-
...mockFeed,
|
|
28
|
-
id: 'feed-1',
|
|
29
|
-
feed: 'user:feed-1',
|
|
30
|
-
created_by: mockUser,
|
|
31
|
-
},
|
|
32
|
-
target_feed: {
|
|
33
|
-
...mockFeed,
|
|
34
|
-
id: 'other-feed',
|
|
35
|
-
feed: 'user:other-feed',
|
|
36
|
-
created_by: mockUser,
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const follow: FollowResponse = existingFollow;
|
|
41
|
-
|
|
42
|
-
// @ts-expect-error - we're not testing the full state here
|
|
43
|
-
const currentState: FeedState = {
|
|
44
|
-
following: [existingFollow],
|
|
45
|
-
following_count: 1,
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const result = updateStateFollowDeleted(
|
|
49
|
-
follow,
|
|
50
|
-
currentState,
|
|
51
|
-
'user:feed-1',
|
|
52
|
-
'user-1',
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
expect(result.changed).toBe(true);
|
|
56
|
-
expect(result.data.following).toHaveLength(0);
|
|
57
|
-
expect(result.data).toMatchObject(follow.source_feed);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('should handle when someone unfollows this feed', () => {
|
|
61
|
-
const existingFollow: FollowResponse = {
|
|
62
|
-
...mockFollow,
|
|
63
|
-
source_feed: {
|
|
64
|
-
...mockFeed,
|
|
65
|
-
id: 'other-feed',
|
|
66
|
-
feed: 'user:other-feed',
|
|
67
|
-
created_by: {
|
|
68
|
-
...mockUser,
|
|
69
|
-
id: 'other-user',
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
target_feed: {
|
|
73
|
-
...mockFeed,
|
|
74
|
-
id: 'feed-1',
|
|
75
|
-
feed: 'user:feed-1',
|
|
76
|
-
created_by: mockUser,
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
const follow: FollowResponse = existingFollow;
|
|
81
|
-
|
|
82
|
-
// @ts-expect-error - we're not testing the full state here
|
|
83
|
-
const currentState: FeedState = {
|
|
84
|
-
followers: [existingFollow],
|
|
85
|
-
own_follows: [existingFollow],
|
|
86
|
-
following_count: 1,
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
const result = updateStateFollowDeleted(
|
|
90
|
-
follow,
|
|
91
|
-
currentState,
|
|
92
|
-
'user:feed-1',
|
|
93
|
-
'user-1',
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
expect(result.changed).toBe(true);
|
|
97
|
-
expect(result.data.followers).toHaveLength(0);
|
|
98
|
-
expect(result.data.own_follows).toBe(currentState.own_follows);
|
|
99
|
-
expect(result.data).toMatchObject(follow.target_feed);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it('should only remove own_follows when connected user is the source', () => {
|
|
103
|
-
const existingFollow: FollowResponse = {
|
|
104
|
-
...mockFollow,
|
|
105
|
-
source_feed: {
|
|
106
|
-
...mockFeed,
|
|
107
|
-
id: 'other-feed',
|
|
108
|
-
feed: 'user:other-feed',
|
|
109
|
-
created_by: { ...mockUser, id: 'user-1' },
|
|
110
|
-
},
|
|
111
|
-
target_feed: {
|
|
112
|
-
...mockFeed,
|
|
113
|
-
id: 'feed-1',
|
|
114
|
-
feed: 'user:feed-1',
|
|
115
|
-
created_by: mockUser,
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
const follow: FollowResponse = existingFollow;
|
|
120
|
-
|
|
121
|
-
// @ts-expect-error - we're not testing the full state here
|
|
122
|
-
const currentState: FeedState = {
|
|
123
|
-
followers: [existingFollow],
|
|
124
|
-
own_follows: [existingFollow],
|
|
125
|
-
following_count: 1,
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
const result = updateStateFollowDeleted(
|
|
129
|
-
follow,
|
|
130
|
-
currentState,
|
|
131
|
-
'user:feed-1',
|
|
132
|
-
'user-1',
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
expect(result.changed).toBe(true);
|
|
136
|
-
expect(result.data.followers).toHaveLength(0);
|
|
137
|
-
expect(result.data.own_follows).toHaveLength(0);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('should not remove own_follows when connected user is not the source', () => {
|
|
141
|
-
const existingFollow: FollowResponse = {
|
|
142
|
-
...mockFollow,
|
|
143
|
-
source_feed: {
|
|
144
|
-
...mockFeed,
|
|
145
|
-
id: 'other-feed',
|
|
146
|
-
feed: 'user:other-feed',
|
|
147
|
-
created_by: { ...mockUser, id: 'other-user' },
|
|
148
|
-
},
|
|
149
|
-
target_feed: {
|
|
150
|
-
...mockFeed,
|
|
151
|
-
id: 'feed-1',
|
|
152
|
-
feed: 'user:feed-1',
|
|
153
|
-
created_by: mockUser,
|
|
154
|
-
},
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
const follow: FollowResponse = existingFollow;
|
|
158
|
-
|
|
159
|
-
// @ts-expect-error - we're not testing the full state here
|
|
160
|
-
const currentState: FeedState = {
|
|
161
|
-
followers: [existingFollow],
|
|
162
|
-
own_follows: [existingFollow],
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
const result = updateStateFollowDeleted(
|
|
166
|
-
follow,
|
|
167
|
-
currentState,
|
|
168
|
-
'user:feed-1',
|
|
169
|
-
'user-1',
|
|
170
|
-
);
|
|
171
|
-
|
|
172
|
-
expect(result.changed).toBe(true);
|
|
173
|
-
expect(result.data.followers).toHaveLength(0);
|
|
174
|
-
expect(result.data.own_follows).toHaveLength(1); // Should remain unchanged
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it('should not update followers/following when they are undefined in delete', () => {
|
|
178
|
-
const existingFollow: FollowResponse = {
|
|
179
|
-
...mockFollow,
|
|
180
|
-
source_feed: {
|
|
181
|
-
...mockFeed,
|
|
182
|
-
id: 'other-feed',
|
|
183
|
-
feed: 'user:other-feed',
|
|
184
|
-
created_by: mockUser,
|
|
185
|
-
},
|
|
186
|
-
target_feed: {
|
|
187
|
-
...mockFeed,
|
|
188
|
-
id: 'feed-1',
|
|
189
|
-
feed: 'user:feed-1',
|
|
190
|
-
created_by: mockUser,
|
|
191
|
-
},
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
const follow: FollowResponse = existingFollow;
|
|
195
|
-
|
|
196
|
-
// @ts-expect-error - we're not testing the full state here
|
|
197
|
-
const currentState: FeedState = {
|
|
198
|
-
followers: undefined,
|
|
199
|
-
own_follows: undefined,
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
const result = updateStateFollowDeleted(
|
|
203
|
-
follow,
|
|
204
|
-
currentState,
|
|
205
|
-
'user:feed-1',
|
|
206
|
-
'user-1',
|
|
207
|
-
);
|
|
208
|
-
|
|
209
|
-
expect(result.changed).toBe(true);
|
|
210
|
-
expect(result.data.followers).toBeUndefined();
|
|
211
|
-
expect(result.data.own_follows).toBeUndefined();
|
|
212
|
-
expect(result.data).toMatchObject(follow.target_feed);
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
it('should filter out the correct follow by target feed id', () => {
|
|
216
|
-
const followToRemove: FollowResponse = {
|
|
217
|
-
...mockFollow,
|
|
218
|
-
source_feed: {
|
|
219
|
-
...mockFeed,
|
|
220
|
-
id: 'feed-1',
|
|
221
|
-
feed: 'user:feed-1',
|
|
222
|
-
created_by: mockUser,
|
|
223
|
-
},
|
|
224
|
-
target_feed: {
|
|
225
|
-
...mockFeed,
|
|
226
|
-
id: 'target-to-remove',
|
|
227
|
-
feed: 'user:target-to-remove',
|
|
228
|
-
created_by: mockUser,
|
|
229
|
-
},
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
const followToKeep: FollowResponse = {
|
|
233
|
-
...mockFollow,
|
|
234
|
-
source_feed: {
|
|
235
|
-
...mockFeed,
|
|
236
|
-
id: 'feed-1',
|
|
237
|
-
feed: 'user:feed-1',
|
|
238
|
-
created_by: mockUser,
|
|
239
|
-
},
|
|
240
|
-
target_feed: {
|
|
241
|
-
...mockFeed,
|
|
242
|
-
id: 'target-to-keep',
|
|
243
|
-
feed: 'user:target-to-keep',
|
|
244
|
-
created_by: mockUser,
|
|
245
|
-
},
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
const follow: FollowResponse = followToRemove;
|
|
249
|
-
|
|
250
|
-
// @ts-expect-error - we're not testing the full state here
|
|
251
|
-
const currentState: FeedState = {
|
|
252
|
-
following: [followToRemove, followToKeep],
|
|
253
|
-
following_count: 2,
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
const result = updateStateFollowDeleted(
|
|
257
|
-
follow,
|
|
258
|
-
currentState,
|
|
259
|
-
'user:feed-1',
|
|
260
|
-
'user-1',
|
|
261
|
-
);
|
|
262
|
-
|
|
263
|
-
expect(result.changed).toBe(true);
|
|
264
|
-
expect(result.data.following).toHaveLength(1);
|
|
265
|
-
expect(result.data.following?.[0]).toBe(followToKeep);
|
|
266
|
-
});
|
|
267
|
-
});
|
|
268
|
-
});
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
import { Feed } from '../../../feed';
|
|
3
|
-
import { FeedsClient } from '../../../feeds-client';
|
|
4
|
-
import { handleFollowUpdated } from './handle-follow-updated';
|
|
5
|
-
import {
|
|
6
|
-
generateFollowResponse,
|
|
7
|
-
generateFeedResponse,
|
|
8
|
-
getHumanId,
|
|
9
|
-
generateOwnUser,
|
|
10
|
-
} from '../../../test-utils/response-generators';
|
|
11
|
-
import type { FollowResponse } from '../../../gen/models';
|
|
12
|
-
|
|
13
|
-
describe(handleFollowUpdated.name, () => {
|
|
14
|
-
let feed: Feed;
|
|
15
|
-
let client: FeedsClient;
|
|
16
|
-
let follow: FollowResponse;
|
|
17
|
-
let otherFollow: FollowResponse;
|
|
18
|
-
let ownFollow: FollowResponse;
|
|
19
|
-
let userId: string;
|
|
20
|
-
|
|
21
|
-
beforeEach(() => {
|
|
22
|
-
userId = getHumanId();
|
|
23
|
-
client = new FeedsClient('mock-api-key');
|
|
24
|
-
|
|
25
|
-
client.state.partialNext({
|
|
26
|
-
connected_user: generateOwnUser({ id: userId }),
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
const feedResponse = generateFeedResponse({
|
|
30
|
-
id: 'main',
|
|
31
|
-
group_id: 'user',
|
|
32
|
-
created_by: { id: userId },
|
|
33
|
-
});
|
|
34
|
-
feed = new Feed(client, 'user', 'main', feedResponse);
|
|
35
|
-
// Setup follows
|
|
36
|
-
follow = generateFollowResponse({
|
|
37
|
-
source_feed: generateFeedResponse({
|
|
38
|
-
id: 'main',
|
|
39
|
-
group_id: 'user',
|
|
40
|
-
created_by: { id: userId },
|
|
41
|
-
}),
|
|
42
|
-
target_feed: generateFeedResponse({
|
|
43
|
-
id: 'target',
|
|
44
|
-
group_id: 'user',
|
|
45
|
-
}),
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
otherFollow = generateFollowResponse({
|
|
49
|
-
source_feed: generateFeedResponse({
|
|
50
|
-
id: 'other',
|
|
51
|
-
group_id: 'user',
|
|
52
|
-
created_by: { id: getHumanId() },
|
|
53
|
-
}),
|
|
54
|
-
target_feed: generateFeedResponse({
|
|
55
|
-
id: 'main',
|
|
56
|
-
group_id: 'user',
|
|
57
|
-
}),
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
ownFollow = generateFollowResponse({
|
|
61
|
-
source_feed: generateFeedResponse({
|
|
62
|
-
id: 'other',
|
|
63
|
-
group_id: 'user',
|
|
64
|
-
created_by: { id: userId },
|
|
65
|
-
}),
|
|
66
|
-
target_feed: generateFeedResponse({
|
|
67
|
-
id: 'main',
|
|
68
|
-
group_id: 'user',
|
|
69
|
-
}),
|
|
70
|
-
});
|
|
71
|
-
// Set up initial state
|
|
72
|
-
feed.state.next((currentState) => ({
|
|
73
|
-
...currentState,
|
|
74
|
-
following: [follow],
|
|
75
|
-
followers: [otherFollow],
|
|
76
|
-
own_follows: [ownFollow],
|
|
77
|
-
}));
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('updates a follow in following when this feed is the source', () => {
|
|
81
|
-
const updatedFollow: FollowResponse = { ...follow, status: 'pending' };
|
|
82
|
-
|
|
83
|
-
handleFollowUpdated.call(feed, { follow: updatedFollow });
|
|
84
|
-
|
|
85
|
-
const [updatedFollowAfter] = feed.currentState.following!;
|
|
86
|
-
|
|
87
|
-
expect(updatedFollowAfter).toBe(updatedFollow);
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('updates a follow in followers when this feed is the target', () => {
|
|
91
|
-
const updatedOtherFollow: FollowResponse = {
|
|
92
|
-
...otherFollow,
|
|
93
|
-
status: 'rejected',
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
handleFollowUpdated.call(feed, { follow: updatedOtherFollow });
|
|
97
|
-
|
|
98
|
-
const [updatedOtherFollowAfter] = feed.currentState.followers!;
|
|
99
|
-
|
|
100
|
-
expect(updatedOtherFollowAfter).toBe(updatedOtherFollow);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('updates a follow in own_follows when connected user is the creator', () => {
|
|
104
|
-
const updatedOwnFollow: FollowResponse = {
|
|
105
|
-
...ownFollow,
|
|
106
|
-
status: 'pending',
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
handleFollowUpdated.call(feed, { follow: updatedOwnFollow });
|
|
110
|
-
|
|
111
|
-
const [ownFollowAfter] = feed.currentState.own_follows!;
|
|
112
|
-
|
|
113
|
-
expect(ownFollowAfter).toBe(updatedOwnFollow);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it('does not update if follow is not found', () => {
|
|
117
|
-
const unrelatedFollow = generateFollowResponse();
|
|
118
|
-
|
|
119
|
-
const stateBefore = feed.currentState;
|
|
120
|
-
|
|
121
|
-
handleFollowUpdated.call(feed, { follow: unrelatedFollow });
|
|
122
|
-
|
|
123
|
-
const stateAfter = feed.currentState;
|
|
124
|
-
|
|
125
|
-
expect(stateAfter.own_follows).toBe(stateBefore.own_follows);
|
|
126
|
-
expect(stateAfter.followers).toBe(stateBefore.followers);
|
|
127
|
-
expect(stateAfter.follower_count).toBe(stateBefore.follower_count);
|
|
128
|
-
expect(stateAfter.following).toBe(stateBefore.following);
|
|
129
|
-
expect(stateAfter.following_count).toBe(stateBefore.following_count);
|
|
130
|
-
});
|
|
131
|
-
});
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
updateNotificationFeedFromEvent,
|
|
4
|
-
updateNotificationStatus,
|
|
5
|
-
} from './handle-notification-feed-updated';
|
|
6
|
-
import {
|
|
7
|
-
createMockAggregatedActivity,
|
|
8
|
-
createMockNotificationFeedUpdatedEvent,
|
|
9
|
-
createMockNotificationStatus,
|
|
10
|
-
} from '../../../test-utils';
|
|
11
|
-
|
|
12
|
-
describe('notification-feed-utils', () => {
|
|
13
|
-
describe('updateNotificationFeedFromEvent', () => {
|
|
14
|
-
it('should return unchanged if event has no notification_status or aggregated_activities', () => {
|
|
15
|
-
const event = createMockNotificationFeedUpdatedEvent();
|
|
16
|
-
|
|
17
|
-
const result = updateNotificationFeedFromEvent(event, [], {
|
|
18
|
-
unread: 0,
|
|
19
|
-
unseen: 0,
|
|
20
|
-
read_activities: [],
|
|
21
|
-
seen_activities: [],
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
expect(result.changed).toBe(false);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it(`should update notification_status when event has notification_status and currentNotificationStatus is undefined`, () => {
|
|
28
|
-
const event = createMockNotificationFeedUpdatedEvent({
|
|
29
|
-
notification_status: createMockNotificationStatus(),
|
|
30
|
-
});
|
|
31
|
-
const result = updateNotificationFeedFromEvent(event, [], undefined);
|
|
32
|
-
|
|
33
|
-
expect(result.changed).toBe(true);
|
|
34
|
-
expect(result.data?.notification_status).toStrictEqual(
|
|
35
|
-
event.notification_status,
|
|
36
|
-
);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it(`shouldn't update aggregated_activities when event has aggregated_activities but currentAggregatedActivities is undefined`, () => {
|
|
40
|
-
const event = createMockNotificationFeedUpdatedEvent({
|
|
41
|
-
aggregated_activities: [createMockAggregatedActivity()],
|
|
42
|
-
});
|
|
43
|
-
const result = updateNotificationFeedFromEvent(
|
|
44
|
-
event,
|
|
45
|
-
undefined,
|
|
46
|
-
createMockNotificationStatus(),
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
expect(result.changed).toBe(false);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('should update notification_status when event has notification_status', () => {
|
|
53
|
-
const notificationStatus = createMockNotificationStatus({
|
|
54
|
-
unread: 5,
|
|
55
|
-
unseen: 3,
|
|
56
|
-
read_activities: ['activity1', 'activity2'],
|
|
57
|
-
seen_activities: [],
|
|
58
|
-
});
|
|
59
|
-
const event = createMockNotificationFeedUpdatedEvent({
|
|
60
|
-
notification_status: notificationStatus,
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
const result = updateNotificationFeedFromEvent(event, [], {
|
|
64
|
-
unread: 0,
|
|
65
|
-
unseen: 0,
|
|
66
|
-
read_activities: [],
|
|
67
|
-
seen_activities: [],
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
expect(result.changed).toBe(true);
|
|
71
|
-
expect(result.data?.notification_status).toStrictEqual(
|
|
72
|
-
notificationStatus,
|
|
73
|
-
);
|
|
74
|
-
expect(result.data?.aggregated_activities).toBeUndefined();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('should update aggregated_activities when event has aggregated_activities', () => {
|
|
78
|
-
const aggregatedActivities = [
|
|
79
|
-
createMockAggregatedActivity({ group: 'group1' }),
|
|
80
|
-
createMockAggregatedActivity({ group: 'group2' }),
|
|
81
|
-
];
|
|
82
|
-
const event = createMockNotificationFeedUpdatedEvent({
|
|
83
|
-
aggregated_activities: aggregatedActivities,
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
const result = updateNotificationFeedFromEvent(event, [], {
|
|
87
|
-
unread: 0,
|
|
88
|
-
unseen: 0,
|
|
89
|
-
read_activities: [],
|
|
90
|
-
seen_activities: [],
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
expect(result.changed).toBe(true);
|
|
94
|
-
expect(result.data?.aggregated_activities).toStrictEqual(
|
|
95
|
-
aggregatedActivities,
|
|
96
|
-
);
|
|
97
|
-
expect(result.data?.notification_status).toBeUndefined();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('should update both notification_status and aggregated_activities when event has both', () => {
|
|
101
|
-
const notificationStatus = createMockNotificationStatus({
|
|
102
|
-
unread: 2,
|
|
103
|
-
unseen: 1,
|
|
104
|
-
});
|
|
105
|
-
const aggregatedActivities = [
|
|
106
|
-
createMockAggregatedActivity({ group: 'group1' }),
|
|
107
|
-
];
|
|
108
|
-
const event = createMockNotificationFeedUpdatedEvent({
|
|
109
|
-
notification_status: notificationStatus,
|
|
110
|
-
aggregated_activities: aggregatedActivities,
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
const result = updateNotificationFeedFromEvent(event, [], {
|
|
114
|
-
unread: 0,
|
|
115
|
-
unseen: 0,
|
|
116
|
-
read_activities: [],
|
|
117
|
-
seen_activities: [],
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
expect(result.changed).toBe(true);
|
|
121
|
-
expect(result.data?.notification_status?.unread).toBe(
|
|
122
|
-
notificationStatus.unread,
|
|
123
|
-
);
|
|
124
|
-
expect(result.data?.notification_status?.unseen).toBe(
|
|
125
|
-
notificationStatus.unseen,
|
|
126
|
-
);
|
|
127
|
-
expect(result.data?.aggregated_activities).toStrictEqual(
|
|
128
|
-
aggregatedActivities,
|
|
129
|
-
);
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it('should handle notification_status with all fields', () => {
|
|
133
|
-
const notificationStatus = createMockNotificationStatus({
|
|
134
|
-
unread: 10,
|
|
135
|
-
unseen: 5,
|
|
136
|
-
last_seen_at: new Date('2023-01-01'),
|
|
137
|
-
seen_activities: [],
|
|
138
|
-
read_activities: ['activity1', 'activity2', 'activity3'],
|
|
139
|
-
});
|
|
140
|
-
const event = createMockNotificationFeedUpdatedEvent({
|
|
141
|
-
notification_status: notificationStatus,
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
const result = updateNotificationFeedFromEvent(event, [], {
|
|
145
|
-
unread: 0,
|
|
146
|
-
unseen: 0,
|
|
147
|
-
read_activities: [],
|
|
148
|
-
seen_activities: [],
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
expect(result.changed).toBe(true);
|
|
152
|
-
expect(result.data?.notification_status).toStrictEqual(
|
|
153
|
-
notificationStatus,
|
|
154
|
-
);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
describe('updateNotificationStatus', () => {
|
|
159
|
-
it('should replace old state with new one', () => {
|
|
160
|
-
const newNotificationStatus = createMockNotificationStatus({
|
|
161
|
-
unread: 5,
|
|
162
|
-
unseen: 3,
|
|
163
|
-
read_activities: ['activity1', 'activity2'],
|
|
164
|
-
seen_activities: ['activity3', 'activity4'],
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
const currentNotificationStatus = createMockNotificationStatus({
|
|
168
|
-
unread: 2,
|
|
169
|
-
unseen: 1,
|
|
170
|
-
read_activities: ['activity5', 'activity6'],
|
|
171
|
-
seen_activities: ['activity7', 'activity8'],
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
const result = updateNotificationStatus(
|
|
175
|
-
newNotificationStatus,
|
|
176
|
-
currentNotificationStatus,
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
expect(result.notification_status).toStrictEqual(newNotificationStatus);
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
});
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
generateActivityResponse,
|
|
3
|
-
generateFeedReactionResponse,
|
|
4
|
-
} from '../../../test-utils';
|
|
5
|
-
import { updateActivities } from './handle-story-feeds-updated';
|
|
6
|
-
import { describe, expect, it } from 'vitest';
|
|
7
|
-
|
|
8
|
-
describe('updateActivities', () => {
|
|
9
|
-
it('should return unchanged if new activities is empty', () => {
|
|
10
|
-
const currentActivities = [generateActivityResponse({ id: 'activity1' })];
|
|
11
|
-
const result = updateActivities([], currentActivities);
|
|
12
|
-
expect(result.changed).toBe(false);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
it('should return unchanged if current activities is undefined', () => {
|
|
16
|
-
const newActivities = [generateActivityResponse({ id: 'activity1' })];
|
|
17
|
-
const result = updateActivities(newActivities, undefined);
|
|
18
|
-
expect(result.changed).toBe(false);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('should update existing activities, ignore new ones', () => {
|
|
22
|
-
const newActivities = [
|
|
23
|
-
generateActivityResponse({ id: 'activity1', is_watched: true }),
|
|
24
|
-
generateActivityResponse({ id: 'activity3' }),
|
|
25
|
-
];
|
|
26
|
-
const currentActivities = [
|
|
27
|
-
generateActivityResponse({
|
|
28
|
-
id: 'activity1',
|
|
29
|
-
own_reactions: [generateFeedReactionResponse({ type: 'like' })],
|
|
30
|
-
}),
|
|
31
|
-
generateActivityResponse({
|
|
32
|
-
id: 'activity2',
|
|
33
|
-
}),
|
|
34
|
-
];
|
|
35
|
-
|
|
36
|
-
const result = updateActivities(newActivities, currentActivities);
|
|
37
|
-
|
|
38
|
-
expect(result.changed).toBe(true);
|
|
39
|
-
expect(result.activities).toHaveLength(2);
|
|
40
|
-
expect(result.activities[0].own_reactions).toHaveLength(1);
|
|
41
|
-
expect(result.activities[0].own_reactions[0].type).toBe('like');
|
|
42
|
-
expect(result.activities[0].is_watched).toBe(true);
|
|
43
|
-
expect(result.activities[1].id).toBe('activity2');
|
|
44
|
-
});
|
|
45
|
-
});
|