@sports-alliance/sports-lib
Version:
A Library to for importing / exporting and processing GPX, TCX, FIT and JSON files from services such as Strava, Movescount, Garmin, Polar etc
204 lines (203 loc) • 9.87 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const importer_json_1 = require("./importer.json");
const activity_types_1 = require("../../../../activities/activity.types");
const data_avg_vam_1 = require("../../../../data/data.avg-vam");
const data_jump_stats_1 = require("../../../../data/data.jump-stats");
const data_max_hr_setting_1 = require("../../../../data/data.max-hr-setting");
const data_avg_respiration_rate_1 = require("../../../../data/data.avg-respiration-rate");
const data_distance_1 = require("../../../../data/data.distance");
const data_ibi_1 = require("../../../../data/data.ibi");
const data_power_balance_left_1 = require("../../../../data/data.power-balance-left");
const data_power_balance_right_1 = require("../../../../data/data.power-balance-right");
const data_time_1 = require("../../../../data/data.time");
const ibi_stream_1 = require("../../../../streams/ibi-stream");
describe('EventImporterJSON legacy type compatibility', () => {
it('maps legacy stat keys to canonical types via DynamicDataLoader aliases', () => {
var _a, _b, _c, _d, _e, _f;
const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({
name: 'legacy-json',
startDate: 0,
endDate: 1000,
type: activity_types_1.ActivityTypes.Running,
powerMeter: false,
trainer: false,
stats: {
'Avg VAM': 123,
'Jump Height Avg': 1.5,
'Max HR Setting': 190,
'Respiration Rate Avg': 16,
'Left Balance': 51,
'Right Balance': 49
},
streams: [],
laps: [],
creator: { name: 'test', devices: [] },
intensityZones: [],
events: []
});
expect((_a = activity.getStat(data_avg_vam_1.DataAvgVAM.type)) === null || _a === void 0 ? void 0 : _a.getValue()).toBe(123);
expect((_b = activity.getStat(data_jump_stats_1.DataJumpHeightAvg.type)) === null || _b === void 0 ? void 0 : _b.getValue()).toBe(1.5);
expect((_c = activity.getStat(data_max_hr_setting_1.DataMaxHRSetting.type)) === null || _c === void 0 ? void 0 : _c.getValue()).toBe(190);
expect((_d = activity.getStat(data_avg_respiration_rate_1.DataAvgRespirationRate.type)) === null || _d === void 0 ? void 0 : _d.getValue()).toBe(16);
expect((_e = activity.getStat(data_power_balance_left_1.DataPowerBalanceLeft.type)) === null || _e === void 0 ? void 0 : _e.getValue()).toBe(51);
expect((_f = activity.getStat(data_power_balance_right_1.DataPowerBalanceRight.type)) === null || _f === void 0 ? void 0 : _f.getValue()).toBe(49);
});
it('prefers canonical stat keys when legacy aliases collide with them', () => {
var _a, _b;
const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({
name: 'mixed-json-balance-stats',
startDate: 0,
endDate: 1000,
type: activity_types_1.ActivityTypes.Cycling,
powerMeter: true,
trainer: false,
stats: {
[data_power_balance_left_1.DataPowerBalanceLeft.type]: 61,
'Left Balance': 51,
'Right Balance': 49,
[data_power_balance_right_1.DataPowerBalanceRight.type]: 39
},
streams: [],
laps: [],
creator: { name: 'test', devices: [] },
intensityZones: [],
events: []
});
expect((_a = activity.getStat(data_power_balance_left_1.DataPowerBalanceLeft.type)) === null || _a === void 0 ? void 0 : _a.getValue()).toBe(61);
expect((_b = activity.getStat(data_power_balance_right_1.DataPowerBalanceRight.type)) === null || _b === void 0 ? void 0 : _b.getValue()).toBe(39);
});
it('maps legacy balance stream keys to canonical power balance types', () => {
const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({
name: 'legacy-json-balance-streams',
startDate: 0,
endDate: 3000,
type: activity_types_1.ActivityTypes.Cycling,
powerMeter: true,
trainer: false,
stats: {},
streams: {
'Left Balance': [51, 52, 53],
'Right Balance': [49, 48, 47]
},
laps: [],
creator: { name: 'test', devices: [] },
intensityZones: [],
events: []
});
expect(activity.hasStreamData('Left Balance')).toBe(false);
expect(activity.hasStreamData('Right Balance')).toBe(false);
expect(activity.getStream(data_power_balance_left_1.DataPowerBalanceLeft.type).getData()).toEqual([51, 52, 53]);
expect(activity.getStream(data_power_balance_right_1.DataPowerBalanceRight.type).getData()).toEqual([49, 48, 47]);
});
it('dedupes mixed legacy and canonical balance streams without throwing', () => {
const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({
name: 'mixed-json-balance-streams',
startDate: 0,
endDate: 3000,
type: activity_types_1.ActivityTypes.Cycling,
powerMeter: true,
trainer: false,
stats: {},
streams: {
[data_power_balance_left_1.DataPowerBalanceLeft.type]: [61, 62, 63],
'Left Balance': [51, 52, 53],
'Right Balance': [49, 48, 47],
[data_power_balance_right_1.DataPowerBalanceRight.type]: [39, 38, 37]
},
laps: [],
creator: { name: 'test', devices: [] },
intensityZones: [],
events: []
});
expect(activity.getStream(data_power_balance_left_1.DataPowerBalanceLeft.type).getData()).toEqual([61, 62, 63]);
expect(activity.getStream(data_power_balance_right_1.DataPowerBalanceRight.type).getData()).toEqual([39, 38, 37]);
});
it('dedupes mixed legacy and canonical array streams without throwing', () => {
const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({
name: 'mixed-json-balance-array-streams',
startDate: 0,
endDate: 3000,
type: activity_types_1.ActivityTypes.Cycling,
powerMeter: true,
trainer: false,
stats: {},
streams: [
{ type: data_power_balance_left_1.DataPowerBalanceLeft.type, data: [61, 62, 63] },
{ type: 'Left Balance', data: [51, 52, 53] },
{ type: 'Right Balance', data: [49, 48, 47] },
{ type: data_power_balance_right_1.DataPowerBalanceRight.type, data: [39, 38, 37] }
],
laps: [],
creator: { name: 'test', devices: [] },
intensityZones: [],
events: []
});
expect(activity.getStream(data_power_balance_left_1.DataPowerBalanceLeft.type).getData()).toEqual([61, 62, 63]);
expect(activity.getStream(data_power_balance_right_1.DataPowerBalanceRight.type).getData()).toEqual([39, 38, 37]);
});
it('ignores legacy object-form Time streams while preserving IBI streams', () => {
const activity = importer_json_1.EventImporterJSON.getActivityFromJSON({
name: 'legacy-json-streams',
startDate: 0,
endDate: 3000,
type: activity_types_1.ActivityTypes.Running,
powerMeter: false,
trainer: false,
stats: {},
streams: {
[data_time_1.DataTime.type]: [0, 1, 2, 3],
[data_distance_1.DataDistance.type]: [0, null, null, 30],
[data_ibi_1.DataIBI.type]: [823, 823, 823]
},
laps: [],
creator: { name: 'test', devices: [] },
intensityZones: [],
events: []
});
expect(activity.hasStreamData(data_time_1.DataTime.type)).toBe(false);
expect(activity.getStream(data_distance_1.DataDistance.type).getData()).toEqual([0, null, null, 30]);
expect(activity.getStream(data_ibi_1.DataIBI.type)).toBeInstanceOf(ibi_stream_1.IBIStream);
expect(activity.generateTimeStream([data_ibi_1.DataIBI.type]).getData(true)).toEqual([1, 2]);
});
it('preserves zero-valued device fields and timestamps when importing creator JSON', () => {
var _a;
const creator = importer_json_1.EventImporterJSON.getCreatorFromJSON({
name: 'test',
devices: [
{
type: 'bike computer',
name: null,
index: 0,
batteryStatus: null,
batteryLevel: 0,
batteryVoltage: 0,
manufacturer: null,
serialNumber: null,
product: 0,
swInfo: null,
hwInfo: null,
antDeviceNumber: 0,
antTransmissionType: 0,
antNetwork: null,
sourceType: null,
antId: '0:0',
cumOperatingTime: 0,
timestamp: '2024-01-01T10:00:00.000Z'
}
]
});
expect(creator.devices[0]).toMatchObject({
type: 'bike computer',
index: 0,
batteryLevel: 0,
batteryVoltage: 0,
product: 0,
antDeviceNumber: 0,
antTransmissionType: 0,
antId: '0:0',
cumOperatingTime: 0
});
expect((_a = creator.devices[0].timestamp) === null || _a === void 0 ? void 0 : _a.toISOString()).toBe('2024-01-01T10:00:00.000Z');
});
});