Files
reelbox/test/ui_computation_regression_test.dart
T

70 lines
3.3 KiB
Dart

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<Image>(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 = <int>[];
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<String> && (w.key! as ValueKey<String>).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());
});
}
}