Skip to content

Commit bf244d2

Browse files
author
sitatec
committed
create mockDatabaseReference
1 parent 52cbe55 commit bf244d2

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
import 'package:firebase_database/firebase_database.dart';
2+
import 'package:flutter/foundation.dart';
3+
import 'package:mockito/mockito.dart';
4+
5+
import 'mock_data_snapshot.dart';
6+
import 'mock_firebase_database.dart';
7+
8+
class MockDatabaseReference extends Mock implements DatabaseReference {
9+
var _nodePath = '/';
10+
// ignore: prefer_final_fields
11+
static final _persitedData = <String, dynamic>{};
12+
var _volatileData = <String, dynamic>{};
13+
MockDatabaseReference();
14+
MockDatabaseReference._(nodePath, [this._volatileData]) {
15+
_nodePath += nodePath;
16+
}
17+
18+
Map<String, dynamic> get _data {
19+
if (MockFirebaseDatabase.persistData) {
20+
return _persitedData;
21+
}
22+
return _volatileData;
23+
}
24+
25+
@override
26+
String get path => _nodePath;
27+
28+
@override
29+
DatabaseReference child(String path) {
30+
if (!path.endsWith('/')) path += '/';
31+
path = (_nodePath + path).replaceAll(RegExp(r'^/+'), '');
32+
return MockDatabaseReference._(
33+
path,
34+
MockFirebaseDatabase.persistData ? _volatileData : <String, dynamic>{},
35+
);
36+
}
37+
38+
@override
39+
// ignore: missing_return
40+
Future<void> set(dynamic value, {dynamic priority}) {
41+
var nodePathWithoutSlashesAtEndAndStart =
42+
_nodePath.substring(1, _nodePath.length - 1);
43+
var nodesList = nodePathWithoutSlashesAtEndAndStart.split('/');
44+
var tempData = <String, dynamic>{};
45+
Map<String, dynamic> lastNodeInCurrentData;
46+
var nodeIndexReference = _Int(0);
47+
if (_data.isEmpty) {
48+
lastNodeInCurrentData = _data;
49+
} else {
50+
lastNodeInCurrentData = getNode(
51+
data: _data,
52+
nodesList: nodesList,
53+
nodeIndex: nodeIndexReference.increment(),
54+
);
55+
}
56+
var nodeIndex = nodeIndexReference.value;
57+
if (nodesList.length <= nodeIndex) {
58+
lastNodeInCurrentData[nodesList.last] = value;
59+
return null;
60+
}
61+
var firstNodeInNewData = nodesList[nodeIndex++];
62+
if (nodeIndex < nodesList.length) {
63+
for (; nodeIndex < nodesList.length; nodeIndex++) {
64+
if (nodeIndex + 1 < nodesList.length) {
65+
tempData[nodesList[nodeIndex]] = {nodesList[nodeIndex + 1]: null};
66+
tempData = tempData[nodesList[nodeIndex]];
67+
} else {
68+
tempData[nodesList[nodeIndex]] = value;
69+
}
70+
}
71+
lastNodeInCurrentData
72+
.addAll({firstNodeInNewData: _makeSupportGenericValue(tempData)});
73+
} else {
74+
if (value is Map) value = _makeSupportGenericValue(value);
75+
lastNodeInCurrentData.addAll({firstNodeInNewData: value});
76+
}
77+
}
78+
79+
dynamic getNode(
80+
{@required dynamic data,
81+
@required List<String> nodesList,
82+
@required _Int nodeIndex}) {
83+
// print(data);
84+
// print(nodeIndex.value);
85+
if (nodesList.length == nodeIndex.value ||
86+
!(data[nodesList[nodeIndex.value]] is Map)) return data;
87+
return getNode(
88+
data: data[nodesList[nodeIndex.value]],
89+
nodesList: nodesList,
90+
nodeIndex: nodeIndex.increment());
91+
}
92+
93+
@override
94+
Future<DataSnapshot> once() {
95+
return Future(() {
96+
var tempData = _data;
97+
var nodePath = _nodePath.substring(1, _nodePath.length - 1);
98+
var nodeList = nodePath.split('/');
99+
if (nodeList.length > 1) {
100+
for (var node in nodeList) {
101+
nodePath = node;
102+
if (tempData[node] == null) {
103+
nodePath = '';
104+
break;
105+
}
106+
if (tempData[node] is Map) {
107+
tempData = tempData[node];
108+
}
109+
}
110+
}
111+
return MockDataSnapshot(tempData[nodePath]);
112+
});
113+
}
114+
}
115+
116+
class _Int {
117+
int value;
118+
_Int(this.value);
119+
_Int increment() {
120+
++value;
121+
return this;
122+
}
123+
}
124+
125+
Map<String, Object> _makeSupportGenericValue(Map<String, dynamic> data) {
126+
var _dataWithGenericValue = {'__generic_mock_data_value__': Object()};
127+
_dataWithGenericValue.addAll(data);
128+
_dataWithGenericValue.forEach((key, value) {
129+
if (value is Map) {
130+
_dataWithGenericValue[key] = _makeSupportGenericValue(value);
131+
}
132+
});
133+
return _dataWithGenericValue;
134+
}

0 commit comments

Comments
 (0)