// settings_autoconnect_test.dart — 自动连接开关:默认关 + 改状态并持久化(重启恢复)。 import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:pangolin_vpn/bridge/vpn_bridge_mock.dart'; import 'package:pangolin_vpn/bridge/vpn_bridge_provider.dart'; import 'package:pangolin_vpn/state/settings_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); setUp(() { SharedPreferences.setMockInitialValues({}); // 桌面(mac 测试机)构造时会跑 _applyAutostart → PackageInfo.fromPlatform; // mock 掉避免无插件挂起、_load 拖到 dispose 之后报「used after dispose」。 PackageInfo.setMockInitialValues( appName: 'Pangolin', packageName: 'com.pangolin', version: '1.0.0', buildNumber: '1', buildSignature: '', ); }); ProviderContainer makeContainer() => ProviderContainer(overrides: [ vpnBridgeProvider.overrideWithValue(VpnBridgeMock()), ]); // 轮询等 _load() 把持久化值读进 state(异步,首次 SharedPreferences 初始化可能偏慢)。 Future waitAutoConnect(ProviderContainer c, bool want) async { for (var i = 0; i < 60; i++) { if (c.read(settingsProvider).autoConnect == want) return; await Future.delayed(const Duration(milliseconds: 10)); } } test('autoConnect 默认关(const 默认 + 空存储加载)', () async { expect(const AppSettings().autoConnect, isFalse); final c = makeContainer(); addTearDown(c.dispose); await waitAutoConnect(c, false); expect(c.read(settingsProvider).autoConnect, isFalse); }); test('_load 从持久化恢复 autoConnect=true', () async { SharedPreferences.setMockInitialValues({'set_auto_connect': true}); final c = makeContainer(); addTearDown(c.dispose); await waitAutoConnect(c, true); expect(c.read(settingsProvider).autoConnect, isTrue, reason: '应读出持久化值'); }); test('setAutoConnect 写入持久化存储', () async { final c = makeContainer(); addTearDown(c.dispose); await waitAutoConnect(c, false); // 等初次加载安定 await c.read(settingsProvider.notifier).setAutoConnect(true); // 校验落盘(状态可能被并发的初次 _load 覆盖,但存储一定被写入)。 final p = await SharedPreferences.getInstance(); expect(p.getBool('set_auto_connect'), isTrue, reason: '应持久化'); }); }