Merge branch 'fix/message-search-pagination' of github.com:GetStream/stream-chat-flutter into add-pagination-ended

This commit is contained in:
xsahil03x
2021-09-07 20:25:07 +05:30
4 changed files with 86 additions and 32 deletions
@@ -105,8 +105,8 @@ class ChannelsBlocState extends State<ChannelsBloc>
}) async { }) async {
final client = _streamChatCoreState!.client; final client = _streamChatCoreState!.client;
final clear = final offset = paginationParams.offset;
paginationParams.offset == null || paginationParams.offset == 0; final clear = offset == null || offset == 0;
if (clear && _paginationEnded) { if (clear && _paginationEnded) {
_paginationEnded = false; _paginationEnded = false;
} }
@@ -38,7 +38,7 @@ class MessageSearchListCore extends StatefulWidget {
/// * [errorBuilder] /// * [errorBuilder]
/// * [loadingBuilder] /// * [loadingBuilder]
/// * [childBuilder] /// * [childBuilder]
MessageSearchListCore({ const MessageSearchListCore({
Key? key, Key? key,
required this.emptyBuilder, required this.emptyBuilder,
required this.errorBuilder, required this.errorBuilder,
@@ -58,12 +58,6 @@ class MessageSearchListCore extends StatefulWidget {
messageQuery == null || messageFilters == null, messageQuery == null || messageFilters == null,
"Can't provide both `query` and `messageFilters` at the same time", "Can't provide both `query` and `messageFilters` at the same time",
), ),
assert(
paginationParams.offset == null ||
paginationParams.offset == 0 ||
sortOptions == null,
'Cannot specify `offset` with `sortOptions` parameter',
),
super(key: key); super(key: key);
/// A [MessageSearchListController] allows reloading and pagination. /// A [MessageSearchListController] allows reloading and pagination.
@@ -70,7 +70,8 @@ class UsersBlocState extends State<UsersBloc>
}) async { }) async {
final client = _streamChatCore.client; final client = _streamChatCore.client;
final clear = pagination.offset == null || pagination.offset == 0; final offset = pagination.offset;
final clear = offset == null || offset == 0;
if (clear && _paginationEnded) { if (clear && _paginationEnded) {
_paginationEnded = false; _paginationEnded = false;
@@ -7,6 +7,7 @@ import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
import 'mocks.dart'; import 'mocks.dart';
const testFilter = Filter.custom(operator: '\$test', value: 'testValue'); const testFilter = Filter.custom(operator: '\$test', value: 'testValue');
const testMessageFilter = Filter.custom(operator: '\$test', value: 'testValue');
void main() { void main() {
List<GetMessageResponse> _generateMessages({ List<GetMessageResponse> _generateMessages({
@@ -28,6 +29,40 @@ void main() {
}, },
); );
testWidgets(
'should throw if both `messageQuery` and `messageFilters` are provided',
(tester) async {
expect(
() => MessageSearchListCore(
childBuilder: (_) => const Offstage(),
loadingBuilder: (_) => const Offstage(),
emptyBuilder: (_) => const Offstage(),
errorBuilder: (_, __) => const Offstage(),
filters: testFilter,
messageFilters: testMessageFilter,
messageQuery: 'test',
),
throwsAssertionError,
);
},
);
testWidgets(
'should throw if both `messageQuery` and `messageFilters` are not provided',
(tester) async {
expect(
() => MessageSearchListCore(
childBuilder: (_) => const Offstage(),
loadingBuilder: (_) => const Offstage(),
emptyBuilder: (_) => const Offstage(),
errorBuilder: (_, __) => const Offstage(),
filters: testFilter,
),
throwsAssertionError,
);
},
);
testWidgets( testWidgets(
'should throw if MessageSearchListCore is used where MessageSearchBloc ' 'should throw if MessageSearchListCore is used where MessageSearchBloc '
'is not present in the widget tree', 'is not present in the widget tree',
@@ -40,6 +75,7 @@ void main() {
emptyBuilder: (BuildContext context) => const Offstage(), emptyBuilder: (BuildContext context) => const Offstage(),
errorBuilder: (BuildContext context, Object? error) => const Offstage(), errorBuilder: (BuildContext context, Object? error) => const Offstage(),
filters: testFilter, filters: testFilter,
messageFilters: testMessageFilter,
); );
await tester.pumpWidget(messageSearchListCore); await tester.pumpWidget(messageSearchListCore);
@@ -61,6 +97,7 @@ void main() {
emptyBuilder: (BuildContext context) => const Offstage(), emptyBuilder: (BuildContext context) => const Offstage(),
errorBuilder: (BuildContext context, Object? error) => const Offstage(), errorBuilder: (BuildContext context, Object? error) => const Offstage(),
filters: testFilter, filters: testFilter,
messageFilters: testMessageFilter,
); );
final mockClient = MockClient(); final mockClient = MockClient();
@@ -92,6 +129,7 @@ void main() {
errorBuilder: (BuildContext context, Object error) => const Offstage(), errorBuilder: (BuildContext context, Object error) => const Offstage(),
messageSearchListController: controller, messageSearchListController: controller,
filters: testFilter, filters: testFilter,
messageFilters: testMessageFilter,
); );
expect(controller.loadData, isNull); expect(controller.loadData, isNull);
@@ -129,6 +167,7 @@ void main() {
key: errorWidgetKey, key: errorWidgetKey,
), ),
filters: testFilter, filters: testFilter,
messageFilters: testMessageFilter,
); );
final mockClient = MockClient(); final mockClient = MockClient();
@@ -138,7 +177,7 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: any(named: 'paginationParams'), paginationParams: any(named: 'paginationParams'),
)).thenThrow(error); )).thenThrow(error);
@@ -159,7 +198,7 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: any(named: 'paginationParams'), paginationParams: any(named: 'paginationParams'),
)).called(1); )).called(1);
}, },
@@ -179,6 +218,7 @@ void main() {
const Offstage(key: emptyWidgetKey), const Offstage(key: emptyWidgetKey),
errorBuilder: (BuildContext context, Object error) => const Offstage(), errorBuilder: (BuildContext context, Object error) => const Offstage(),
filters: testFilter, filters: testFilter,
messageFilters: testMessageFilter,
); );
final mockClient = MockClient(); final mockClient = MockClient();
@@ -188,10 +228,13 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: any(named: 'paginationParams'), paginationParams: any(named: 'paginationParams'),
)).thenAnswer( )).thenAnswer(
(_) async => SearchMessagesResponse()..results = messageResponseList, (_) async => SearchMessagesResponse()
..results = messageResponseList
..next = null
..previous = null,
); );
await tester.pumpWidget( await tester.pumpWidget(
@@ -211,7 +254,7 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: any(named: 'paginationParams'), paginationParams: any(named: 'paginationParams'),
)).called(1); )).called(1);
}, },
@@ -231,6 +274,7 @@ void main() {
emptyBuilder: (BuildContext context) => const Offstage(), emptyBuilder: (BuildContext context) => const Offstage(),
errorBuilder: (BuildContext context, Object error) => const Offstage(), errorBuilder: (BuildContext context, Object error) => const Offstage(),
filters: testFilter, filters: testFilter,
messageFilters: testMessageFilter,
); );
final mockClient = MockClient(); final mockClient = MockClient();
@@ -240,10 +284,13 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: any(named: 'paginationParams'), paginationParams: any(named: 'paginationParams'),
)).thenAnswer( )).thenAnswer(
(_) async => SearchMessagesResponse()..results = messageResponseList, (_) async => SearchMessagesResponse()
..results = messageResponseList
..next = null
..previous = null,
); );
await tester.pumpWidget( await tester.pumpWidget(
@@ -263,7 +310,7 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: any(named: 'paginationParams'), paginationParams: any(named: 'paginationParams'),
)).called(1); )).called(1);
}, },
@@ -289,6 +336,7 @@ void main() {
errorBuilder: (BuildContext context, Object error) => const Offstage(), errorBuilder: (BuildContext context, Object error) => const Offstage(),
paginationParams: pagination, paginationParams: pagination,
filters: testFilter, filters: testFilter,
messageFilters: testMessageFilter,
); );
final mockClient = MockClient(); final mockClient = MockClient();
@@ -298,10 +346,13 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: pagination, paginationParams: pagination,
)).thenAnswer( )).thenAnswer(
(_) async => SearchMessagesResponse()..results = messageResponseList, (_) async => SearchMessagesResponse()
..results = messageResponseList
..next = null
..previous = null,
); );
await tester.pumpWidget( await tester.pumpWidget(
@@ -332,7 +383,7 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: pagination, paginationParams: pagination,
)).called(1); )).called(1);
@@ -348,11 +399,13 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: updatedPagination, paginationParams: updatedPagination,
)).thenAnswer( )).thenAnswer(
(_) async => (_) async => SearchMessagesResponse()
SearchMessagesResponse()..results = paginatedMessageResponseList, ..results = paginatedMessageResponseList
..next = null
..previous = null,
); );
await messageSearchListCoreState.paginateData(); await messageSearchListCoreState.paginateData();
@@ -372,7 +425,7 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: updatedPagination, paginationParams: updatedPagination,
)).called(1); )).called(1);
}, },
@@ -406,6 +459,7 @@ void main() {
const Offstage(), const Offstage(),
paginationParams: pagination.copyWith(limit: limit), paginationParams: pagination.copyWith(limit: limit),
filters: testFilter, filters: testFilter,
messageFilters: testMessageFilter,
); );
final mockClient = MockClient(); final mockClient = MockClient();
@@ -415,10 +469,13 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: pagination, paginationParams: pagination,
)).thenAnswer( )).thenAnswer(
(_) async => SearchMessagesResponse()..results = messageResponseList, (_) async => SearchMessagesResponse()
..results = messageResponseList
..next = null
..previous = null,
); );
await tester.pumpWidget( await tester.pumpWidget(
@@ -453,7 +510,7 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: pagination, paginationParams: pagination,
)).called(1); )).called(1);
@@ -466,11 +523,13 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: updatedPagination, paginationParams: updatedPagination,
)).thenAnswer( )).thenAnswer(
(_) async => (_) async => SearchMessagesResponse()
SearchMessagesResponse()..results = updatedMessageResponseList, ..results = updatedMessageResponseList
..next = null
..previous = null,
); );
await tester.pumpAndSettle(); await tester.pumpAndSettle();
@@ -487,7 +546,7 @@ void main() {
testFilter, testFilter,
query: any(named: 'query'), query: any(named: 'query'),
sort: any(named: 'sort'), sort: any(named: 'sort'),
messageFilters: any(named: 'messageFilters'), messageFilters: testMessageFilter,
paginationParams: updatedPagination, paginationParams: updatedPagination,
)).called(1); )).called(1);
}, },