From bdc19a9d5975b60a039147f6c61053396f290ed8 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 10:41:50 +0200 Subject: [PATCH 1/5] make timeoutOrExpirationDate optional --- packages/stream_chat/lib/src/client.dart | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/stream_chat/lib/src/client.dart b/packages/stream_chat/lib/src/client.dart index 05f2559b..6e7caa9e 100644 --- a/packages/stream_chat/lib/src/client.dart +++ b/packages/stream_chat/lib/src/client.dart @@ -1361,12 +1361,13 @@ class StreamChatClient { /// [timeoutOrExpirationDate] can either be a [DateTime] or a value in seconds /// to be added to [DateTime.now] Future pinMessage( - Message message, - Object timeoutOrExpirationDate, - ) { + Message message, [ + Object? timeoutOrExpirationDate, + ]) { assert(() { if (timeoutOrExpirationDate is! DateTime && - timeoutOrExpirationDate is! num) { + timeoutOrExpirationDate is! num && + timeoutOrExpirationDate != null) { throw ArgumentError('Invalid timeout or Expiration date'); } return true; @@ -1383,13 +1384,19 @@ class StreamChatClient { .toUtc(); } return updateMessage( - message.copyWith(pinned: true, pinExpires: pinExpires), + message.copyWith( + pinned: true, + pinExpires: pinExpires, + ), ); } /// Unpins provided message - Future unpinMessage(Message message) => - updateMessage(message.copyWith(pinned: false)); + Future unpinMessage(Message message) => updateMessage( + message.copyWith( + pinned: false, + ), + ); } /// The class that handles the state of the channel listening to the events From 32cb1e77001d038911f538a4181562d08e44c0da Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 10:45:59 +0200 Subject: [PATCH 2/5] replicate in channel --- packages/stream_chat/lib/src/api/channel.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 69d967fe..384ca105 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -507,9 +507,9 @@ class Channel { /// Pins provided message Future pinMessage( - Message message, + Message message, [ Object? timeoutOrExpirationDate, - ) { + ]) { assert(() { if (timeoutOrExpirationDate is! DateTime && timeoutOrExpirationDate != null && From a543cf325a11fcfd8315ecbeaa211fecc37e1bef Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 10:50:35 +0200 Subject: [PATCH 3/5] fix assert error message --- packages/stream_chat/lib/src/api/channel.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 384ca105..657126c1 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -517,7 +517,7 @@ class Channel { throw ArgumentError('Invalid timeout or Expiration date'); } return true; - }(), 'Check for invalid token or expiration date'); + }(), 'Check whether time out is valid'); DateTime? pinExpires; if (timeoutOrExpirationDate is DateTime) { From 5b39893f768970f68ad80c47e64e254851d99982 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 11:36:08 +0200 Subject: [PATCH 4/5] add test --- .../stream_chat/test/src/client_test.dart | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/stream_chat/test/src/client_test.dart b/packages/stream_chat/test/src/client_test.dart index b2a5bbac..53792764 100644 --- a/packages/stream_chat/test/src/client_test.dart +++ b/packages/stream_chat/test/src/client_test.dart @@ -1112,6 +1112,28 @@ void main() { data: {'message': anything})).called(1); }); + test('should complete successfully with a null value', () async { + final message = Message(text: 'Hello'); + + when( + () => mockDio.post( + '/messages/${message.id}', + data: anything, + ), + ).thenAnswer( + (_) async => Response( + data: jsonEncode({'message': message}), + statusCode: 200, + requestOptions: FakeRequestOptions(), + ), + ); + + await client.pinMessage(message); + + verify(() => mockDio.post('/messages/${message.id}', + data: {'message': anything})).called(1); + }); + test('should unpin message successfully', () async { final message = Message(text: 'Hello'); From d764de9f689d59c6c71320e4f7d02e57b4bfcd1f Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 21 May 2021 11:37:03 +0200 Subject: [PATCH 5/5] add test --- .../test/src/api/channel_test.dart | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/packages/stream_chat/test/src/api/channel_test.dart b/packages/stream_chat/test/src/api/channel_test.dart index c3409b7e..f92b05bb 100644 --- a/packages/stream_chat/test/src/api/channel_test.dart +++ b/packages/stream_chat/test/src/api/channel_test.dart @@ -449,6 +449,51 @@ void main() { .called(1); }); + test('should be pinned successfully with null timeout', () async { + final mockDio = MockDio(); + + when(() => mockDio.options).thenReturn(BaseOptions()); + when(() => mockDio.interceptors).thenReturn(Interceptors()); + + final client = StreamChatClient( + 'api-key', + httpClient: mockDio, + tokenProvider: (_) async => '', + ); + final channelClient = client.channel('messaging', id: 'testid'); + final message = Message(text: 'Hello', id: 'test'); + + when(() => mockDio.post( + any(), + data: any(named: 'data'), + )).thenAnswer((_) async => Response( + data: jsonEncode(ChannelState()), + statusCode: 200, + requestOptions: FakeRequestOptions(), + )); + + await channelClient.watch(); + + when( + () => mockDio.post( + '/messages/${message.id}', + data: anything, + ), + ).thenAnswer( + (_) async => Response( + data: jsonEncode({'message': message}), + statusCode: 200, + requestOptions: FakeRequestOptions(), + ), + ); + + await channelClient.pinMessage(message); + + verify(() => + mockDio.post('/messages/${message.id}', data: anything)) + .called(1); + }); + test('should be unpinned successfully', () async { final mockDio = MockDio();