db-vendo-client/test/db.js
2018-04-19 15:21:49 +02:00

298 lines
7.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

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 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 atze = '991598902'
const westhafen = '008089116'
const wedding = '008089131'
const württembergallee = '731084'
const regensburgHbf = '8000309'
test('Berlin Jungfernheide to München Hbf', co(function* (t) {
const journeys = yield client.journeys(jungfernheide, münchenHbf, {
when, passedStations: true
})
validate(t, journeys, 'journeys', 'journeys')
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()
}))