Skip to content

Commit de5a3bd

Browse files
committed
fix: null-safety issues
1 parent ede7510 commit de5a3bd

File tree

6 files changed

+69
-78
lines changed

6 files changed

+69
-78
lines changed

example/example.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ class UserRepository {
66
UserRepository(this.firebaseDatabase);
77
FirebaseDatabase firebaseDatabase;
88

9-
Future<String> getUserName(String userId) async {
9+
Future<String?> getUserName(String userId) async {
1010
final userNameReference =
1111
firebaseDatabase.reference().child('users').child(userId).child('name');
1212
final dataSnapshot = await userNameReference.once();
1313
return dataSnapshot.value;
1414
}
1515

16-
Future<Map<String, dynamic>> getUser(String userId) async {
16+
Future<Map<String, dynamic>?> getUser(String userId) async {
1717
final userNode = firebaseDatabase.reference().child('users/$userId');
1818
final dataSnapshot = await userNode.once();
1919
return dataSnapshot.value;
@@ -22,7 +22,7 @@ class UserRepository {
2222

2323
void main() {
2424
FirebaseDatabase firebaseDatabase;
25-
UserRepository userRepository;
25+
late UserRepository userRepository;
2626
// Put fake data
2727
const userId = 'userId';
2828
const userName = 'Elon musk';

lib/src/mock_database_reference.dart

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:firebase_database/firebase_database.dart';
2-
import 'package:flutter/foundation.dart';
32
import 'package:mockito/mockito.dart';
43

54
import 'mock_data_snapshot.dart';
@@ -8,8 +7,8 @@ import 'mock_firebase_database.dart';
87
class MockDatabaseReference extends Mock implements DatabaseReference {
98
var _nodePath = '/';
109
// ignore: prefer_final_fields
11-
static var _persitedData = <String, dynamic>{};
12-
var _volatileData = <String, dynamic>{};
10+
static Map<String, dynamic>? _persitedData = <String, dynamic>{};
11+
Map<String, dynamic>? _volatileData = <String, dynamic>{};
1312
MockDatabaseReference();
1413
MockDatabaseReference._(nodePath, [this._volatileData]) {
1514
_nodePath += nodePath;
@@ -20,7 +19,7 @@ class MockDatabaseReference extends Mock implements DatabaseReference {
2019
yield MockEvent._(data.value);
2120
}
2221

23-
Map<String, dynamic> get _data {
22+
Map<String, dynamic>? get _data {
2423
if (MockFirebaseDatabase.persistData) {
2524
return _persitedData;
2625
}
@@ -48,50 +47,49 @@ class MockDatabaseReference extends Mock implements DatabaseReference {
4847
}
4948

5049
@override
51-
// ignore: missing_return
52-
Future<void> set(dynamic value, {dynamic priority}) {
50+
Future<void> set(dynamic value, {dynamic priority}) async {
5351
if (_nodePath == '/') {
5452
_data = value;
55-
return null;
56-
}
57-
var nodePathWithoutSlashesAtEndAndStart =
58-
_nodePath.substring(1, _nodePath.length - 1);
59-
var nodesList = nodePathWithoutSlashesAtEndAndStart.split('/');
60-
var tempData = <String, dynamic>{};
61-
Map<String, dynamic> lastNodeInCurrentData;
62-
var nodeIndexReference = _Int(0);
63-
if (_data[nodesList.first] == null) {
64-
lastNodeInCurrentData = _data;
65-
} else {
66-
lastNodeInCurrentData = _getNextNodeData(
67-
data: _data, nodesList: nodesList, nodeIndex: nodeIndexReference);
68-
}
69-
var nodeIndex = nodeIndexReference.value;
70-
var noNewNodeToAdd = nodesList.length <= nodeIndex;
71-
if (noNewNodeToAdd) {
72-
lastNodeInCurrentData[nodesList.last] = value;
73-
return null;
74-
}
75-
var firstNodeInNewData = nodesList[nodeIndex++];
76-
if (nodeIndex < nodesList.length) {
77-
tempData = _buildNewNodesTree(
78-
nodeIndex: nodeIndex,
79-
nodesList: nodesList,
80-
data: tempData,
81-
value: value,
82-
);
83-
lastNodeInCurrentData.addAll({firstNodeInNewData: tempData});
8453
} else {
85-
if (value is Map) value = value;
86-
lastNodeInCurrentData.addAll({firstNodeInNewData: value});
54+
var nodePathWithoutSlashesAtEndAndStart =
55+
_nodePath.substring(1, _nodePath.length - 1);
56+
var nodesList = nodePathWithoutSlashesAtEndAndStart.split('/');
57+
Map<String, dynamic>? tempData = <String, dynamic>{};
58+
Map<String, dynamic>? lastNodeInCurrentData;
59+
var nodeIndexReference = _Int(0);
60+
if (_data![nodesList.first] == null) {
61+
lastNodeInCurrentData = _data;
62+
} else {
63+
lastNodeInCurrentData = _getNextNodeData(
64+
data: _data, nodesList: nodesList, nodeIndex: nodeIndexReference);
65+
}
66+
var nodeIndex = nodeIndexReference.value;
67+
var noNewNodeToAdd = nodesList.length <= nodeIndex;
68+
if (noNewNodeToAdd) {
69+
lastNodeInCurrentData![nodesList.last] = value;
70+
} else {
71+
var firstNodeInNewData = nodesList[nodeIndex++];
72+
if (nodeIndex < nodesList.length) {
73+
tempData = _buildNewNodesTree(
74+
nodeIndex: nodeIndex,
75+
nodesList: nodesList,
76+
data: tempData,
77+
value: value,
78+
);
79+
lastNodeInCurrentData!.addAll({firstNodeInNewData: tempData});
80+
} else {
81+
if (value is Map) value = value;
82+
lastNodeInCurrentData!.addAll({firstNodeInNewData: value});
83+
}
84+
}
8785
}
8886
}
8987

90-
Map<String, dynamic> _buildNewNodesTree({
91-
@required dynamic data,
92-
@required List<String> nodesList,
93-
@required int nodeIndex,
94-
@required value,
88+
Map<String, dynamic>? _buildNewNodesTree({
89+
required dynamic data,
90+
required List<String> nodesList,
91+
required int nodeIndex,
92+
required value,
9593
}) {
9694
var nextNodeIndex = nodeIndex + 1;
9795
if (nodeIndex + 1 < nodesList.length) {
@@ -107,9 +105,9 @@ class MockDatabaseReference extends Mock implements DatabaseReference {
107105
}
108106

109107
_getNextNodeData({
110-
@required dynamic data,
111-
@required List<String> nodesList,
112-
@required _Int nodeIndex,
108+
required dynamic data,
109+
required List<String> nodesList,
110+
required _Int nodeIndex,
113111
}) {
114112
if (nodesList.length <= nodeIndex.value ||
115113
!(data[nodesList[nodeIndex.value]] is Map)) {
@@ -132,7 +130,7 @@ class MockDatabaseReference extends Mock implements DatabaseReference {
132130
if (nodeList.length > 1) {
133131
for (var i = 0; i < nodeList.length; i++) {
134132
nodePath = nodeList[i];
135-
var nonExistentNodeFound = tempData[nodePath] == null;
133+
var nonExistentNodeFound = tempData![nodePath] == null;
136134
if (nonExistentNodeFound || (i + 1) == nodeList.length) {
137135
break;
138136
}
@@ -141,7 +139,7 @@ class MockDatabaseReference extends Mock implements DatabaseReference {
141139
}
142140
}
143141
}
144-
return Future.value(MockDataSnapshot(tempData[nodePath]));
142+
return Future.value(MockDataSnapshot(tempData![nodePath]));
145143
}
146144
}
147145

pubspec.lock

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ packages:
2121
name: args
2222
url: "https://pub.dartlang.org"
2323
source: hosted
24-
version: "1.6.0"
24+
version: "2.2.0"
2525
async:
2626
dependency: transitive
2727
description:
@@ -49,7 +49,7 @@ packages:
4949
name: built_collection
5050
url: "https://pub.dartlang.org"
5151
source: hosted
52-
version: "5.1.0"
52+
version: "5.1.1"
5353
built_value:
5454
dependency: transitive
5555
description:
@@ -140,28 +140,28 @@ packages:
140140
name: firebase_core
141141
url: "https://pub.dartlang.org"
142142
source: hosted
143-
version: "0.7.0"
143+
version: "1.6.0"
144144
firebase_core_platform_interface:
145145
dependency: "direct main"
146146
description:
147147
name: firebase_core_platform_interface
148148
url: "https://pub.dartlang.org"
149149
source: hosted
150-
version: "3.0.1"
150+
version: "4.0.1"
151151
firebase_core_web:
152152
dependency: transitive
153153
description:
154154
name: firebase_core_web
155155
url: "https://pub.dartlang.org"
156156
source: hosted
157-
version: "0.2.1+3"
157+
version: "1.1.0"
158158
firebase_database:
159159
dependency: "direct main"
160160
description:
161161
name: firebase_database
162162
url: "https://pub.dartlang.org"
163163
source: hosted
164-
version: "6.0.0"
164+
version: "7.2.1"
165165
fixnum:
166166
dependency: transitive
167167
description:
@@ -253,21 +253,14 @@ packages:
253253
name: plugin_platform_interface
254254
url: "https://pub.dartlang.org"
255255
source: hosted
256-
version: "1.0.3"
256+
version: "2.0.1"
257257
pub_semver:
258258
dependency: transitive
259259
description:
260260
name: pub_semver
261261
url: "https://pub.dartlang.org"
262262
source: hosted
263263
version: "2.0.0"
264-
quiver:
265-
dependency: transitive
266-
description:
267-
name: quiver
268-
url: "https://pub.dartlang.org"
269-
source: hosted
270-
version: "2.1.5"
271264
sky_engine:
272265
dependency: transitive
273266
description: flutter

pubspec.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ homepage: https://github.com/sitatec/firebase_database_mocks.git
99
issue_tracker: https://github.com/sitatec/firebase_database_mocks/issues
1010

1111
environment:
12-
sdk: ">=2.7.0 <3.0.0"
12+
sdk: '>=2.12.0 <3.0.0'
1313

1414
dependencies:
1515
flutter:
1616
sdk: flutter
17-
firebase_database: ^6.0.0
18-
pedantic: ^1.9.2
17+
firebase_database: ^7.2.1
18+
pedantic: ^1.11.1
1919
mockito: ^5.0.15
20-
firebase_core_platform_interface: ^3.0.1
20+
firebase_core_platform_interface: ^4.0.1
2121
flutter_test:
2222
sdk: flutter

test/exemples_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ class UserRepository {
66
UserRepository(this.firebaseDatabase);
77
FirebaseDatabase firebaseDatabase;
88

9-
Future<String> getUserName(String userId) async {
9+
Future<String?> getUserName(String userId) async {
1010
final userNameReference =
1111
firebaseDatabase.reference().child('users').child(userId).child('name');
1212
final dataSnapshot = await userNameReference.once();
1313
return dataSnapshot.value;
1414
}
1515

16-
Future<Map<String, dynamic>> getUser(String userId) async {
16+
Future<Map<String, dynamic>?> getUser(String userId) async {
1717
final userNode = firebaseDatabase.reference().child('users/$userId');
1818
final dataSnapshot = await userNode.once();
1919
return dataSnapshot.value;
@@ -22,7 +22,7 @@ class UserRepository {
2222

2323
void main() {
2424
FirebaseDatabase firebaseDatabase;
25-
UserRepository userRepository;
25+
late UserRepository userRepository;
2626
// Put fake data
2727
const userId = 'userId';
2828
const userName = 'Elon musk';

test/mock_database_reference_test.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'package:firebase_database_mocks/src/set_up_mocks.dart';
44
import 'package:flutter_test/flutter_test.dart';
55

66
void main() {
7-
MockDatabaseReference databaseReference;
7+
late MockDatabaseReference databaseReference;
88
setUp(() {
99
setupFirebaseMocks(); // Just to make sure it that no exception is thrown.
1010
databaseReference = MockDatabaseReference();
@@ -184,12 +184,12 @@ void main() {
184184

185185
test('Should persist data while test running', () async {
186186
MockFirebaseDatabase.setDataPersistanceEnabled(ennabled: true);
187-
var databaseReference = MockDatabaseReference();
188-
await databaseReference.child('test1').set('value1');
189-
await databaseReference.child('test2/test2').set('value2');
190-
await databaseReference.child('test1/test_one').set('value3');
191-
databaseReference = null;
192-
expect(databaseReference, isNull);
187+
MockDatabaseReference? _databaseReference = MockDatabaseReference();
188+
await _databaseReference.child('test1').set('value1');
189+
await _databaseReference.child('test2/test2').set('value2');
190+
await _databaseReference.child('test1/test_one').set('value3');
191+
_databaseReference = null;
192+
expect(_databaseReference, isNull);
193193

194194
var newDatabaseReference = MockDatabaseReference();
195195
expect(

0 commit comments

Comments
 (0)