Bernds Wunsch 2026-10-08: UI grundsätzlich prüfen (Navigation, Sackgassen, Anruf-Logik). Audit + Konzept in docs/UI_AUDIT.md, belegt mit neuer Screenshot-Tour integration_test/ui_audit_tour_test.dart (35 Zustände, Handy + PC, zwei Testkonten, Test-Space mit Sprachkanal). Sofort behoben: - S1/S2: Gegenseite legt auf / Anruf scheitert / Sprachkanal bricht ab → automatisch zurück zum Chat mit Hinweis (Fehler sichtbar statt still); leere Anrufansicht deutsch mit Zurück-Knopf (vorher englische Sackgasse ohne Zurück am Handy). - S4: toter „Threads“-Knopf entfernt. S5: Space betreten (PC) öffnet letzten bzw. ersten Textkanal. S6: keine doppelte Anrufsteuerung am PC. - Annehmen-Fenster mit Anrufer-Avatar und Anrufart; eigene Kachel mit eigenem Initial statt „D“; Mitgliederliste rund mit Profilbild und „(Du)“; Tastaturkürzel nur am PC; englische Texte in Anruf/Leerzuständen deutsch. - Tests: Fehlerempfänger des Testrahmens nach app.main() zurück (vorher verschwanden Fehlermeldungen), Lesebestätigungs-Test im Wegwerf-Raum statt in der DM, robustere Schritte; test.ps1 räumt liegengebliebene Test-Prozesse weg; gemeinsame Hilfen integration_test/support/. Co-Authored-By: Claude Opus 5.5 <[email protected]>
72 lines
3.0 KiB
Dart
72 lines
3.0 KiB
Dart
import 'dart:io';
|
||
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||
import 'package:flutter_test/flutter_test.dart';
|
||
import 'package:integration_test/integration_test.dart';
|
||
import 'package:pyramid/core/matrix_client.dart';
|
||
import 'package:pyramid/features/voice_channel/voice_channel_service.dart';
|
||
import 'package:pyramid/main.dart' as app;
|
||
|
||
/// Echter Beitritt zu LiveKit mit einem vom SERVER ausgestellten Token
|
||
/// (docs/LIVEKIT_TOKEN_MIGRATION.md) – über denselben Weg wie die App
|
||
/// (voiceChannelProvider.startCall), nur mit dem TEST-Konto.
|
||
///
|
||
/// Läuft nur mit gesetztem PYRAMID_PROFILE_DIR (eingeloggtes Testprofil,
|
||
/// z. B. pyramidtest1) – nie gegen Bernds echtes Profil:
|
||
///
|
||
/// $env:PYRAMID_PROFILE_DIR="$env:USERPROFILE\.pyramid-autopilot\profile1"
|
||
/// flutter test integration_test/livekit_token_connect_test.dart -d windows
|
||
///
|
||
/// Betritt einen eigenen Wegwerf-Raum („pyramid-tokentest“), nur Ton, und
|
||
/// legt sofort wieder auf. Ersetzt NICHT den Anruftest auf dem Handy.
|
||
void main() {
|
||
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||
final profile = Platform.environment['PYRAMID_PROFILE_DIR'];
|
||
|
||
testWidgets(
|
||
'LiveKit-Beitritt mit Server-Token: Identität = eigene Matrix-ID',
|
||
(tester) async {
|
||
// app.main() ersetzt FlutterError.onError – danach den Empfänger des
|
||
// Testrahmens zurücksetzen, sonst verschwinden Fehlermeldungen.
|
||
final testOnError = FlutterError.onError;
|
||
app.main();
|
||
final end = DateTime.now().add(const Duration(seconds: 90));
|
||
while (find.byType(MaterialApp).evaluate().isEmpty &&
|
||
DateTime.now().isBefore(end)) {
|
||
await tester.pump(const Duration(milliseconds: 200));
|
||
}
|
||
FlutterError.onError = testOnError;
|
||
final container = ProviderScope.containerOf(
|
||
tester.element(find.byType(MaterialApp).first),
|
||
);
|
||
final client = await tester.runAsync(
|
||
() => container.read(matrixClientProvider.future),
|
||
);
|
||
expect(client!.isLogged(), isTrue, reason: 'Testprofil nicht angemeldet');
|
||
|
||
final call = container.read(voiceChannelProvider);
|
||
await tester.runAsync(() => call.startCall(
|
||
roomName: 'pyramid-tokentest',
|
||
roomDisplayName: 'Token-Test',
|
||
identity: 'wird-vom-server-ignoriert',
|
||
audioOnly: true,
|
||
matrixClient: client,
|
||
));
|
||
await tester.pump(const Duration(milliseconds: 500));
|
||
|
||
expect(call.error, isNull, reason: 'Beitritt fehlgeschlagen');
|
||
expect(call.room, isNotNull, reason: 'keine LiveKit-Verbindung');
|
||
// Der Server bestimmt die Identität aus dem geprüften Matrix-Login –
|
||
// der vom Client übergebene Wert spielt keine Rolle mehr.
|
||
expect(call.room!.localParticipant?.identity, client.userID);
|
||
|
||
await tester.runAsync(() => call.hangUp());
|
||
await tester.pump(const Duration(milliseconds: 500));
|
||
expect(call.room, isNull);
|
||
},
|
||
skip: profile == null,
|
||
timeout: const Timeout(Duration(minutes: 3)),
|
||
);
|
||
}
|