Files
ReelShort/test/core/device_id_test.dart
T
Vicky a3f3481f4f feat: phase1 UI prep — 设备ID系统传递 + 国家本地化展示 + 继续观看直进播放页
设备标识: Android SSAID/ iOS IDFV 原生通道 → Dart DeviceIdProvider
国家解析: 注册/登录从后端 IP → 国家/语言/时区/币种 自动落库
账号资料: 全部本地化展示 (account_display.dart)
我的页: 继续观看卡片点击直接进播放页
2026-10-27 15:45:20 +08:00

82 lines
2.4 KiB
Dart

// Author: fruit.com.cn
import 'package:flutter_test/flutter_test.dart';
import 'package:fruitshorts/core/data/services/auth_session_store.dart';
import 'package:fruitshorts/core/data/services/device_id_provider.dart';
import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart';
import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart';
/// 可控的系统设备标识来源。
class _FakeDeviceIdProvider implements DeviceIdProvider {
_FakeDeviceIdProvider(this.value, {this.region});
final String? value;
final String? region;
int calls = 0;
@override
Future<String?> systemDeviceId() async {
calls++;
return value;
}
@override
Future<String?> deviceRegion() async => region;
}
void main() {
setUp(() {
SharedPreferencesAsyncPlatform.instance =
InMemorySharedPreferencesAsync.empty();
});
test('should_prefer_system_device_id_over_local_value', () async {
final provider = _FakeDeviceIdProvider('a-9774d56d682e549c');
final store = AuthSessionStore(deviceIdProvider: provider);
expect(await store.deviceId(), 'a-9774d56d682e549c');
});
test('should_fall_back_to_stable_local_uuid_when_system_id_missing', () async {
final store = AuthSessionStore(
deviceIdProvider: _FakeDeviceIdProvider(null),
);
final first = await store.deviceId();
final second = await store.deviceId();
// 同一次运行内固定,且符合 UUIDv4 形态
expect(first, second);
expect(first, startsWith('d-'));
expect(
RegExp(
r'^d-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$',
).hasMatch(first),
isTrue,
reason: '本地兜底必须是 UUIDv4,避免 32 位随机带来的碰撞',
);
});
test('should_cache_system_id_within_one_session', () async {
final provider = _FakeDeviceIdProvider('i-E621E1F8-C36C-495A-93FC-0C247A3E6E5F');
final store = AuthSessionStore(deviceIdProvider: provider);
await store.deviceId();
await store.deviceId();
expect(provider.calls, 1);
});
test('should_return_device_region_or_empty_string', () async {
final store = AuthSessionStore(
deviceIdProvider: _FakeDeviceIdProvider(null, region: 'TH'),
);
final missing = AuthSessionStore(
deviceIdProvider: _FakeDeviceIdProvider(null),
);
expect(await store.deviceRegion(), 'TH');
expect(await missing.deviceRegion(), '');
});
}