[verified] Publish ReelBox source under GPLv3

This commit is contained in:
Hermes committed 2026-11-12 23:41:13 +00:00
commit db2b505ca3
445 files changed
+105274

No files matched your search

+109
View File
@@ -0,0 +1,109 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:reelbox/data/api_service.dart';
import 'package:reelbox/data/models.dart';
import 'package:reelbox/state/app_state.dart';
import 'package:reelbox/ui/common.dart';
Future<AppState> stateForTest() async {
SharedPreferences.setMockInitialValues({});
final state = AppState(api: ApiService());
await state.initialize(discover: false);
return state;
}
Widget host(AppState state, Widget child) => AppScope(
state: state,
child: MaterialApp(home: Scaffold(body: child)),
);
void main() {
const movie = TitleRecord(id: 1, title: 'A real film');
const promo = TitleRecord(id: 2, title: 'ملودی باکس');
const station = TitleRecord(
id: 3,
title: 'Old live station',
type: 'channel',
);
testWidgets(
'shared grids reject removed records even when API parsing is bypassed',
(tester) async {
final state = await stateForTest();
await tester.pumpWidget(
host(state, const PosterGrid(items: [movie, promo, station])),
);
expect(find.text('A real film'), findsOneWidget);
expect(find.text('ملودی باکس'), findsNothing);
expect(find.text('Old live station'), findsNothing);
await tester.pumpWidget(const SizedBox.shrink());
state.dispose();
},
);
testWidgets('a directly constructed removed poster never paints its label', (
tester,
) async {
final state = await stateForTest();
await tester.pumpWidget(
host(state, const SizedBox(height: 280, child: PosterCard(title: promo))),
);
expect(find.text('ملودی باکس'), findsNothing);
await tester.pumpWidget(const SizedBox.shrink());
state.dispose();
});
testWidgets('a promotional rail heading cannot reintroduce vendor content', (
tester,
) async {
final state = await stateForTest();
await tester.pumpWidget(
host(state, const PosterRail(title: 'نورتون', items: [movie])),
);
expect(find.text('نورتون'), findsNothing);
expect(find.byType(PosterCard), findsNothing);
await tester.pumpWidget(const SizedBox.shrink());
state.dispose();
});
testWidgets(
'compact preference renders usable rows rather than poster grids',
(tester) async {
final state = await stateForTest();
await state.updateSettings(state.prefs.copyWith(compactCatalog: true));
await tester.pumpWidget(host(state, const PosterGrid(items: [movie])));
expect(find.byType(GridView), findsNothing);
expect(
find.byKey(const ValueKey('compact-title-row:poster:1')),
findsOneWidget,
);
await tester.pumpWidget(const SizedBox.shrink());
state.dispose();
},
);
testWidgets('status messages have an explicit accessible dismiss action', (
tester,
) async {
final state = await stateForTest();
await tester.pumpWidget(
host(
state,
Builder(
builder: (context) => TextButton(
onPressed: () => toast(context, 'Saved locally'),
child: const Text('Show status'),
),
),
),
);
await tester.tap(find.text('Show status'));
await tester.pumpAndSettle();
final closeTooltip = MaterialLocalizations.of(
tester.element(find.byType(SnackBar)),
).closeButtonTooltip;
expect(find.byTooltip(closeTooltip), findsOneWidget);
await tester.tap(find.byTooltip(closeTooltip));
await tester.pumpAndSettle();
expect(find.text('Saved locally'), findsNothing);
await tester.pumpWidget(const SizedBox.shrink());
state.dispose();
});
}