Multiple improvements
Sonarqube Scanner / Prepare environment (push) Successful in 10s
Sonarqube Scanner / Build and test (push) Successful in 28s
Sonarqube Scanner / SonarQube analysis (push) Successful in 1m8s
Sonarqube Scanner / Deploy to Server (push) Successful in 8s

This commit is contained in:
2026-10-05 01:18:14 +02:00
parent 2b07e9bc47
commit 49a9de0355
27 changed files with 797 additions and 80 deletions
+42
View File
@@ -277,6 +277,8 @@ async function loadApp({ language = 'de-DE' } = {}) {
stop() {}
},
LocalRoutes: {
async getAppPoi(_id, poiId) { return structuredClone(localRoute?.pois.find(poi => Number(poi.id) === Number(poiId)) || null); },
releasePoiMedia() {},
getAppRoute(id) {
if (String(id) !== 'local-1' || !localRoute) throw new Error('lokal nicht gefunden');
return structuredClone(localRoute);
@@ -640,3 +642,43 @@ test('invalid API responses reject initialization and route selection errors res
assert.deepEqual(errors, ['Strecke entfernt']);
assert.equal(button.properties.get('disabled'), false);
});
test('local station playback loads only the selected station and ignores media arriving after leaving', async () => {
const setup = await loadApp();
const { context, harness } = setup;
const ns = context.Wegwichtel;
await ns.App.initialize({ markStep() {} });
const button = new FakeNode('local-select');
button.dataValues.set('route-source', 'local');
button.dataValues.set('route-id', 'local-1');
const requests = [];
const released = [];
ns.LocalRoutes.getAppPoi = (routeId, poiId) => new Promise(resolve => requests.push({ routeId, poiId, resolve }));
ns.LocalRoutes.releasePoiMedia = poi => released.push(poi);
const calls = observeSensors(setup);
await harness.activate('[data-route-select]', button);
assert.equal(requests.length, 0);
const poiButton = new FakeNode('station');
poiButton.dataValues.set('poi-id', 10);
// Use the first actual local station ID rather than assuming server IDs.
const local = ns.LocalRoutes.getAppRoute('local-1');
poiButton.dataValues.set('poi-id', local.pois[0].id);
await harness.activate('[data-poi-select]', poiButton);
assert.equal(requests.length, 1);
assert.equal(requests[0].routeId, 'local-1');
assert.equal(requests[0].poiId, local.pois[0].id);
const firstLoaded = { images: [{ url: 'blob:shown' }], audioUrl: 'blob:shown-audio' };
requests[0].resolve(firstLoaded);
await new Promise(resolve => setImmediate(resolve));
assert.equal(calls.audio.at(-1), 'blob:shown-audio');
assert.equal(calls.slides.at(-1)[0].url, 'blob:shown');
await harness.activate('[data-poi-select]', poiButton);
assert.equal(released[0], firstLoaded);
await harness.activate('#stop-route', new FakeNode('stop'));
const loaded = { images: [{ url: 'blob:late' }], audioUrl: 'blob:late-audio' };
requests[1].resolve(loaded);
await new Promise(resolve => setImmediate(resolve));
assert.equal(released[1], loaded);
assert.equal(calls.audio.includes('blob:late-audio'), false);
});