From 5479bf3ccba793e650ce6e3f1cc25483f1d128e8 Mon Sep 17 00:00:00 2001 From: Elijah Quartey Date: Thu, 22 Aug 2024 16:15:26 -0500 Subject: [PATCH 1/2] fix: websocket error handling --- .../graphql/web_socket/types/web_socket_types.dart | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/api/amplify_api_dart/lib/src/graphql/web_socket/types/web_socket_types.dart b/packages/api/amplify_api_dart/lib/src/graphql/web_socket/types/web_socket_types.dart index fbbd8a2b60..b2157be19e 100644 --- a/packages/api/amplify_api_dart/lib/src/graphql/web_socket/types/web_socket_types.dart +++ b/packages/api/amplify_api_dart/lib/src/graphql/web_socket/types/web_socket_types.dart @@ -144,8 +144,15 @@ class WebSocketError extends WebSocketMessagePayload implements Exception { final List> errors; static WebSocketError fromJson(Map json) { - final errors = json['errors'] as List?; - return WebSocketError(errors?.cast() ?? []); + final errors = json['errors']; + List>? errorsList = []; + if (errors is List?) { + errorsList = errors?.cast(); + } else if (errors is Map) { + errorsList = [errors]; + } + + return WebSocketError(errorsList ?? []); } @override From 3c3f63593bc252181f7538fce48e64f7dfb281cc Mon Sep 17 00:00:00 2001 From: Elijah Quartey Date: Fri, 23 Aug 2024 08:45:57 -0500 Subject: [PATCH 2/2] add unit test --- .../web_socket/web_socket_types_test.dart | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/packages/api/amplify_api_dart/test/web_socket/web_socket_types_test.dart b/packages/api/amplify_api_dart/test/web_socket/web_socket_types_test.dart index 90e7489e1c..14e26ea68f 100644 --- a/packages/api/amplify_api_dart/test/web_socket/web_socket_types_test.dart +++ b/packages/api/amplify_api_dart/test/web_socket/web_socket_types_test.dart @@ -113,6 +113,34 @@ void main() { errors, ); + /// GraphQLResponseDecoder should handle a payload with errors. + final response = GraphQLResponseDecoder.instance.decode( + request: GraphQLRequest( + document: '', + ), + response: message.payload!.toJson(), + ); + expect( + response.errors.first.message, + errorMessage, + ); + }); + test('WebsocketMessage should decode errors as a Map', () { + const errorMessage = 'Max number of 100 subscriptions reached'; + const errorType = 'MaxSubscriptionsReachedError'; + const errorMap = {'errorType': errorType, 'message': errorMessage}; + final entry = { + 'id': 'xyz-456', + 'type': 'error', + 'payload': {'data': null, 'errors': errorMap}, + }; + final message = WebSocketMessage.fromJson(entry); + expect(message.messageType, MessageType.error); + expect( + message.payload!.toJson()['errors'], + [errorMap], + ); + /// GraphQLResponseDecoder should handle a payload with errors. final response = GraphQLResponseDecoder.instance.decode( request: GraphQLRequest(