import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:go_router/go_router.dart'; import 'package:jiu_client/core/models/page_result.dart'; import 'package:jiu_client/models/partner.dart'; import 'package:jiu_client/models/product.dart'; import 'package:jiu_client/models/stock_in.dart'; import 'package:jiu_client/models/warehouse.dart'; import 'package:jiu_client/providers/partner_provider.dart'; import 'package:jiu_client/providers/product_provider.dart'; import 'package:jiu_client/providers/stock_in_provider.dart'; import 'package:jiu_client/providers/warehouse_provider.dart'; import 'package:jiu_client/screens/stock_in/stock_in_form_screen.dart'; class _FakeWarehouseNotifier extends WarehouseListNotifier { @override Future> build() async { return const [ Warehouse(id: 1, name: '主仓库', isDefault: true), ]; } @override Future reload() async {} } class _FakeSupplierNotifier extends PartnerListNotifier { _FakeSupplierNotifier() : super(type: 'supplier'); @override Future> build() async { return const PageResult( data: [ Partner(id: 1, name: '张家酒水', type: 'supplier'), ], total: 1, page: 1, pageSize: 20, ); } @override void reload() {} } class _FakeProductNotifier extends ProductListNotifier { @override Future> build() async { return const PageResult( data: [ Product( id: 1, code: 'P001', name: '五粮液', spec: '500ml', unit: '瓶', purchasePrice: 100, ), ], total: 1, page: 1, pageSize: 20, ); } @override void reload() {} @override void setKeyword(String keyword) {} @override void setPage(int page) {} @override Future createProduct(Map data) async {} @override Future updateProduct(int id, Map data) async {} @override Future deleteProduct(int id) async {} } class _CapturingStockInNotifier extends StockInListNotifier { Map? capturedData; @override Future> build() async { return const PageResult(data: [], total: 0, page: 1, pageSize: 20); } @override void reload() {} @override void setPage(int page) {} @override void setStatus(String status) {} @override void setDateRange(String? startDate, String? endDate) {} @override Future createOrder(Map data) async { capturedData = data; } @override Future submitOrder(int id) async {} @override Future approveOrder(int id) async {} @override Future rejectOrder(int id) async {} } void main() { // TODO: 表单 DropdownButtonFormField 数量已变更,测试待更新 testWidgets('stock-in form creates and submits a pending order', skip: true, (tester) async { tester.view.physicalSize = const Size(1440, 1200); tester.view.devicePixelRatio = 1.0; addTearDown(tester.view.resetPhysicalSize); final stockInNotifier = _CapturingStockInNotifier(); final router = GoRouter( initialLocation: '/stock-in/new', routes: [ GoRoute( path: '/stock-in', builder: (_, __) => const Scaffold(body: Text('stock-in list')), ), GoRoute( path: '/stock-in/new', builder: (_, __) => const StockInFormScreen(), ), ], ); await tester.pumpWidget( ProviderScope( overrides: [ warehouseListProvider.overrideWith(() => _FakeWarehouseNotifier()), supplierListProvider.overrideWith(() => _FakeSupplierNotifier()), productListProvider.overrideWith(() => _FakeProductNotifier()), stockInListProvider.overrideWith(() => stockInNotifier), ], child: MaterialApp.router(routerConfig: router), ), ); await tester.pumpAndSettle(); await tester.tap(find.byType(DropdownButtonFormField).at(0)); await tester.pumpAndSettle(); await tester.tap(find.text('主仓库').last); await tester.pumpAndSettle(); await tester.tap(find.byType(DropdownButtonFormField).at(2)); await tester.pumpAndSettle(); await tester.tap(find.text('五粮液(500ml)').last); await tester.pumpAndSettle(); await tester.enterText(find.byType(TextFormField).at(1), '10'); await tester.enterText(find.byType(TextFormField).at(2), '100'); await tester.tap(find.text('提交审核')); await tester.pump(); await tester.pumpAndSettle(); expect(find.text('stock-in list'), findsOneWidget); expect(stockInNotifier.capturedData, isNotNull); expect(stockInNotifier.capturedData!['warehouse_id'], 1); expect(stockInNotifier.capturedData!['status'], 'pending'); expect((stockInNotifier.capturedData!['items'] as List).length, 1); expect( (stockInNotifier.capturedData!['items'] as List).first['product_id'], 1, ); }); }