import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'package:hepan_everyday/features/school/school_browser.dart'; import 'package:hepan_everyday/features/school/school_browser_diagnostics.dart'; import 'package:hepan_everyday/services/diagnostic_log.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); testWidgets( 'Android school browser honors desktop viewport and keeps console details private', (tester) async { final web = WebViewController(); await web.setJavaScriptMode(JavaScriptMode.unrestricted); var loaded = Completer(); await web.setNavigationDelegate( NavigationDelegate( onPageFinished: (_) { if (!loaded.isCompleted) loaded.complete(); }, ), ); await tester.pumpWidget( MaterialApp( home: Scaffold(body: WebViewWidget(controller: web)), ), ); await tester.pumpAndSettle(); const html = '' 'PRIVATE_NATIVE_PAGE_TEXT'; await web.loadHtmlString(html); await loaded.future.timeout(const Duration(seconds: 20)); final before = num.parse( (await web.runJavaScriptReturningResult( 'document.documentElement.clientWidth', )).toString(), ); final info = await configureSchoolBrowser(web, 'undergraduate'); loaded = Completer(); await web.loadHtmlString(html); await loaded.future.timeout(const Duration(seconds: 20)); final after = num.parse( (await web.runJavaScriptReturningResult( 'document.documentElement.clientWidth', )).toString(), ); expect(before, lessThan(1000)); expect(after, greaterThanOrEqualTo(1100)); expect(info.chromiumVersion, matches(r'^\d+(\.\d+){1,3}$')); await web.runJavaScript( 'console.error("Uncaught ReferenceError: jQuery is not defined PRIVATE_NATIVE_CONSOLE_DETAIL")', ); await Future.delayed(const Duration(milliseconds: 200)); // Native data fixtures use about:blank; test the script and decoder here. // Separate tests cover production origin and document-generation guards. dynamic fixtureUrl = await web.runJavaScriptReturningResult( 'location.href', ); if ((fixtureUrl as String).startsWith('"')) { fixtureUrl = jsonDecode(fixtureUrl); } final rawState = await web.runJavaScriptReturningResult( schoolPageDiagnosticsScript.replaceAll( '__EXPECTED_URL__', jsonEncode(fixtureUrl), ), ); recordSchoolPageState(DiagnosticLog.instance, 'undergraduate', rawState); final log = utf8.decode(await DiagnosticLog.instance.export()); expect(log, contains('school_console_error')); expect(log, contains('"code":"jquery_missing"')); expect(log, contains('"code":"jquery","result":false')); expect(log, contains('school_asset_state')); expect(log, isNot(contains('PRIVATE_NATIVE_CONSOLE_DETAIL'))); expect(log, isNot(contains('PRIVATE_NATIVE_PAGE_TEXT'))); }, ); }