Skip to content

Commit

Permalink
Added menu and placeholder screens - DC
Browse files Browse the repository at this point in the history
  • Loading branch information
ChopinDavid committed Jan 14, 2025
1 parent 893bf12 commit fb62bf4
Show file tree
Hide file tree
Showing 12 changed files with 273 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:get_it/get_it.dart';
import 'package:uchu/screens/exercise_page.dart';
import 'package:uchu/services/navigation_service.dart';
import 'package:uchu/services/translation_service.dart';
import 'package:uchu/utilities/db_helper.dart';
import 'package:uchu/utilities/explanation_helper.dart';
Expand All @@ -14,6 +15,7 @@ void main() {
GetIt.instance.registerSingleton<ExplanationHelper>(ExplanationHelper());
GetIt.instance.registerSingleton<UrlHelper>(const UrlHelper());
GetIt.instance.registerSingleton<TranslationService>(TranslationService());
GetIt.instance.registerSingleton<NavigationService>(NavigationService());

runApp(const MyApp());
}
Expand Down
10 changes: 10 additions & 0 deletions lib/screens/exercise_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:uchu/models/word_form.dart';
import 'package:uchu/widgets/exercise_footer.dart';
import 'package:uchu/widgets/gender_exercise_widget.dart';
import 'package:uchu/widgets/sentence_exercise_widget.dart';
import 'package:uchu/widgets/uchu_drawer.dart';

import '../models/sentence.dart';

Expand All @@ -17,6 +18,15 @@ class ExercisePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
drawer: UchuDrawer(),
appBar: AppBar(
leading: Builder(builder: (context) {
return IconButton(
onPressed: () => Scaffold.of(context).openDrawer(),
icon: const Icon(Icons.menu),
);
}),
),
body: Padding(
padding: const EdgeInsets.all(24.0),
child: Center(
Expand Down
17 changes: 17 additions & 0 deletions lib/screens/settings_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:flutter/material.dart';

class SettingsPage extends StatelessWidget {
const SettingsPage({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Settings'),
),
body: const Center(
child: Text('Settings Page'),
),
);
}
}
17 changes: 17 additions & 0 deletions lib/screens/statistics_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:flutter/material.dart';

class StatisticsPage extends StatelessWidget {
const StatisticsPage({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Statistics'),
),
body: const Center(
child: Text('Statistics Page'),
),
);
}
}
27 changes: 27 additions & 0 deletions lib/services/navigation_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'package:uchu/screens/settings_page.dart';
import 'package:uchu/screens/statistics_page.dart';

class NavigationService {
Future<T?> pushSettingsPage<T>(BuildContext context) {
return Navigator.push<T>(
context,
MaterialPageRoute(
builder: (context) {
return const SettingsPage();
},
),
);
}

Future<T?> pushStatisticsPage<T>(BuildContext context) {
return Navigator.push<T>(
context,
MaterialPageRoute(
builder: (context) {
return const StatisticsPage();
},
),
);
}
}
43 changes: 43 additions & 0 deletions lib/widgets/uchu_drawer.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:uchu/services/navigation_service.dart';
import 'package:uchu/utilities/url_helper.dart';

class UchuDrawer extends StatelessWidget {
const UchuDrawer({super.key});

@override
Widget build(BuildContext context) {
return Drawer(
child: ListView.builder(
itemBuilder: (context, index) {
switch (index) {
case 0:
return const DrawerHeader(child: Text('Uchu'));
case 1:
return ListTile(
title: const Text('Settings'),
onTap: () => GetIt.instance
.get<NavigationService>()
.pushSettingsPage(context),
);
case 2:
return ListTile(
title: const Text('Statistics'),
onTap: () => GetIt.instance
.get<NavigationService>()
.pushStatisticsPage(context),
);
case 3:
return ListTile(
title: const Text('Bug Report/Feature Request'),
onTap: () => GetIt.instance
.get<UrlHelper>()
.launchUrl('https://github.com/ChopinDavid/uchu/issues'),
);
}
},
),
);
}
}
1 change: 1 addition & 0 deletions test/test_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ class TestUtils {
question: Sentence.testValue(), answers: [WordForm.testValue()]));
registerFallbackValue(MockTextStyle());
registerFallbackValue(const LaunchOptions());
registerFallbackValue(MockBuildContext());
}
}
5 changes: 5 additions & 0 deletions test/unit_tests/mocks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import 'package:sqflite/sqflite.dart';
import 'package:uchu/blocs/exercise/exercise_bloc.dart';
import 'package:uchu/blocs/translation/translation_bloc.dart';
import 'package:uchu/models/noun.dart';
import 'package:uchu/services/navigation_service.dart';
import 'package:uchu/services/translation_service.dart';
import 'package:uchu/utilities/db_helper.dart';
import 'package:uchu/utilities/exercise_helper.dart';
Expand Down Expand Up @@ -62,3 +63,7 @@ class MockNavigatorState extends Mock implements NavigatorState {
return super.toString();
}
}

class MockNavigationService extends Mock implements NavigationService {}

class MockBuildContext extends Mock implements BuildContext {}
40 changes: 40 additions & 0 deletions test/unit_tests/screens/exercise_page_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:uchu/screens/exercise_page.dart';
import 'package:uchu/widgets/exercise_footer.dart';
import 'package:uchu/widgets/gender_exercise_widget.dart';
import 'package:uchu/widgets/sentence_exercise_widget.dart';
import 'package:uchu/widgets/uchu_drawer.dart';

import '../mocks.dart';

Expand Down Expand Up @@ -172,4 +173,43 @@ main() {
explanation);
});
});

group(
'drawer',
() {
testWidgets(
'is shown when menu icon is tapped',
(widgetTester) async {
whenListen(
mockExerciseBloc,
Stream.fromIterable(
<ExerciseState>[],
),
initialState: ExerciseExerciseRetrievedState(),
);

await widgetTester.pumpWidget(
MaterialApp(
home: BlocProvider.value(
value: mockExerciseBloc,
child: const ExercisePage(),
),
),
);
await widgetTester.pump();
await widgetTester.idle();

expect(find.byType(UchuDrawer), findsNothing);

final menuIconFinder = find.byIcon(Icons.menu);
expect(menuIconFinder, findsOneWidget);
await widgetTester.tap(menuIconFinder);
await widgetTester.pump();
await widgetTester.idle();

expect(find.byType(UchuDrawer), findsOneWidget);
},
);
},
);
}
10 changes: 10 additions & 0 deletions test/unit_tests/screens/settings_page_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:flutter_test/flutter_test.dart';

main() {
test(
'placeholder',
() {
expect(1 + 1, 2);
},
);
}
10 changes: 10 additions & 0 deletions test/unit_tests/screens/statistics_page_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:flutter_test/flutter_test.dart';

main() {
test(
'placeholder',
() {
expect(1 + 1, 2);
},
);
}
91 changes: 91 additions & 0 deletions test/unit_tests/widgets/uchu_drawer_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:get_it/get_it.dart';
import 'package:mocktail/mocktail.dart';
import 'package:uchu/services/navigation_service.dart';
import 'package:uchu/utilities/url_helper.dart';
import 'package:uchu/widgets/uchu_drawer.dart';

import '../../test_utils.dart';
import '../mocks.dart';

main() {
late NavigationService mockNavigationService;
late UrlHelper mockUrlHelper;

setUpAll(TestUtils.registerFallbackValues);

setUp(() async {
await GetIt.instance.reset();

mockNavigationService = MockNavigationService();
mockUrlHelper = MockUrlHelper();

when(() => mockNavigationService.pushSettingsPage(any())).thenAnswer(
(invocation) async {},
);

when(() => mockNavigationService.pushStatisticsPage(any())).thenAnswer(
(invocation) async {},
);

when(() => mockUrlHelper.launchUrl(any())).thenAnswer(
(invocation) async => true,
);

GetIt.instance.registerSingleton<NavigationService>(mockNavigationService);
GetIt.instance.registerSingleton<UrlHelper>(mockUrlHelper);
});

testWidgets(
'Tapping "Settings" pushes the settings page',
(widgetTester) async {
await widgetTester.pumpWidget(
const MaterialApp(
home: UchuDrawer(),
),
);

await widgetTester.pumpAndSettle();

await widgetTester.tap(find.text('Settings'));

verify(() => mockNavigationService.pushSettingsPage(any())).called(1);
},
);

testWidgets(
'Tapping "Statistics" pushes the statistics page',
(widgetTester) async {
await widgetTester.pumpWidget(
const MaterialApp(
home: UchuDrawer(),
),
);

await widgetTester.pumpAndSettle();

await widgetTester.tap(find.text('Statistics'));

verify(() => mockNavigationService.pushStatisticsPage(any())).called(1);
},
);

testWidgets(
'Tapping "Bug Report/Feature Request" launches the Uchu GitHub issues page',
(widgetTester) async {
await widgetTester.pumpWidget(
const MaterialApp(
home: UchuDrawer(),
),
);

await widgetTester.pumpAndSettle();

await widgetTester.tap(find.text('Bug Report/Feature Request'));

verify(() => mockUrlHelper
.launchUrl('https://github.com/ChopinDavid/uchu/issues')).called(1);
},
);
}

0 comments on commit fb62bf4

Please sign in to comment.