yx_tracking_flutter/test/isolate_event_storage_test....

122 lines
3.7 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:yx_tracking_flutter/src/model/device_info.dart';
import 'package:yx_tracking_flutter/src/model/event.dart';
import 'package:yx_tracking_flutter/src/storage/isolate_event_storage.dart';
Event _buildEvent(String type, DateTime createTime) {
final ts = createTime.millisecondsSinceEpoch;
return Event(
systemCode: 'SYS',
eventType: type,
userInfo: null,
clientType: 3,
clientTimestamp: ts,
timestamp: createTime.toUtc().toIso8601String(),
deviceInfo: const DeviceInfo(
os: 'os',
model: 'model',
screenResolution: '1x1',
),
eventParams: null,
customTags: null,
createTime: createTime,
);
}
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
group('IsolateEventStorage (memory backend)', () {
late IsolateEventStorage storage;
setUp(() async {
storage = IsolateEventStorage(backend: IsolateStorageBackend.memory);
await storage.init();
});
tearDown(() async {
await storage.dispose();
});
test('insert/count/fetchBatch 基础流程', () async {
final now = DateTime.now();
await storage.insert(
_buildEvent('A', now.subtract(const Duration(seconds: 2))),
);
await storage.insert(
_buildEvent('B', now.subtract(const Duration(seconds: 1))),
);
expect(await storage.count(), 2);
final batch = await storage.fetchBatch(10);
expect(batch.map((e) => e.event.eventType), <String>['A', 'B']);
});
test('fetchRecent 按时间降序返回', () async {
final now = DateTime.now();
await storage.insert(
_buildEvent('OLD', now.subtract(const Duration(seconds: 2))),
);
await storage.insert(_buildEvent('NEW', now));
final recent = await storage.fetchRecent(1);
expect(recent.single.event.eventType, 'NEW');
});
test('deleteByIds 删除指定事件', () async {
final now = DateTime.now();
final id1 = await storage.insert(_buildEvent('A', now));
final id2 = await storage.insert(
_buildEvent('B', now.add(const Duration(seconds: 1))),
);
await storage.deleteByIds(<int>[id1]);
final left = await storage.fetchBatch(10);
expect(left.map((e) => e.id), <int>[id2]);
});
test('trimToMaxSize 会删除最旧事件', () async {
final now = DateTime.now();
await storage.insert(
_buildEvent('A', now.subtract(const Duration(seconds: 3))),
);
await storage.insert(
_buildEvent('B', now.subtract(const Duration(seconds: 2))),
);
await storage.insert(
_buildEvent('C', now.subtract(const Duration(seconds: 1))),
);
final trimmed = await storage.trimToMaxSize(2);
expect(trimmed, 1);
final left = await storage.fetchBatch(10);
expect(left.map((e) => e.event.eventType), <String>['B', 'C']);
});
test('deleteExpired 会清理过期事件', () async {
final now = DateTime.now();
await storage.insert(
_buildEvent('OLD', now.subtract(const Duration(days: 8))),
);
await storage.insert(_buildEvent('KEEP', now));
final removed = await storage.deleteExpired(
now.subtract(const Duration(days: 7)),
);
expect(removed, 1);
final left = await storage.fetchBatch(10);
expect(left.single.event.eventType, 'KEEP');
});
test('updateRetryCount 会更新 retryCount', () async {
final now = DateTime.now();
final id = await storage.insert(_buildEvent('RETRY', now));
await storage.updateRetryCount(id, 2);
final stored = await storage.fetchBatch(1);
expect(stored.single.retryCount, 2);
expect(stored.single.event.retryCount, 2);
});
});
}