Files
51dj_android/analytics_sdk/test/domain_manager_cache_test.dart
T
2026-10-08 11:37:25 +07:00

95 lines
3.5 KiB
Dart

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);
});
});
}