YouTube-Tab: Server-User brauchen keine eigene Baka-Anmeldung mehr
Server-User (Dustin, Baka, Tinker) melden sich beim Öffnen des YouTube-Bereichs automatisch im Hintergrund mit ihren Navidrome- Zugangsdaten beim Baka-Konto an (BakaAuth.autoAnmelden) — die manuelle Anmeldung bleibt nur für Gäste sichtbar. Schlägt die Auto-Anmeldung fehl, gibt es einen Rückfallweg zur manuellen Anmeldung, statt den User auszusperren. Login-Buttons vergrößert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcDiyJdVRqh1TtJk5JiabX
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
f0313724d4
commit
f604dc7635
@@ -27,7 +27,9 @@ class _MemorySpeicher implements TokenSpeicher {
|
||||
}
|
||||
|
||||
Widget _wrap(BakaAuth auth,
|
||||
{required MeloDb db, required CategoryService categories}) {
|
||||
{required MeloDb db,
|
||||
required CategoryService categories,
|
||||
NavidromeService? navidrome}) {
|
||||
return MultiProvider(
|
||||
providers: [
|
||||
Provider<MeloDb>.value(value: db),
|
||||
@@ -45,7 +47,8 @@ Widget _wrap(BakaAuth auth,
|
||||
// Nur fürs Badge im Unterreiter-Kopf gebraucht (dienst.laeuft) — der
|
||||
// Download-Tab beobachtet ihn app-weit, unabhängig vom Unterreiter.
|
||||
ChangeNotifierProvider<DownloadService>(
|
||||
create: (_) => DownloadService(db: db, navidrome: NavidromeService()),
|
||||
create: (_) => DownloadService(
|
||||
db: db, navidrome: navidrome ?? NavidromeService()),
|
||||
),
|
||||
],
|
||||
child: const MaterialApp(home: Scaffold(body: DownloadsScreen())),
|
||||
@@ -79,6 +82,14 @@ void main() {
|
||||
});
|
||||
}
|
||||
|
||||
// _YouTubeBereich prüft beim Öffnen per NavidromeService.
|
||||
// ladeGespeicherteZugangsdaten(), ob ein Server-User verbunden ist — ohne
|
||||
// diese Antwort bleibt der Aufruf im Test unbeantwortet hängen.
|
||||
messenger.setMockMethodCallHandler(
|
||||
const MethodChannel('plugins.it_nomads.com/flutter_secure_storage'),
|
||||
(call) async => null,
|
||||
);
|
||||
|
||||
late MeloDb db;
|
||||
late CategoryService categories;
|
||||
|
||||
@@ -196,4 +207,67 @@ void main() {
|
||||
|
||||
expect(find.byType(DropdownButtonFormField<String>), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'Server-User sieht das Adressfeld sofort, ohne Baka-Anmeldung',
|
||||
(tester) async {
|
||||
final auth = BakaAuth(
|
||||
client: MockClient(
|
||||
(_) async => http.Response(jsonEncode({'token': 'jwt'}), 200)),
|
||||
speicher: _MemorySpeicher(),
|
||||
);
|
||||
final nav = NavidromeService()
|
||||
..setCredentials('https://musik.baka-net.de', 'Baka', 'geheim');
|
||||
|
||||
await tester.pumpWidget(_wrap(auth,
|
||||
db: db, categories: categories, navidrome: nav));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Beim Baka-Konto anmelden'), findsNothing);
|
||||
expect(find.text('Angemeldet als Baka'), findsNothing);
|
||||
expect(find.text('YouTube-Adresse'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'Server-User bekommt bei fehlgeschlagener Auto-Anmeldung einen '
|
||||
'Rückfallweg zur manuellen Anmeldung', (tester) async {
|
||||
final auth = BakaAuth(
|
||||
client: MockClient((_) async => http.Response('', 500)),
|
||||
speicher: _MemorySpeicher());
|
||||
final nav = NavidromeService()
|
||||
..setCredentials('https://musik.baka-net.de', 'Baka', 'falsch');
|
||||
|
||||
await tester.pumpWidget(_wrap(auth,
|
||||
db: db, categories: categories, navidrome: nav));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Beim Baka-Konto anmelden'), findsOneWidget);
|
||||
expect(find.text('YouTube-Adresse'), findsNothing);
|
||||
expect(
|
||||
find.textContaining('automatische Anmeldung hat nicht geklappt'),
|
||||
findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'Server-User meldet sich im Hintergrund mit denselben Zugangsdaten '
|
||||
'beim Baka-Konto an', (tester) async {
|
||||
String? gesendeterBenutzer;
|
||||
final auth = BakaAuth(
|
||||
client: MockClient((request) async {
|
||||
final body = jsonDecode(request.body) as Map<String, dynamic>;
|
||||
gesendeterBenutzer = body['username'] as String?;
|
||||
return http.Response(jsonEncode({'token': 'jwt'}), 200);
|
||||
}),
|
||||
speicher: _MemorySpeicher(),
|
||||
);
|
||||
final nav = NavidromeService()
|
||||
..setCredentials('https://musik.baka-net.de', 'Tinker', 'geheim2');
|
||||
|
||||
await tester.pumpWidget(_wrap(auth,
|
||||
db: db, categories: categories, navidrome: nav));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(gesendeterBenutzer, 'Tinker');
|
||||
expect(auth.istAngemeldet, isTrue);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'dart:convert';
|
||||
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:http/testing.dart';
|
||||
@@ -9,6 +10,8 @@ import 'package:melo/downloads/youtube_search_screen.dart';
|
||||
import 'package:melo/library/database.dart';
|
||||
import 'package:melo/library/library_service.dart';
|
||||
import 'package:melo/services/baka_auth.dart';
|
||||
import 'package:melo/services/download_service.dart';
|
||||
import 'package:melo/services/navidrome_service.dart';
|
||||
import 'package:melo/services/yt_download_service.dart';
|
||||
import 'package:melo/services/yt_search_service.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
@@ -39,6 +42,7 @@ Widget _wrap({
|
||||
required BakaAuth auth,
|
||||
required YtSearchService search,
|
||||
required YtDownloadService download,
|
||||
NavidromeService? navidrome,
|
||||
}) {
|
||||
return MultiProvider(
|
||||
providers: [
|
||||
@@ -47,6 +51,13 @@ Widget _wrap({
|
||||
ChangeNotifierProvider<BakaAuth>.value(value: auth),
|
||||
ChangeNotifierProvider<YtSearchService>.value(value: search),
|
||||
ChangeNotifierProvider<YtDownloadService>.value(value: download),
|
||||
// Nur für die Server-User-Prüfung gebraucht (siehe
|
||||
// _pruefeServerUser) — ohne gespeicherte Zugangsdaten bleibt sie ein
|
||||
// Gast.
|
||||
ChangeNotifierProvider<DownloadService>(
|
||||
create: (_) => DownloadService(
|
||||
db: db, navidrome: navidrome ?? NavidromeService()),
|
||||
),
|
||||
],
|
||||
child: const MaterialApp(home: Scaffold(body: YoutubeSearchScreen())),
|
||||
);
|
||||
@@ -56,6 +67,15 @@ void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
setUp(() => SharedPreferences.setMockInitialValues({}));
|
||||
|
||||
// _pruefeServerUser prüft per NavidromeService.ladeGespeicherteZugangs-
|
||||
// daten(), ob ein Server-User verbunden ist — ohne diese Antwort bleibt
|
||||
// der Aufruf im Test unbeantwortet hängen.
|
||||
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
||||
.setMockMethodCallHandler(
|
||||
const MethodChannel('plugins.it_nomads.com/flutter_secure_storage'),
|
||||
(call) async => null,
|
||||
);
|
||||
|
||||
testWidgets('ohne Anmeldung erscheint der Hinweis auf die Baka-Anmeldung',
|
||||
(tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
@@ -75,6 +95,50 @@ void main() {
|
||||
await db.close();
|
||||
});
|
||||
|
||||
testWidgets('Server-User sieht keinen Anmelde-Hinweis', (tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
final auth = BakaAuth(
|
||||
client: MockClient(
|
||||
(_) async => http.Response(jsonEncode({'token': 'jwt'}), 200)),
|
||||
speicher: _MemorySpeicher(),
|
||||
);
|
||||
final search = YtSearchService(auth: auth);
|
||||
final download = YtDownloadService(auth: auth);
|
||||
final nav = NavidromeService()
|
||||
..setCredentials('https://musik.baka-net.de', 'Dustin', 'geheim');
|
||||
|
||||
await tester.pumpWidget(_wrap(
|
||||
db: db, auth: auth, search: search, download: download,
|
||||
navidrome: nav));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.textContaining('Baka-Anmeldung'), findsNothing);
|
||||
|
||||
await db.close();
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'Server-User bekommt bei fehlgeschlagener Auto-Anmeldung wieder '
|
||||
'den Anmelde-Hinweis', (tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
final auth = BakaAuth(
|
||||
client: MockClient((_) async => http.Response('', 500)),
|
||||
speicher: _MemorySpeicher());
|
||||
final search = YtSearchService(auth: auth);
|
||||
final download = YtDownloadService(auth: auth);
|
||||
final nav = NavidromeService()
|
||||
..setCredentials('https://musik.baka-net.de', 'Dustin', 'falsch');
|
||||
|
||||
await tester.pumpWidget(_wrap(
|
||||
db: db, auth: auth, search: search, download: download,
|
||||
navidrome: nav));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.textContaining('Baka-Anmeldung'), findsOneWidget);
|
||||
|
||||
await db.close();
|
||||
});
|
||||
|
||||
testWidgets('Suche zeigt Titel und Dauer der Treffer', (tester) async {
|
||||
final db = MeloDb(NativeDatabase.memory());
|
||||
final auth = await _angemeldeteAuth();
|
||||
|
||||
Reference in New Issue
Block a user