diff --git a/packages/stream_chat/lib/src/client/retry_queue.dart b/packages/stream_chat/lib/src/client/retry_queue.dart index 008270e5..4c44433f 100644 --- a/packages/stream_chat/lib/src/client/retry_queue.dart +++ b/packages/stream_chat/lib/src/client/retry_queue.dart @@ -177,6 +177,9 @@ class RetryQueue { } } + /// Whether our [_messageQueue] has messages or not + bool get hasMessages => _messageQueue.isNotEmpty; + /// Call this method to dispose this object void dispose() { _messageQueue.clear(); diff --git a/packages/stream_chat/test/src/api/retry_queue_test.dart b/packages/stream_chat/test/src/api/retry_queue_test.dart new file mode 100644 index 00000000..084b82ec --- /dev/null +++ b/packages/stream_chat/test/src/api/retry_queue_test.dart @@ -0,0 +1,74 @@ +import 'package:mocktail/mocktail.dart'; +import 'package:stream_chat/src/client/retry_policy.dart'; +import 'package:stream_chat/src/client/retry_queue.dart'; +import 'package:stream_chat/src/core/models/event.dart'; +import 'package:stream_chat/src/core/models/message.dart'; +import 'package:stream_chat/src/event_type.dart'; +import 'package:test/scaffolding.dart'; +import 'package:test/test.dart'; + +import '../mocks.dart'; + +void main() { + late final channel = MockRetryQueueChannel(); + late final logger = MockLogger(); + late RetryQueue retryQueue; + + setUpAll(() { + final retryPolicy = RetryPolicy( + shouldRetry: (_, attempt, __) => attempt < 5, + retryTimeout: (_, attempt, __) => Duration(seconds: attempt), + ); + when(() => channel.client.retryPolicy).thenReturn(retryPolicy); + + when(() => channel.client.on(EventType.connectionRecovered)).thenAnswer( + (_) => Stream.value(Event( + type: EventType.connectionRecovered, + online: false, + )), + ); + + when(() => channel.on(any(), any(), any(), any())).thenAnswer( + (_) => Stream.value( + Event(type: EventType.any), + ), + ); + }); + + setUp(() { + retryQueue = RetryQueue(channel: channel, logger: logger); + }); + + tearDown(() { + retryQueue.dispose(); + }); + + group('`.add`', () { + test('should return if message list is empty', () { + expect(() => retryQueue.add([]), returnsNormally); + verifyNever(() => logger.info(any())); + }); + + test('should return if queue already contains the message', () { + final message = Message( + id: 'test-message-id', + text: 'Sample message test', + ); + retryQueue.add([message]); + expect(() => retryQueue.add([message]), returnsNormally); + // Called only for the first message + verify(() => logger.info('Adding 1 messages')).called(1); + }); + + test('`.add` should add failed request to the queue', () async { + final message = Message( + id: 'test-message-id', + text: 'Sample message test', + ); + retryQueue.add([message]); + expect(retryQueue.hasMessages, isTrue); + }); + }); + + // TODO: Add more tests once macbook is fixed :( +} diff --git a/packages/stream_chat/test/src/mocks.dart b/packages/stream_chat/test/src/mocks.dart index 9c20be7c..31e768e8 100644 --- a/packages/stream_chat/test/src/mocks.dart +++ b/packages/stream_chat/test/src/mocks.dart @@ -1,7 +1,9 @@ import 'package:dio/dio.dart'; import 'package:logging/logging.dart'; import 'package:mocktail/mocktail.dart'; +import 'package:stream_chat/src/client/channel.dart'; import 'package:stream_chat/src/client/client.dart'; +import 'package:stream_chat/src/client/retry_policy.dart'; import 'package:stream_chat/src/core/api/attachment_file_uploader.dart'; import 'package:stream_chat/src/core/api/channel_api.dart'; import 'package:stream_chat/src/core/api/device_api.dart'; @@ -84,3 +86,22 @@ class MockStreamChatClientWithPersistence extends Mock } class MockChannelConfig extends Mock implements ChannelConfig {} + +class MockRetryQueueChannel extends Mock implements Channel { + final channelId = 'test-channel-id'; + final channelType = 'test-channel-type'; + + @override + String? get id => channelId; + + @override + String get type => channelType; + + @override + String? get cid => '$channelType:$channelId'; + + StreamChatClient? _client; + + @override + StreamChatClient get client => _client ??= MockStreamChatClient(); +}