From 17ff69780d69f1beab6247bc205adb23365b5c88 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sat, 9 May 2026 11:40:46 -0400 Subject: [PATCH] test(flutter/home): cover new home parity layout Expands the existing single test into four cases: - 4 placeholder cards in Playlists row when no system playlists exist - Empty-state copy for each section verbatim against the strings in HomeScreen - Real For-You card renders with the system badge when present - Existing rollups (Recently added / Rediscover) still render correctly alongside the new providers Co-Authored-By: Claude Opus 4.7 (1M context) --- .../test/library/home_screen_test.dart | 107 +++++++++++++++++- 1 file changed, 104 insertions(+), 3 deletions(-) diff --git a/flutter_client/test/library/home_screen_test.dart b/flutter_client/test/library/home_screen_test.dart index a74c373f..45e0e27f 100644 --- a/flutter_client/test/library/home_screen_test.dart +++ b/flutter_client/test/library/home_screen_test.dart @@ -2,16 +2,110 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:minstrel/api/endpoints/playlists.dart'; import 'package:minstrel/library/home_screen.dart'; import 'package:minstrel/library/library_providers.dart'; import 'package:minstrel/models/album.dart'; import 'package:minstrel/models/artist.dart'; import 'package:minstrel/models/home_data.dart'; +import 'package:minstrel/models/playlist.dart'; +import 'package:minstrel/models/system_playlists_status.dart'; +import 'package:minstrel/playlists/playlists_provider.dart'; import 'package:minstrel/theme/theme_data.dart'; +const _emptyHome = HomeData( + recentlyAddedAlbums: [], + rediscoverAlbums: [], + rediscoverArtists: [], + mostPlayedTracks: [], + lastPlayedArtists: [], +); + void main() { - testWidgets('home renders sections with rows', (tester) async { - const fixture = HomeData( + testWidgets('renders 4 placeholder cards in Playlists row when no system playlists exist', + (tester) async { + await tester.pumpWidget(ProviderScope( + overrides: [ + homeProvider.overrideWith((ref) async => _emptyHome), + playlistsListProvider('all').overrideWith( + (ref) async => PlaylistsList.empty(), + ), + systemPlaylistsStatusProvider.overrideWith( + (ref) async => SystemPlaylistsStatus.empty(), + ), + ], + child: MaterialApp(theme: buildThemeData(), home: const HomeScreen()), + )); + await tester.pumpAndSettle(); + // For-You placeholder + 3 Songs-like placeholders. + expect(find.text('For You'), findsOneWidget); + expect(find.text('Songs like…'), findsNWidgets(3)); + }); + + testWidgets('renders empty-state copy for each section when home payload is empty', + (tester) async { + await tester.pumpWidget(ProviderScope( + overrides: [ + homeProvider.overrideWith((ref) async => _emptyHome), + playlistsListProvider('all').overrideWith( + (ref) async => PlaylistsList.empty(), + ), + systemPlaylistsStatusProvider.overrideWith( + (ref) async => SystemPlaylistsStatus.empty(), + ), + ], + child: MaterialApp(theme: buildThemeData(), home: const HomeScreen()), + )); + await tester.pumpAndSettle(); + expect( + find.text("Nothing added yet. Scan a folder via the server's config."), + findsOneWidget, + ); + expect( + find.text('No forgotten favourites yet. Like some albums or artists to fill this in.'), + findsOneWidget, + ); + expect(find.text('No plays to draw from. Listen to something.'), + findsOneWidget); + expect(find.text('No recent plays.'), findsOneWidget); + }); + + testWidgets('renders For-You card when system playlist exists', + (tester) async { + const forYou = Playlist( + id: 'fy', + userId: 'u1', + name: 'For You', + description: '', + isPublic: false, + systemVariant: 'for_you', + trackCount: 75, + coverUrl: '', + ownerUsername: 'alice', + createdAt: '2026-05-01T00:00:00Z', + updatedAt: '2026-05-01T00:00:00Z', + ); + await tester.pumpWidget(ProviderScope( + overrides: [ + homeProvider.overrideWith((ref) async => _emptyHome), + playlistsListProvider('all').overrideWith( + (ref) async => + const PlaylistsList(owned: [forYou], public: []), + ), + systemPlaylistsStatusProvider.overrideWith( + (ref) async => SystemPlaylistsStatus.empty(), + ), + ], + child: MaterialApp(theme: buildThemeData(), home: const HomeScreen()), + )); + await tester.pumpAndSettle(); + // The real card carries the playlist name + the "for you" badge. + expect(find.text('For You'), findsOneWidget); + expect(find.text('for you'), findsOneWidget); + }); + + testWidgets('renders home rollups when payload is non-empty', (tester) async { + const home = HomeData( recentlyAddedAlbums: [ AlbumRef(id: 'a', title: 'Geogaddi', artistId: 'x', artistName: 'BoC'), ], @@ -24,13 +118,20 @@ void main() { ); await tester.pumpWidget(ProviderScope( overrides: [ - homeProvider.overrideWith((ref) async => fixture), + homeProvider.overrideWith((ref) async => home), + playlistsListProvider('all').overrideWith( + (ref) async => PlaylistsList.empty(), + ), + systemPlaylistsStatusProvider.overrideWith( + (ref) async => SystemPlaylistsStatus.empty(), + ), ], child: MaterialApp(theme: buildThemeData(), home: const HomeScreen()), )); await tester.pumpAndSettle(); expect(find.text('Recently added'), findsOneWidget); expect(find.text('Geogaddi'), findsOneWidget); + expect(find.text('Rediscover'), findsOneWidget); expect(find.text('Aphex Twin'), findsOneWidget); }); }