| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- import 'package:cardash_launcher/core/theme/app_theme.dart';
- import 'package:cardash_launcher/data/models/jellyfin_library.dart';
- import 'package:cardash_launcher/data/models/jellyfin_models.dart';
- import 'package:cardash_launcher/data/repositories/settings_repository.dart';
- import 'package:cardash_launcher/data/services/jellyfin_service.dart';
- import 'package:cardash_launcher/data/services/secure_store.dart';
- import 'package:cardash_launcher/features/settings/jellyfin_controller.dart';
- import 'package:cardash_launcher/features/settings/jellyfin_settings_card.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter_test/flutter_test.dart';
- import 'package:provider/provider.dart';
- import 'package:shared_preferences/shared_preferences.dart';
- class _MemoryStore implements SecureStore {
- final values = <String, String>{};
- @override
- Future<String?> read(String key) async => values[key];
- @override
- Future<void> write(String key, String value) async {
- values[key] = value;
- }
- @override
- Future<void> delete(String key) async {
- values.remove(key);
- }
- }
- class _FakeGateway implements JellyfinGateway {
- @override
- Future<JellyfinServerInfo> serverInfo(Uri baseUrl) async {
- return const JellyfinServerInfo(name: 'DarkTower', version: '12.2.0');
- }
- @override
- Future<JellyfinQuickConnect> startQuickConnect(
- Uri baseUrl, {
- required String deviceId,
- }) async {
- return const JellyfinQuickConnect(code: '491006', secret: 'secret');
- }
- @override
- Future<bool> isQuickConnectApproved(Uri baseUrl, String secret) async {
- return false;
- }
- @override
- Future<JellyfinSession> authenticateQuickConnect(
- Uri baseUrl,
- String secret, {
- required String deviceId,
- }) async {
- return const JellyfinSession(
- accessToken: 'token-1',
- userId: 'user-1',
- userName: 'wasp',
- );
- }
- @override
- Future<JellyfinUser> currentUser(Uri baseUrl, String token) async {
- return const JellyfinUser(id: 'user-1', name: 'wasp');
- }
- @override
- void close() {}
- }
- void main() {
- testWidgets(
- 'Jellyfin card shows the URL field, then the Quick Connect code',
- (tester) async {
- await tester.binding.setSurfaceSize(const Size(900, 700));
- addTearDown(() => tester.binding.setSurfaceSize(null));
- SharedPreferences.setMockInitialValues({});
- final prefs = await SharedPreferences.getInstance();
- final controller = JellyfinController(
- SettingsRepository(prefs),
- _FakeGateway(),
- _MemoryStore(),
- pollInterval: const Duration(milliseconds: 10),
- pairingLifetime: const Duration(seconds: 30),
- );
- addTearDown(controller.dispose);
- await controller.initialize();
- await tester.pumpWidget(
- MaterialApp(
- theme: AppTheme.light(),
- home: ChangeNotifierProvider<JellyfinController>.value(
- value: controller,
- child: const Scaffold(
- body: SizedBox(
- width: 720,
- child: Padding(
- padding: EdgeInsets.all(24),
- child: JellyfinSettingsCard(),
- ),
- ),
- ),
- ),
- ),
- );
- await tester.pumpAndSettle();
- expect(find.text('Jellyfin'), findsOneWidget);
- expect(find.text('Off'), findsOneWidget);
- expect(find.text('Server URL'), findsNothing);
- await tester.tap(find.byType(Switch));
- await tester.pumpAndSettle();
- expect(find.text('Server URL'), findsOneWidget);
- expect(find.text('Connect'), findsOneWidget);
- expect(find.text('Streaming quality'), findsOneWidget);
- expect(find.text('Direct'), findsOneWidget);
- await tester.tap(find.text('Direct'));
- await tester.pumpAndSettle();
- await tester.tap(find.text('320 kbps').last);
- await tester.pumpAndSettle();
- expect(controller.audioQuality, JellyfinAudioQuality.kbps320);
- expect(find.text('320 kbps'), findsOneWidget);
- await tester.enterText(find.byType(TextField), 'jellyfin.example.com');
- await tester.tap(find.text('Connect'));
- await tester.pump();
- await tester.pump(const Duration(milliseconds: 20));
- expect(find.text('Quick Connect code'), findsOneWidget);
- expect(find.text('491006'), findsOneWidget);
- expect(find.text('Waiting for approval'), findsOneWidget);
- expect(tester.takeException(), isNull);
- controller.cancelPairing();
- await tester.pump();
- },
- );
- }
|