diff --git a/.travis.yml b/.travis.yml index e1599d287..8819014fe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,10 +11,11 @@ install: script: - (cd packages/dart && pub get) + - (cd packages/dart && dart run build_runner build --delete-conflicting-outputs) - (cd packages/dart && pub run test) - (cd packages/flutter && flutter pub get) - (cd packages/flutter && flutter test --no-pub test/) cache: directories: - - "$HOME/.pub-cache" \ No newline at end of file + - "$HOME/.pub-cache" diff --git a/packages/dart/pubspec.yaml b/packages/dart/pubspec.yaml index def9daefe..a9baf22d2 100644 --- a/packages/dart/pubspec.yaml +++ b/packages/dart/pubspec.yaml @@ -26,5 +26,6 @@ dependencies: dev_dependencies: # Testing + build_runner: ^2.0.1 mockito: ^5.0.4 test: ^1.16.8 diff --git a/packages/dart/test/parse_query_test.dart b/packages/dart/test/parse_query_test.dart index ca49b3995..ba343ef40 100644 --- a/packages/dart/test/parse_query_test.dart +++ b/packages/dart/test/parse_query_test.dart @@ -1,13 +1,15 @@ +import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; import 'package:parse_server_sdk/parse_server_sdk.dart'; import 'package:test/test.dart'; -class MockClient extends Mock implements ParseClient {} +import 'parse_query_test.mocks.dart'; +@GenerateMocks([ParseClient]) void main() { group('queryBuilder', () { test('whereRelatedTo', () async { - final MockClient client = MockClient(); + final MockParseClient client = MockParseClient(); await Parse().initialize( 'appId', @@ -27,11 +29,31 @@ void main() { QueryBuilder(ParseObject('_User', client: client)); queryBuilder.whereRelatedTo('likes', 'Post', '8TOXdXf3tz'); - when(client.data).thenReturn(ParseCoreData()); - await queryBuilder.query(); + when(client.get( + any, + options: anyNamed("options"), + onReceiveProgress: anyNamed("onReceiveProgress"), + )).thenAnswer((_) async => ParseNetworkResponse( + statusCode: 200, + data: + "{\"results\":[{\"objectId\":\"eT9muOxBTJ\",\"username\":\"test\",\"createdAt\":\"2021-04-23T13:46:06.092Z\",\"updatedAt\":\"2021-04-23T13:46:23.586Z\",\"ACL\":{\"*\":{\"read\":true},\"eT9muOxBTJ\":{\"read\":true,\"write\":true}}}]}")); - final Uri result = - Uri.parse(verify(client.get(captureAny!)).captured.single); + ParseResponse response = await queryBuilder.query(); + + expect(response.results?.first, isA()); + + ParseObject parseObject = response.results?.first; + + expect(parseObject.get(keyVarUsername), "test"); + expect(parseObject.objectId, "eT9muOxBTJ"); + expect(parseObject.createdAt, DateTime.parse("2021-04-23T13:46:06.092Z")); + expect(parseObject.updatedAt, DateTime.parse("2021-04-23T13:46:23.586Z")); + + final Uri result = Uri.parse(verify(client.get( + captureAny, + options: anyNamed("options"), + onReceiveProgress: anyNamed("onReceiveProgress"), + )).captured.single); expect(result.path, '/classes/_User'); diff --git a/packages/dart/test/parse_query_test.mocks.dart b/packages/dart/test/parse_query_test.mocks.dart new file mode 100644 index 000000000..e2d9b8392 --- /dev/null +++ b/packages/dart/test/parse_query_test.mocks.dart @@ -0,0 +1,92 @@ +// Mocks generated by Mockito 5.0.5 from annotations +// in parse_server_sdk/test/parse_query_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:parse_server_sdk/parse_server_sdk.dart' as _i2; + +// ignore_for_file: comment_references +// ignore_for_file: unnecessary_parenthesis + +class _FakeParseCoreData extends _i1.Fake implements _i2.ParseCoreData {} + +class _FakeParseNetworkResponse extends _i1.Fake + implements _i2.ParseNetworkResponse {} + +class _FakeParseNetworkByteResponse extends _i1.Fake + implements _i2.ParseNetworkByteResponse {} + +/// A class which mocks [ParseClient]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockParseClient extends _i1.Mock implements _i2.ParseClient { + MockParseClient() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.ParseCoreData get data => (super.noSuchMethod(Invocation.getter(#data), + returnValue: _FakeParseCoreData()) as _i2.ParseCoreData); + @override + _i3.Future<_i2.ParseNetworkResponse> get(String? path, + {_i2.ParseNetworkOptions? options, + _i2.ProgressCallback? onReceiveProgress}) => + (super.noSuchMethod( + Invocation.method(#get, [path], + {#options: options, #onReceiveProgress: onReceiveProgress}), + returnValue: Future<_i2.ParseNetworkResponse>.value( + _FakeParseNetworkResponse())) + as _i3.Future<_i2.ParseNetworkResponse>); + @override + _i3.Future<_i2.ParseNetworkResponse> put(String? path, + {String? data, _i2.ParseNetworkOptions? options}) => + (super.noSuchMethod( + Invocation.method(#put, [path], {#data: data, #options: options}), + returnValue: Future<_i2.ParseNetworkResponse>.value( + _FakeParseNetworkResponse())) + as _i3.Future<_i2.ParseNetworkResponse>); + @override + _i3.Future<_i2.ParseNetworkResponse> post(String? path, + {String? data, _i2.ParseNetworkOptions? options}) => + (super.noSuchMethod( + Invocation.method(#post, [path], {#data: data, #options: options}), + returnValue: Future<_i2.ParseNetworkResponse>.value( + _FakeParseNetworkResponse())) as _i3 + .Future<_i2.ParseNetworkResponse>); + @override + _i3.Future<_i2.ParseNetworkResponse> postBytes(String? path, + {_i3.Stream>? data, + _i2.ParseNetworkOptions? options, + _i2.ProgressCallback? onSendProgress}) => + (super.noSuchMethod( + Invocation.method(#postBytes, [ + path + ], { + #data: data, + #options: options, + #onSendProgress: onSendProgress + }), + returnValue: Future<_i2.ParseNetworkResponse>.value( + _FakeParseNetworkResponse())) + as _i3.Future<_i2.ParseNetworkResponse>); + @override + _i3.Future<_i2.ParseNetworkResponse> delete(String? path, + {_i2.ParseNetworkOptions? options}) => + (super.noSuchMethod( + Invocation.method(#delete, [path], {#options: options}), + returnValue: Future<_i2.ParseNetworkResponse>.value( + _FakeParseNetworkResponse())) + as _i3.Future<_i2.ParseNetworkResponse>); + @override + _i3.Future<_i2.ParseNetworkByteResponse> getBytes(String? path, + {_i2.ParseNetworkOptions? options, + _i2.ProgressCallback? onReceiveProgress}) => + (super.noSuchMethod( + Invocation.method(#getBytes, [path], + {#options: options, #onReceiveProgress: onReceiveProgress}), + returnValue: Future<_i2.ParseNetworkByteResponse>.value( + _FakeParseNetworkByteResponse())) + as _i3.Future<_i2.ParseNetworkByteResponse>); +} diff --git a/packages/flutter/test/parse_query_test.dart b/packages/flutter/test/parse_query_test.dart deleted file mode 100644 index 9285f04a7..000000000 --- a/packages/flutter/test/parse_query_test.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockito/mockito.dart'; -import 'package:parse_server_sdk_flutter/parse_server_sdk.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -class MockClient extends Mock implements ParseClient {} - -void main() { - SharedPreferences.setMockInitialValues(Map()); - - group('queryBuilder', () { - test('whereRelatedTo', () async { - final MockClient client = MockClient(); - - await Parse().initialize( - 'appId', - 'https://test.parse.com', - debug: true, - // to prevent automatic detection - fileDirectory: 'someDirectory', - // to prevent automatic detection - appName: 'appName', - // to prevent automatic detection - appPackageName: 'somePackageName', - // to prevent automatic detection - appVersion: 'someAppVersion', - ); - - final QueryBuilder queryBuilder = - QueryBuilder(ParseObject('_User', client: client)); - queryBuilder.whereRelatedTo('likes', 'Post', '8TOXdXf3tz'); - - when(client.data).thenReturn(ParseCoreData()); - await queryBuilder.query(); - - final Uri result = - Uri.parse(verify(client.get(captureAny!)).captured.single); - - expect(result.path, '/classes/_User'); - - final Uri expectedQuery = Uri( - query: - 'where={"\$relatedTo":{"object":{"__type":"Pointer","className":"Post","objectId":"8TOXdXf3tz"},"key":"likes"}}'); - expect(result.query, expectedQuery.query); - }); - }); -}