import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:jiu_client/core/models/page_result.dart'; import 'package:jiu_client/core/auth/auth_state.dart'; import 'package:jiu_client/models/partner.dart'; import 'package:jiu_client/providers/partner_provider.dart'; import 'package:jiu_client/screens/partners/partners_screen.dart'; import '../support/golden_harness.dart'; import '../support/shell_harness.dart'; /// design-distill 阶段4:往来单位 golden × 三主题(回归闸 + 保真基准)。 /// 桌面版挂进真 AppShell(与原型整页截图同构),行数据照抄原型 /// screens/partners.html 的 PARTNERS(10 行),可与 proto 基准整屏 diff: /// node tools/fidelity.mjs partners /// 更新基准:flutter test --update-goldens test/golden/partners_golden_test.dart // 原型 PARTNERS 10 行(recv/pay 走 partnerBalancesProvider 假数据)。 const _partners = [ Partner( id: 1, name: '茅台华东总代', type: 'supplier', contact: '张伟', phone: '138-0011-2233', address: '上海市青浦区华新镇酒类商城A12'), Partner( id: 2, name: '老李酒水批发', type: 'supplier,customer', contact: '李建国', phone: '139-2200-7788', address: '江苏省南京市江宁区秣陵街道'), Partner( id: 3, name: '鼎丰超市', type: 'customer', contact: '王芳', phone: '137-6655-4321', address: '浙江省杭州市拱墅区大关路88号'), Partner( id: 4, name: '五粮液川南运营中心', type: 'supplier', contact: '刘德海', phone: '135-8899-0011', address: '四川省宜宾市翠屏区岷江路'), Partner( id: 5, name: '金樽酒楼', type: 'customer', contact: '陈静', phone: '136-2211-9900', address: '江苏省苏州市姑苏区观前街'), Partner( id: 6, name: '恒昌名酒行', type: 'supplier,customer', contact: '赵明', phone: '138-7766-5544', address: '安徽省合肥市蜀山区长江西路'), Partner( id: 7, name: '汾酒山西直营', type: 'supplier', contact: '孙立', phone: '134-5566-7788', address: '山西省吕梁市汾阳市杏花村'), Partner( id: 8, name: '喜宴婚庆服务', type: 'customer', contact: '周丽', phone: '139-3344-5566', address: '江苏省无锡市梁溪区中山路'), Partner( id: 9, name: '郎酒华东仓储', type: 'supplier', contact: '吴强', phone: '137-9900-1122', address: '江苏省南京市六合区雄州街道'), Partner( id: 10, name: '万家乐连锁便利', type: 'customer', contact: '郑涛', phone: '135-1122-3344', address: '浙江省宁波市海曙区中山东路'), ]; // 原型 recv/pay 数值(id → (应收, 应付)) const _balances = { 1: (recv: 0, pay: 486200), 2: (recv: 38400, pay: 152600), 3: (recv: 126800, pay: 0), 4: (recv: 0, pay: 298500), 5: (recv: 54200, pay: 0), 6: (recv: 72900, pay: 41000), 7: (recv: 0, pay: 88400), 8: (recv: 19600, pay: 0), 9: (recv: 0, pay: 134700), 10: (recv: 93500, pay: 0), }; class _FakePartnersNotifier extends PartnerListNotifier { @override Future> build() async => const PageResult(data: _partners, total: 10, page: 1, pageSize: 1000); @override void setPage(int page) {} @override void setPageSize(int pageSize) {} @override void setKeyword(String keyword) {} @override void setType(String? t) {} @override void reload() {} } List _overrides() => [ partnersScreenProvider.overrideWith(() => _FakePartnersNotifier()), partnerBalancesProvider.overrideWith((ref) async => _balances), isReadonlyProvider.overrideWithValue(false), ]; void main() { TestWidgetsFlutterBinding.ensureInitialized(); SharedPreferences.setMockInitialValues({}); // 桌面:外壳挂载整框(顶栏+侧栏+状态栏+屏),与原型整页同构 shellGoldenAcrossThemes( 'partners 整框(桌面)', path: '/partners', screen: (_) => const PartnersScreen(), goldenPrefix: 'partners', overrides: _overrides, logical: const Size(1280, 900), ); // 移动:窄屏(<600)→ context.isMobile → MobileListCard 卡片流路径 goldenAcrossThemes( 'partners 整屏(移动)', goldenPrefix: 'partners_mobile', child: () => const Scaffold(body: PartnersScreen()), overrides: _overrides, logical: const Size(390, 1200), ); }