From de5a3bd1b739edb052a15954ed37e727282980d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sita=20B=C3=A9r=C3=A9t=C3=A9?= Date: Sat, 4 Sep 2021 21:41:30 -0400 Subject: [PATCH] fix: null-safety issues --- example/example.dart | 6 +- lib/src/mock_database_reference.dart | 92 +++++++++++++------------- pubspec.lock | 21 ++---- pubspec.yaml | 8 +-- test/exemples_test.dart | 6 +- test/mock_database_reference_test.dart | 14 ++-- 6 files changed, 69 insertions(+), 78 deletions(-) diff --git a/example/example.dart b/example/example.dart index 2f588af..68cc30f 100644 --- a/example/example.dart +++ b/example/example.dart @@ -6,14 +6,14 @@ class UserRepository { UserRepository(this.firebaseDatabase); FirebaseDatabase firebaseDatabase; - Future getUserName(String userId) async { + Future getUserName(String userId) async { final userNameReference = firebaseDatabase.reference().child('users').child(userId).child('name'); final dataSnapshot = await userNameReference.once(); return dataSnapshot.value; } - Future> getUser(String userId) async { + Future?> getUser(String userId) async { final userNode = firebaseDatabase.reference().child('users/$userId'); final dataSnapshot = await userNode.once(); return dataSnapshot.value; @@ -22,7 +22,7 @@ class UserRepository { void main() { FirebaseDatabase firebaseDatabase; - UserRepository userRepository; + late UserRepository userRepository; // Put fake data const userId = 'userId'; const userName = 'Elon musk'; diff --git a/lib/src/mock_database_reference.dart b/lib/src/mock_database_reference.dart index af1e354..5908470 100644 --- a/lib/src/mock_database_reference.dart +++ b/lib/src/mock_database_reference.dart @@ -1,5 +1,4 @@ import 'package:firebase_database/firebase_database.dart'; -import 'package:flutter/foundation.dart'; import 'package:mockito/mockito.dart'; import 'mock_data_snapshot.dart'; @@ -8,8 +7,8 @@ import 'mock_firebase_database.dart'; class MockDatabaseReference extends Mock implements DatabaseReference { var _nodePath = '/'; // ignore: prefer_final_fields - static var _persitedData = {}; - var _volatileData = {}; + static Map? _persitedData = {}; + Map? _volatileData = {}; MockDatabaseReference(); MockDatabaseReference._(nodePath, [this._volatileData]) { _nodePath += nodePath; @@ -20,7 +19,7 @@ class MockDatabaseReference extends Mock implements DatabaseReference { yield MockEvent._(data.value); } - Map get _data { + Map? get _data { if (MockFirebaseDatabase.persistData) { return _persitedData; } @@ -48,50 +47,49 @@ class MockDatabaseReference extends Mock implements DatabaseReference { } @override - // ignore: missing_return - Future set(dynamic value, {dynamic priority}) { + Future set(dynamic value, {dynamic priority}) async { if (_nodePath == '/') { _data = value; - return null; - } - var nodePathWithoutSlashesAtEndAndStart = - _nodePath.substring(1, _nodePath.length - 1); - var nodesList = nodePathWithoutSlashesAtEndAndStart.split('/'); - var tempData = {}; - Map lastNodeInCurrentData; - var nodeIndexReference = _Int(0); - if (_data[nodesList.first] == null) { - lastNodeInCurrentData = _data; - } else { - lastNodeInCurrentData = _getNextNodeData( - data: _data, nodesList: nodesList, nodeIndex: nodeIndexReference); - } - var nodeIndex = nodeIndexReference.value; - var noNewNodeToAdd = nodesList.length <= nodeIndex; - if (noNewNodeToAdd) { - lastNodeInCurrentData[nodesList.last] = value; - return null; - } - var firstNodeInNewData = nodesList[nodeIndex++]; - if (nodeIndex < nodesList.length) { - tempData = _buildNewNodesTree( - nodeIndex: nodeIndex, - nodesList: nodesList, - data: tempData, - value: value, - ); - lastNodeInCurrentData.addAll({firstNodeInNewData: tempData}); } else { - if (value is Map) value = value; - lastNodeInCurrentData.addAll({firstNodeInNewData: value}); + var nodePathWithoutSlashesAtEndAndStart = + _nodePath.substring(1, _nodePath.length - 1); + var nodesList = nodePathWithoutSlashesAtEndAndStart.split('/'); + Map? tempData = {}; + Map? lastNodeInCurrentData; + var nodeIndexReference = _Int(0); + if (_data![nodesList.first] == null) { + lastNodeInCurrentData = _data; + } else { + lastNodeInCurrentData = _getNextNodeData( + data: _data, nodesList: nodesList, nodeIndex: nodeIndexReference); + } + var nodeIndex = nodeIndexReference.value; + var noNewNodeToAdd = nodesList.length <= nodeIndex; + if (noNewNodeToAdd) { + lastNodeInCurrentData![nodesList.last] = value; + } else { + var firstNodeInNewData = nodesList[nodeIndex++]; + if (nodeIndex < nodesList.length) { + tempData = _buildNewNodesTree( + nodeIndex: nodeIndex, + nodesList: nodesList, + data: tempData, + value: value, + ); + lastNodeInCurrentData!.addAll({firstNodeInNewData: tempData}); + } else { + if (value is Map) value = value; + lastNodeInCurrentData!.addAll({firstNodeInNewData: value}); + } + } } } - Map _buildNewNodesTree({ - @required dynamic data, - @required List nodesList, - @required int nodeIndex, - @required value, + Map? _buildNewNodesTree({ + required dynamic data, + required List nodesList, + required int nodeIndex, + required value, }) { var nextNodeIndex = nodeIndex + 1; if (nodeIndex + 1 < nodesList.length) { @@ -107,9 +105,9 @@ class MockDatabaseReference extends Mock implements DatabaseReference { } _getNextNodeData({ - @required dynamic data, - @required List nodesList, - @required _Int nodeIndex, + required dynamic data, + required List nodesList, + required _Int nodeIndex, }) { if (nodesList.length <= nodeIndex.value || !(data[nodesList[nodeIndex.value]] is Map)) { @@ -132,7 +130,7 @@ class MockDatabaseReference extends Mock implements DatabaseReference { if (nodeList.length > 1) { for (var i = 0; i < nodeList.length; i++) { nodePath = nodeList[i]; - var nonExistentNodeFound = tempData[nodePath] == null; + var nonExistentNodeFound = tempData![nodePath] == null; if (nonExistentNodeFound || (i + 1) == nodeList.length) { break; } @@ -141,7 +139,7 @@ class MockDatabaseReference extends Mock implements DatabaseReference { } } } - return Future.value(MockDataSnapshot(tempData[nodePath])); + return Future.value(MockDataSnapshot(tempData![nodePath])); } } diff --git a/pubspec.lock b/pubspec.lock index 1cfb201..5700091 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,7 +21,7 @@ packages: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.6.0" + version: "2.2.0" async: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: built_collection url: "https://pub.dartlang.org" source: hosted - version: "5.1.0" + version: "5.1.1" built_value: dependency: transitive description: @@ -140,28 +140,28 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "0.7.0" + version: "1.6.0" firebase_core_platform_interface: dependency: "direct main" description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "4.0.1" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "0.2.1+3" + version: "1.1.0" firebase_database: dependency: "direct main" description: name: firebase_database url: "https://pub.dartlang.org" source: hosted - version: "6.0.0" + version: "7.2.1" fixnum: dependency: transitive description: @@ -253,7 +253,7 @@ packages: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "2.0.1" pub_semver: dependency: transitive description: @@ -261,13 +261,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" - quiver: - dependency: transitive - description: - name: quiver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 93e7699..f1b9434 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,14 +9,14 @@ homepage: https://github.com/sitatec/firebase_database_mocks.git issue_tracker: https://github.com/sitatec/firebase_database_mocks/issues environment: - sdk: ">=2.7.0 <3.0.0" + sdk: '>=2.12.0 <3.0.0' dependencies: flutter: sdk: flutter - firebase_database: ^6.0.0 - pedantic: ^1.9.2 + firebase_database: ^7.2.1 + pedantic: ^1.11.1 mockito: ^5.0.15 - firebase_core_platform_interface: ^3.0.1 + firebase_core_platform_interface: ^4.0.1 flutter_test: sdk: flutter diff --git a/test/exemples_test.dart b/test/exemples_test.dart index 2f588af..68cc30f 100644 --- a/test/exemples_test.dart +++ b/test/exemples_test.dart @@ -6,14 +6,14 @@ class UserRepository { UserRepository(this.firebaseDatabase); FirebaseDatabase firebaseDatabase; - Future getUserName(String userId) async { + Future getUserName(String userId) async { final userNameReference = firebaseDatabase.reference().child('users').child(userId).child('name'); final dataSnapshot = await userNameReference.once(); return dataSnapshot.value; } - Future> getUser(String userId) async { + Future?> getUser(String userId) async { final userNode = firebaseDatabase.reference().child('users/$userId'); final dataSnapshot = await userNode.once(); return dataSnapshot.value; @@ -22,7 +22,7 @@ class UserRepository { void main() { FirebaseDatabase firebaseDatabase; - UserRepository userRepository; + late UserRepository userRepository; // Put fake data const userId = 'userId'; const userName = 'Elon musk'; diff --git a/test/mock_database_reference_test.dart b/test/mock_database_reference_test.dart index 8db50de..4e30b62 100644 --- a/test/mock_database_reference_test.dart +++ b/test/mock_database_reference_test.dart @@ -4,7 +4,7 @@ import 'package:firebase_database_mocks/src/set_up_mocks.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { - MockDatabaseReference databaseReference; + late MockDatabaseReference databaseReference; setUp(() { setupFirebaseMocks(); // Just to make sure it that no exception is thrown. databaseReference = MockDatabaseReference(); @@ -184,12 +184,12 @@ void main() { test('Should persist data while test running', () async { MockFirebaseDatabase.setDataPersistanceEnabled(ennabled: true); - var databaseReference = MockDatabaseReference(); - await databaseReference.child('test1').set('value1'); - await databaseReference.child('test2/test2').set('value2'); - await databaseReference.child('test1/test_one').set('value3'); - databaseReference = null; - expect(databaseReference, isNull); + MockDatabaseReference? _databaseReference = MockDatabaseReference(); + await _databaseReference.child('test1').set('value1'); + await _databaseReference.child('test2/test2').set('value2'); + await _databaseReference.child('test1/test_one').set('value3'); + _databaseReference = null; + expect(_databaseReference, isNull); var newDatabaseReference = MockDatabaseReference(); expect(