From 7a611d4c4fec7fef7fa8ab4a02fcf3c31927a2a0 Mon Sep 17 00:00:00 2001 From: daniel-michel <65034538+daniel-michel@users.noreply.github.com> Date: Thu, 16 Nov 2023 15:07:33 +0100 Subject: [PATCH] tests: add widget tests --- test/view/home_page_test.dart | 25 ++++++++++ test/view/movie_item_test.dart | 62 +++++++++++++++++++++++++ test/view/movie_list_test.dart | 34 ++++++++++++++ test/view/movie_manager_list_test.dart | 64 ++++++++++++++++++++++++++ 4 files changed, 185 insertions(+) create mode 100644 test/view/home_page_test.dart create mode 100644 test/view/movie_item_test.dart create mode 100644 test/view/movie_list_test.dart create mode 100644 test/view/movie_manager_list_test.dart diff --git a/test/view/home_page_test.dart b/test/view/home_page_test.dart new file mode 100644 index 0000000..ee78a19 --- /dev/null +++ b/test/view/home_page_test.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:release_schedule/api/movie_api.dart'; +import 'package:release_schedule/main.dart'; +import 'package:release_schedule/model/local_movie_storage.dart'; +import 'package:release_schedule/model/movie_manager.dart'; +import 'package:release_schedule/view/movie_manager_list.dart'; + +void main() { + group('HomePage', () { + testWidgets('displays title', (WidgetTester tester) async { + MovieManager movieManager = MovieManager(MovieApi(), LocalMovieStorage()); + await tester.pumpWidget(MaterialApp(home: HomePage(movieManager))); + + expect(find.text('Release Schedule'), findsOneWidget); + }); + + testWidgets('displays list of releases', (WidgetTester tester) async { + MovieManager movieManager = MovieManager(MovieApi(), LocalMovieStorage()); + await tester.pumpWidget(MaterialApp(home: HomePage(movieManager))); + + expect(find.byType(MovieManagerList), findsOneWidget); + }); + }); +} diff --git a/test/view/movie_item_test.dart b/test/view/movie_item_test.dart new file mode 100644 index 0000000..d187492 --- /dev/null +++ b/test/view/movie_item_test.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:release_schedule/model/date_format.dart'; +import 'package:release_schedule/model/movie.dart'; +import 'package:release_schedule/view/movie_item.dart'; + +void main() { + testWidgets('MovieItem displays movie data', (WidgetTester 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.text('Test Movie'), findsOneWidget); + + final formattedDate = movie.releaseDate.toString(); + expect(find.textContaining(formattedDate), findsOneWidget); + + expect(find.textContaining('Action, Adventure'), findsOneWidget); + }); + + testWidgets('should update when the movie is modified', (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.text('Test Movie'), findsOneWidget); + + movie.setDetails( + genres: ['Action', 'Adventure', 'Comedy'], + ); + + await tester.pump(); + + expect(find.textContaining('Action, Adventure, Comedy'), findsOneWidget); + }); +} diff --git a/test/view/movie_list_test.dart b/test/view/movie_list_test.dart new file mode 100644 index 0000000..473b695 --- /dev/null +++ b/test/view/movie_list_test.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:release_schedule/model/movie.dart'; +import 'package:release_schedule/view/movie_item.dart'; +import 'package:release_schedule/view/movie_list.dart'; + +void main() { + group('MovieList', () { + testWidgets('should render a 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), + ), + ), + ); + + expect(find.byType(MovieItem), findsNWidgets(movies.length)); + }); + }); +} diff --git a/test/view/movie_manager_list_test.dart b/test/view/movie_manager_list_test.dart new file mode 100644 index 0000000..525340d --- /dev/null +++ b/test/view/movie_manager_list_test.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:release_schedule/api/movie_api.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/view/movie_item.dart'; +import 'package:release_schedule/view/movie_list.dart'; +import 'package:release_schedule/view/movie_manager_list.dart'; + +void main() { + group('MovieManagerList', () { + testWidgets('displays movie list', (tester) async { + final manager = MovieManager(MovieApi(), LocalMovieStorage()); + manager.addMovies([ + MovieData( + 'Movie 1', + DateWithPrecisionAndCountry( + DateTime.now(), DatePrecision.day, 'US')), + MovieData( + 'Movie 2', + DateWithPrecisionAndCountry( + DateTime.now(), DatePrecision.day, 'US')), + ]); + // pump the delay until the change is written to the cache, so no timers run when the test finishes + await tester.pump(const Duration(seconds: 5)); + + await tester.pumpWidget( + MaterialApp(home: Scaffold(body: MovieManagerList(manager)))); + + expect(find.byType(LinearProgressIndicator), findsNothing); + expect(find.byType(MovieList), findsOneWidget); + }); + + testWidgets('updates when new movies are added', (tester) async { + final manager = MovieManager(MovieApi(), LocalMovieStorage()); + manager.addMovies([ + MovieData( + 'Movie 1', + DateWithPrecisionAndCountry( + DateTime.now(), DatePrecision.day, 'US')), + MovieData( + 'Movie 2', + DateWithPrecisionAndCountry( + DateTime.now(), DatePrecision.day, 'US')), + ]); + + await tester.pumpWidget( + MaterialApp(home: Scaffold(body: MovieManagerList(manager)))); + + manager.addMovies([ + MovieData( + 'Movie 3', + DateWithPrecisionAndCountry( + DateTime.now(), DatePrecision.day, 'US')), + ]); + // pump the delay until the change is written to the cache, so no timers run when the test finishes + await tester.pump(const Duration(seconds: 5)); + + expect(find.byType(MovieList), findsOneWidget); + expect(find.byType(MovieItem), findsNWidgets(3)); + }); + }); +}