test: more testing of the home page, MovieItem, MovieList
test: add testing for MoviePage fix: remove global accidentally used instance of movie managermain
parent
57708bc894
commit
be11dc040c
|
@ -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)),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue