84 lines
3.3 KiB
Dart
84 lines
3.3 KiB
Dart
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<void>();
|
|
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 =
|
|
'<!doctype html><html><head><meta name="viewport" content="width=1200"></head>'
|
|
'<body>PRIVATE_NATIVE_PAGE_TEXT</body></html>';
|
|
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<void>();
|
|
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<void>.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')));
|
|
},
|
|
);
|
|
}
|