diff --git a/test/bvg.js b/test/bvg.js index 2508ba2b..2226c438 100644 --- a/test/bvg.js +++ b/test/bvg.js @@ -26,6 +26,7 @@ const testJourneysStationToStation = require('./lib/journeys-station-to-station' const testJourneysStationToAddress = require('./lib/journeys-station-to-address') const testJourneysStationToPoi = require('./lib/journeys-station-to-poi') const testEarlierLaterJourneys = require('./lib/earlier-later-journeys') +const testLegCycleAlternatives = require('./lib/leg-cycle-alternatives') const testRefreshJourney = require('./lib/refresh-journey') const journeysFailsWithNoProduct = require('./lib/journeys-fails-with-no-product') const testDepartures = require('./lib/departures') @@ -144,38 +145,12 @@ test('earlier/later journeys', co(function* (t) { })) test('journeys – leg cycle & alternatives', co(function* (t) { - // Apparently the BVG endpoint only returns alternatives for S-Bahn legs, - // not for U-Bahn legs. It also won't return the cycle or alternatives - // more than ~2 hours in advance. This is why we don't pass `when` here. - const journeys = yield client.journeys(tiergarten, jannowitzbrücke, { - results: 3 + yield testLegCycleAlternatives({ + test: t, + fetchJourneys: client.journeys, + fromId: tiergarten, + toId: jannowitzbrücke }) - - for (let i = 0; i < journeys.length; i++) { - const journey = journeys[i] - for (let j = 0; j < journey.legs.length; j++) { - const leg = journey.legs[j] - if (!leg.line) continue - const name = `journeys[${i}].legs[${j}]` - - t.ok(leg.cycle, name + '.cycle is missing') - t.equal(typeof leg.cycle.min, 'number', name + '.cycle.min is not a number') - t.equal(typeof leg.cycle.max, 'number', name + '.cycle.max is not a number') - t.equal(typeof leg.cycle.nr, 'number', name + '.cycle.nr is not a number') - - const lW = +new Date(leg.departure) - t.ok(Array.isArray(leg.alternatives), name + '.alternatives must be an array') - for (let k = 0; k < leg.alternatives.length; k++) { - const a = leg.alternatives[k] - const n = name + `.alternatives[${k}]` - - let aW = +new Date(a.when) - if ('number' === typeof a.delay) aW -= a.delay * 1000 - t.ok(isRoughlyEqual(2 * hour, aW, lW), n + '.when seems invalid') - } - } - } - t.end() })) diff --git a/test/db.js b/test/db.js index 075e44d9..3b8082c5 100644 --- a/test/db.js +++ b/test/db.js @@ -20,6 +20,7 @@ const testJourneysStationToStation = require('./lib/journeys-station-to-station' const testJourneysStationToAddress = require('./lib/journeys-station-to-address') const testJourneysStationToPoi = require('./lib/journeys-station-to-poi') const testEarlierLaterJourneys = require('./lib/earlier-later-journeys') +const testLegCycleAlternatives = require('./lib/leg-cycle-alternatives') const testRefreshJourney = require('./lib/refresh-journey') const journeysFailsWithNoProduct = require('./lib/journeys-fails-with-no-product') const testDepartures = require('./lib/departures') @@ -79,6 +80,8 @@ const wedding = '008089131' const württembergallee = '731084' const regensburgHbf = '8000309' const blnOstbahnhof = '8010255' +const blnTiergarten = '8089091' +const blnJannowitzbrücke = '8089019' test('journeys – Berlin Schwedter Str. to München Hbf', co(function* (t) { const journeys = yield client.journeys(blnSchwedterStr, münchenHbf, { @@ -195,6 +198,16 @@ test('earlier/later journeys, Jungfernheide -> München Hbf', co(function* (t) { t.end() })) +test('journeys – leg cycle & alternatives', co(function* (t) { + yield testLegCycleAlternatives({ + test: t, + fetchJourneys: client.journeys, + fromId: blnTiergarten, + toId: blnJannowitzbrücke + }) + t.end() +})) + test('refreshJourney', co(function* (t) { yield testRefreshJourney({ test: t, diff --git a/test/lib/leg-cycle-alternatives.js b/test/lib/leg-cycle-alternatives.js new file mode 100644 index 00000000..65f38fc5 --- /dev/null +++ b/test/lib/leg-cycle-alternatives.js @@ -0,0 +1,47 @@ +'use strict' + +const isRoughlyEqual = require('is-roughly-equal') + +const co = require('./co') +const {hour} = require('./util') + +const testLegCycleAlternatives = co(function* (cfg) { + const { + test: t, + fetchJourneys, + fromId, + toId + } = cfg + + // Apparently HAFAS doesn't return the leg cycle or alternatives more + // than ~2 hours in advance. This is why we don't pass `when` here. + const journeys = yield fetchJourneys(fromId, toId, {results: 3}) + + for (let i = 0; i < journeys.length; i++) { + const journey = journeys[i] + for (let j = 0; j < journey.legs.length; j++) { + const leg = journey.legs[j] + const name = `journeys[${i}].legs[${j}]` + + if (!leg.line) continue + + t.ok(leg.cycle, name + '.cycle is missing') + t.equal(typeof leg.cycle.min, 'number', name + '.cycle.min is not a number') + t.equal(typeof leg.cycle.max, 'number', name + '.cycle.max is not a number') + t.equal(typeof leg.cycle.nr, 'number', name + '.cycle.nr is not a number') + + const lineWhen = +new Date(leg.departure) + t.ok(Array.isArray(leg.alternatives), name + '.alternatives must be an array') + for (let k = 0; k < leg.alternatives.length; k++) { + const a = leg.alternatives[k] + const n = name + `.alternatives[${k}]` + + let alternativeWhen = +new Date(a.when) + if ('number' === typeof a.delay) alternativeWhen -= a.delay * 1000 + t.ok(isRoughlyEqual(2 * hour, alternativeWhen, lineWhen), n + '.when seems invalid') + } + } + } +}) + +module.exports = testLegCycleAlternatives