@Tags(['drift']) library; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:minstrel/library/widgets/album_card.dart'; import 'package:minstrel/library/widgets/track_row.dart'; import 'package:minstrel/models/album.dart'; import 'package:minstrel/models/track.dart'; import 'package:minstrel/theme/theme_data.dart'; // Same drift-cohort skip as the rest. TrackRow now contains // CachedIndicator (ConsumerWidget), which reads // audioCacheManagerProvider → constructs AppDb → drift_flutter calls // driftDatabase() → libsqlite3.so isn't on the runner. Open a real // async chain that leaves a pending timer at test teardown. // See Fable #399. const _skipDrift = true; void main() { testWidgets('AlbumCard renders title and artist', (tester) async { await tester.pumpWidget(MaterialApp( theme: buildThemeData(), home: Scaffold( body: AlbumCard( album: const AlbumRef( id: 'a', title: 'Geogaddi', artistId: 'x', artistName: 'Boards of Canada', ), onTap: () {}, ), ), )); expect(find.text('Geogaddi'), findsOneWidget); expect(find.text('Boards of Canada'), findsOneWidget); }); testWidgets('TrackRow shows mm:ss duration', skip: _skipDrift, (tester) async { // TrackRow now contains CachedIndicator (ConsumerWidget) so a // ProviderScope is required at the root. await tester.pumpWidget(ProviderScope( child: MaterialApp( theme: buildThemeData(), home: Scaffold( body: TrackRow( track: const TrackRef( id: 't', title: 'Roygbiv', albumId: 'a', artistId: 'x', durationSec: 137, trackNumber: 4, ), onTap: () {}, ), ), ), )); expect(find.text('02:17'), findsOneWidget); }); }