Multiple improvements
This commit is contained in:
@@ -14,7 +14,7 @@ async function setup() {
|
||||
appendChild(child) { this.children.push(child); }
|
||||
replaceChildren() { this.children = []; }
|
||||
}
|
||||
const ids = ['route-recording-control', 'route-recording-status', 'route-recording-pause', 'route-recording-stop', 'editor-recorded-positions', 'editor-add-position'];
|
||||
const ids = ['route-recording-control', 'route-recording-status', 'route-recording-pause', 'route-recording-stop', 'editor-recorded-positions', 'editor-add-position', 'route-recording-toggle'];
|
||||
const nodes = new Map(ids.map(id => [id, new Element()]));
|
||||
const document = new EventTarget();
|
||||
document.readyState = 'complete';
|
||||
@@ -23,7 +23,7 @@ async function setup() {
|
||||
const intervals = new Map();
|
||||
const packages = new Map([['draft', { id: 'draft', route: { name: 'Entwurf' }, gpx: '[]', pois: [] }]]);
|
||||
const context = { document, Date, console,
|
||||
setInterval(callback, delay) { assert.equal(delay, 30000); intervals.set(1, callback); return 1; },
|
||||
setInterval(callback, delay) { assert.equal(delay, 120000); intervals.set(1, callback); return 1; },
|
||||
clearInterval(id) { intervals.delete(id); },
|
||||
Wegwichtel: { Geo: { current: async () => ({ lat: 50, lon: 10, timestamp: Date.now() }) },
|
||||
LocalRoutes: {
|
||||
@@ -47,7 +47,7 @@ function activate(node, type = 'pointerup', key) {
|
||||
node.dispatchEvent(event);
|
||||
}
|
||||
|
||||
test('recording persists every 30 seconds during an editing session, pauses and finishes', async () => {
|
||||
test('recording persists every two minutes during an editing session, pauses and finishes', async () => {
|
||||
const { recorder, packages, intervals, nodes } = await setup();
|
||||
recorder.start('draft'); await tick();
|
||||
assert.equal(recorder.status, 'recording');
|
||||
@@ -106,10 +106,14 @@ test('missing recorded locations can be filled manually while newer samples rema
|
||||
|
||||
|
||||
test('ending editing stops sampling, reopening permits recording and a fresh app remains inactive', async () => {
|
||||
const { recorder, intervals, packages } = await setup();
|
||||
const { recorder, intervals, packages, nodes } = await setup();
|
||||
assert.equal(recorder.status, 'idle');
|
||||
recorder.beginEditing('draft');
|
||||
await tick();
|
||||
assert.equal(intervals.size, 0);
|
||||
nodes.get('route-recording-toggle').checked = true;
|
||||
nodes.get('route-recording-toggle').dispatchEvent(new Event('change'));
|
||||
await tick();
|
||||
assert.equal(intervals.size, 1);
|
||||
recorder.pause();
|
||||
recorder.beginEditing('draft');
|
||||
@@ -121,8 +125,68 @@ test('ending editing stops sampling, reopening permits recording and a fresh app
|
||||
assert.equal(JSON.parse(packages.get('draft').gpx).length, 1);
|
||||
recorder.beginEditing('draft');
|
||||
await tick();
|
||||
assert.equal(recorder.status, 'recording');
|
||||
assert.equal(recorder.status, 'idle');
|
||||
assert.equal(nodes.get('route-recording-toggle').checked, false);
|
||||
const fresh = await setup();
|
||||
assert.equal(fresh.recorder.status, 'idle');
|
||||
assert.equal(fresh.intervals.size, 0);
|
||||
});
|
||||
|
||||
|
||||
test('the switch can prepare a new draft and late GPS from an older session is ignored', async () => {
|
||||
const { context, recorder, nodes, packages, intervals } = await setup();
|
||||
const answers = [];
|
||||
context.Wegwichtel.Geo.current = () => new Promise(resolve => answers.push(resolve));
|
||||
const toggle = nodes.get('route-recording-toggle');
|
||||
toggle.checked = true; toggle.dispatchEvent(new Event('change'));
|
||||
assert.equal(answers.length, 0);
|
||||
recorder.beginEditing('draft');
|
||||
assert.equal(answers.length, 1);
|
||||
toggle.checked = false; toggle.dispatchEvent(new Event('change'));
|
||||
toggle.checked = true; toggle.dispatchEvent(new Event('change'));
|
||||
assert.equal(answers.length, 2);
|
||||
answers[1]({ lat: 52, lon: 12 }); await tick();
|
||||
answers[0]({ lat: 50, lon: 10 }); await tick();
|
||||
assert.equal(JSON.parse(packages.get('draft').gpx).length, 1);
|
||||
assert.equal(JSON.parse(packages.get('draft').gpx)[0].lat, 52);
|
||||
context.Wegwichtel.Geo.current = async () => ({ lat: 53, lon: 13 });
|
||||
context.document.visibilityState = 'visible';
|
||||
context.document.dispatchEvent(new Event('visibilitychange')); await tick();
|
||||
assert.equal(JSON.parse(packages.get('draft').gpx).length, 2);
|
||||
recorder.endEditing();
|
||||
assert.equal(intervals.size, 0);
|
||||
assert.equal(toggle.checked, false);
|
||||
});
|
||||
|
||||
test('each crosshair fills only its own point without starting recording or saving', async () => {
|
||||
const { recorder, nodes, packages } = await setup();
|
||||
recorder.renderPoints('[{"lat":1,"lon":2},{"lat":3,"lon":4}]');
|
||||
const [first, second] = nodes.get('editor-recorded-positions').children;
|
||||
second.children[5].dispatchEvent(new Event('click')); await tick();
|
||||
assert.equal(first.children[2].value, '1');
|
||||
assert.equal(second.children[2].value, '50');
|
||||
assert.equal(second.children[4].value, '10');
|
||||
assert.equal(recorder.status, 'idle');
|
||||
assert.equal(packages.get('draft').gpx, '[]');
|
||||
assert.match(second.children[6].textContent, /Speichere/);
|
||||
});
|
||||
|
||||
test('manual location errors preserve coordinates and stale or duplicate requests cannot overwrite points', async () => {
|
||||
const { context, recorder, nodes } = await setup();
|
||||
recorder.renderPoints('[{"lat":1,"lon":2}]');
|
||||
const row = nodes.get('editor-recorded-positions').children[0];
|
||||
context.Wegwichtel.Geo.current = async () => { throw new Error('denied'); };
|
||||
row.children[5].dispatchEvent(new Event('click')); await tick();
|
||||
assert.equal(row.children[2].value, '1');
|
||||
assert.match(row.children[6].textContent, /nicht gefunden/);
|
||||
let finish;
|
||||
let requests = 0;
|
||||
context.Wegwichtel.Geo.current = () => { requests++; return new Promise(resolve => { finish = resolve; }); };
|
||||
row.children[5].dispatchEvent(new Event('click'));
|
||||
row.children[5].dispatchEvent(new Event('click'));
|
||||
assert.equal(requests, 1);
|
||||
recorder.renderPoints('[]');
|
||||
finish({ lat: 51, lon: 11 }); await tick();
|
||||
assert.equal(row.children[2].value, '1');
|
||||
assert.equal(row.children[5].disabled, false);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user