import 'package:flutter_test/flutter_test.dart'; import 'package:jinzhi_flutter_app/features/web/application/mall_web_host_controller.dart'; void main() { final host = MallWebHostController.instance; setUp(() async => host.clear()); tearDown(() async => host.clear()); test('opens and dismisses the resident full-screen mall host', () { final uri = Uri.parse('https://mall.example.com/?isNight=0'); host.open(uri); expect(host.state.value.url, uri.toString()); expect(host.state.value.visible, isTrue); host.dismiss(); expect(host.state.value.url, uri.toString()); expect(host.state.value.visible, isFalse); }); test('cache identity ignores attribution but includes theme', () { const first = 'https://mall.example.com/path?isNight=0&click_id=a&tracking_id=t1'; const second = 'https://mall.example.com/path?isNight=0&click_id=b&tracking_id=t2'; const dark = 'https://mall.example.com/path?isNight=1&click_id=b'; expect( MallWebHostController.cacheKeyFor(first), MallWebHostController.cacheKeyFor(second), ); expect( MallWebHostController.cacheKeyFor(first), isNot(MallWebHostController.cacheKeyFor(dark)), ); }); test('defers a changed preload while the mall is visible', () { final active = Uri.parse('https://mall.example.com/?isNight=0'); final refreshed = Uri.parse('https://mall.example.com/?isNight=1'); host.open(active); host.preload(refreshed); expect(host.state.value.url, active.toString()); expect(host.state.value.visible, isTrue); host.dismiss(); expect(host.state.value.url, refreshed.toString()); expect(host.state.value.visible, isFalse); }); test('themed URL replaces a stale isNight value', () { final uri = MallWebHostController.uriForTheme( Uri.parse('https://mall.example.com/?from=jinzhi&isNight=1'), isDark: false, ); expect(uri.queryParameters['from'], 'jinzhi'); expect(uri.queryParameters['isNight'], '0'); }); }