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/auth/auth_state.dart'; import 'package:jiu_client/core/utils/clock.dart'; import 'package:jiu_client/models/user.dart'; import 'package:jiu_client/providers/user_provider.dart'; import 'package:jiu_client/screens/settings/users_screen.dart'; import '../support/golden_harness.dart'; import '../support/shell_harness.dart'; /// design-distill 阶段4:用户管理独立页 golden × 三主题(回归闸 + 保真基准)。 /// 数据照抄原型 screens/users.html 的 USERS(5 人,四级角色), /// 相对时间(今天/昨天)用可注入时钟 appClock 冻结在 2026-07-13 09:30: /// node tools/fidelity.mjs users /// 更新基准:flutter test --update-goldens test/golden/users_golden_test.dart // 原型 USERS 5 行;最近登录 今天09:12 / 今天08:50 / 昨天18:40 / 06-19 / 06-10 const _users = [ AppUser( id: 1, username: 'wang', realName: '王经理', role: 'superadmin', isActive: true, lastLoginAt: '2026-07-13T09:12:00'), AppUser( id: 2, username: 'zhang', realName: '张主管', role: 'admin', isActive: true, lastLoginAt: '2026-07-13T08:50:00'), AppUser( id: 3, username: 'li', realName: '李采购', role: 'operator', isActive: true, lastLoginAt: '2026-07-12T18:40:00'), AppUser( id: 4, username: 'zhao', realName: '赵会计', role: 'readonly', isActive: true, lastLoginAt: '2026-06-19T10:05:00'), AppUser( id: 5, username: 'qian', realName: '钱仓管', role: 'operator', isActive: false, lastLoginAt: '2026-06-10T14:22:00'), ]; class _FakeUserList extends UserListNotifier { @override Future> build() async => _users; @override Future reload() async {} } List _overrides() => [ userListProvider.overrideWith(() => _FakeUserList()), isReadonlyProvider.overrideWithValue(false), ]; void main() { TestWidgetsFlutterBinding.ensureInitialized(); SharedPreferences.setMockInitialValues({}); // 冻结相对日期基准(与外壳状态栏同一时刻) appClock = () => DateTime(2026, 7, 13, 9, 30, 15); // 桌面:外壳挂载(users 页在原型中同样高亮「系统设置」导航 → 挂 /settings 分支) shellGoldenAcrossThemes( 'users 整框(桌面)', path: '/settings', screen: (_) => const UsersScreen(), goldenPrefix: 'users', overrides: _overrides, logical: const Size(1280, 900), ); // 移动:窄屏卡片流 goldenAcrossThemes( 'users 整屏(移动)', goldenPrefix: 'users_mobile', child: () => const Scaffold(body: UsersScreen()), overrides: _overrides, logical: const Size(390, 1400), ); }