Skip to content

Commit

Permalink
fix: null-safety issues
Browse files Browse the repository at this point in the history
  • Loading branch information
sitatec committed Sep 5, 2021
1 parent ede7510 commit de5a3bd
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 78 deletions.
6 changes: 3 additions & 3 deletions example/example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ class UserRepository {
UserRepository(this.firebaseDatabase);
FirebaseDatabase firebaseDatabase;

Future<String> getUserName(String userId) async {
Future<String?> getUserName(String userId) async {
final userNameReference =
firebaseDatabase.reference().child('users').child(userId).child('name');
final dataSnapshot = await userNameReference.once();
return dataSnapshot.value;
}

Future<Map<String, dynamic>> getUser(String userId) async {
Future<Map<String, dynamic>?> getUser(String userId) async {
final userNode = firebaseDatabase.reference().child('users/$userId');
final dataSnapshot = await userNode.once();
return dataSnapshot.value;
Expand All @@ -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';
Expand Down
92 changes: 45 additions & 47 deletions lib/src/mock_database_reference.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -8,8 +7,8 @@ import 'mock_firebase_database.dart';
class MockDatabaseReference extends Mock implements DatabaseReference {
var _nodePath = '/';
// ignore: prefer_final_fields
static var _persitedData = <String, dynamic>{};
var _volatileData = <String, dynamic>{};
static Map<String, dynamic>? _persitedData = <String, dynamic>{};
Map<String, dynamic>? _volatileData = <String, dynamic>{};
MockDatabaseReference();
MockDatabaseReference._(nodePath, [this._volatileData]) {
_nodePath += nodePath;
Expand All @@ -20,7 +19,7 @@ class MockDatabaseReference extends Mock implements DatabaseReference {
yield MockEvent._(data.value);
}

Map<String, dynamic> get _data {
Map<String, dynamic>? get _data {
if (MockFirebaseDatabase.persistData) {
return _persitedData;
}
Expand Down Expand Up @@ -48,50 +47,49 @@ class MockDatabaseReference extends Mock implements DatabaseReference {
}

@override
// ignore: missing_return
Future<void> set(dynamic value, {dynamic priority}) {
Future<void> 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 = <String, dynamic>{};
Map<String, dynamic> 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<String, dynamic>? tempData = <String, dynamic>{};
Map<String, dynamic>? 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<String, dynamic> _buildNewNodesTree({
@required dynamic data,
@required List<String> nodesList,
@required int nodeIndex,
@required value,
Map<String, dynamic>? _buildNewNodesTree({
required dynamic data,
required List<String> nodesList,
required int nodeIndex,
required value,
}) {
var nextNodeIndex = nodeIndex + 1;
if (nodeIndex + 1 < nodesList.length) {
Expand All @@ -107,9 +105,9 @@ class MockDatabaseReference extends Mock implements DatabaseReference {
}

_getNextNodeData({
@required dynamic data,
@required List<String> nodesList,
@required _Int nodeIndex,
required dynamic data,
required List<String> nodesList,
required _Int nodeIndex,
}) {
if (nodesList.length <= nodeIndex.value ||
!(data[nodesList[nodeIndex.value]] is Map)) {
Expand All @@ -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;
}
Expand All @@ -141,7 +139,7 @@ class MockDatabaseReference extends Mock implements DatabaseReference {
}
}
}
return Future.value(MockDataSnapshot(tempData[nodePath]));
return Future.value(MockDataSnapshot(tempData![nodePath]));
}
}

Expand Down
21 changes: 7 additions & 14 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -253,21 +253,14 @@ 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:
name: pub_semver
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
Expand Down
8 changes: 4 additions & 4 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 3 additions & 3 deletions test/exemples_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ class UserRepository {
UserRepository(this.firebaseDatabase);
FirebaseDatabase firebaseDatabase;

Future<String> getUserName(String userId) async {
Future<String?> getUserName(String userId) async {
final userNameReference =
firebaseDatabase.reference().child('users').child(userId).child('name');
final dataSnapshot = await userNameReference.once();
return dataSnapshot.value;
}

Future<Map<String, dynamic>> getUser(String userId) async {
Future<Map<String, dynamic>?> getUser(String userId) async {
final userNode = firebaseDatabase.reference().child('users/$userId');
final dataSnapshot = await userNode.once();
return dataSnapshot.value;
Expand All @@ -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';
Expand Down
14 changes: 7 additions & 7 deletions test/mock_database_reference_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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(
Expand Down

0 comments on commit de5a3bd

Please sign in to comment.