feat(stream_chat): upgrade to null safe dependencies

This commit is contained in:
Felix Angelov
2021-03-21 23:27:26 -05:00
parent b653ec34d3
commit 67f62d0692
24 changed files with 1460 additions and 1032 deletions
@@ -352,7 +352,7 @@ class Channel {
state?.addMessage(response.message); state?.addMessage(response.message);
return response; return response;
} catch (error) { } catch (error) {
if (error is DioError && error.type != DioErrorType.RESPONSE) { if (error is DioError && error.type != DioErrorType.response) {
state?.retryQueue?.add([message]); state?.retryQueue?.add([message]);
} }
rethrow; rethrow;
@@ -405,7 +405,7 @@ class Channel {
)); ));
return response; return response;
} catch (error) { } catch (error) {
if (error is DioError && error.type != DioErrorType.RESPONSE) { if (error is DioError && error.type != DioErrorType.response) {
state?.retryQueue?.add([message]); state?.retryQueue?.add([message]);
} }
rethrow; rethrow;
@@ -446,7 +446,7 @@ class Channel {
return response; return response;
} catch (error) { } catch (error) {
if (error is DioError && error.type != DioErrorType.RESPONSE) { if (error is DioError && error.type != DioErrorType.response) {
state?.retryQueue?.add([message]); state?.retryQueue?.add([message]);
} }
rethrow; rethrow;
@@ -74,7 +74,7 @@ class RetryQueue {
} catch (error) { } catch (error) {
ApiError apiError; ApiError apiError;
if (error is DioError) { if (error is DioError) {
if (error.type == DioErrorType.RESPONSE) { if (error.type == DioErrorType.response) {
_messageQueue.remove(message); _messageQueue.remove(message);
return; return;
} }
+30 -11
View File
@@ -252,7 +252,7 @@ class StreamChatClient {
this.httpClient.options.connectTimeout = connectTimeout.inMilliseconds; this.httpClient.options.connectTimeout = connectTimeout.inMilliseconds;
this.httpClient.interceptors.add( this.httpClient.interceptors.add(
InterceptorsWrapper( InterceptorsWrapper(
onRequest: (options) async { onRequest: (options, handler) async {
options.queryParameters.addAll(_commonQueryParams); options.queryParameters.addAll(_commonQueryParams);
options.headers.addAll(_httpHeaders); options.headers.addAll(_httpHeaders);
@@ -288,7 +288,10 @@ class StreamChatClient {
); );
} }
Future<void> _tokenExpiredInterceptor(DioError err) async { Future<void> _tokenExpiredInterceptor(
DioError err,
ErrorInterceptorHandler handler,
) async {
final apiError = ApiError( final apiError = ApiError(
err.response?.data, err.response?.data,
err.response?.statusCode, err.response?.statusCode,
@@ -313,13 +316,29 @@ class StreamChatClient {
try { try {
return await httpClient.request( return await httpClient.request(
err.request.path, err.requestOptions.path,
cancelToken: err.request.cancelToken, cancelToken: err.requestOptions.cancelToken,
data: err.request.data, data: err.requestOptions.data,
onReceiveProgress: err.request.onReceiveProgress, onReceiveProgress: err.requestOptions.onReceiveProgress,
onSendProgress: err.request.onSendProgress, onSendProgress: err.requestOptions.onSendProgress,
queryParameters: err.request.queryParameters, queryParameters: err.requestOptions.queryParameters,
options: err.request, options: Options(
method: err.requestOptions.method,
sendTimeout: err.requestOptions.sendTimeout,
receiveTimeout: err.requestOptions.receiveTimeout,
extra: err.requestOptions.extra,
headers: err.requestOptions.headers,
responseType: err.requestOptions.responseType,
contentType: err.requestOptions.contentType,
validateStatus: err.requestOptions.validateStatus,
receiveDataWhenStatusError:
err.requestOptions.receiveDataWhenStatusError,
followRedirects: err.requestOptions.followRedirects,
maxRedirects: err.requestOptions.maxRedirects,
requestEncoder: err.requestOptions.requestEncoder,
responseDecoder: err.requestOptions.responseDecoder,
listFormat: err.requestOptions.listFormat,
),
); );
} catch (err) { } catch (err) {
return err; return err;
@@ -783,7 +802,7 @@ class StreamChatClient {
} }
Object _parseError(DioError error) { Object _parseError(DioError error) {
if (error.type == DioErrorType.RESPONSE) { if (error.type == DioErrorType.response) {
final apiError = final apiError =
ApiError(error.response?.data, error.response?.statusCode); ApiError(error.response?.data, error.response?.statusCode);
logger.severe('apiError: ${apiError.toString()}'); logger.severe('apiError: ${apiError.toString()}');
@@ -930,7 +949,7 @@ class StreamChatClient {
_connectCompleter = Completer(); _connectCompleter = Completer();
_anonymous = true; _anonymous = true;
final uuid = Uuid(); const uuid = Uuid();
state.user = OwnUser(id: uuid.v4()); state.user = OwnUser(id: uuid.v4());
return connect().then((event) { return connect().then((event) {
@@ -35,7 +35,7 @@ class Attachment {
this.extraData, this.extraData,
this.file, this.file,
UploadState uploadState, UploadState uploadState,
}) : id = id ?? Uuid().v4(), }) : id = id ?? const Uuid().v4(),
title = title ?? file?.name, title = title ?? file?.name,
localUri = file?.path != null ? Uri.parse(file.path) : null { localUri = file?.path != null ? Uri.parse(file.path) : null {
this.uploadState = uploadState ?? this.uploadState = uploadState ??
@@ -73,7 +73,7 @@ class Message {
this.deletedAt, this.deletedAt,
this.status = MessageSendingStatus.sent, this.status = MessageSendingStatus.sent,
this.skipPush, this.skipPush,
}) : id = id ?? Uuid().v4(), }) : id = id ?? const Uuid().v4(),
pinExpires = pinExpires?.toUtc(); pinExpires = pinExpires?.toUtc();
/// Create a new instance from a json /// Create a new instance from a json
+16 -16
View File
@@ -9,22 +9,22 @@ environment:
sdk: ">=2.7.0 <3.0.0" sdk: ">=2.7.0 <3.0.0"
dependencies: dependencies:
async: ^2.4.2 async: ^2.5.0
collection: ^1.14.13 collection: ^1.15.0
dio: ^3.0.10 dio: ">=4.0.0-prev3 <4.0.0"
freezed_annotation: ^0.12.0 freezed_annotation: ^0.14.0
http_parser: ^3.1.4 http_parser: ^4.0.0
json_annotation: ^3.0.1 json_annotation: ^4.0.0
logging: ^0.11.4 logging: ^1.0.0
meta: ^1.2.4 meta: ^1.3.0
mime: ^0.9.7 mime: ^1.0.0
rxdart: ^0.25.0 rxdart: ^0.26.0
uuid: ^2.2.2 uuid: ^3.0.0
web_socket_channel: ^1.1.0 web_socket_channel: ^2.0.0
dev_dependencies: dev_dependencies:
build_runner: ^1.10.0 build_runner: ^1.10.0
freezed: ^0.12.7 freezed: ^0.14.0
json_serializable: ^3.3.0 json_serializable: ^4.0.0
mockito: ^4.1.1 mocktail: ^0.1.0
test: ^1.15.7 test: ^1.16.0
File diff suppressed because it is too large Load Diff
@@ -4,13 +4,13 @@ import 'package:stream_chat/stream_chat.dart';
void main() { void main() {
group('src/api/requests', () { group('src/api/requests', () {
test('SortOption', () { test('SortOption', () {
final option = SortOption('name'); const option = SortOption('name');
final j = option.toJson(); final j = option.toJson();
expect(j, {'field': 'name', 'direction': -1}); expect(j, {'field': 'name', 'direction': -1});
}); });
test('PaginationParams', () { test('PaginationParams', () {
final option = PaginationParams(); const option = PaginationParams();
final j = option.toJson(); final j = option.toJson();
expect(j, {'limit': 10, 'offset': 0}); expect(j, {'limit': 10, 'offset': 0});
}); });
@@ -3284,7 +3284,7 @@ void main() {
}); });
test('QueryReactionsResponse', () { test('QueryReactionsResponse', () {
const jsonExample = r''' const jsonExample = '''
{"reactions": [{"message_id": "4637f7e4-a06b-42db-ba5a-8d8270dd926f","user_id": "c1c9b454-2bcc-402d-8bb0-2f3706ce1680","user": {"id": "c1c9b454-2bcc-402d-8bb0-2f3706ce1680","role": "user","created_at": "2020-01-28T22:17:30.83015Z","updated_at": "2020-01-28T22:17:31.19435Z","banned": false,"online": false,"image": "https://randomuser.me/api/portraits/women/2.jpg","name": "Mia Denys"},"type": "love","score": 1,"created_at": "2020-01-28T22:17:31.128376Z","updated_at": "2020-01-28T22:17:31.128376Z"}]} {"reactions": [{"message_id": "4637f7e4-a06b-42db-ba5a-8d8270dd926f","user_id": "c1c9b454-2bcc-402d-8bb0-2f3706ce1680","user": {"id": "c1c9b454-2bcc-402d-8bb0-2f3706ce1680","role": "user","created_at": "2020-01-28T22:17:30.83015Z","updated_at": "2020-01-28T22:17:31.19435Z","banned": false,"online": false,"image": "https://randomuser.me/api/portraits/women/2.jpg","name": "Mia Denys"},"type": "love","score": 1,"created_at": "2020-01-28T22:17:31.128376Z","updated_at": "2020-01-28T22:17:31.128376Z"}]}
'''; ''';
final response = final response =
@@ -3402,31 +3402,31 @@ void main() {
test('ListDevicesResponse', () { test('ListDevicesResponse', () {
const jsonExample = const jsonExample =
r'''{"devices":[{"push_provider":"firebase","id":"test"}],"duration":"0.35ms"}'''; '''{"devices":[{"push_provider":"firebase","id":"test"}],"duration":"0.35ms"}''';
final response = ListDevicesResponse.fromJson(json.decode(jsonExample)); final response = ListDevicesResponse.fromJson(json.decode(jsonExample));
expect(response.devices, isA<List<Device>>()); expect(response.devices, isA<List<Device>>());
}); });
test('SendFileResponse', () { test('SendFileResponse', () {
const jsonExample = r'''{"file": "file-url","duration":"0.35ms"}'''; const jsonExample = '''{"file": "file-url","duration":"0.35ms"}''';
final response = SendFileResponse.fromJson(json.decode(jsonExample)); final response = SendFileResponse.fromJson(json.decode(jsonExample));
expect(response.file, isA<String>()); expect(response.file, isA<String>());
}); });
test('SendImageResponse', () { test('SendImageResponse', () {
const jsonExample = r'''{"file": "file-url","duration":"0.35ms"}'''; const jsonExample = '''{"file": "file-url","duration":"0.35ms"}''';
final response = SendImageResponse.fromJson(json.decode(jsonExample)); final response = SendImageResponse.fromJson(json.decode(jsonExample));
expect(response.file, isA<String>()); expect(response.file, isA<String>());
}); });
test('SendImageResponse', () { test('SendImageResponse', () {
const jsonExample = r'''{"file": "file-url","duration":"0.35ms"}'''; const jsonExample = '''{"file": "file-url","duration":"0.35ms"}''';
final response = SendImageResponse.fromJson(json.decode(jsonExample)); final response = SendImageResponse.fromJson(json.decode(jsonExample));
expect(response.file, isA<String>()); expect(response.file, isA<String>());
}); });
test('EmptyResponse', () { test('EmptyResponse', () {
const jsonExample = r'''{"file": "file-url","duration":"0.35ms"}'''; const jsonExample = '''{"file": "file-url","duration":"0.35ms"}''';
final response = EmptyResponse.fromJson(json.decode(jsonExample)); final response = EmptyResponse.fromJson(json.decode(jsonExample));
expect(response.duration, isA<String>()); expect(response.duration, isA<String>());
}); });
@@ -3481,8 +3481,7 @@ void main() {
}); });
test('UpdateUsersResponse', () { test('UpdateUsersResponse', () {
const jsonExample = const jsonExample = '''{"users": {"bbb19d9a-ee50-45bc-84e5-0584e79d0c9e":{
r'''{"users": {"bbb19d9a-ee50-45bc-84e5-0584e79d0c9e":{
"id": "bbb19d9a-ee50-45bc-84e5-0584e79d0c9e", "id": "bbb19d9a-ee50-45bc-84e5-0584e79d0c9e",
"role": "user", "role": "user",
"created_at": "2020-01-28T22:17:30.826259Z", "created_at": "2020-01-28T22:17:30.826259Z",
@@ -3498,7 +3497,7 @@ void main() {
test('ConnectGuestUserResponse', () { test('ConnectGuestUserResponse', () {
const jsonExample = const jsonExample =
r'{"user":{"id":"guest-ac612aee-25fe-49fb-b1af-969e41f452a0-wild-breeze-7","role":"guest","created_at":"2020-02-03T10:19:01.538434Z","updated_at":"2020-02-03T10:19:01.539543Z","banned":false,"online":false},"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiZ3Vlc3QtYWM2MTJhZWUtMjVmZS00OWZiLWIxYWYtOTY5ZTQxZjQ1MmEwLXdpbGQtYnJlZXplLTcifQ.mmoFGu7oJjpFsp7nFN78UbIpO7gowbuIbyoppsuvbXA","duration":"4.66ms"}'; '''{"user":{"id":"guest-ac612aee-25fe-49fb-b1af-969e41f452a0-wild-breeze-7","role":"guest","created_at":"2020-02-03T10:19:01.538434Z","updated_at":"2020-02-03T10:19:01.539543Z","banned":false,"online":false},"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiZ3Vlc3QtYWM2MTJhZWUtMjVmZS00OWZiLWIxYWYtOTY5ZTQxZjQ1MmEwLXdpbGQtYnJlZXplLTcifQ.mmoFGu7oJjpFsp7nFN78UbIpO7gowbuIbyoppsuvbXA","duration":"4.66ms"}''';
final response = final response =
ConnectGuestUserResponse.fromJson(json.decode(jsonExample)); ConnectGuestUserResponse.fromJson(json.decode(jsonExample));
expect(response.user, isA<User>()); expect(response.user, isA<User>());
@@ -4,6 +4,8 @@ import 'package:stream_chat/src/api/web_socket_channel_stub.dart';
void main() { void main() {
test('src/api/web_socket_stub_test', () { test('src/api/web_socket_stub_test', () {
expect( expect(
() => connectWebSocket('fakeurl'), throwsA(isA<UnimplementedError>())); () => connectWebSocket('fakeurl'),
throwsA(isA<UnimplementedError>()),
);
}); });
} }
@@ -2,7 +2,7 @@ import 'dart:async';
import 'package:test/test.dart'; import 'package:test/test.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:mockito/mockito.dart'; import 'package:mocktail/mocktail.dart';
import 'package:stream_chat/src/api/connection_status.dart'; import 'package:stream_chat/src/api/connection_status.dart';
import 'package:stream_chat/src/api/websocket.dart'; import 'package:stream_chat/src/api/websocket.dart';
import 'package:stream_chat/src/models/event.dart'; import 'package:stream_chat/src/models/event.dart';
@@ -19,7 +19,7 @@ class Functions {
}) => }) =>
null; null;
void handleFunc(Event event) => null; void handleFunc(Event event) {}
} }
class MockFunctions extends Mock implements Functions {} class MockFunctions extends Mock implements Functions {}
@@ -28,45 +28,44 @@ class MockWSChannel extends Mock implements WebSocketChannel {}
class MockWSSink extends Mock implements WebSocketSink {} class MockWSSink extends Mock implements WebSocketSink {}
class FakeEvent extends Fake implements Event {}
void main() { void main() {
group('src/api/websocket', () { group('src/api/websocket', () {
setUpAll(() {
registerFallbackValue<Event>(FakeEvent());
});
test('should connect with correct parameters', () async { test('should connect with correct parameters', () async {
final ConnectWebSocket connectFunc = MockFunctions().connectFunc; final ConnectWebSocket connectFunc = MockFunctions().connectFunc;
final ws = WebSocket( final ws = WebSocket(
baseUrl: 'baseurl', baseUrl: 'baseurl',
user: User(id: 'testid'), user: User(id: 'testid'),
logger: Logger('ws'), logger: Logger('ws'),
connectParams: {'test': 'true'}, connectParams: {'test': 'true'},
connectPayload: {'payload': 'test'}, connectPayload: {'payload': 'test'},
handler: (e) { handler: print,
print(e);
},
connectFunc: connectFunc, connectFunc: connectFunc,
); );
final mockWSChannel = MockWSChannel(); final mockWSChannel = MockWSChannel();
final streamController = StreamController<String>.broadcast();
final StreamController<String> streamController = const computedUrl =
StreamController<String>.broadcast();
final computedUrl =
'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D'; 'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D';
when(connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel); when(() => connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel);
when(mockWSChannel.sink).thenAnswer((_) => MockWSSink()); when(() => mockWSChannel.sink).thenAnswer((_) => MockWSSink());
when(mockWSChannel.stream).thenAnswer((_) { when(() => mockWSChannel.stream).thenAnswer(
return streamController.stream; (_) => streamController.stream,
}); );
final timer = Timer.periodic( final timer = Timer.periodic(
Duration(milliseconds: 100), const Duration(milliseconds: 100),
(_) => streamController.sink.add('{}'), (_) => streamController.sink.add('{}'),
); );
await ws.connect(); await ws.connect();
verify(connectFunc(computedUrl)).called(1); verify(() => connectFunc(computedUrl)).called(1);
expect(ws.connectionStatus, ConnectionStatus.connected); expect(ws.connectionStatus, ConnectionStatus.connected);
await streamController.close(); await streamController.close();
@@ -77,7 +76,6 @@ void main() {
test('should connect with correct parameters and handle events', () async { test('should connect with correct parameters and handle events', () async {
final handleFunc = MockFunctions().handleFunc; final handleFunc = MockFunctions().handleFunc;
final ConnectWebSocket connectFunc = MockFunctions().connectFunc; final ConnectWebSocket connectFunc = MockFunctions().connectFunc;
final ws = WebSocket( final ws = WebSocket(
baseUrl: 'baseurl', baseUrl: 'baseurl',
user: User(id: 'testid'), user: User(id: 'testid'),
@@ -87,27 +85,21 @@ void main() {
handler: handleFunc, handler: handleFunc,
connectFunc: connectFunc, connectFunc: connectFunc,
); );
final mockWSChannel = MockWSChannel(); final mockWSChannel = MockWSChannel();
final streamController = StreamController<String>.broadcast();
final StreamController<String> streamController = const computedUrl =
StreamController<String>.broadcast();
final computedUrl =
'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D'; 'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D';
when(connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel); when(() => connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel);
when(mockWSChannel.sink).thenAnswer((_) => MockWSSink()); when(() => mockWSChannel.sink).thenAnswer((_) => MockWSSink());
when(mockWSChannel.stream).thenAnswer((_) { when(() => mockWSChannel.stream).thenAnswer((_) => streamController.stream);
return streamController.stream;
});
final connect = ws.connect().then((_) { final connect = ws.connect().then((_) {
streamController.sink.add('{}'); streamController.sink.add('{}');
return Future.delayed(Duration(milliseconds: 200)); return Future.delayed(const Duration(milliseconds: 200));
}).then((value) { }).then((value) {
verify(connectFunc(computedUrl)).called(1); verify(() => connectFunc(computedUrl)).called(1);
verify(handleFunc(any)).called(greaterThan(0)); verify(() => handleFunc(any())).called(greaterThan(0));
return streamController.close(); return streamController.close();
}); });
@@ -119,9 +111,7 @@ void main() {
test('should close correctly the controller', () async { test('should close correctly the controller', () async {
final handleFunc = MockFunctions().handleFunc; final handleFunc = MockFunctions().handleFunc;
final ConnectWebSocket connectFunc = MockFunctions().connectFunc; final ConnectWebSocket connectFunc = MockFunctions().connectFunc;
final ws = WebSocket( final ws = WebSocket(
baseUrl: 'baseurl', baseUrl: 'baseurl',
user: User(id: 'testid'), user: User(id: 'testid'),
@@ -131,27 +121,21 @@ void main() {
handler: handleFunc, handler: handleFunc,
connectFunc: connectFunc, connectFunc: connectFunc,
); );
final mockWSChannel = MockWSChannel(); final mockWSChannel = MockWSChannel();
final streamController = StreamController<String>.broadcast();
final StreamController<String> streamController = const computedUrl =
StreamController<String>.broadcast();
final computedUrl =
'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D'; 'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D';
when(connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel); when(() => connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel);
when(mockWSChannel.sink).thenAnswer((_) => MockWSSink()); when(() => mockWSChannel.sink).thenAnswer((_) => MockWSSink());
when(mockWSChannel.stream).thenAnswer((_) { when(() => mockWSChannel.stream).thenAnswer((_) => streamController.stream);
return streamController.stream;
});
final connect = ws.connect().then((_) { final connect = ws.connect().then((_) {
streamController.sink.add('{}'); streamController.sink.add('{}');
return Future.delayed(Duration(milliseconds: 200)); return Future.delayed(const Duration(milliseconds: 200));
}).then((value) { }).then((value) {
verify(connectFunc(computedUrl)).called(1); verify(() => connectFunc(computedUrl)).called(1);
verify(handleFunc(any)).called(greaterThan(0)); verify(() => handleFunc(any())).called(greaterThan(0));
return streamController.close(); return streamController.close();
}); });
@@ -163,9 +147,7 @@ void main() {
test('should run correctly health check', () async { test('should run correctly health check', () async {
final handleFunc = MockFunctions().handleFunc; final handleFunc = MockFunctions().handleFunc;
final ConnectWebSocket connectFunc = MockFunctions().connectFunc; final ConnectWebSocket connectFunc = MockFunctions().connectFunc;
final ws = WebSocket( final ws = WebSocket(
baseUrl: 'baseurl', baseUrl: 'baseurl',
user: User(id: 'testid'), user: User(id: 'testid'),
@@ -175,32 +157,27 @@ void main() {
handler: handleFunc, handler: handleFunc,
connectFunc: connectFunc, connectFunc: connectFunc,
); );
final mockWSChannel = MockWSChannel(); final mockWSChannel = MockWSChannel();
final mockWSSink = MockWSSink(); final mockWSSink = MockWSSink();
final streamController = StreamController<String>.broadcast();
final StreamController<String> streamController = const computedUrl =
StreamController<String>.broadcast();
final computedUrl =
'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D'; 'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D';
when(connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel); when(() => connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel);
when(mockWSChannel.stream).thenAnswer((_) { when(() => mockWSChannel.stream).thenAnswer((_) => streamController.stream);
return streamController.stream; when(() => mockWSChannel.sink).thenReturn(mockWSSink);
});
when(mockWSChannel.sink).thenReturn(mockWSSink);
final timer = Timer.periodic( final timer = Timer.periodic(
Duration(milliseconds: 1000), const Duration(milliseconds: 1000),
(_) => streamController.sink.add('{}'), (_) => streamController.sink.add('{}'),
); );
final connect = ws.connect().then((_) { final connect = ws.connect().then((_) {
streamController.sink.add('{}'); streamController.sink.add('{}');
return Future.delayed(Duration(milliseconds: 200)); return Future.delayed(const Duration(milliseconds: 200));
}).then((value) async { }).then((value) async {
verify(mockWSSink.add("{'type': 'health.check'}")).called(greaterThan(0)); verify(() => mockWSSink.add("{'type': 'health.check'}"))
.called(greaterThan(0));
timer.cancel(); timer.cancel();
await streamController.close(); await streamController.close();
@@ -214,9 +191,7 @@ void main() {
test('should run correctly reconnection check', () async { test('should run correctly reconnection check', () async {
final handleFunc = MockFunctions().handleFunc; final handleFunc = MockFunctions().handleFunc;
final ConnectWebSocket connectFunc = MockFunctions().connectFunc; final ConnectWebSocket connectFunc = MockFunctions().connectFunc;
Logger.root.level = Level.ALL; Logger.root.level = Level.ALL;
final ws = WebSocket( final ws = WebSocket(
baseUrl: 'baseurl', baseUrl: 'baseurl',
@@ -227,34 +202,28 @@ void main() {
handler: handleFunc, handler: handleFunc,
connectFunc: connectFunc, connectFunc: connectFunc,
reconnectionMonitorTimeout: 1, reconnectionMonitorTimeout: 1,
reconnectionMonitorInterval: 1,
); );
final mockWSChannel = MockWSChannel(); final mockWSChannel = MockWSChannel();
final mockWSSink = MockWSSink(); final mockWSSink = MockWSSink();
var streamController = StreamController<String>.broadcast();
StreamController<String> streamController = const computedUrl =
StreamController<String>.broadcast();
final computedUrl =
'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D'; 'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D';
when(connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel); when(() => connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel);
when(mockWSChannel.stream).thenAnswer((_) { when(() => mockWSChannel.stream).thenAnswer((_) => streamController.stream);
return streamController.stream; when(() => mockWSChannel.sink).thenReturn(mockWSSink);
});
when(mockWSChannel.sink).thenReturn(mockWSSink);
final connect = ws.connect().then((_) { final connect = ws.connect().then((_) {
streamController.sink.add('{}'); streamController.sink.add('{}');
streamController.close(); streamController.close();
streamController = StreamController<String>.broadcast(); streamController = StreamController<String>.broadcast();
streamController.sink.add('{}'); streamController.sink.add('{}');
return Future.delayed(Duration(milliseconds: 200)); return Future.delayed(const Duration(milliseconds: 200));
}).then((value) async { }).then((value) async {
verify(mockWSSink.add("{'type': 'health.check'}")).called(greaterThan(0)); verify(() => mockWSSink.add("{'type': 'health.check'}"))
.called(greaterThan(0));
verify(connectFunc(computedUrl)).called(2); verify(() => connectFunc(computedUrl)).called(2);
await streamController.close(); await streamController.close();
return mockWSSink.close(); return mockWSSink.close();
@@ -267,9 +236,7 @@ void main() {
test('should close correctly the controller', () async { test('should close correctly the controller', () async {
final handleFunc = MockFunctions().handleFunc; final handleFunc = MockFunctions().handleFunc;
final ConnectWebSocket connectFunc = MockFunctions().connectFunc; final ConnectWebSocket connectFunc = MockFunctions().connectFunc;
final ws = WebSocket( final ws = WebSocket(
baseUrl: 'baseurl', baseUrl: 'baseurl',
user: User(id: 'testid'), user: User(id: 'testid'),
@@ -279,28 +246,22 @@ void main() {
handler: handleFunc, handler: handleFunc,
connectFunc: connectFunc, connectFunc: connectFunc,
); );
final mockWSChannel = MockWSChannel(); final mockWSChannel = MockWSChannel();
final mockWSSink = MockWSSink(); final mockWSSink = MockWSSink();
final streamController = StreamController<String>.broadcast();
final StreamController<String> streamController = const computedUrl =
StreamController<String>.broadcast();
final computedUrl =
'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D'; 'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D';
when(connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel); when(() => connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel);
when(mockWSChannel.stream).thenAnswer((_) { when(() => mockWSChannel.stream).thenAnswer((_) => streamController.stream);
return streamController.stream; when(() => mockWSChannel.sink).thenReturn(mockWSSink);
});
when(mockWSChannel.sink).thenReturn(mockWSSink);
final connect = ws.connect().then((_) { final connect = ws.connect().then((_) {
streamController.sink.add('{}'); streamController.sink.add('{}');
return Future.delayed(Duration(milliseconds: 200)); return Future.delayed(const Duration(milliseconds: 200));
}).then((value) async { }).then((value) async {
await ws.disconnect(); await ws.disconnect();
verify(mockWSSink.close()).called(greaterThan(0)); verify(mockWSSink.close).called(greaterThan(0));
await streamController.close(); await streamController.close();
await mockWSSink.close(); await mockWSSink.close();
@@ -313,41 +274,34 @@ void main() {
test('should throw an error', () async { test('should throw an error', () async {
final ConnectWebSocket connectFunc = MockFunctions().connectFunc; final ConnectWebSocket connectFunc = MockFunctions().connectFunc;
final ws = WebSocket( final ws = WebSocket(
baseUrl: 'baseurl', baseUrl: 'baseurl',
user: User(id: 'testid'), user: User(id: 'testid'),
logger: Logger('ws'), logger: Logger('ws'),
connectParams: {'test': 'true'}, connectParams: {'test': 'true'},
connectPayload: {'payload': 'test'}, connectPayload: {'payload': 'test'},
handler: (e) { handler: print,
print(e);
},
connectFunc: connectFunc, connectFunc: connectFunc,
); );
final mockWSChannel = MockWSChannel(); final mockWSChannel = MockWSChannel();
final streamController = StreamController<String>.broadcast(); final streamController = StreamController<String>.broadcast();
const computedUrl =
final computedUrl =
'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D'; 'wss://baseurl/connect?test=true&json=%7B%22payload%22%3A%22test%22%2C%22user_details%22%3A%7B%22id%22%3A%22testid%22%7D%7D';
when(connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel); when(() => connectFunc(computedUrl)).thenAnswer((_) => mockWSChannel);
when(mockWSChannel.sink).thenAnswer((_) => MockWSSink()); when(() => mockWSChannel.sink).thenAnswer((_) => MockWSSink());
when(mockWSChannel.stream).thenAnswer((_) { when(() => mockWSChannel.stream).thenAnswer((_) => streamController.stream);
return streamController.stream;
});
Future.delayed( Future.delayed(
Duration(milliseconds: 1000), const Duration(milliseconds: 1000),
() => streamController.sink.addError('test error'), () => streamController.sink.addError('test error'),
); );
try { try {
expect(await ws.connect(), throwsA(isA<String>())); expect(await ws.connect(), throwsA(isA<String>()));
} catch (e) { } catch (e) {
verify(connectFunc(computedUrl)).called(greaterThanOrEqualTo(1)); verify(() => connectFunc(computedUrl)).called(greaterThanOrEqualTo(1));
streamController.close();
} }
}); });
} }
File diff suppressed because it is too large Load Diff
@@ -5,7 +5,7 @@ import 'package:stream_chat/src/models/action.dart';
void main() { void main() {
group('src/models/action', () { group('src/models/action', () {
const jsonExample = r'''{ const jsonExample = '''{
"name": "name", "name": "name",
"style": "style", "style": "style",
"text": "text", "text": "text",
@@ -1,12 +1,12 @@
import 'dart:convert';
import 'package:stream_chat/src/models/attachment.dart'; import 'package:stream_chat/src/models/attachment.dart';
import 'package:stream_chat/src/models/action.dart'; import 'package:stream_chat/src/models/action.dart';
import 'dart:convert';
import 'package:test/test.dart'; import 'package:test/test.dart';
void main() { void main() {
group('src/models/attachment', () { group('src/models/attachment', () {
const jsonExample = r'''{ const jsonExample = '''{
"type": "giphy", "type": "giphy",
"title": "awesome", "title": "awesome",
"title_link": "https://giphy.com/gifs/nrkp3-dance-happy-3o7TKnCdBx5cMg0qti", "title_link": "https://giphy.com/gifs/nrkp3-dance-happy-3o7TKnCdBx5cMg0qti",
@@ -38,22 +38,27 @@ void main() {
test('should parse json correctly', () { test('should parse json correctly', () {
final attachment = Attachment.fromJson(json.decode(jsonExample)); final attachment = Attachment.fromJson(json.decode(jsonExample));
expect(attachment.type, "giphy"); expect(attachment.type, 'giphy');
expect(attachment.title, "awesome"); expect(attachment.title, 'awesome');
expect(attachment.titleLink, expect(
"https://giphy.com/gifs/nrkp3-dance-happy-3o7TKnCdBx5cMg0qti"); attachment.titleLink,
expect(attachment.thumbUrl, 'https://giphy.com/gifs/nrkp3-dance-happy-3o7TKnCdBx5cMg0qti',
"https://media0.giphy.com/media/3o7TKnCdBx5cMg0qti/giphy.gif"); );
expect(
attachment.thumbUrl,
'https://media0.giphy.com/media/3o7TKnCdBx5cMg0qti/giphy.gif',
);
expect(attachment.actions, hasLength(3)); expect(attachment.actions, hasLength(3));
expect(attachment.actions[0], isA<Action>()); expect(attachment.actions[0], isA<Action>());
}); });
test('should serialize to json correctly', () { test('should serialize to json correctly', () {
final channel = Attachment( final channel = Attachment(
type: "image", type: 'image',
title: "soo", title: 'soo',
titleLink: titleLink:
"https://giphy.com/gifs/nrkp3-dance-happy-3o7TKnCdBx5cMg0qti"); 'https://giphy.com/gifs/nrkp3-dance-happy-3o7TKnCdBx5cMg0qti',
);
expect( expect(
channel.toJson(), channel.toJson(),
@@ -10,7 +10,7 @@ import 'package:stream_chat/stream_chat.dart';
void main() { void main() {
group('src/models/channel_state', () { group('src/models/channel_state', () {
const jsonExample = r'''{ const jsonExample = '''{
"channel": { "channel": {
"id": "dev", "id": "dev",
"type": "team", "type": "team",
@@ -853,28 +853,32 @@ void main() {
expect(channelState.channel.config.commands, hasLength(1)); expect(channelState.channel.config.commands, hasLength(1));
expect(channelState.channel.config.commands[0], isA<Command>()); expect(channelState.channel.config.commands[0], isA<Command>());
expect(channelState.channel.lastMessageAt, expect(channelState.channel.lastMessageAt,
DateTime.parse("2020-01-30T13:43:41.062362Z")); DateTime.parse('2020-01-30T13:43:41.062362Z'));
expect(channelState.channel.createdAt, expect(channelState.channel.createdAt,
DateTime.parse("2019-04-03T18:43:33.213373Z")); DateTime.parse('2019-04-03T18:43:33.213373Z'));
expect(channelState.channel.updatedAt, expect(channelState.channel.updatedAt,
DateTime.parse("2019-04-03T18:43:33.213374Z")); DateTime.parse('2019-04-03T18:43:33.213374Z'));
expect(channelState.channel.createdBy, isA<User>()); expect(channelState.channel.createdBy, isA<User>());
expect(channelState.channel.frozen, true); expect(channelState.channel.frozen, true);
expect(channelState.channel.extraData['example'], 1); expect(channelState.channel.extraData['example'], 1);
expect(channelState.channel.extraData['name'], "#dev"); expect(channelState.channel.extraData['name'], '#dev');
expect(channelState.channel.extraData['image'], expect(
"https://cdn.chrisshort.net/testing-certificate-chains-in-go/GOPHER_MIC_DROP.png"); channelState.channel.extraData['image'],
'https://cdn.chrisshort.net/testing-certificate-chains-in-go/GOPHER_MIC_DROP.png',
);
expect(channelState.messages, hasLength(25)); expect(channelState.messages, hasLength(25));
expect(channelState.messages[0], isA<Message>()); expect(channelState.messages[0], isA<Message>());
expect(channelState.messages[0], isNotNull); expect(channelState.messages[0], isNotNull);
expect(channelState.messages[0].createdAt, expect(
DateTime.parse("2020-01-29T03:23:02.843948Z")); channelState.messages[0].createdAt,
DateTime.parse('2,020-01-29T03:23:02.843948Z'),
);
expect(channelState.messages[0].user, isA<User>()); expect(channelState.messages[0].user, isA<User>());
expect(channelState.watcherCount, 5); expect(channelState.watcherCount, 5);
}); });
test('should serialize to json correctly', () { test('should serialize to json correctly', () {
const toJsonExample = r''' const toJsonExample = '''
{ {
"channel": { "channel": {
"id": "dev", "id": "dev",
@@ -17,19 +17,19 @@ void main() {
test('should parse json correctly', () { test('should parse json correctly', () {
final channel = ChannelModel.fromJson(json.decode(jsonExample)); final channel = ChannelModel.fromJson(json.decode(jsonExample));
expect(channel.id, equals("test")); expect(channel.id, equals('test'));
expect(channel.type, equals("livestream")); expect(channel.type, equals('livestream'));
expect(channel.cid, equals("test:livestream")); expect(channel.cid, equals('test:livestream'));
expect(channel.extraData["cats"], equals(true)); expect(channel.extraData['cats'], equals(true));
expect(channel.extraData["fruit"], equals(["bananas", "apples"])); expect(channel.extraData['fruit'], equals(['bananas', 'apples']));
}); });
test('should serialize to json correctly', () { test('should serialize to json correctly', () {
final channel = ChannelModel( final channel = ChannelModel(
type: "type", type: 'type',
id: "id", id: 'id',
cid: "a:a", cid: 'a:a',
extraData: {"name": "cool"}, extraData: {'name': 'cool'},
); );
expect( expect(
@@ -40,10 +40,10 @@ void main() {
test('should serialize to json correctly when frozen is provided', () { test('should serialize to json correctly when frozen is provided', () {
final channel = ChannelModel( final channel = ChannelModel(
type: "type", type: 'type',
id: "id", id: 'id',
cid: "a:a", cid: 'a:a',
extraData: {"name": "cool"}, extraData: {'name': 'cool'},
frozen: false, frozen: false,
); );
@@ -1,6 +1,6 @@
import 'package:stream_chat/src/models/command.dart';
import 'dart:convert'; import 'dart:convert';
import 'package:stream_chat/src/models/command.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
void main() { void main() {
@@ -30,9 +30,9 @@ void main() {
expect( expect(
command.toJson(), command.toJson(),
{ {
"name": "giphy", 'name': 'giphy',
"description": "Post a random gif to the channel", 'description': 'Post a random gif to the channel',
"args": "[text]", 'args': '[text]',
}, },
); );
}); });
@@ -5,7 +5,7 @@ import 'package:stream_chat/src/models/device.dart';
void main() { void main() {
group('src/models/device', () { group('src/models/device', () {
const jsonExample = r'''{ const jsonExample = '''{
"id": "device-id", "id": "device-id",
"push_provider": "push-provider" "push_provider": "push-provider"
}'''; }''';
@@ -55,7 +55,7 @@ void main() {
type: 'type', type: 'type',
cid: 'cid', cid: 'cid',
connectionId: 'connectionId', connectionId: 'connectionId',
createdAt: DateTime.parse("2020-01-29T03:22:47.63613Z"), createdAt: DateTime.parse('2020-01-29T03:22:47.63613Z'),
me: OwnUser(id: 'id2'), me: OwnUser(id: 'id2'),
totalUnreadCount: 1, totalUnreadCount: 1,
unreadChannels: 1, unreadChannels: 1,
@@ -28,8 +28,8 @@ void main() {
final member = Member.fromJson(json.decode(jsonExample)); final member = Member.fromJson(json.decode(jsonExample));
expect(member.user, isA<User>()); expect(member.user, isA<User>());
expect(member.role, 'member'); expect(member.role, 'member');
expect(member.createdAt, DateTime.parse("2020-01-28T22:17:30.95443Z")); expect(member.createdAt, DateTime.parse('2020-01-28T22:17:30.95443Z'));
expect(member.updatedAt, DateTime.parse("2020-01-28T22:17:30.95443Z")); expect(member.updatedAt, DateTime.parse('2020-01-28T22:17:30.95443Z'));
}); });
}); });
} }
@@ -76,10 +76,10 @@ void main() {
test('should parse json correctly', () { test('should parse json correctly', () {
final message = Message.fromJson(json.decode(jsonExample)); final message = Message.fromJson(json.decode(jsonExample));
expect(message.id, "4637f7e4-a06b-42db-ba5a-8d8270dd926f"); expect(message.id, '4637f7e4-a06b-42db-ba5a-8d8270dd926f');
expect(message.text, expect(message.text,
"https://giphy.com/gifs/the-lion-king-live-action-5zvN79uTGfLMOVfQaA"); 'https://giphy.com/gifs/the-lion-king-live-action-5zvN79uTGfLMOVfQaA');
expect(message.type, "regular"); expect(message.type, 'regular');
expect(message.user, isA<User>()); expect(message.user, isA<User>());
expect(message.silent, isA<bool>()); expect(message.silent, isA<bool>());
expect(message.attachments, isA<List<Attachment>>()); expect(message.attachments, isA<List<Attachment>>());
@@ -87,8 +87,8 @@ void main() {
expect(message.ownReactions, isA<List<Reaction>>()); expect(message.ownReactions, isA<List<Reaction>>());
expect(message.reactionCounts, {'love': 1}); expect(message.reactionCounts, {'love': 1});
expect(message.reactionScores, {'love': 1}); expect(message.reactionScores, {'love': 1});
expect(message.createdAt, DateTime.parse("2020-01-28T22:17:31.107978Z")); expect(message.createdAt, DateTime.parse('2020-01-28T22:17:31.107978Z'));
expect(message.updatedAt, DateTime.parse("2020-01-28T22:17:31.130506Z")); expect(message.updatedAt, DateTime.parse('2020-01-28T22:17:31.130506Z'));
expect(message.mentionedUsers, isA<List<User>>()); expect(message.mentionedUsers, isA<List<User>>());
expect(message.pinned, false); expect(message.pinned, false);
expect(message.pinnedAt, null); expect(message.pinnedAt, null);
@@ -98,38 +98,37 @@ void main() {
test('should serialize to json correctly', () { test('should serialize to json correctly', () {
final message = Message( final message = Message(
id: "4637f7e4-a06b-42db-ba5a-8d8270dd926f", id: '4637f7e4-a06b-42db-ba5a-8d8270dd926f',
text: text:
"https://giphy.com/gifs/the-lion-king-live-action-5zvN79uTGfLMOVfQaA", 'https://giphy.com/gifs/the-lion-king-live-action-5zvN79uTGfLMOVfQaA',
silent: false, silent: false,
attachments: [ attachments: [
Attachment.fromJson({ Attachment.fromJson({
"type": "video", 'type': 'video',
"author_name": "GIPHY", 'author_name': 'GIPHY',
"title": "The Lion King Disney GIF - Find \u0026 Share on GIPHY", 'title': 'The Lion King Disney GIF - Find \u0026 Share on GIPHY',
"title_link": 'title_link':
"https://media.giphy.com/media/5zvN79uTGfLMOVfQaA/giphy.gif", 'https://media.giphy.com/media/5zvN79uTGfLMOVfQaA/giphy.gif',
"text": 'text':
"Discover \u0026 share this Lion King Live Action GIF with everyone you know. GIPHY is how you search, share, discover, and create GIFs.", '''Discover \u0026 share this Lion King Live Action GIF with everyone you know. GIPHY is how you search, share, discover, and create GIFs.''',
"image_url": 'image_url':
"https://media.giphy.com/media/5zvN79uTGfLMOVfQaA/giphy.gif", 'https://media.giphy.com/media/5zvN79uTGfLMOVfQaA/giphy.gif',
"thumb_url": 'thumb_url':
"https://media.giphy.com/media/5zvN79uTGfLMOVfQaA/giphy.gif", 'https://media.giphy.com/media/5zvN79uTGfLMOVfQaA/giphy.gif',
"asset_url": 'asset_url':
"https://media.giphy.com/media/5zvN79uTGfLMOVfQaA/giphy.mp4", 'https://media.giphy.com/media/5zvN79uTGfLMOVfQaA/giphy.mp4',
"og_scrape_url": 'og_scrape_url':
"https://giphy.com/gifs/the-lion-king-live-action-5zvN79uTGfLMOVfQaA" 'https://giphy.com/gifs/the-lion-king-live-action-5zvN79uTGfLMOVfQaA'
}) })
], ],
showInChannel: true, showInChannel: true,
parentId: 'parentId', parentId: 'parentId',
extraData: {'hey': 'test'}, extraData: {'hey': 'test'},
status: MessageSendingStatus.sent,
); );
expect( expect(
message.toJson(), message.toJson(),
json.decode(r''' json.decode('''
{ {
"id": "4637f7e4-a06b-42db-ba5a-8d8270dd926f", "id": "4637f7e4-a06b-42db-ba5a-8d8270dd926f",
"text": "https://giphy.com/gifs/the-lion-king-live-action-5zvN79uTGfLMOVfQaA", "text": "https://giphy.com/gifs/the-lion-king-live-action-5zvN79uTGfLMOVfQaA",
@@ -1,7 +1,7 @@
import 'package:test/test.dart';
import 'package:stream_chat/src/models/reaction.dart';
import 'dart:convert'; import 'dart:convert';
import 'package:test/test.dart';
import 'package:stream_chat/src/models/reaction.dart';
import 'package:stream_chat/src/models/user.dart'; import 'package:stream_chat/src/models/user.dart';
void main() { void main() {
@@ -30,13 +30,13 @@ void main() {
test('should parse json correctly', () { test('should parse json correctly', () {
final reaction = Reaction.fromJson(json.decode(jsonExample)); final reaction = Reaction.fromJson(json.decode(jsonExample));
expect(reaction.messageId, '76cd8c82-b557-4e48-9d12-87995d3a0e04'); expect(reaction.messageId, '76cd8c82-b557-4e48-9d12-87995d3a0e04');
expect(reaction.createdAt, DateTime.parse("2020-01-28T22:17:31.108742Z")); expect(reaction.createdAt, DateTime.parse('2020-01-28T22:17:31.108742Z'));
expect(reaction.type, 'wow'); expect(reaction.type, 'wow');
expect( expect(
reaction.user.toJson(), reaction.user.toJson(),
User.init("2de0297c-f3f2-489d-b930-ef77342edccf", extraData: { User.init('2de0297c-f3f2-489d-b930-ef77342edccf', extraData: {
"image": "https://randomuser.me/api/portraits/women/45.jpg", 'image': 'https://randomuser.me/api/portraits/women/45.jpg',
"name": "Daisy Morgan" 'name': 'Daisy Morgan'
}).toJson(), }).toJson(),
); );
expect(reaction.score, 1); expect(reaction.score, 1);
@@ -47,13 +47,13 @@ void main() {
test('should serialize to json correctly', () { test('should serialize to json correctly', () {
final reaction = Reaction( final reaction = Reaction(
messageId: '76cd8c82-b557-4e48-9d12-87995d3a0e04', messageId: '76cd8c82-b557-4e48-9d12-87995d3a0e04',
createdAt: DateTime.parse("2020-01-28T22:17:31.108742Z"), createdAt: DateTime.parse('2020-01-28T22:17:31.108742Z'),
type: 'wow', type: 'wow',
user: User.init("2de0297c-f3f2-489d-b930-ef77342edccf", extraData: { user: User.init('2de0297c-f3f2-489d-b930-ef77342edccf', extraData: {
"image": "https://randomuser.me/api/portraits/women/45.jpg", 'image': 'https://randomuser.me/api/portraits/women/45.jpg',
"name": "Daisy Morgan" 'name': 'Daisy Morgan'
}), }),
userId: "2de0297c-f3f2-489d-b930-ef77342edccf", userId: '2de0297c-f3f2-489d-b930-ef77342edccf',
extraData: {'bananas': 'yes'}, extraData: {'bananas': 'yes'},
score: 1, score: 1,
); );
@@ -61,10 +61,10 @@ void main() {
expect( expect(
reaction.toJson(), reaction.toJson(),
{ {
"message_id": "76cd8c82-b557-4e48-9d12-87995d3a0e04", 'message_id': '76cd8c82-b557-4e48-9d12-87995d3a0e04',
"type": "wow", 'type': 'wow',
"score": 1, 'score': 1,
"bananas": 'yes', 'bananas': 'yes',
}, },
); );
}); });
@@ -31,8 +31,8 @@ void main() {
); );
expect(read.toJson(), { expect(read.toJson(), {
"user": {"id": "bbb19d9a-ee50-45bc-84e5-0584e79d0c9e"}, 'user': {'id': 'bbb19d9a-ee50-45bc-84e5-0584e79d0c9e'},
"last_read": "2020-01-28T22:17:30.966485Z", 'last_read': '2020-01-28T22:17:30.966485Z',
'unread_messages': 10, 'unread_messages': 10,
}); });
}); });
@@ -17,11 +17,13 @@ void main() {
}); });
test('should serialize to json correctly', () { test('should serialize to json correctly', () {
final user = final user = User(
User(id: 'bbb19d9a-ee50-45bc-84e5-0584e79d0c9e', role: "abc"); id: 'bbb19d9a-ee50-45bc-84e5-0584e79d0c9e',
role: 'abc',
);
expect(user.toJson(), { expect(user.toJson(), {
'id': "bbb19d9a-ee50-45bc-84e5-0584e79d0c9e", 'id': 'bbb19d9a-ee50-45bc-84e5-0584e79d0c9e',
}); });
}); });
}); });