import 'package:dio/dio.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:slogan_app/core/auth/auth_provider.dart'; import 'package:slogan_app/core/network/api_client.dart'; import 'package:slogan_app/core/storage/token_storage.dart'; import '../network/api_client_test.dart'; void main() { test('登录成功:token 持久化 + 状态 authenticated', () async { final adapter = MockAdapter(); adapter.onRequest = (o) => Response( requestOptions: o, data: { 'code': 0, 'message': 'OK', 'data': { 'token': 'jwt-token', 'user': {'id': 7, 'name': '测试'} } }); final storage = InMemoryTokenStorage(); final container = ProviderContainer(overrides: [ tokenStorageProvider.overrideWithValue(storage), apiClientProvider.overrideWith((ref) => ApiClient( tokenStorage: storage, dio: Dio(BaseOptions(baseUrl: 'http://test')) ..httpClientAdapter = adapter)), ]); addTearDown(container.dispose); await container.read(authProvider.notifier).login('a', '123456'); final state = container.read(authProvider); expect(state.value?.authenticated, true); expect(state.value?.userId, 7); expect(storage.token, 'jwt-token'); }); test('登录失败:状态 error 携带 message', () async { final adapter = MockAdapter(); adapter.onRequest = (o) => Response( requestOptions: o, data: {'code': 50, 'message': '账号不存在', 'data': null}); final storage = InMemoryTokenStorage(); final container = ProviderContainer(overrides: [ tokenStorageProvider.overrideWithValue(storage), apiClientProvider.overrideWith((ref) => ApiClient( tokenStorage: storage, dio: Dio(BaseOptions(baseUrl: 'http://test')) ..httpClientAdapter = adapter)), ]); addTearDown(container.dispose); await container.read(authProvider.notifier).login('a', '123456'); final state = container.read(authProvider); expect(state.hasError, true); expect(state.error.toString(), contains('账号不存在')); expect(state.value?.authenticated, false); }); } /// 内存版 TokenStorage(测试用,无需 SharedPreferences 插件) class InMemoryTokenStorage extends TokenStorage { String? _t; @override String? get token => _t; @override Future load() async {} @override Future save(String token) async => _t = token; @override Future clear() async => _t = null; }