@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
93 lines (92 loc) • 5.27 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const mockParse = jest.fn();
jest.mock('fit-file-parser', () => ({
__esModule: true,
default: jest.fn().mockImplementation(() => ({
parse: mockParse
}))
}));
const activity_parsing_options_1 = require("../../../../activities/activity-parsing-options");
const data_stamina_1 = require("../../../../data/data.stamina");
const importer_fit_1 = require("./importer.fit");
const finiteNumbers = (values) => values.filter((value) => Number.isFinite(value));
const getStatValue = (activity, type) => { var _a; return (_a = activity.getStat(type)) === null || _a === void 0 ? void 0 : _a.getValue(); };
const createGarminStaminaFitObject = () => {
const startTime = new Date('2026-05-21T10:00:00.000Z');
const at = (seconds) => new Date(startTime.getTime() + seconds * 1000);
return {
file_ids: [{ manufacturer: 'garmin' }],
events: [],
sessions: [
{
sport: 'running',
start_time: at(0),
timestamp: at(4),
total_elapsed_time: 4,
total_timer_time: 4,
total_distance: 40,
beginning_potential_stamina: 95,
ending_potential_stamina: 66,
min_stamina: 34,
laps: [
{
start_time: at(0),
timestamp: at(4),
total_elapsed_time: 4,
total_timer_time: 4,
total_distance: 40,
lap_trigger: 'manual',
beginning_potential_stamina: 95,
ending_potential_stamina: 66,
min_stamina: 34
}
]
}
],
records: [
{ timestamp: at(0), distance: 0, speed: 3, stamina: 95, potential_stamina: 95 },
{ timestamp: at(1), distance: 10, speed: 3, stamina: 80, potential_stamina: 92 },
{ timestamp: at(2), distance: 20, speed: 3, stamina: 34, potential_stamina: 80 },
{ timestamp: at(3), distance: 30, speed: 3, stamina: 66, potential_stamina: 66 },
{ timestamp: at(4), distance: 40, speed: 3, stamina: 66, potential_stamina: 66 }
]
};
};
describe('EventImporterFIT Garmin stamina integration', () => {
beforeEach(() => {
mockParse.mockReset();
mockParse.mockImplementation((_arrayBuffer, callback) => {
callback(null, createGarminStaminaFitObject());
});
});
it('should import Garmin stamina from parsed FIT records and session summaries', () => __awaiter(void 0, void 0, void 0, function* () {
var _a, _b, _c;
const event = yield importer_fit_1.EventImporterFIT.getFromArrayBuffer(new ArrayBuffer(1), new activity_parsing_options_1.ActivityParsingOptions({ generateUnitStreams: false }), 'garmin-stamina.fit');
const activity = event.getFirstActivity();
const lap = activity.getLaps()[0];
expect(mockParse).toHaveBeenCalledTimes(1);
expect(finiteNumbers(activity.getStreamData(data_stamina_1.DataStamina.type))).toEqual([95, 80, 34, 66, 66]);
expect(finiteNumbers(activity.getStreamData(data_stamina_1.DataPotentialStamina.type))).toEqual([95, 92, 80, 66, 66]);
expect(getStatValue(activity, data_stamina_1.DataBeginningPotentialStamina.type)).toBe(95);
expect(getStatValue(activity, data_stamina_1.DataEndingPotentialStamina.type)).toBe(66);
expect(getStatValue(activity, data_stamina_1.DataStaminaMin.type)).toBe(34);
expect(getStatValue(activity, data_stamina_1.DataStaminaMax.type)).toBe(95);
expect(getStatValue(activity, data_stamina_1.DataStaminaAvg.type)).toBeCloseTo(68.2, 10);
expect(getStatValue(activity, data_stamina_1.DataPotentialStaminaMin.type)).toBe(66);
expect(getStatValue(activity, data_stamina_1.DataPotentialStaminaMax.type)).toBe(95);
expect(getStatValue(activity, data_stamina_1.DataPotentialStaminaAvg.type)).toBeCloseTo(79.8, 10);
expect((_a = lap.getStat(data_stamina_1.DataBeginningPotentialStamina.type)) === null || _a === void 0 ? void 0 : _a.getValue()).toBe(95);
expect((_b = lap.getStat(data_stamina_1.DataEndingPotentialStamina.type)) === null || _b === void 0 ? void 0 : _b.getValue()).toBe(66);
expect((_c = lap.getStat(data_stamina_1.DataStaminaMin.type)) === null || _c === void 0 ? void 0 : _c.getValue()).toBe(34);
}));
});