db-vendo-client/test/db.js

307 lines
8 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict'
const stations = require('db-stations/full.json')
const a = require('assert')
const tapePromise = require('tape-promise').default
const tape = require('tape')
const isRoughlyEqual = require('is-roughly-equal')
const {createWhen} = require('./lib/util')
const co = require('./lib/co')
const createClient = require('..')
const dbProfile = require('../p/db')
const products = require('../p/db/products')
const {
station: createValidateStation
} = require('./lib/validators')
const createValidate = require('./lib/validate-fptf-with')
const testJourneysStationToStation = require('./lib/journeys-station-to-station')
const isObj = o => o !== null && 'object' === typeof o && !Array.isArray(o)
const when = createWhen('Europe/Berlin', 'de-DE')
const cfg = {
when,
stationCoordsOptional: false,
products
}
const _validateStation = createValidateStation(cfg)
const validateStation = (validate, s, name) => {
_validateStation(validate, s, name)
const match = stations.some(station => (
station.id === s.id ||
(station.additionalIds && station.additionalIds.includes(s.id))
))
if (!match) {
console.error(name + `.id: unknown ID "${s.id}"`)
}
}
const validate = createValidate(cfg, {
station: validateStation
})
const assertValidPrice = (t, p) => {
t.ok(p)
if (p.amount !== null) {
t.equal(typeof p.amount, 'number')
t.ok(p.amount > 0)
}
if (p.hint !== null) {
t.equal(typeof p.hint, 'string')
t.ok(p.hint)
}
}
const test = tapePromise(tape)
const client = createClient(dbProfile)
const berlinHbf = '8011160'
const münchenHbf = '8000261'
const jungfernheide = '8011167'
const blnSchwedterStr = '732652'
const atze = '991598902'
const westhafen = '008089116'
const wedding = '008089131'
const württembergallee = '731084'
const regensburgHbf = '8000309'
test('journeys  Berlin Schwedter Str. to München Hbf', co(function* (t) {
const journeys = yield client.journeys(blnSchwedterStr, münchenHbf, {
results: 3, when, passedStations: true
})
yield testJourneysStationToStation({
test: t,
journeys,
validate,
fromId: blnSchwedterStr,
toId: münchenHbf
})
// todo: find a journey where there pricing info is always available
for (let journey of journeys) {
if (journey.price) assertValidPrice(t, journey.price)
}
t.end()
}))
// todo: journeys, only one product
// todo: journeys, fails with no product
test('Berlin Jungfernheide to Torfstraße 17', co(function* (t) {
const latitude = 52.5416823
const longitude = 13.3491223
const journeys = yield client.journeys(jungfernheide, {
type: 'location', address: 'Torfstraße 17',
latitude, longitude
}, {when})
validate(t, journeys, 'journeys', 'journeys')
const i = journeys[0].legs.length - 1
const d = journeys[0].legs[i].destination
const name = `journeys[0].legs[${i}].destination`
t.equal(d.address, 'Torfstraße 17', name + '.address is invalid')
t.ok(isRoughlyEqual(.0001, d.latitude, latitude), name + '.latitude is invalid')
t.ok(isRoughlyEqual(.0001, d.longitude, longitude), name + '.longitude is invalid')
t.end()
}))
test('Berlin Jungfernheide to ATZE Musiktheater', co(function* (t) {
const latitude = 52.542417
const longitude = 13.350437
const journeys = yield client.journeys(jungfernheide, {
type: 'location', id: atze, name: 'ATZE Musiktheater',
latitude, longitude
}, {when})
validate(t, journeys, 'journeys', 'journeys')
const i = journeys[0].legs.length - 1
const d = journeys[0].legs[i].destination
const name = `journeys[0].legs[${i}].destination`
t.equal(d.name, 'ATZE Musiktheater', name + '.name is invalid')
t.ok(isRoughlyEqual(.0001, d.latitude, latitude), name + '.latitude is invalid')
t.ok(isRoughlyEqual(.0001, d.longitude, longitude), name + '.longitude is invalid')
t.end()
}))
test('journeys: via works with detour', co(function* (t) {
// Going from Westhafen to Wedding via Württembergalle without detour
// is currently impossible. We check if the routing engine computes a detour.
const journeys = yield client.journeys(westhafen, wedding, {
via: württembergallee,
results: 1,
when,
passedStations: true
})
validate(t, journeys, 'journeys', 'journeys')
const leg = journeys[0].legs.some((leg) => {
return leg.passed && leg.passed.some((passed) => {
return passed.station.id === württembergallee
})
})
t.ok(leg, 'Württembergalle is not being passed')
t.end()
}))
test('earlier/later journeys, Jungfernheide -> München Hbf', co(function* (t) {
const model = yield client.journeys(jungfernheide, münchenHbf, {
results: 3, when
})
// todo: move to journeys validator?
t.equal(typeof model.earlierRef, 'string')
t.ok(model.earlierRef)
t.equal(typeof model.laterRef, 'string')
t.ok(model.laterRef)
// when and earlierThan/laterThan should be mutually exclusive
t.throws(() => {
client.journeys(jungfernheide, münchenHbf, {
when, earlierThan: model.earlierRef
})
// silence rejections, we're only interested in exceptions
.catch(() => {})
})
t.throws(() => {
client.journeys(jungfernheide, münchenHbf, {
when, laterThan: model.laterRef
})
// silence rejections, we're only interested in exceptions
.catch(() => {})
})
let earliestDep = Infinity, latestDep = -Infinity
for (let j of model) {
const dep = +new Date(j.legs[0].departure)
if (dep < earliestDep) earliestDep = dep
else if (dep > latestDep) latestDep = dep
}
const earlier = yield client.journeys(jungfernheide, münchenHbf, {
results: 3,
// todo: single journey ref?
earlierThan: model.earlierRef
})
for (let j of earlier) {
t.ok(new Date(j.legs[0].departure) < earliestDep)
}
const later = yield client.journeys(jungfernheide, münchenHbf, {
results: 3,
// todo: single journey ref?
laterThan: model.laterRef
})
for (let j of later) {
t.ok(new Date(j.legs[0].departure) > latestDep)
}
t.end()
}))
test('journey leg details', co(function* (t) {
const journeys = yield client.journeys(berlinHbf, münchenHbf, {
results: 1, when
})
const p = journeys[0].legs[0]
t.ok(p.id, 'precondition failed')
t.ok(p.line.name, 'precondition failed')
const leg = yield client.journeyLeg(p.id, p.line.name, {when})
validate(t, leg, 'journeyLeg', 'leg')
t.end()
}))
test('departures at Berlin Jungfernheide', co(function* (t) {
const deps = yield client.departures(jungfernheide, {
duration: 5, when
})
validate(t, deps, 'departures', 'departures')
for (let i = 0; i < deps.length; i++) {
const dep = deps[i]
const name = `deps[${i}]`
// todo: make this pass
// t.equal(dep.station.id, jungfernheide, name + '.station.id is invalid')
}
// todo: move into deps validator
t.deepEqual(deps, deps.sort((a, b) => t.when > b.when))
t.end()
}))
test('departures with station object', co(function* (t) {
const deps = yield client.departures({
type: 'station',
id: jungfernheide,
name: 'Berlin Jungfernheide',
location: {
type: 'location',
latitude: 1.23,
longitude: 2.34
}
}, {when})
validate(t, deps, 'departures', 'departures')
t.end()
}))
test('nearby Berlin Jungfernheide', co(function* (t) {
const nearby = yield client.nearby({
type: 'location',
latitude: 52.530273,
longitude: 13.299433
}, {
results: 2, distance: 400
})
validate(t, nearby, 'locations', 'nearby')
t.equal(nearby.length, 2)
const s0 = nearby[0]
// todo: trim IDs
t.ok(s0.id === '008011167' || s0.id === jungfernheide)
t.equal(s0.name, 'Berlin Jungfernheide')
t.ok(isRoughlyEqual(s0.location.latitude, 52.530408, .0005))
t.ok(isRoughlyEqual(s0.location.longitude, 13.299424, .0005))
t.ok(s0.distance >= 0)
t.ok(s0.distance <= 100)
// todo: nearby[0]
t.end()
}))
test('locations named Jungfernheide', co(function* (t) {
const locations = yield client.locations('Jungfernheide', {
results: 10
})
validate(t, locations, 'locations', 'locations')
t.ok(locations.length <= 10)
t.ok(locations.some((l) => {
// todo: trim IDs
return l.id === '008011167' || l.id === jungfernheide
}), 'Jungfernheide not found')
t.end()
}))
test('location', co(function* (t) {
const s = yield client.location(regensburgHbf)
validate(t, s, 'station', 'station')
t.equal(s.id, regensburgHbf)
t.end()
}))