import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:reelbox/data/api_service.dart'; import 'package:reelbox/state/app_state.dart'; import 'package:reelbox/ui/catalog.dart'; import 'package:reelbox/ui/common.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'api_service_test.dart' show StubAdapter, jsonBody; void main() { testWidgets('artwork decodes at constrained thumbnail width, not fallback width', (tester) async { await tester.pumpWidget(const MaterialApp(home: MediaQuery( data: MediaQueryData(devicePixelRatio: 2), child: Center(child: SizedBox(width: 62, height: 88, child: MediaArtwork(url: 'https://example.test/poster.jpg'), )), ))); final image = tester.widget(find.byType(Image)); final provider = image.image as ResizeImage; debugPrint('UI_WORK artwork decodeWidth=${provider.width} target=124'); expect(provider.width, 124); expect(tester.getSize(find.byType(MediaArtwork)), const Size(62, 88)); await tester.pumpWidget(const SizedBox()); }); for (final compact in [false, true]) { testWidgets('paged catalogue builds only nearby ${compact ? 'rows' : 'posters'}', (tester) async { tester.view.physicalSize = const Size(390, 844); tester.view.devicePixelRatio = 1; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); SharedPreferences.setMockInitialValues({}); final pages = []; final adapter = StubAdapter((request) { if (request.uri.path.contains('/all/')) return jsonBody([]); final page = int.parse(request.uri.pathSegments[7]); pages.add(page); return jsonBody(page == 0 ? List.generate(160, (i) => { 'id': i + 1, 'type': 'movie', 'title': 'Fixture ${i + 1}', }) : []); }); final state = AppState(api: ApiService(dio: Dio()..httpClientAdapter = adapter)); await state.updateSettings(state.prefs.copyWith(compactCatalog: compact)); addTearDown(state.dispose); await tester.pumpWidget(AppScope(state: state, child: const MaterialApp(home: BrowsePage(initialCountry: 9)))); await tester.pumpAndSettle(); final visibleRows = compact ? find.byWidgetPredicate((w) => w.key is ValueKey && (w.key! as ValueKey).value.startsWith('compact-title-row:')) : find.byType(PosterCard); final initialCount = visibleRows.evaluate().length; debugPrint('UI_WORK paged compact=$compact initial=$initialCount total=160'); expect(initialCount, greaterThan(0)); expect(initialCount, lessThan(24), reason: 'offscreen titles must not be laid out eagerly'); expect(find.text('Fixture 160'), findsNothing); expect(pages, [0]); final scrollable = find.byType(Scrollable).last; await tester.scrollUntilVisible(find.text('Fixture 160'), 650, scrollable: scrollable, maxScrolls: 100); await tester.ensureVisible(find.text('Fixture 160')); await tester.pumpAndSettle(); expect(find.text('Fixture 160'), findsOneWidget); expect(pages, [0, 1]); debugPrint('UI_WORK paged compact=$compact end=${visibleRows.evaluate().length} pages=$pages'); expect(visibleRows.evaluate().length, lessThan(24)); await tester.pumpWidget(const SizedBox()); }); } }