// selected_node_persist_test.dart — 选中节点(智能/具体)跨重启持久化,供自动连接复用上次选择。 import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pangolin_vpn/models/node.dart'; import 'package:pangolin_vpn/state/nodes_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); setUp(() => SharedPreferences.setMockInitialValues({})); Future waitSelected(ProviderContainer c, String want) async { for (var i = 0; i < 60; i++) { if (c.read(selectedNodeCodeProvider) == want) return; await Future.delayed(const Duration(milliseconds: 10)); } } test('默认智能选择(AUTO)', () async { final c = ProviderContainer(); addTearDown(c.dispose); expect(c.read(selectedNodeCodeProvider), kSmartNodeCode); }); test('select 具体节点 → 落盘', () async { final c = ProviderContainer(); addTearDown(c.dispose); await waitSelected(c, kSmartNodeCode); // 等 _load await c.read(selectedNodeCodeProvider.notifier).select('JP'); expect(c.read(selectedNodeCodeProvider), 'JP'); final p = await SharedPreferences.getInstance(); expect(p.getString('selected_node_code'), 'JP', reason: '应持久化'); }); test('重启从持久化恢复具体节点', () async { SharedPreferences.setMockInitialValues({'selected_node_code': 'JP'}); final c = ProviderContainer(); addTearDown(c.dispose); await waitSelected(c, 'JP'); expect(c.read(selectedNodeCodeProvider), 'JP', reason: '重启应恢复上次选择'); }); test('重启恢复智能选择(AUTO 持久化)', () async { SharedPreferences.setMockInitialValues({'selected_node_code': kSmartNodeCode}); final c = ProviderContainer(); addTearDown(c.dispose); await waitSelected(c, kSmartNodeCode); expect(c.read(selectedNodeCodeProvider), kSmartNodeCode); }); }