feat(navigation): add go to album actions

This commit is contained in:
zarzet
2026-08-01 16:06:08 +07:00
parent 6a3a85f7c9
commit 645a324a5f
7 changed files with 254 additions and 22 deletions
+38 -19
View File
@@ -43,32 +43,37 @@ void main() {
id: id,
title: id == 'first' ? 'First' : 'Second',
artist: 'Artist',
album: 'Album',
duration: const Duration(minutes: 3),
extras: {'source': 'content://library/$id.flac'},
);
Future<void> pumpNowPlaying(WidgetTester tester) async {
tester.view.physicalSize = const Size(1080, 1920);
tester.view.devicePixelRatio = 1;
addTearDown(tester.view.resetPhysicalSize);
addTearDown(tester.view.resetDevicePixelRatio);
await tester.pumpWidget(
ProviderScope(
overrides: [
currentMediaItemProvider.overrideWith((ref) => mediaItems.stream),
playbackStateProvider.overrideWith((ref) => const Stream.empty()),
playQueueProvider.overrideWith((ref) => const Stream.empty()),
],
child: const MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: NowPlayingScreen(),
),
),
);
}
testWidgets(
'automatic SAF track change refreshes lyrics while Lyrics page is active',
(tester) async {
tester.view.physicalSize = const Size(1080, 1920);
tester.view.devicePixelRatio = 1;
addTearDown(tester.view.resetPhysicalSize);
addTearDown(tester.view.resetDevicePixelRatio);
await tester.pumpWidget(
ProviderScope(
overrides: [
currentMediaItemProvider.overrideWith((ref) => mediaItems.stream),
playbackStateProvider.overrideWith((ref) => const Stream.empty()),
playQueueProvider.overrideWith((ref) => const Stream.empty()),
],
child: const MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: NowPlayingScreen(),
),
),
);
await pumpNowPlaying(tester);
mediaItems.add(item('first'));
await tester.pumpAndSettle();
@@ -83,4 +88,18 @@ void main() {
expect(find.text('First lyric'), findsNothing);
},
);
testWidgets('Now Playing menu exposes Go to Album when album is known', (
tester,
) async {
await pumpNowPlaying(tester);
mediaItems.add(item('first'));
await tester.pumpAndSettle();
await tester.tap(find.byIcon(Icons.more_vert));
await tester.pumpAndSettle();
expect(find.text('Go to Album'), findsOneWidget);
expect(find.byIcon(Icons.album_outlined), findsOneWidget);
});
}
+39
View File
@@ -3,8 +3,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:spotiflac_android/l10n/l10n.dart';
import 'package:spotiflac_android/models/settings.dart';
import 'package:spotiflac_android/models/track.dart';
import 'package:spotiflac_android/providers/library_collections_provider.dart';
import 'package:spotiflac_android/providers/music_player_provider.dart';
import 'package:spotiflac_android/providers/settings_provider.dart';
import 'package:spotiflac_android/widgets/preview_button.dart';
import 'package:spotiflac_android/widgets/track_collection_quick_actions.dart';
@@ -84,4 +87,40 @@ void main() {
expectCenteredHitbox(tester, Icons.more_vert);
});
testWidgets('track options expose Go to Album for album tracks', (
tester,
) async {
await tester.pumpWidget(
ProviderScope(
overrides: [
settingsProvider.overrideWith(_TestSettingsNotifier.new),
libraryCollectionsProvider.overrideWith(
_TestLibraryCollectionsNotifier.new,
),
],
child: const MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: Scaffold(body: TrackCollectionQuickActions(track: track)),
),
),
);
await tester.tap(find.byIcon(Icons.more_vert));
await tester.pumpAndSettle();
expect(find.text('Go to Album'), findsOneWidget);
expect(find.byIcon(Icons.album_outlined), findsOneWidget);
});
}
class _TestSettingsNotifier extends SettingsNotifier {
@override
AppSettings build() => const AppSettings();
}
class _TestLibraryCollectionsNotifier extends LibraryCollectionsNotifier {
@override
LibraryCollectionsState build() => LibraryCollectionsState(isLoaded: true);
}