Initial commit: 91dj android client dev_1.0.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:analytics_sdk/config/sdk_config.dart';
|
||||
import 'package:analytics_sdk/manager/domain_manager.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
/// DomainManager 磁盘缓存测试
|
||||
///
|
||||
/// 使用 MethodChannel mock 将 path_provider 重定向到系统临时目录,
|
||||
/// 测试缓存读写逻辑而无需真实设备文件系统。
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
late Directory tempDir;
|
||||
const channel = MethodChannel('plugins.flutter.io/path_provider');
|
||||
|
||||
setUp(() async {
|
||||
tempDir = await Directory.systemTemp.createTemp('dm_cache_test_');
|
||||
// 将 path_provider 所有路径请求重定向到临时目录
|
||||
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
||||
.setMockMethodCallHandler(channel, (MethodCall call) async {
|
||||
return tempDir.path;
|
||||
});
|
||||
// 重置单例缓存路径(确保每个 test 都从全新状态开始)
|
||||
DomainManager.instance.reset();
|
||||
});
|
||||
|
||||
tearDown(() async {
|
||||
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
||||
.setMockMethodCallHandler(channel, null);
|
||||
if (tempDir.existsSync()) {
|
||||
await tempDir.delete(recursive: true);
|
||||
}
|
||||
});
|
||||
|
||||
group('DomainManager 磁盘缓存', () {
|
||||
test('缓存文件不存在时 loadCachedDomains() 返回空列表', () async {
|
||||
final result = await DomainManager.instance.loadCachedDomains();
|
||||
expect(result, isEmpty);
|
||||
});
|
||||
|
||||
test('写入缓存后 loadCachedDomains() 返回正确域名列表', () async {
|
||||
final domains = ['https://api.example.com', 'https://api2.example.com'];
|
||||
// 直接写入缓存文件模拟之前 initWithDomains 写入的结果
|
||||
final cacheFile =
|
||||
File('${tempDir.path}/${SdkConfig.domainCacheFileName}');
|
||||
await cacheFile.writeAsString(jsonEncode(domains));
|
||||
|
||||
final result = await DomainManager.instance.loadCachedDomains();
|
||||
expect(result, equals(domains));
|
||||
});
|
||||
|
||||
test('缓存文件 JSON 格式损坏时 loadCachedDomains() 返回空列表(不抛异常)', () async {
|
||||
final cacheFile =
|
||||
File('${tempDir.path}/${SdkConfig.domainCacheFileName}');
|
||||
await cacheFile.writeAsString('not valid json {{{');
|
||||
|
||||
expect(
|
||||
() async => await DomainManager.instance.loadCachedDomains(),
|
||||
returnsNormally,
|
||||
);
|
||||
final result = await DomainManager.instance.loadCachedDomains();
|
||||
expect(result, isEmpty);
|
||||
});
|
||||
|
||||
test('空字符串或空格不被解析为有效域名', () async {
|
||||
final cacheFile =
|
||||
File('${tempDir.path}/${SdkConfig.domainCacheFileName}');
|
||||
await cacheFile.writeAsString(jsonEncode([' ', '', 'https://ok.com']));
|
||||
|
||||
final result = await DomainManager.instance.loadCachedDomains();
|
||||
expect(result, equals(['https://ok.com']));
|
||||
});
|
||||
});
|
||||
|
||||
group('DomainManager.reset()', () {
|
||||
test('reset() 后 fastestDomain 和 reportDomains 均为空', () async {
|
||||
// 先通过缓存文件让 loadCachedDomains 有数据
|
||||
final cacheFile =
|
||||
File('${tempDir.path}/${SdkConfig.domainCacheFileName}');
|
||||
await cacheFile.writeAsString(jsonEncode(['https://api.example.com']));
|
||||
|
||||
// reset() 只清内存状态,不删文件
|
||||
DomainManager.instance.reset();
|
||||
expect(DomainManager.instance.fastestDomain, isNull);
|
||||
expect(DomainManager.instance.reportDomains, isEmpty);
|
||||
|
||||
// 缓存文件应仍然存在
|
||||
expect(cacheFile.existsSync(), isTrue);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user