import 'package:flutter_test/flutter_test.dart'; import 'package:yx_tracking_flutter/yx_tracking_flutter.dart'; void main() { group('Event.fromJson 分支覆盖', () { test('clientType/clientTimestamp 支持 num 与 string', () { final event = Event.fromJson( { 'system_code': 'SYS', 'eventType': 'E_NUM', 'clientType': 3.9, 'clientTimestamp': '123', 'timestamp': '2026-01-01T00:00:00.000Z', 'deviceInfo': { 'os': 'o', 'model': 'm', 'screenResolution': '1x1', }, }, createTime: DateTime.fromMillisecondsSinceEpoch(0), retryCount: 0, ); expect(event.clientType, 3); expect(event.clientTimestamp, 123); }); test('eventParams/customTags 支持非 string key 的 Map', () { final event = Event.fromJson( { 'system_code': 'SYS', 'eventType': 'E_MAP', 'clientType': 3, 'clientTimestamp': 1, 'timestamp': '2026-01-01T00:00:00.000Z', 'deviceInfo': { 'os': 'o', 'model': 'm', 'screenResolution': '1x1', }, 'eventParams': {1: 'v'}, 'customTags': {'k': 1}, }, createTime: DateTime.fromMillisecondsSinceEpoch(0), retryCount: 0, ); expect(event.eventParams?['1'], 'v'); expect(event.customTags?['k'], 1); }); }); test('Event.fromPayload 非 Map JSON 会抛 FormatException', () { expect( () => Event.fromPayload( '[]', createTime: DateTime.fromMillisecondsSinceEpoch(0), retryCount: 0, ), throwsFormatException, ); }); test('StoredEvent.copyWith 可覆盖所有字段', () { final baseEvent = Event( systemCode: 'SYS', eventType: 'BASE', userInfo: null, clientType: 3, clientTimestamp: 1, timestamp: 't', deviceInfo: const DeviceInfo( os: 'o', model: 'm', screenResolution: '1x1', ), eventParams: null, customTags: null, createTime: DateTime.fromMillisecondsSinceEpoch(1), ); final stored = StoredEvent( id: 1, event: baseEvent, retryCount: 2, createTime: DateTime.fromMillisecondsSinceEpoch(2), ); final newEvent = Event( systemCode: baseEvent.systemCode, eventType: 'NEW', userInfo: baseEvent.userInfo, clientType: baseEvent.clientType, clientTimestamp: baseEvent.clientTimestamp, timestamp: baseEvent.timestamp, deviceInfo: baseEvent.deviceInfo, eventParams: baseEvent.eventParams, customTags: baseEvent.customTags, createTime: baseEvent.createTime, retryCount: baseEvent.retryCount, ); final replaced = stored.copyWith( id: 9, event: newEvent, retryCount: 7, createTime: DateTime.fromMillisecondsSinceEpoch(9), ); expect(replaced.id, 9); expect(replaced.event.eventType, 'NEW'); expect(replaced.retryCount, 7); expect(replaced.createTime.millisecondsSinceEpoch, 9); final unchanged = stored.copyWith(); expect(unchanged.id, stored.id); expect(unchanged.event, same(stored.event)); expect(unchanged.retryCount, stored.retryCount); expect(unchanged.createTime, stored.createTime); }); }