// 功能描述:验证地址新增、失败重试、删除确认和默认地址刷新。 // 版本:1.0.0。 import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:user_app/data/services/api_client.dart'; import 'package:user_app/domain/models/shipping_address.dart'; import 'package:user_app/ui/core/app_theme.dart'; import 'package:user_app/ui/features/address/addresses_page.dart'; import '../support/a1_fixture.dart'; class AddressFixture extends A1FixtureRepository { List values = []; final requests = []; int deletes = 0; @override Future> shippingAddresses() async => values; @override Future saveShippingAddress(ShippingAddress address, {required String requestNo}) async { requests.add(requestNo); if (this.fail) throw const ApiException(500, '保存失败,请重试'); values = [ ShippingAddress( identity: 'saved', address: address.address, contactName: address.contactName, contactPhone: address.contactPhone, isDefault: address.isDefault, ), ]; } @override Future setDefaultAddress(String identity) async { if (this.fail) throw const ApiException(500, '设置失败'); final a = values.single; values = [ ShippingAddress( identity: a.identity, address: a.address, contactName: a.contactName, contactPhone: a.contactPhone, isDefault: true, ), ]; } @override Future deleteAddress(String identity) async { deletes++; values = []; } } void main() { testWidgets('新增校验,失败保留输入与请求号,成功刷新列表', (tester) async { final repo = AddressFixture()..fail = true; await tester.pumpWidget( MaterialApp( theme: AppTheme.light(), home: AddressesPage(repository: repo), ), ); await tester.pumpAndSettle(); await tester.tap(find.text('新增收货地址')); await tester.pumpAndSettle(); await tester.tap(find.text('保存地址')); await tester.pumpAndSettle(); expect(repo.requests, isEmpty); final fields = find.byType(TextFormField); await tester.enterText(fields.at(0), '收货人'); await tester.enterText(fields.at(1), '13800000001'); await tester.enterText(fields.at(2), '广东省广州市测试路 1 号'); await tester.tap(find.text('保存地址')); await tester.pumpAndSettle(); expect(find.text('保存失败,请重试'), findsOneWidget); repo.fail = false; await tester.tap(find.text('保存地址')); await tester.pumpAndSettle(); expect(repo.requests.length, 2); expect(repo.requests.first, repo.requests.last); expect(find.text('收货人'), findsOneWidget); expect(find.text('138****0001'), findsOneWidget); expect(find.text('地址管理'), findsOneWidget); }); testWidgets('默认切换失败不假更新,成功刷新,删除需要确认', (tester) async { final repo = AddressFixture() ..values = [ const ShippingAddress( identity: 'owned', address: '测试地址', contactName: '收货人', contactPhone: '13800000001', ), ]; await tester.pumpWidget( MaterialApp( theme: AppTheme.light(), home: AddressesPage(repository: repo), ), ); await tester.pumpAndSettle(); repo.fail = true; await tester.tap(find.text('设为默认')); await tester.pumpAndSettle(); expect(repo.values.single.isDefault, false); repo.fail = false; await tester.tap(find.text('设为默认')); await tester.pumpAndSettle(); expect(repo.values.single.isDefault, true); await tester.tap(find.text('编辑')); await tester.pumpAndSettle(); await tester.ensureVisible(find.text('删除地址')); await tester.tap(find.text('删除地址')); await tester.pumpAndSettle(); await tester.tap(find.text('取消')); await tester.pumpAndSettle(); expect(repo.deletes, 0); await tester.tap(find.text('删除地址')); await tester.pumpAndSettle(); await tester.tap(find.text('删除')); await tester.pumpAndSettle(); expect(repo.deletes, 1); expect(find.text('暂无收货地址'), findsOneWidget); }); }