import 'package:flutter_test/flutter_test.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:jiu_client/core/auth/auth_state.dart'; void main() { setUp(() { SharedPreferences.setMockInitialValues({}); }); group('AuthNotifier', () { late AuthNotifier notifier; setUp(() { notifier = AuthNotifier(); }); test('initial state is not logged in and not initialized', () { expect(notifier.state.isLoggedIn, false); expect(notifier.state.initialized, false); }); test('restore() sets initialized=true when no stored tokens', () async { await notifier.restore(); expect(notifier.state.initialized, true); expect(notifier.state.isLoggedIn, false); }); test('restore() restores user from stored tokens', () async { SharedPreferences.setMockInitialValues({ 'access_token': 'test-access-token', 'refresh_token': 'test-refresh-token', 'username': 'admin', 'real_name': '管理员', 'shop_no': 'S001', 'shop_id': '1', }); await notifier.restore(); expect(notifier.state.initialized, true); expect(notifier.state.isLoggedIn, true); expect(notifier.state.user!.username, 'admin'); expect(notifier.state.user!.shopNo, 'S001'); expect(notifier.state.user!.accessToken, 'test-access-token'); }); test('login() saves user and updates state', () async { const user = AuthUser( accessToken: 'at', refreshToken: 'rt', username: 'admin', realName: '管理员', shopNo: 'S001', shopId: 1, ); await notifier.login(user); expect(notifier.state.isLoggedIn, true); expect(notifier.state.user!.username, 'admin'); final prefs = await SharedPreferences.getInstance(); expect(prefs.getString('access_token'), 'at'); expect(prefs.getString('refresh_token'), 'rt'); }); test('logout() removes auth keys and clears state', () async { SharedPreferences.setMockInitialValues({ 'access_token': 'token', 'refresh_token': 'rt', 'username': 'admin', 'login_history_hotels': ['S001'], }); await notifier.restore(); expect(notifier.state.isLoggedIn, true); await notifier.logout(); expect(notifier.state.isLoggedIn, false); final prefs = await SharedPreferences.getInstance(); expect(prefs.getString('access_token'), null); // Login history must NOT be cleared on logout expect(prefs.getStringList('login_history_hotels'), ['S001']); }); test('updateAccessToken() updates token without changing other fields', () async { await notifier.login(const AuthUser( accessToken: 'old-token', refreshToken: 'rt', username: 'admin', realName: '管理员', shopNo: 'S001', shopId: 1, )); notifier.updateAccessToken('new-token'); expect(notifier.state.user!.accessToken, 'new-token'); expect(notifier.state.user!.refreshToken, 'rt'); expect(notifier.state.user!.username, 'admin'); }); }); }