import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jiu_client/core/exceptions.dart'; import 'package:jiu_client/core/models/page_result.dart'; import 'package:jiu_client/models/product.dart'; import 'package:jiu_client/providers/product_provider.dart'; import 'package:jiu_client/screens/products/products_screen.dart'; class _ReadonlyProductNotifier extends ProductListNotifier { @override Future> build() async { return const PageResult(data: [], total: 0, page: 1, pageSize: 20); } @override void reload() {} @override void setKeyword(String keyword) {} @override void setPage(int page) {} @override Future createProduct(Map data) async { throw const AppException('readonly user', statusCode: 403); } @override Future updateProduct(int id, Map data) async {} @override Future deleteProduct(int id) async {} } void main() { // TODO: 新建按钮位置已变更,测试待更新 testWidgets('write operation shows forbidden error for readonly user', skip: true, (tester) async { tester.view.physicalSize = const Size(1280, 800); tester.view.devicePixelRatio = 1.0; addTearDown(tester.view.resetPhysicalSize); await tester.pumpWidget( ProviderScope( overrides: [ productListProvider.overrideWith(() => _ReadonlyProductNotifier()), ], child: const MaterialApp( home: Scaffold(body: ProductsScreen()), ), ), ); await tester.pumpAndSettle(); await tester.tap(find.text('新建')); await tester.pumpAndSettle(); await tester.enterText(find.byType(TextFormField).at(0), '测试商品'); await tester.enterText(find.byType(TextFormField).at(1), 'P999'); await tester.tap(find.text('保存')); await tester.pump(); await tester.pumpAndSettle(); expect(find.textContaining('保存失败:readonly user'), findsOneWidget); }); }