Skip to content

Commit 42c386f

Browse files
committed
test: add more local filter tests
1 parent c51ef49 commit 42c386f

File tree

11 files changed

+1047
-17
lines changed

11 files changed

+1047
-17
lines changed

packages/stream_feeds/lib/src/state/event/poll_vote_list_event_handler.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class PollVoteListEventHandler implements StateEventHandler {
3131

3232
if (event is api.PollVoteChangedFeedEvent) {
3333
// Only handle votes for this specific poll
34-
if (event.poll.id != pollId) return;
34+
if (event.pollVote.pollId != pollId) return;
3535

3636
final pollVote = event.pollVote.toModel();
3737
if (!matchesQueryFilter(pollVote)) {

packages/stream_feeds/test/state/activity_list_test.dart

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -418,15 +418,7 @@ void main() {
418418

419419
// Wait for the event to be processed
420420
await Future<Object?>.delayed(Duration.zero);
421-
422-
// Activity should still be there since no filter is applied
423421
expect(activityList.state.activities, hasLength(3));
424-
425-
final updatedActivity = activityList.state.activities.firstWhere(
426-
(activity) => activity.id == 'activity-1',
427-
);
428-
429-
expect(updatedActivity.type, 'share');
430422
},
431423
);
432424
});

packages/stream_feeds/test/state/activity_test.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ void main() {
124124
expectAsync1(
125125
(event) {
126126
expect(event, isA<ActivityState>());
127-
expect(event.poll?.id, 'id');
127+
expect(event.poll?.id, 'poll-id');
128128
expect(event.poll?.voteCount, 1);
129129
},
130130
),
@@ -165,7 +165,7 @@ void main() {
165165
expectAsync1(
166166
(event) {
167167
expect(event, isA<ActivityState>());
168-
expect(event.poll?.id, 'id');
168+
expect(event.poll?.id, 'poll-id');
169169
expect(event.poll?.answersCount, 1);
170170
expect(event.poll?.latestAnswers.length, 1);
171171
},
@@ -225,7 +225,7 @@ void main() {
225225
expectAsync1(
226226
(event) {
227227
expect(event, isA<ActivityState>());
228-
expect(event.poll?.id, 'id');
228+
expect(event.poll?.id, 'poll-id');
229229
expect(event.poll?.answersCount, 0);
230230
expect(event.poll?.latestAnswers.length, 0);
231231
},
@@ -286,7 +286,7 @@ void main() {
286286
expectAsync1(
287287
(event) {
288288
expect(event, isA<ActivityState>());
289-
expect(event.poll?.id, 'id');
289+
expect(event.poll?.id, 'poll-id');
290290
expect(event.poll?.voteCount, 0);
291291
expect(event.poll?.latestVotesByOption.length, 0);
292292
},
@@ -328,7 +328,7 @@ void main() {
328328
expectAsync1(
329329
(event) {
330330
expect(event, isA<ActivityState>());
331-
expect(event.poll?.id, 'id');
331+
expect(event.poll?.id, 'poll-id');
332332
expect(event.poll?.isClosed, true);
333333
},
334334
),
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
import 'dart:async';
2+
import 'dart:convert';
3+
4+
import 'package:mocktail/mocktail.dart';
5+
import 'package:stream_feeds/src/client/feeds_client_impl.dart';
6+
import 'package:stream_feeds/src/generated/api/model/bookmark_folder_updated_event.dart';
7+
import 'package:stream_feeds/stream_feeds.dart';
8+
import 'package:test/test.dart';
9+
10+
import '../test_utils.dart';
11+
12+
void main() {
13+
late StreamFeedsClientImpl client;
14+
late MockDefaultApi feedsApi;
15+
late MockWebSocketChannel webSocketChannel;
16+
17+
setUp(() {
18+
feedsApi = MockDefaultApi();
19+
webSocketChannel = MockWebSocketChannel();
20+
21+
client = StreamFeedsClientImpl(
22+
apiKey: 'apiKey',
23+
user: const User(id: 'luke_skywalker'),
24+
tokenProvider: TokenProvider.static(UserToken(testToken)),
25+
feedsRestApi: feedsApi,
26+
wsProvider: (options) => webSocketChannel,
27+
);
28+
});
29+
30+
tearDown(() {
31+
client.disconnect();
32+
});
33+
34+
group('BookmarkFolderListEventHandler - Local filtering', () {
35+
late StreamController<Object> wsStreamController;
36+
late MockWebSocketSink webSocketSink;
37+
38+
setUp(() async {
39+
wsStreamController = StreamController<Object>();
40+
webSocketSink = MockWebSocketSink();
41+
WsTestConnection(
42+
wsStreamController: wsStreamController,
43+
webSocketSink: webSocketSink,
44+
webSocketChannel: webSocketChannel,
45+
).setUp();
46+
47+
await client.connect();
48+
49+
when(
50+
() => feedsApi.queryBookmarkFolders(
51+
queryBookmarkFoldersRequest: any(
52+
named: 'queryBookmarkFoldersRequest',
53+
),
54+
),
55+
).thenAnswer(
56+
(_) async => Result.success(
57+
QueryBookmarkFoldersResponse(
58+
duration: DateTime.now().toIso8601String(),
59+
bookmarkFolders: [
60+
createDefaultBookmarkFolderResponse(id: 'folder-1'),
61+
createDefaultBookmarkFolderResponse(id: 'folder-2'),
62+
createDefaultBookmarkFolderResponse(id: 'folder-3'),
63+
],
64+
),
65+
),
66+
);
67+
});
68+
69+
tearDown(() async {
70+
await webSocketSink.close();
71+
await wsStreamController.close();
72+
});
73+
74+
test(
75+
'BookmarkFolderUpdatedEvent - should remove folder when updated to non-matching name',
76+
() async {
77+
final folderList = client.bookmarkFolderList(
78+
BookmarkFoldersQuery(
79+
filter: Filter.equal(
80+
BookmarkFoldersFilterField.folderName,
81+
'My Folder',
82+
),
83+
),
84+
);
85+
86+
await folderList.get();
87+
expect(folderList.state.bookmarkFolders, hasLength(3));
88+
89+
// Send event with folder that has different name (doesn't match filter)
90+
wsStreamController.add(
91+
jsonEncode(
92+
BookmarkFolderUpdatedEvent(
93+
type: 'feeds.bookmark_folder.updated',
94+
createdAt: DateTime.now(),
95+
custom: const {},
96+
bookmarkFolder: createDefaultBookmarkFolderResponse(
97+
id: 'folder-1',
98+
// Doesn't match folder name
99+
).copyWith(name: 'Different Folder'),
100+
),
101+
),
102+
);
103+
104+
await Future<Object?>.delayed(Duration.zero);
105+
expect(folderList.state.bookmarkFolders, hasLength(2));
106+
},
107+
);
108+
109+
test(
110+
'No filter - should not remove folder when no filter specified',
111+
() async {
112+
final folderList = client.bookmarkFolderList(
113+
// No filter - all folders should be accepted
114+
const BookmarkFoldersQuery(),
115+
);
116+
117+
await folderList.get();
118+
expect(folderList.state.bookmarkFolders, hasLength(3));
119+
120+
wsStreamController.add(
121+
jsonEncode(
122+
BookmarkFolderUpdatedEvent(
123+
type: 'feeds.bookmark_folder.updated',
124+
createdAt: DateTime.now(),
125+
custom: const {},
126+
bookmarkFolder: createDefaultBookmarkFolderResponse(
127+
id: 'folder-1',
128+
).copyWith(name: 'Different Folder'),
129+
),
130+
),
131+
);
132+
133+
await Future<Object?>.delayed(Duration.zero);
134+
expect(folderList.state.bookmarkFolders, hasLength(3));
135+
},
136+
);
137+
});
138+
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import 'dart:async';
2+
import 'dart:convert';
3+
4+
import 'package:mocktail/mocktail.dart';
5+
import 'package:stream_feeds/src/client/feeds_client_impl.dart';
6+
import 'package:stream_feeds/src/generated/api/model/bookmark_updated_event.dart';
7+
import 'package:stream_feeds/stream_feeds.dart';
8+
import 'package:test/test.dart';
9+
10+
import '../test_utils.dart';
11+
12+
void main() {
13+
late StreamFeedsClientImpl client;
14+
late MockDefaultApi feedsApi;
15+
late MockWebSocketChannel webSocketChannel;
16+
17+
setUp(() {
18+
feedsApi = MockDefaultApi();
19+
webSocketChannel = MockWebSocketChannel();
20+
21+
client = StreamFeedsClientImpl(
22+
apiKey: 'apiKey',
23+
user: const User(id: 'luke_skywalker'),
24+
tokenProvider: TokenProvider.static(UserToken(testToken)),
25+
feedsRestApi: feedsApi,
26+
wsProvider: (options) => webSocketChannel,
27+
);
28+
});
29+
30+
tearDown(() {
31+
client.disconnect();
32+
});
33+
34+
group('BookmarkListEventHandler - Local filtering', () {
35+
late StreamController<Object> wsStreamController;
36+
late MockWebSocketSink webSocketSink;
37+
38+
setUp(() async {
39+
wsStreamController = StreamController<Object>();
40+
webSocketSink = MockWebSocketSink();
41+
WsTestConnection(
42+
wsStreamController: wsStreamController,
43+
webSocketSink: webSocketSink,
44+
webSocketChannel: webSocketChannel,
45+
).setUp();
46+
47+
await client.connect();
48+
49+
when(
50+
() => feedsApi.queryBookmarks(
51+
queryBookmarksRequest: any(named: 'queryBookmarksRequest'),
52+
),
53+
).thenAnswer(
54+
(_) async => Result.success(
55+
QueryBookmarksResponse(
56+
duration: DateTime.now().toIso8601String(),
57+
bookmarks: [
58+
createDefaultBookmarkResponse(
59+
folderId: 'folder-1',
60+
activityId: 'activity-1',
61+
),
62+
createDefaultBookmarkResponse(
63+
folderId: 'folder-1',
64+
activityId: 'activity-2',
65+
),
66+
createDefaultBookmarkResponse(
67+
folderId: 'folder-1',
68+
activityId: 'activity-3',
69+
),
70+
],
71+
),
72+
),
73+
);
74+
});
75+
76+
tearDown(() async {
77+
await webSocketSink.close();
78+
await wsStreamController.close();
79+
});
80+
81+
test(
82+
'BookmarkUpdatedEvent - should remove bookmark when updated to non-matching user',
83+
() async {
84+
final bookmarkList = client.bookmarkList(
85+
BookmarksQuery(
86+
filter: Filter.equal(BookmarksFilterField.folderId, 'folder-1'),
87+
),
88+
);
89+
90+
await bookmarkList.get();
91+
expect(bookmarkList.state.bookmarks, hasLength(3));
92+
93+
wsStreamController.add(
94+
jsonEncode(
95+
BookmarkUpdatedEvent(
96+
type: 'feeds.bookmark.updated',
97+
createdAt: DateTime.now(),
98+
custom: const {},
99+
bookmark: createDefaultBookmarkResponse(
100+
folderId: 'folder-2',
101+
activityId: 'activity-1',
102+
),
103+
),
104+
),
105+
);
106+
107+
await Future<Object?>.delayed(Duration.zero);
108+
expect(bookmarkList.state.bookmarks, hasLength(2));
109+
},
110+
);
111+
112+
test(
113+
'No filter - should not remove bookmark when no filter specified',
114+
() async {
115+
final bookmarkList = client.bookmarkList(
116+
// No filter, all bookmarks should be accepted
117+
const BookmarksQuery(),
118+
);
119+
120+
await bookmarkList.get();
121+
expect(bookmarkList.state.bookmarks, hasLength(3));
122+
123+
wsStreamController.add(
124+
jsonEncode(
125+
BookmarkUpdatedEvent(
126+
type: 'feeds.bookmark.updated',
127+
createdAt: DateTime.now(),
128+
custom: const {},
129+
bookmark: createDefaultBookmarkResponse(
130+
folderId: 'folder-2',
131+
activityId: 'activity-1',
132+
),
133+
),
134+
),
135+
);
136+
137+
await Future<Object?>.delayed(Duration.zero);
138+
expect(bookmarkList.state.bookmarks, hasLength(3));
139+
},
140+
);
141+
});
142+
}

0 commit comments

Comments
 (0)