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/models/product.dart'; import 'package:jiu_client/models/inventory.dart'; import 'package:jiu_client/providers/product_provider.dart'; import 'package:jiu_client/providers/inventory_provider.dart'; import 'package:jiu_client/repositories/product_repository.dart'; import 'package:jiu_client/repositories/inventory_repository.dart'; import 'package:jiu_client/screens/products/product_detail_screen.dart'; import '../support/golden_harness.dart'; /// design-distill 阶段4:商品详情「富数据版」golden × 三主题。 /// 验证 3 KPI(当前库存/货值/近30天出库)+ 各仓库分布 + 近期流水(接后端 /// /inventory?product_id + /inventory/logs?product_id 聚合)。 /// 更新基准:flutter test --update-goldens test/golden/product_detail_golden_test.dart class _FakeProductRepo implements ProductRepository { @override Future getDetail(int id) async => const Product( id: 1, code: 'MT-FT-500', name: '茅台 飞天 53°', unit: '件', series: '飞天', spec: '500ml×6', brand: '茅台', purchasePrice: 2680, categoryName: '酱香'); @override Future> getPriceHistory(int id) async => const [ (date: '2026-06-12', price: 2680), (date: '2026-04-20', price: 2620), (date: '2026-02-08', price: 2700), (date: '2025-11-15', price: 2580), ]; @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } class _FakeInvRepo implements InventoryRepository { @override Future> listInventory({ int? warehouseId, int? productId, String? keyword, String? code, List? series, List? spec, int page = 1, int pageSize = 50, }) async => const PageResult(data: [ Inventory(id: 1, productId: 1, quantity: 92, warehouseName: '主仓'), Inventory(id: 2, productId: 1, quantity: 28, warehouseName: '二号仓'), Inventory(id: 3, productId: 1, quantity: 8, warehouseName: '冷藏库'), ], total: 3, page: 1, pageSize: 1000); @override Future> listLogs({ int? warehouseId, int? productId, int page = 1, int pageSize = 50, }) async => const PageResult(data: [ InventoryLog( warehouseId: 1, productId: 1, direction: 'in', quantity: 24, createdAt: '2026-06-20T09:00:00'), InventoryLog( warehouseId: 1, productId: 1, direction: 'out', quantity: 12, createdAt: '2026-06-18T09:00:00'), InventoryLog( warehouseId: 2, productId: 1, direction: 'out', quantity: 18, createdAt: '2026-06-15T09:00:00'), InventoryLog( warehouseId: 1, productId: 1, direction: 'in', quantity: 36, createdAt: '2026-06-12T09:00:00'), ], total: 4, page: 1, pageSize: 100); @override dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); } List _overrides() => [ productRepositoryProvider.overrideWithValue(_FakeProductRepo()), inventoryRepositoryProvider.overrideWithValue(_FakeInvRepo()), ]; void main() { TestWidgetsFlutterBinding.ensureInitialized(); SharedPreferences.setMockInitialValues({}); goldenAcrossThemes( 'product detail 富数据(桌面)', goldenPrefix: 'product_detail', child: () => const Scaffold(body: ProductDetailScreen(productId: 1)), overrides: _overrides, logical: const Size(1100, 1300), ); }