blob: ea5171cc0fcdc3cd4418896b5e84c212eadd7dc5 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:devtools_app/src/shared/navigation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('routeNameWithQueryParams', () {
test('Generates a route name with params without a context', () {
expect(routeNameWithQueryParams(null, '/'), '/');
expect(routeNameWithQueryParams(null, '/home'), '/home');
expect(routeNameWithQueryParams(null, '/', {}), '/?');
expect(routeNameWithQueryParams(null, '/', {'foo': 'bar'}), '/?foo=bar');
expect(
routeNameWithQueryParams(null, '/', {'foo': 'bar', 'theme': 'dark'}),
'/?foo=bar&theme=dark',
);
});
/// Builds an app that calls [onBuild] when [initialRoute] loads.
Widget routeTestingApp(
void Function(BuildContext) onBuild, {
String initialRoute = '/',
}) {
return MaterialApp(
initialRoute: initialRoute,
routes: {
initialRoute: (context) {
onBuild(context);
return const SizedBox();
},
},
);
}
testWidgets(
'Generates a route name with parameters with an empty route in the context',
(WidgetTester tester) async {
late String generatedRoute;
await tester.pumpWidget(
routeTestingApp((context) {
generatedRoute = routeNameWithQueryParams(
context,
'/home',
{'foo': 'bar', 'theme': 'dark'},
);
}),
);
expect(generatedRoute, '/home?foo=bar&theme=dark');
},
);
testWidgets(
'Respects dark theme of the current route from the context',
(WidgetTester tester) async {
late String generatedRoute;
await tester.pumpWidget(
routeTestingApp(
(context) {
generatedRoute =
routeNameWithQueryParams(context, '/home', {'foo': 'bar'});
},
initialRoute: '/?theme=dark',
),
);
expect(generatedRoute, '/home?foo=bar&theme=dark');
},
);
testWidgets(
'Removes redundant light theme of the current route from the context',
(WidgetTester tester) async {
late String generatedRoute;
await tester.pumpWidget(
routeTestingApp(
(context) {
generatedRoute =
routeNameWithQueryParams(context, '/home', {'foo': 'bar'});
},
initialRoute: '/?theme=light',
),
);
expect(generatedRoute, '/home?foo=bar');
},
);
testWidgets(
'Overrides dark theme of the current route when a replacement theme is given',
(WidgetTester tester) async {
late String generatedRoute;
await tester.pumpWidget(
routeTestingApp(
(context) {
generatedRoute = routeNameWithQueryParams(
context,
'/home',
{'foo': 'bar', 'theme': 'light'},
);
},
initialRoute: '/?snap=crackle&theme=dark',
),
);
expect(generatedRoute, '/home?foo=bar&theme=light');
},
);
testWidgets(
'Overrides other parameters of the current route from the context',
(WidgetTester tester) async {
late String generatedRoute;
await tester.pumpWidget(
routeTestingApp(
(context) {
generatedRoute =
routeNameWithQueryParams(context, '/home', {'foo': 'baz'});
},
initialRoute: '/?foo=bar&baz=quux',
),
);
expect(generatedRoute, '/home?foo=baz');
},
);
group('in an unnamed route', () {
// TODO(jacobr): rewrite these tests in a way that makes sense given how
// we are now managing the dark and light themes.
/*
/// Builds an app that loads an unnamed route and calls [onBuild] when
/// the unnamed route loads.
Widget unnamedRouteApp(void Function(BuildContext) onUnnamedRouteBuild) {
return routeTestingApp((context) {
WidgetsBinding.instance.addPostFrameCallback((_) {
Navigator.of(context)
.push(MaterialPageRoute(builder: (innerContext) {
onUnnamedRouteBuild(innerContext);
return const SizedBox();
}));
});
});
}
testWidgets('Builds with global dark mode when dark mode is on',
(WidgetTester tester) async {
String generatedRoute;
// ignore: deprecated_member_use_from_same_package
setTheme(darkTheme: true);
await tester.pumpWidget(unnamedRouteApp((context) {
generatedRoute =
routeNameWithQueryParams(context, '/home', {'foo': 'baz'});
}));
await tester.pumpAndSettle();
expect(generatedRoute, '/home?foo=baz&theme=dark');
// Teardown the global theme change
// ignore: deprecated_member_use_from_same_package
setTheme(darkTheme: false);
});
testWidgets('Builds with global light mode when dark mode is off',
(WidgetTester tester) async {
String generatedRoute;
await tester.pumpWidget(unnamedRouteApp((context) {
generatedRoute =
routeNameWithQueryParams(context, '/home', {'foo': 'baz'});
}));
await tester.pumpAndSettle();
expect(generatedRoute, '/home?foo=baz');
});
*/
});
});
}