import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:im_webview_app/config/app_config.dart'; import 'package:im_webview_app/main.dart'; void main() { test('creates the WebView shell app widget', () { expect( const ImWebViewApp(shellBranding: ShellBranding.fallback), isA(), ); }); test('loads the configured H5 root URL without shell URL params', () { const logo = 'data:image/png;base64,abc+/='; final uri = Uri.parse( AppConfig.homeUrl(appName: 'Shell Test', appLogo: logo), ); expect(uri.scheme, 'https'); expect(uri.host, 'h5-test.imharry.work'); expect(uri.path, '/'); expect(uri.queryParameters.containsKey('flutter_shell'), isFalse); expect(uri.queryParameters.containsKey('shell_app_name'), isFalse); expect(uri.queryParameters.containsKey('shell_app_logo'), isFalse); expect(uri.queryParameters.containsKey('shell_cache_bust'), isFalse); expect(uri.toString(), isNot(contains('%25'))); expect(Uri.splitQueryString(uri.fragment).containsKey('shell_app_logo'), isFalse); }); test('exposes configured H5 URLs as Flutter shell lines', () { final lines = AppConfig.h5Lines; expect(lines, isNotEmpty); expect(lines.first.label, '线路1'); expect(lines.first.url, AppConfig.homeUrl(lineIndex: 0)); expect(Uri.parse(lines.first.url).host, 'h5-test.imharry.work'); }); test('falls back to the first H5 line for invalid line indexes', () { expect(AppConfig.homeUrl(lineIndex: -1), AppConfig.h5Lines.first.url); expect(AppConfig.homeUrl(lineIndex: 99), AppConfig.h5Lines.first.url); }); test('matches runtime URLs back to their Flutter shell line', () { final lineUrl = AppConfig.h5Lines.first.url; expect(AppConfig.lineIndexForUrl('${lineUrl}login'), 0); }); test('refreshes an H5 route URL without adding branding to the URL', () { final uri = Uri.parse( AppConfig.withFreshShellParams( 'https://h5-test.imharry.work/login?from=runtime&shell_app_name=Old' '&flutter_shell=1&shell_cache_bust=1#shell_app_logo=old', ), ); expect(uri.path, '/login'); expect(uri.queryParameters['from'], 'runtime'); expect(uri.queryParameters.containsKey('flutter_shell'), isFalse); expect(uri.queryParameters.containsKey('shell_app_name'), isFalse); expect(uri.queryParameters.containsKey('shell_app_logo'), isFalse); expect(uri.queryParameters.containsKey('shell_cache_bust'), isFalse); expect(Uri.splitQueryString(uri.fragment).containsKey('shell_app_logo'), isFalse); }); test('keeps independent non-legacy H5 hosts when removing shell params', () { final uri = Uri.parse( AppConfig.canonicalizeMainFrameUrl( 'https://line-two.example/login?shell_app_name=Old' '&flutter_shell=1#shell_app_logo=old', ), ); expect(uri.host, 'line-two.example'); expect(uri.path, '/login'); expect(uri.queryParameters.containsKey('shell_app_name'), isFalse); expect(uri.queryParameters.containsKey('flutter_shell'), isFalse); expect(Uri.splitQueryString(uri.fragment).containsKey('shell_app_logo'), isFalse); }); test('rewrites legacy H5 host main-frame URLs to the canonical host', () { final uri = Uri.parse( AppConfig.canonicalizeMainFrameUrl( 'https://h5-test.imharry.work/login?from=runtime' '&shell_app_name=Old#shell_app_logo=old', ), ); expect(uri.scheme, 'https'); expect(uri.host, 'h5-test.imharry.work'); expect(uri.path, '/login'); expect(uri.queryParameters['from'], 'runtime'); expect(uri.queryParameters.containsKey('shell_app_name'), isFalse); expect(Uri.splitQueryString(uri.fragment).containsKey('shell_app_logo'), isFalse); }); }