@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.
Files changed (84) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cjs/index.js +94 -25
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/react-bindings.js +26 -55
  5. package/dist/cjs/react-bindings.js.map +1 -1
  6. package/dist/es/index.mjs +86 -17
  7. package/dist/es/index.mjs.map +1 -1
  8. package/dist/es/react-bindings.mjs +19 -48
  9. package/dist/es/react-bindings.mjs.map +1 -1
  10. package/dist/{index-Zde8UE5f.mjs → feeds-client-BObWT4vl.mjs} +191 -92
  11. package/dist/feeds-client-BObWT4vl.mjs.map +1 -0
  12. package/dist/{index--koeDtxd.js → feeds-client-BlR_3zy2.js} +178 -79
  13. package/dist/feeds-client-BlR_3zy2.js.map +1 -0
  14. package/dist/tsconfig.tsbuildinfo +1 -1
  15. package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.d.ts +2 -32
  16. package/dist/types/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.d.ts.map +1 -1
  17. package/dist/types/common/real-time/event-models.d.ts +7 -2
  18. package/dist/types/common/real-time/event-models.d.ts.map +1 -1
  19. package/dist/types/common/types.d.ts +1 -0
  20. package/dist/types/common/types.d.ts.map +1 -1
  21. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -1
  22. package/dist/types/feed/event-handlers/activity/handle-activity-updated.d.ts.map +1 -1
  23. package/dist/types/feed/feed.d.ts +1 -1
  24. package/dist/types/feed/feed.d.ts.map +1 -1
  25. package/dist/types/feeds-client/feeds-client.d.ts +9 -1
  26. package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
  27. package/dist/types/utils/throttling/index.d.ts +3 -0
  28. package/dist/types/utils/throttling/index.d.ts.map +1 -0
  29. package/dist/types/utils/throttling/throttle.d.ts +34 -0
  30. package/dist/types/utils/throttling/throttle.d.ts.map +1 -0
  31. package/dist/types/utils/throttling/throttled-get-batched-own-capabilities.d.ts +14 -0
  32. package/dist/types/utils/throttling/throttled-get-batched-own-capabilities.d.ts.map +1 -0
  33. package/package.json +7 -3
  34. package/react-bindings.d.ts +11 -0
  35. package/react-bindings.js +7 -0
  36. package/react-bindings.mjs +11 -0
  37. package/src/bindings/react/hooks/feed-state-hooks/useOwnCapabilities.ts +21 -73
  38. package/src/common/real-time/event-models.ts +8 -2
  39. package/src/common/types.ts +1 -0
  40. package/src/feed/event-handlers/activity/handle-activity-added.ts +9 -1
  41. package/src/feed/event-handlers/activity/handle-activity-updated.ts +4 -0
  42. package/src/feed/feed.ts +18 -3
  43. package/src/feeds-client/feeds-client.ts +106 -3
  44. package/src/utils/throttling/index.ts +2 -0
  45. package/src/utils/throttling/throttle.ts +123 -0
  46. package/src/utils/throttling/throttled-get-batched-own-capabilities.ts +44 -0
  47. package/dist/index--koeDtxd.js.map +0 -1
  48. package/dist/index-Zde8UE5f.mjs.map +0 -1
  49. package/src/feed/event-handlers/activity/activity-marked-utils.test.ts +0 -208
  50. package/src/feed/event-handlers/activity/activity-reaction-utils.test.ts +0 -371
  51. package/src/feed/event-handlers/activity/handle-activity-added.test.ts +0 -97
  52. package/src/feed/event-handlers/activity/handle-activity-deleted.test.ts +0 -117
  53. package/src/feed/event-handlers/activity/handle-activity-pinned.test.ts +0 -60
  54. package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +0 -257
  55. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +0 -317
  56. package/src/feed/event-handlers/activity/handle-activity-reaction-updated.test.ts +0 -282
  57. package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +0 -95
  58. package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +0 -245
  59. package/src/feed/event-handlers/add-aggregated-activities-to-state.test.ts +0 -510
  60. package/src/feed/event-handlers/bookmark/bookmark-utils.test.ts +0 -521
  61. package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +0 -178
  62. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +0 -188
  63. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +0 -196
  64. package/src/feed/event-handlers/comment/handle-comment-added.test.ts +0 -271
  65. package/src/feed/event-handlers/comment/handle-comment-deleted.test.ts +0 -255
  66. package/src/feed/event-handlers/comment/handle-comment-reaction-added.test.ts +0 -329
  67. package/src/feed/event-handlers/comment/handle-comment-reaction-deleted.test.ts +0 -343
  68. package/src/feed/event-handlers/comment/handle-comment-reaction-updated.test.ts +0 -350
  69. package/src/feed/event-handlers/comment/handle-comment-updated.test.ts +0 -267
  70. package/src/feed/event-handlers/comment/utils/update-comment-count.test.ts +0 -322
  71. package/src/feed/event-handlers/feed-member/handle-feed-member-added.test.ts +0 -75
  72. package/src/feed/event-handlers/feed-member/handle-feed-member-removed.test.ts +0 -82
  73. package/src/feed/event-handlers/feed-member/handle-feed-member-updated.test.ts +0 -84
  74. package/src/feed/event-handlers/follow/follow-state-update-queue.test.ts +0 -219
  75. package/src/feed/event-handlers/follow/handle-follow-created.test.ts +0 -250
  76. package/src/feed/event-handlers/follow/handle-follow-deleted.test.ts +0 -268
  77. package/src/feed/event-handlers/follow/handle-follow-updated.test.ts +0 -131
  78. package/src/feed/event-handlers/notification-feed/handle-notification-feed-updated.test.ts +0 -182
  79. package/src/feed/event-handlers/story-feeds/handle-story-feeds-updated.test.ts +0 -45
  80. package/src/feed/feed.test.ts +0 -90
  81. package/src/feeds-client/event-handlers/user/handle-user-updated.test.ts +0 -53
  82. package/src/utils/event-triggered-by-connected-user.test.ts +0 -73
  83. package/src/utils/state-update-queue.test.ts +0 -129
  84. 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
- });