Skip to content

Commit 06f1b87

Browse files
committed
login test: Add happy-path test for AddAccountPage
1 parent 6d02f42 commit 06f1b87

File tree

3 files changed

+68
-1
lines changed

3 files changed

+68
-1
lines changed

test/api/route/route_checks.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
import 'package:checks/checks.dart';
22
import 'package:zulip/api/route/messages.dart';
3+
import 'package:zulip/api/route/realm.dart';
34
import 'package:zulip/api/route/saved_snippets.dart';
45

56
extension SendMessageResultChecks on Subject<SendMessageResult> {
67
Subject<int> get id => has((e) => e.id, 'id');
78
}
9+
810
extension CreateSavedSnippetResultChecks on Subject<CreateSavedSnippetResult> {
911
Subject<int> get savedSnippetId => has((e) => e.savedSnippetId, 'savedSnippetId');
1012
}
1113

14+
extension GetServerSettingsResultChecks on Subject<GetServerSettingsResult> {
15+
Subject<Uri> get realmUrl => has((e) => e.realmUrl, 'realmUrl');
16+
}
17+
1218
// TODO add similar extensions for other classes in api/route/*.dart

test/widgets/checks.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:checks/checks.dart';
22
import 'package:flutter/widgets.dart';
3+
import 'package:zulip/api/route/realm.dart';
34

45
import 'package:zulip/model/emoji.dart';
56
import 'package:zulip/model/narrow.dart';
@@ -8,6 +9,7 @@ import 'package:zulip/widgets/compose_box.dart';
89
import 'package:zulip/widgets/content.dart';
910
import 'package:zulip/widgets/emoji.dart';
1011
import 'package:zulip/widgets/emoji_reaction.dart';
12+
import 'package:zulip/widgets/login.dart';
1113
import 'package:zulip/widgets/message_list.dart';
1214
import 'package:zulip/widgets/page.dart';
1315
import 'package:zulip/widgets/profile.dart';
@@ -74,6 +76,10 @@ extension AccountRouteChecks<T> on Subject<AccountRoute<T>> {
7476
Subject<int> get accountId => has((x) => x.accountId, 'accountId');
7577
}
7678

79+
extension LoginPageChecks on Subject<LoginPage> {
80+
Subject<GetServerSettingsResult> get serverSettings => has((x) => x.serverSettings, 'serverSettings');
81+
}
82+
7783
extension ProfilePageChecks on Subject<ProfilePage> {
7884
Subject<int> get userId => has((x) => x.userId, 'userId');
7985
}

test/widgets/login_test.dart

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:zulip/widgets/login.dart';
1717
import 'package:zulip/widgets/page.dart';
1818

1919
import '../api/fake_api.dart';
20+
import '../api/route/route_checks.dart';
2021
import '../example_data.dart' as eg;
2122
import '../model/binding.dart';
2223
import '../stdlib_checks.dart';
@@ -65,7 +66,61 @@ void main() {
6566
expectErrorFromText('[email protected]', ServerUrlValidationError.noUseEmail);
6667
});
6768

68-
// TODO test AddAccountPage
69+
group('AddAccountPage', () {
70+
late FakeApiConnection connection;
71+
List<Route<dynamic>> pushedRoutes = [];
72+
List<Route<dynamic>> poppedRoutes = [];
73+
74+
List<Route<dynamic>> takePushedRoutes() {
75+
final routes = pushedRoutes.toList();
76+
pushedRoutes.clear();
77+
return routes;
78+
}
79+
80+
Future<void> prepare(WidgetTester tester) async {
81+
addTearDown(testBinding.reset);
82+
83+
pushedRoutes = [];
84+
poppedRoutes = [];
85+
final testNavObserver = TestNavigatorObserver();
86+
testNavObserver.onPushed = (route, prevRoute) => pushedRoutes.add(route);
87+
testNavObserver.onPopped = (route, prevRoute) => poppedRoutes.add(route);
88+
testNavObserver.onReplaced = (route, prevRoute) {
89+
poppedRoutes.add(prevRoute!);
90+
pushedRoutes.add(route!);
91+
};
92+
93+
await tester.pumpWidget(ZulipApp(navigatorObservers: [testNavObserver]));
94+
await tester.pump();
95+
check(takePushedRoutes()).single.isA<WidgetRoute>().page.isA<ChooseAccountPage>();
96+
await tester.tap(find.text('Add an account'));
97+
check(takePushedRoutes()).single.isA<WidgetRoute>().page.isA<AddAccountPage>();
98+
await testNavObserver.pumpPastTransition(tester);
99+
}
100+
101+
Future<void> attempt(WidgetTester tester,
102+
Uri realmUrl, Map<String, Object?> responseJson) async {
103+
await tester.enterText(find.byType(TextField), realmUrl.toString());
104+
testBinding.globalStore.useCachedApiConnections = true;
105+
connection = testBinding.globalStore.apiConnection(
106+
realmUrl: realmUrl,
107+
zulipFeatureLevel: null);
108+
connection.prepare(json: responseJson);
109+
await tester.tap(find.text('Continue'));
110+
await tester.pump(Duration.zero);
111+
}
112+
113+
testWidgets('happy path', (tester) async {
114+
await prepare(tester);
115+
116+
final serverSettings = eg.serverSettings();
117+
118+
await attempt(tester, serverSettings.realmUrl, serverSettings.toJson());
119+
checkNoDialog(tester);
120+
check(takePushedRoutes()).single.isA<WidgetRoute>().page.isA<LoginPage>()
121+
.serverSettings.realmUrl.equals(serverSettings.realmUrl);
122+
});
123+
});
69124

70125
group('LoginPage', () {
71126
late FakeApiConnection connection;

0 commit comments

Comments
 (0)