Skip to content

Commit 9a911a8

Browse files
a7medevahmedAlaaInstabug
authored andcommitted
test: add tests for navigator observer (#501)
1 parent 0e22771 commit 9a911a8

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ dependencies:
1515

1616
dev_dependencies:
1717
build_runner: ^2.0.3
18+
fake_async: '>=1.2.0 <1.4.0'
1819
flutter_test:
1920
sdk: flutter
2021
lint: ^1.0.0
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import 'package:fake_async/fake_async.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_test/flutter_test.dart';
4+
import 'package:instabug_flutter/instabug_flutter.dart';
5+
import 'package:instabug_flutter/src/generated/instabug.api.g.dart';
6+
import 'package:instabug_flutter/src/utils/screen_loading/screen_loading_manager.dart';
7+
import 'package:mockito/annotations.dart';
8+
import 'package:mockito/mockito.dart';
9+
10+
import 'instabug_navigator_observer_test.mocks.dart';
11+
12+
@GenerateMocks([
13+
InstabugHostApi,
14+
ScreenLoadingManager,
15+
])
16+
void main() {
17+
TestWidgetsFlutterBinding.ensureInitialized();
18+
WidgetsFlutterBinding.ensureInitialized();
19+
20+
final mHost = MockInstabugHostApi();
21+
final mScreenLoadingManager = MockScreenLoadingManager();
22+
23+
late InstabugNavigatorObserver observer;
24+
const screen = '/screen';
25+
const previousScreen = '/previousScreen';
26+
late Route route;
27+
late Route previousRoute;
28+
29+
setUpAll(() {
30+
Instabug.$setHostApi(mHost);
31+
ScreenLoadingManager.setInstance(mScreenLoadingManager);
32+
});
33+
34+
setUp(() {
35+
observer = InstabugNavigatorObserver();
36+
route = createRoute(screen);
37+
previousRoute = createRoute(previousScreen);
38+
});
39+
40+
test('should report screen change when a route is pushed', () {
41+
fakeAsync((async) {
42+
observer.didPush(route, previousRoute);
43+
44+
async.elapse(const Duration(milliseconds: 1000));
45+
46+
verify(
47+
mScreenLoadingManager.startUiTrace(screen),
48+
).called(1);
49+
50+
verify(
51+
mHost.reportScreenChange(screen),
52+
).called(1);
53+
});
54+
});
55+
56+
test(
57+
'should report screen change when a route is popped and previous is known',
58+
() {
59+
fakeAsync((async) {
60+
observer.didPop(route, previousRoute);
61+
62+
async.elapse(const Duration(milliseconds: 1000));
63+
64+
verify(
65+
mScreenLoadingManager.startUiTrace(previousScreen),
66+
).called(1);
67+
68+
verify(
69+
mHost.reportScreenChange(previousScreen),
70+
).called(1);
71+
});
72+
});
73+
74+
test(
75+
'should not report screen change when a route is popped and previous is not known',
76+
() {
77+
fakeAsync((async) {
78+
observer.didPop(route, null);
79+
80+
async.elapse(const Duration(milliseconds: 1000));
81+
82+
verifyNever(
83+
mScreenLoadingManager.startUiTrace(any),
84+
);
85+
86+
verifyNever(
87+
mHost.reportScreenChange(any),
88+
);
89+
});
90+
});
91+
}
92+
93+
Route createRoute(String? name) {
94+
return MaterialPageRoute(
95+
builder: (_) => Container(),
96+
settings: RouteSettings(name: name),
97+
);
98+
}

0 commit comments

Comments
 (0)