import 'package:gql_exec/gql_exec.dart'; import 'package:gql/language.dart'; import 'package:fl_query/fl_query.dart' show Fragment; import 'package:fl_query/src/utilities/helpers.dart'; import 'package:http/http.dart' as http; import 'package:http_parser/http_parser.dart'; const String rawOperationKey = 'rawOperationKey'; class TestCase { TestCase({ required this.data, required String operation, Map variables = const {}, this.normalizedEntities, }) : request = Request( operation: Operation(document: parseString(operation)), variables: variables, context: Context(), ); Request request; /// data to write to cache Map data; /// entities to inspect the store for, if any List>? normalizedEntities; } final basicTest = TestCase( operation: r'''{ a { __typename id # union list { __typename value ... on Item { id } } b { __typename id c { __typename id, cField } bField { field } }, d { id, dField {field} } aField { field } } }''', data: { 'a': { '__typename': 'A', 'id': 1, 'list': [ {'__typename': 'Num', 'value': 1}, {'__typename': 'Num', 'value': 2}, {'__typename': 'Num', 'value': 3}, {'__typename': 'Item', 'id': 4, 'value': 4} ], 'b': { '__typename': 'B', 'id': 5, 'c': { '__typename': 'C', 'id': 6, 'cField': 'value', }, 'bField': {'field': true} }, 'd': { 'id': 9, 'dField': {'field': true} }, 'aField': {'field': false} }, }, ); /// https://github.com/gql-dart/gql/blob/master/links/gql_http_link/test/multipart_upload_test.dart final fileVarsTest = TestCase( data: { "multipleUpload": [ { "id": "r1odc4PAz", "filename": "sample_upload.jpg", "mimetype": "image/jpeg", "path": "./uploads/r1odc4PAz-sample_upload.jpg" }, { "id": "5Ea18qlMur", "filename": "sample_upload.txt", "mimetype": "text/plain", "path": "./uploads/5Ea18qlMur-sample_upload.txt" } ], }, operation: r""" mutation($files: [Upload!]!) { multipleUpload(files: $files) { id filename mimetype path } } """, variables: { 'files': [ http.MultipartFile.fromBytes( "", [0, 1, 254, 255], filename: "sample_upload.jpg", contentType: MediaType("image", "jpeg"), ), http.MultipartFile.fromString( "", "just plain text", filename: "sample_upload.txt", contentType: MediaType("text", "plain"), ), ], }, ); final originalCValue = { '__typename': 'C', 'id': 6, 'cField': 'value', }; final originalCFragment = Fragment( document: parseString( r''' fragment partialC on C { __typename id cField } ''', ), ); final updatedCFragment = Fragment( document: parseString( r''' fragment partialC on C { __typename id new cField } ''', ), ); final updatedCValue = { '__typename': 'C', 'id': 6, 'new': 'field', 'cField': 'changed value', }; final Map? updatedCBasicTestData = deeplyMergeLeft([ basicTest.data, { 'a': { 'b': { 'c': { '__typename': 'C', 'id': 6, 'cField': 'changed value', }, }, }, }, ]); final basicTestSubsetAValue = TestCase( operation: r'''{ a { __typename id list { __typename value ... on Item { id } } d { id } } }''', data: { 'a': { '__typename': 'A', 'id': 1, 'list': [ {'__typename': 'Num', 'value': 5}, {'__typename': 'Num', 'value': 6}, {'__typename': 'Num', 'value': 7}, { '__typename': 'Item', 'id': 8, 'value': 8, } ], 'd': { 'id': 10, }, }, }, ); getUpdatedSubsetOperationData({withUpdatedC = false}) => { 'a': { '__typename': 'A', 'id': 1, 'list': basicTestSubsetAValue.data['a']['list'], 'b': { '__typename': 'B', 'id': 5, 'c': { '__typename': 'C', 'id': 6, 'cField': '${withUpdatedC ? "changed " : ""}value', }, 'bField': {'field': true} }, 'd': { 'id': 10, 'dField': {'field': true} }, 'aField': {'field': false} }, }; final cyclicalTest = TestCase(operation: r'''{ a { __typename id b { __typename id as { __typename id } } } }''', data: { 'a': { '__typename': 'A', 'id': 1, 'b': { '__typename': 'B', 'id': 5, 'as': [ { '__typename': 'A', 'id': 1, }, ] }, }, }, normalizedEntities: [ { '__typename': 'A', 'id': 1, 'b': {r"$ref": 'B:5'} }, { '__typename': 'B', 'id': 5, 'as': [ {r"$ref": 'A:1'} ], }, ]); Map get cyclicalObjOperationData { Map a; Map b; a = { '__typename': 'A', 'id': 1, }; b = { '__typename': 'B', 'id': 5, 'as': [a] }; a['b'] = b; return {'a': a}; } final typelessTest = TestCase( operation: r'''{ a { # union list { #__typename value #... on Item { id } } b { id c { id, cField } bField { field } }, d { id, dField {field} } aField { field } } }''', data: { 'a': { 'list': [ { //'__typename': 'Num', 'value': 1, }, { //'__typename': 'Num', 'value': 2, }, { //'__typename': 'Num', 'value': 3, }, { //'__typename': 'Item', //'id': 4, 'value': 4, } ], 'b': { 'id': 5, 'c': { 'id': 6, 'cField': 'value', }, 'bField': {'field': true} }, 'd': { 'id': 9, 'dField': {'field': true} }, 'aField': {'field': false} }, }, );