[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

+145
View File
@@ -0,0 +1,145 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:reelbox/data/models.dart';
import 'package:reelbox/ui/catalog.dart';
import 'package:reelbox/media/download_button.dart';
import 'package:reelbox/media/downloads_page.dart';
import 'catalog_widget_test.dart' show CatalogApi, mountCatalog;
void main() {
testWidgets(
'embedded sources are rejected without enqueue or external handoff',
(tester) async {
var dispatched = 0;
var navigations = 0;
final state = await mountCatalog(
tester,
CatalogApi(),
Scaffold(
body: DownloadButton(
title: const TitleRecord(id: 7, title: 'Movie'),
source: const MediaSource(
type: 'youtube',
url: 'https://youtu.be/fixture',
),
enqueue: ({required title, required source, episode}) async {
dispatched++;
},
openDownloads: (_) => navigations++,
),
),
);
addTearDown(state.dispose);
await tester.tap(find.text('Download in Reelbox'));
await tester.pumpAndSettle();
expect(dispatched, 0);
expect(navigations, 0);
expect(
find.textContaining('Embedded sources cannot be downloaded'),
findsOneWidget,
);
expect(tester.takeException(), isNull);
},
);
testWidgets('source cards label the internal Reelbox download action', (
tester,
) async {
final state = await mountCatalog(
tester,
CatalogApi(),
const TitlePage(title: TitleRecord(id: 7, title: 'Fixture')),
);
addTearDown(state.dispose);
expect(
find.widgetWithText(FilledButton, 'Download in Reelbox'),
findsWidgets,
);
});
testWidgets(
'enqueue failure shows its cause and allows retry without navigating',
(tester) async {
var attempts = 0;
var navigations = 0;
final state = await mountCatalog(
tester,
CatalogApi(),
Scaffold(
body: DownloadButton(
title: const TitleRecord(id: 7, title: 'Movie'),
source: const MediaSource(url: 'https://media.example/movie.mp4'),
enqueue: ({required title, required source, episode}) async {
attempts++;
throw StateError('HTTP 403: this media URL has expired.');
},
openDownloads: (_) => navigations++,
),
),
);
addTearDown(state.dispose);
await tester.tap(find.text('Download in Reelbox'));
await tester.pumpAndSettle();
expect(
find.textContaining('HTTP 403: this media URL has expired.'),
findsOneWidget,
);
expect(navigations, 0);
expect(tester.takeException(), isNull);
await tester.tap(find.text('Download in Reelbox'));
await tester.pump();
expect(attempts, 2);
},
);
testWidgets(
'selected episode queues once while starting then opens Downloads',
(tester) async {
const title = TitleRecord(id: 41, title: 'Series', type: 'serie');
const source = MediaSource(
id: 9,
quality: '720p',
url: 'https://media.example/episode.mp4',
);
const episode = EpisodeRecord(id: 52, title: 'Episode 2');
final pending = Completer<void>();
final dispatched = <(TitleRecord, MediaSource, EpisodeRecord?)>[];
final state = await mountCatalog(
tester,
CatalogApi(),
Scaffold(
body: DownloadButton(
title: title,
source: source,
episode: episode,
enqueue: ({required title, required source, episode}) {
dispatched.add((title, source, episode));
return pending.future;
},
),
),
);
addTearDown(state.dispose);
final button = find.widgetWithText(FilledButton, 'Download in Reelbox');
await tester.tap(button);
await tester.tap(button);
await tester.pump();
expect(dispatched, [(title, source, episode)]);
expect(
tester.widget<FilledButton>(find.byType(FilledButton)).onPressed,
isNull,
);
expect(find.byType(CircularProgressIndicator), findsOneWidget);
expect(find.byType(DownloadsPage), findsNothing);
pending.complete();
await tester.pumpAndSettle();
expect(find.byType(DownloadsPage), findsOneWidget);
expect(dispatched, hasLength(1));
expect(tester.takeException(), isNull);
},
variant: TargetPlatformVariant.only(TargetPlatform.linux),
);
}