import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import shell from 'shelljs'; import PouchDB from 'pouchdb'; import { appendTrkpt, getTrkseg, getTrksegDocs, putTrkseg } from './trkseg'; import getUri from '../lib/ids'; import { put } from './lib'; import { emptyWpt } from './wpt'; import { compactRteOrTrkseg } from './rte'; import { sleep } from '../lib/async-wait'; const test = it; const jest = vi; declare global { var db: any; var dbReady: boolean; } const originalDb = globalThis.db; const originalDateNow = globalThis.Date.now; describe('The trkseg module with a real db', () => { beforeEach(async () => { globalThis.db = new PouchDB('dyomedea', { auto_compaction: false, }); globalThis.Date.now = () => 0; }); afterEach(async () => { try { await db.destroy(); } catch (err) { // console.error(err); await shell.exec('rm -rf $*$'); } globalThis.db = undefined; globalThis.dbReady = false; globalThis.Date.now = originalDateNow; }); it('can write and read a trkseg', async () => { const id = 'gpx/4320836036089189/3trk/000000/000000'; const trkseg: Trkseg = {}; const trksegPut = await putTrkseg(id, trkseg); const trksegGet = await getTrkseg({ id }); expect(trksegGet).toEqual(trkseg); }); it('can write and read a trkseg with trkpts', async () => { const id = 'whatever'; const trkseg: Trkseg = { trkpt: [ { $: { lat: 0, lon: 0 }, }, { $: { lat: 1, lon: 1 }, }, ], }; const trksegPut = await putTrkseg(id, trkseg); const trksegGet = await getTrkseg({ id }); expect(trksegGet).toEqual(trkseg); }); it('can read external trkpts ', async () => { const idTrkseg = 'gpx/4320836036089189/3trk/000000/000000'; const idTrksegpt = 'gpx/4320836036089189/3trk/000000/000000/000035'; const trkpt3: Wpt = { $: { lat: 3, lon: 3 }, }; const trkseg0: Trkseg = { trkpt: [ { $: { lat: 1, lon: 1 }, }, { $: { lat: 2, lon: 2 }, }, ], }; const trkseg1: Trkseg = { trkpt: [ { $: { lat: 1, lon: 1 }, }, { $: { lat: 2, lon: 2 }, }, trkpt3, ], }; const trksegPut = await putTrkseg(idTrkseg, trkseg0); await put(idTrksegpt, 'trkpt', () => trkpt3, emptyWpt); expect(await getTrkseg({ id: idTrkseg })).toEqual(trkseg1); }); it('can can append a new trkpt ', async () => { const idTrkseg = 'gpx/4320836036089189/3trk/000000/000000'; const trkpt3: Wpt = { $: { lat: 3, lon: 3 }, }; const trkseg0: Trkseg = { trkpt: [ { $: { lat: 1, lon: 1 }, }, { $: { lat: 2, lon: 2 }, }, ], }; const trkseg1: Trkseg = { trkpt: [ { $: { lat: 1, lon: 1 }, }, { $: { lat: 2, lon: 2 }, }, trkpt3, ], }; await putTrkseg(idTrkseg, trkseg0); await appendTrkpt({ trksegIdObj: getUri('trkseg', idTrkseg), trkpt: trkpt3, }); expect(await getTrkseg({ id: idTrkseg })).toEqual(trkseg1); }); it('can compact external trkpts after existing internal trkpts', async () => { const idTrkseg = 'gpx/4320836036089189/3trk/000000/000000'; const idTrksegpt = 'gpx/4320836036089189/3trk/000000/000000/000035'; const trkpt3: Wpt = { $: { lat: 3, lon: 3 }, }; const trkseg0: Trkseg = { trkpt: [ { $: { lat: 1, lon: 1 }, }, { $: { lat: 2, lon: 2 }, }, ], }; const trkseg1: Trkseg = { trkpt: [ { $: { lat: 1, lon: 1 }, }, { $: { lat: 2, lon: 2 }, }, trkpt3, ], }; const trksegPut = await putTrkseg(idTrkseg, trkseg0); await put(idTrksegpt, 'trkpt', () => trkpt3, emptyWpt); expect(await getTrkseg({ id: idTrkseg })).toEqual(trkseg1); compactRteOrTrkseg({ id: idTrkseg, getDocs: getTrksegDocs }); expect(await getTrkseg({ id: idTrkseg })).toEqual(trkseg1); }); it('can compact external trkpts without existing internal trkpts', async () => { const idTrkseg = 'gpx/4320836036089189/3trk/000000/000000'; const idTrksegpt1 = 'gpx/4320836036089189/3trk/000000/000000/000035'; const idTrksegpt2 = 'gpx/4320836036089189/3trk/000000/000000/000036'; const trkpt1 = { $: { lat: 1, lon: 1 }, }; const trkpt2 = { $: { lat: 2, lon: 2 }, }; const trkseg0: Trkseg = {}; const trkseg1: Trkseg = { trkpt: [trkpt1, trkpt2], }; const trksegPut = await putTrkseg(idTrkseg, trkseg0); await put(idTrksegpt1, 'trkpt', () => trkpt1, emptyWpt); await put(idTrksegpt2, 'trkpt', () => trkpt2, emptyWpt); const { trkseg, docs } = await getTrksegDocs({ id: idTrkseg }); expect(trkseg).toEqual(trkseg1); expect(docs.rows.length).toEqual(3); await compactRteOrTrkseg({ id: idTrkseg, getDocs: getTrksegDocs }); //await sleep(5000); const { trkseg: trksegx, docs: docsx } = await getTrksegDocs({ id: idTrkseg, }); expect(trksegx).toEqual(trkseg1); expect(docsx.rows.length).toEqual(1); }); });