@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
173 lines (172 loc) • 8.44 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
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());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const importer_gpx_1 = require("./importer.gpx");
const xmldom_1 = __importDefault(require("@xmldom/xmldom"));
describe('importer.gpx', () => {
afterEach(() => {
jest.useRealTimers();
});
it('parses gpx without name', () => __awaiter(void 0, void 0, void 0, function* () {
const gpxString = `
<gpx creator="Garmin Connect" version="1.1"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/11.xsd"
xmlns:ns3="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
<metadata>
<link href="connect.garmin.com">
<text>Garmin Connect</text>
</link>
<time>2019-09-29T13:58:25.000Z</time>
</metadata>
<trk>
<type>road_biking</type>
<trkseg>
<trkpt lat="1" lon="2">
<time>2019-09-29T13:58:25.000Z</time>
</trkpt>
</trkseg>
</trk>
</gpx> `;
const result = yield importer_gpx_1.EventImporterGPX.getFromString(gpxString, xmldom_1.default.DOMParser);
expect(result.getFirstActivity().name).toEqual('');
}));
it('parses gpx with name', () => __awaiter(void 0, void 0, void 0, function* () {
const gpxString = `
<gpx creator="Garmin Connect" version="1.1"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/11.xsd"
xmlns:ns3="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
<metadata>
<link href="connect.garmin.com">
<text>Garmin Connect</text>
</link>
<time>2019-09-29T13:58:25.000Z</time>
</metadata>
<trk>
<name>Meylan Road Cycling</name>
<type>road_biking</type>
<trkseg>
<trkpt lat="1" lon="2">
<time>2019-09-29T13:58:25.000Z</time>
</trkpt>
</trkseg>
</trk>
</gpx> `;
const result = yield importer_gpx_1.EventImporterGPX.getFromString(gpxString, xmldom_1.default.DOMParser);
expect(result.getFirstActivity().name).toEqual('Meylan Road Cycling');
}));
it('rejects route.gpx from the activity importer', () => __awaiter(void 0, void 0, void 0, function* () {
const fs = yield Promise.resolve().then(() => __importStar(require('fs')));
const path = yield Promise.resolve().then(() => __importStar(require('path')));
const samplesDir = path.resolve(__dirname, '../../../../../samples/gpx');
const filePath = path.join(samplesDir, 'route.gpx');
const fileString = fs.readFileSync(filePath, 'utf-8');
yield expect(importer_gpx_1.EventImporterGPX.getFromString(fileString, xmldom_1.default.DOMParser)).rejects.toThrow('use importRoutesFromGPX');
}));
it('rejects route-only GPX with metadata time instead of fabricating activity dates', () => __awaiter(void 0, void 0, void 0, function* () {
const gpxString = `
<gpx creator="Garmin Connect" version="1.1"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<metadata>
<time>2019-09-29T13:58:25.000Z</time>
</metadata>
<rte>
<name>Route A</name>
<rtept lat="1" lon="2"/>
<rtept lat="1.1" lon="2.1"/>
</rte>
<rte>
<name>Route B</name>
<rtept lat="3" lon="4"/>
</rte>
</gpx>`;
yield expect(importer_gpx_1.EventImporterGPX.getFromString(gpxString, xmldom_1.default.DOMParser)).rejects.toThrow('use importRoutesFromGPX');
}));
it('rejects route-only GPX without metadata time instead of fabricating epoch dates', () => __awaiter(void 0, void 0, void 0, function* () {
const gpxString = `
<gpx creator="Garmin Connect" version="1.1"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<rte>
<name>Route A</name>
<rtept lat="1" lon="2"/>
<rtept lat="1.1" lon="2.1"/>
</rte>
<rte>
<name>Route B</name>
<rtept lat="3" lon="4"/>
<rtept lat="3.1" lon="4.1"/>
<rtept lat="3.2" lon="4.2"/>
</rte>
</gpx>`;
yield expect(importer_gpx_1.EventImporterGPX.getFromString(gpxString, xmldom_1.default.DOMParser)).rejects.toThrow('use importRoutesFromGPX');
}));
it('produces stable route-only rejection regardless of current system time', () => __awaiter(void 0, void 0, void 0, function* () {
const gpxString = `
<gpx creator="Garmin Connect" version="1.1"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<rte>
<name>Route A</name>
<rtept lat="1" lon="2"/>
<rtept lat="1.1" lon="2.1"/>
</rte>
<rte>
<name>Route B</name>
<rtept lat="3" lon="4"/>
</rte>
</gpx>`;
jest.useFakeTimers().setSystemTime(new Date('2025-01-01T00:00:00.000Z'));
yield expect(importer_gpx_1.EventImporterGPX.getFromString(gpxString, xmldom_1.default.DOMParser)).rejects.toThrow('use importRoutesFromGPX');
jest.setSystemTime(new Date('2030-01-01T00:00:00.000Z'));
yield expect(importer_gpx_1.EventImporterGPX.getFromString(gpxString, xmldom_1.default.DOMParser)).rejects.toThrow('use importRoutesFromGPX');
}));
});