Auto-Anmeldung: doppelten Login-Request beim App-Start verhindert (Race durch IndexedStack)
Betraf alle drei Nutzer (Dustin, Baka, Tinker), nicht nur einen: IndexedStack baut Download-Tab und YT-Suche beim App-Start gleichzeitig, beide loesen unabhaengig voneinander autoAnmelden() aus. Ohne In-Flight-Absicherung gingen zwei fast-gleichzeitige Login-Requests an denselben Server, von denen einer abgelehnt wurde - obwohl die Zugangsdaten korrekt waren. - BakaAuth.autoAnmelden() haengt einen ueberlappenden Aufruf jetzt an den bereits laufenden Login-Versuch an, statt einen zweiten Request zu senden. - Anmelde-Dialog im Download-Tab zeigt den tatsaechlich bekannten Navidrome-Benutzernamen statt immer "Baka" vorauszufuellen. - Navidrome-Dialog in den Einstellungen waehlt den zuletzt bekannten Benutzer vor statt immer "Baka".
This commit is contained in:
@@ -248,6 +248,26 @@ void main() {
|
||||
findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'Der Anmelde-Dialog schlägt den bekannten Navidrome-Benutzer vor, '
|
||||
'nicht immer "Baka"', (tester) async {
|
||||
final auth = BakaAuth(
|
||||
client: MockClient((_) async => http.Response('', 500)),
|
||||
speicher: _MemorySpeicher());
|
||||
final nav = NavidromeService()
|
||||
..setCredentials('https://musik.baka-net.de', 'Tinker', 'falsch');
|
||||
|
||||
await tester.pumpWidget(_wrap(auth,
|
||||
db: db, categories: categories, navidrome: nav));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
await tester.tap(find.text('Beim Baka-Konto anmelden'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
final feld = tester.widget<TextField>(find.byType(TextField).first);
|
||||
expect(feld.controller!.text, 'Tinker');
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'Server-User meldet sich im Hintergrund mit denselben Zugangsdaten '
|
||||
'beim Baka-Konto an', (tester) async {
|
||||
|
||||
@@ -115,6 +115,30 @@ void main() {
|
||||
expect(auth.benutzer, 'Baka');
|
||||
});
|
||||
|
||||
test(
|
||||
'autoAnmelden löst bei gleichzeitigen Aufrufen nur EINEN HTTP-Request aus '
|
||||
'(Race Condition durch IndexedStack, das mehrere Tabs gleichzeitig baut)',
|
||||
() async {
|
||||
var aufrufe = 0;
|
||||
final client = MockClient((_) async {
|
||||
aufrufe++;
|
||||
// Künstliche Verzögerung: simuliert, dass der erste Request noch
|
||||
// nicht zurück ist, wenn der zweite Aufruf startet.
|
||||
await Future.delayed(const Duration(milliseconds: 50));
|
||||
return http.Response(jsonEncode({'token': 'jwt-tinker'}), 200);
|
||||
});
|
||||
final auth = BakaAuth(client: client, speicher: _MemorySpeicher());
|
||||
|
||||
await Future.wait([
|
||||
auth.autoAnmelden('Tinker', 'geheim'),
|
||||
auth.autoAnmelden('Tinker', 'geheim'),
|
||||
]);
|
||||
|
||||
expect(aufrufe, 1);
|
||||
expect(auth.istAngemeldet, isTrue);
|
||||
expect(auth.benutzer, 'Tinker');
|
||||
});
|
||||
|
||||
test('autoAnmelden tut nichts ohne Zugangsdaten', () async {
|
||||
var aufrufe = 0;
|
||||
final client = MockClient((_) async {
|
||||
|
||||
Reference in New Issue
Block a user