test: more testing of the home page, MovieItem, MovieList

test: add testing for MoviePage
fix: remove global accidentally used instance of movie manager
main
daniel-michel 2024-01-09 21:52:32 +01:00
parent 57708bc894
commit be11dc040c
8 changed files with 272 additions and 14 deletions

View File

@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:release_schedule/api/wikidata_movie_api.dart';
import 'package:release_schedule/model/dates.dart'; import 'package:release_schedule/model/dates.dart';
import 'package:release_schedule/model/live_search.dart'; import 'package:release_schedule/model/live_search.dart';
import 'package:release_schedule/model/local_movie_storage.dart';
import 'package:release_schedule/model/movie_manager.dart'; import 'package:release_schedule/model/movie_manager.dart';
import 'package:release_schedule/view/movie_item.dart'; import 'package:release_schedule/view/movie_item.dart';
import 'package:release_schedule/view/movie_manager_list.dart'; import 'package:release_schedule/view/movie_manager_list.dart';
@ -30,7 +32,10 @@ class MyApp extends StatelessWidget {
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange),
useMaterial3: true, useMaterial3: true,
), ),
home: HomePage(movieManager), home: HomePage(
MovieManager(WikidataMovieApi(),
LocalMovieStorageGetStorage(WikidataMovieData.fromEncodable)),
),
); );
} }
} }

View File

@ -42,8 +42,7 @@ class LiveSearch extends ChangeNotifier {
searchingOnline = true; searchingOnline = true;
try { try {
String startedSearching = searchTerm; String startedSearching = searchTerm;
List<MovieData> onlineResults = List<MovieData> onlineResults = await manager.onlineSearch(searchTerm);
await movieManager.onlineSearch(searchTerm);
searchingOnline = false; searchingOnline = false;
// if the search term has changed since we started searching, ignore the results // if the search term has changed since we started searching, ignore the results
if (startedSearching != searchTerm) { if (startedSearching != searchTerm) {

View File

@ -2,15 +2,11 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:release_schedule/api/movie_api.dart'; import 'package:release_schedule/api/movie_api.dart';
import 'package:release_schedule/api/wikidata_movie_api.dart';
import 'package:release_schedule/model/delayed_function_caller.dart'; import 'package:release_schedule/model/delayed_function_caller.dart';
import 'package:release_schedule/model/local_movie_storage.dart'; import 'package:release_schedule/model/local_movie_storage.dart';
import 'package:release_schedule/model/movie.dart'; import 'package:release_schedule/model/movie.dart';
import 'package:release_schedule/model/search.dart'; import 'package:release_schedule/model/search.dart';
final movieManager = MovieManager(WikidataMovieApi(),
LocalMovieStorageGetStorage(WikidataMovieData.fromEncodable));
class MovieManager extends ChangeNotifier { class MovieManager extends ChangeNotifier {
final List<MovieData> movies = List.empty(growable: true); final List<MovieData> movies = List.empty(growable: true);
final LocalMovieStorage cache; final LocalMovieStorage cache;

View File

@ -150,7 +150,8 @@ class GroupedList<GroupType> extends StatelessWidget {
List<({int index, GroupType group})> newGroupStarts = [ List<({int index, GroupType group})> newGroupStarts = [
(index: 0, group: groupBy(0)) (index: 0, group: groupBy(0))
]; ];
int internalInitialScrollIndex = initialScrollIndex + 1; int internalInitialScrollIndex =
initialScrollIndex + (initialScrollIndex > 0 ? 1 : 0);
GroupType last = newGroupStarts[0].group; GroupType last = newGroupStarts[0].group;
for (int i = 1; i < itemCount; i++) { for (int i = 1; i < itemCount; i++) {
final GroupType current = groupBy(i); final GroupType current = groupBy(i);

View File

@ -2,26 +2,62 @@ import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:release_schedule/api/movie_api.dart'; import 'package:release_schedule/api/movie_api.dart';
import 'package:release_schedule/main.dart'; import 'package:release_schedule/main.dart';
import 'package:release_schedule/model/dates.dart';
import 'package:release_schedule/model/local_movie_storage.dart'; import 'package:release_schedule/model/local_movie_storage.dart';
import 'package:release_schedule/model/movie.dart';
import 'package:release_schedule/model/movie_manager.dart'; import 'package:release_schedule/model/movie_manager.dart';
import 'package:release_schedule/view/movie_manager_list.dart'; import 'package:release_schedule/view/movie_manager_list.dart';
void main() { void main() {
group('HomePage', () { group('HomePage', () {
testWidgets('displays title', (WidgetTester tester) async { late LocalMovieStorage storage;
MovieManager movieManager =
MovieManager(MovieApi(), InMemoryMovieStorage());
await tester.pumpWidget(MaterialApp(home: HomePage(movieManager)));
setUp(() {
storage = InMemoryMovieStorage();
storage.update([
MovieData(
'The Shawshank Redemption',
DateWithPrecisionAndCountry(
DateTime(1994, 9, 22), DatePrecision.day, 'US'),
),
MovieData(
'The Godfather',
DateWithPrecisionAndCountry(
DateTime(1972, 3, 24), DatePrecision.day, 'US'),
),
MovieData(
'The Dark Knight',
DateWithPrecisionAndCountry(
DateTime(2008, 7, 18), DatePrecision.day, 'US'),
),
]);
});
testWidgets('displays search bar', (WidgetTester tester) async {
MovieManager movieManager = MovieManager(MovieApi(), storage);
await tester.pumpWidget(MaterialApp(home: HomePage(movieManager)));
await tester.pump(const Duration(seconds: 3));
expect(find.text('Search'), findsOneWidget); expect(find.text('Search'), findsOneWidget);
}); });
testWidgets('displays list of releases', (WidgetTester tester) async { testWidgets('displays list of releases', (WidgetTester tester) async {
MovieManager movieManager = MovieManager movieManager = MovieManager(MovieApi(), storage);
MovieManager(MovieApi(), InMemoryMovieStorage());
await tester.pumpWidget(MaterialApp(home: HomePage(movieManager))); await tester.pumpWidget(MaterialApp(home: HomePage(movieManager)));
await tester.pump(const Duration(seconds: 3));
expect(find.byType(MovieManagerList), findsOneWidget); expect(find.byType(MovieManagerList), findsOneWidget);
}); });
testWidgets('displays search results', (WidgetTester tester) async {
MovieManager movieManager = MovieManager(MovieApi(), storage);
await tester.pumpWidget(MaterialApp(home: HomePage(movieManager)));
await tester.enterText(
find.byType(TextField), 'The Shawshank Redemption');
await tester.pump(const Duration(seconds: 3));
await tester.pumpAndSettle();
expect(find.text('The Shawshank Redemption'), findsNWidgets(2));
});
}); });
} }

View File

@ -3,6 +3,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:release_schedule/model/dates.dart'; import 'package:release_schedule/model/dates.dart';
import 'package:release_schedule/model/movie.dart'; import 'package:release_schedule/model/movie.dart';
import 'package:release_schedule/view/movie_item.dart'; import 'package:release_schedule/view/movie_item.dart';
import 'package:release_schedule/view/movie_page.dart';
void main() { void main() {
testWidgets('MovieItem displays movie data', (WidgetTester tester) async { testWidgets('MovieItem displays movie data', (WidgetTester tester) async {
@ -56,4 +57,88 @@ void main() {
expect(find.textContaining('Action, Adventure, Comedy'), findsOneWidget); expect(find.textContaining('Action, Adventure, Comedy'), findsOneWidget);
}); });
testWidgets('should update when the movie is bookmarked', (tester) async {
final movie = MovieData(
'Test Movie',
DateWithPrecisionAndCountry(
DateTime(2023, 1, 1), DatePrecision.day, 'US'),
);
movie.setDetails(
genres: ['Action', 'Adventure'],
);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MovieItem(movie),
),
),
);
expect(find.byIcon(Icons.bookmark_border), findsOneWidget);
movie.setDetails(
bookmarked: true,
);
await tester.pump();
expect(find.byIcon(Icons.bookmark_added), findsOneWidget);
});
testWidgets("should update the bookmark state when the icon is tapped",
(tester) async {
final movie = MovieData(
'Test Movie',
DateWithPrecisionAndCountry(
DateTime(2023, 1, 1), DatePrecision.day, 'US'),
);
movie.setDetails(
genres: ['Action', 'Adventure'],
);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MovieItem(movie),
),
),
);
expect(find.byIcon(Icons.bookmark_border), findsOneWidget);
await tester.tap(find.byIcon(Icons.bookmark_outline));
await tester.pump();
expect(find.byIcon(Icons.bookmark_added), findsOneWidget);
});
testWidgets("should navigate to MoviePage when tapped", (tester) async {
final movie = MovieData(
'Test Movie',
DateWithPrecisionAndCountry(
DateTime(2023, 1, 1), DatePrecision.day, 'US'),
);
movie.setDetails(
genres: ['Action', 'Adventure'],
);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MovieItem(movie),
),
),
);
expect(find.byIcon(Icons.bookmark_border), findsOneWidget);
await tester.tap(find.byType(ListTile));
await tester.pumpAndSettle();
expect(find.byType(MoviePage), findsOneWidget);
});
} }

View File

@ -33,5 +33,36 @@ void main() {
expect(find.byType(MovieItem), findsNWidgets(movies.length)); expect(find.byType(MovieItem), findsNWidgets(movies.length));
}); });
testWidgets("should filter the list of movies",
(WidgetTester tester) async {
final movies = [
MovieData(
'The Shawshank Redemption',
DateWithPrecisionAndCountry(
DateTime(1994, 9, 22), DatePrecision.day, 'US'),
),
MovieData(
'The Godfather',
DateWithPrecisionAndCountry(
DateTime(1972, 3, 24), DatePrecision.day, 'US'),
),
];
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MovieList(
movies,
filter: (movie) => movie.title.contains('Godfather'),
),
),
),
);
await tester.pumpAndSettle();
expect(find.byType(MovieItem), findsOneWidget);
});
}); });
} }

View File

@ -0,0 +1,105 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:release_schedule/model/dates.dart';
import 'package:release_schedule/model/movie.dart';
import 'package:release_schedule/view/movie_page.dart';
void main() {
group('MoviePage', () {
testWidgets('should render the movie details', (WidgetTester tester) async {
final movie = MovieData(
'The Shawshank Redemption',
DateWithPrecisionAndCountry(
DateTime(1994, 9, 22), DatePrecision.day, 'US'),
);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MoviePage(movie),
),
),
);
await tester.pumpAndSettle();
expect(find.text(movie.title), findsAtLeastNWidgets(1));
});
testWidgets('should bookmark the movie', (WidgetTester tester) async {
final movie = MovieData(
'The Shawshank Redemption',
DateWithPrecisionAndCountry(
DateTime(1994, 9, 22), DatePrecision.day, 'US'),
);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MoviePage(movie),
),
),
);
await tester.pumpAndSettle();
expect(movie.bookmarked, isFalse);
await tester.tap(find.byIcon(Icons.bookmark_outline));
await tester.pumpAndSettle();
expect(movie.bookmarked, isTrue);
});
});
testWidgets("should display the movie's genres", (WidgetTester tester) async {
final movie = MovieData(
'The Shawshank Redemption',
DateWithPrecisionAndCountry(
DateTime(1994, 9, 22), DatePrecision.day, 'US'),
)..setDetails(genres: ['Drama']);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MoviePage(movie),
),
),
);
await tester.pumpAndSettle();
expect(find.text('Drama'), findsOneWidget);
});
testWidgets("should display the movie's titles and release dates",
(WidgetTester tester) async {
final movie = MovieData(
'The Shawshank Redemption',
DateWithPrecisionAndCountry(
DateTime(1994, 9, 22), DatePrecision.day, 'US'),
)..setDetails(
titles: [(title: 'The Shawshank Redemption', language: 'en')],
releaseDates: [
DateWithPrecisionAndCountry(
DateTime(1994, 9, 22), DatePrecision.day, 'US')
],
);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: MoviePage(movie),
),
),
);
await tester.pumpAndSettle();
expect(find.text('en'), findsOneWidget);
expect(find.text('The Shawshank Redemption'), findsNWidgets(2));
expect(find.text('US'), findsOneWidget);
expect(find.textContaining('1994'), findsOneWidget);
});
}