mirror of
				https://github.com/public-transport/db-vendo-client.git
				synced 2025-11-04 10:06:32 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			329 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			329 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import tap from 'tap';
 | 
						|
import {parseLine as parse} from '../../parse/line.js';
 | 
						|
import {products} from '../../lib/products.js';
 | 
						|
 | 
						|
const profile = {
 | 
						|
	products: products,
 | 
						|
	parseOperator: _ => null,
 | 
						|
};
 | 
						|
const ctx = {
 | 
						|
	data: {},
 | 
						|
	opt: {},
 | 
						|
	profile,
 | 
						|
};
 | 
						|
 | 
						|
tap.test('parses db ICE leg correctly', (t) => {
 | 
						|
	const input = {
 | 
						|
		journeyId: 'foo',
 | 
						|
		verkehrsmittel: {
 | 
						|
			produktGattung: 'ICE',
 | 
						|
			kategorie: 'ICE',
 | 
						|
			name: 'ICE 229',
 | 
						|
			nummer: '229',
 | 
						|
			richtung: 'Wien Hbf',
 | 
						|
			typ: 'PUBLICTRANSPORT',
 | 
						|
			zugattribute: [{
 | 
						|
				kategorie: 'BEFÖRDERER',
 | 
						|
				key: 'BEF',
 | 
						|
				value: 'DB Fernverkehr AG, Österreichische Bundesbahnen',
 | 
						|
			}, {
 | 
						|
				kategorie: 'FAHRRADMITNAHME',
 | 
						|
				key: 'FR',
 | 
						|
				value: 'Bicycles conveyed - subject to reservation',
 | 
						|
				teilstreckenHinweis: '(Mainz Hbf - Wien Meidling)',
 | 
						|
			}],
 | 
						|
			kurzText: 'ICE',
 | 
						|
			mittelText: 'ICE 229',
 | 
						|
			langText: 'ICE 229',
 | 
						|
		},
 | 
						|
	};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 'ice-229',
 | 
						|
		fahrtNr: '229',
 | 
						|
		name: 'ICE 229',
 | 
						|
		public: true,
 | 
						|
		product: 'nationalExpress',
 | 
						|
		productName: 'ICE',
 | 
						|
		mode: 'train',
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
 | 
						|
tap.test('parses db Bus trip correctly', (t) => {
 | 
						|
	const input = {
 | 
						|
		reisetag: '2024-12-07',
 | 
						|
		regulaereVerkehrstage: 'not every day',
 | 
						|
		irregulaereVerkehrstage: '7., 14. Dec 2024',
 | 
						|
		zugName: 'Bus 807',
 | 
						|
		zugattribute: [
 | 
						|
			{
 | 
						|
				kategorie: 'INFORMATION',
 | 
						|
				key: 'cB',
 | 
						|
				value: 'Tel. 0981-9714925, Anmeldung bis 90 Min. vor Abfahrt (Mo-So: 9-15 Uhr)',
 | 
						|
			},
 | 
						|
		],
 | 
						|
		cancelled: false,
 | 
						|
	};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 'bus-807',
 | 
						|
		fahrtNr: '807',
 | 
						|
		name: 'Bus 807',
 | 
						|
		public: true,
 | 
						|
		product: undefined,
 | 
						|
		productName: undefined,
 | 
						|
		mode: undefined,
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
tap.test('parses db trip correctly', (t) => {
 | 
						|
	const input = {
 | 
						|
		reisetag: '2025-01-17',
 | 
						|
		regulaereVerkehrstage: 'daily',
 | 
						|
		zugName: 'ag 84100',
 | 
						|
	};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 'ag-84100',
 | 
						|
		name: 'ag 84100',
 | 
						|
		fahrtNr: '84100',
 | 
						|
		public: true,
 | 
						|
		product: undefined,
 | 
						|
		productName: undefined,
 | 
						|
		mode: undefined,
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
tap.test('parses db Bus leg correctly', (t) => {
 | 
						|
	const input = {
 | 
						|
		journeyId: 'foo',
 | 
						|
		verkehrsmittel: {
 | 
						|
			produktGattung: 'BUS',
 | 
						|
			kategorie: 'Bus',
 | 
						|
			linienNummer: '807',
 | 
						|
			name: 'Bus 807',
 | 
						|
			nummer: '807',
 | 
						|
			richtung: 'Bahnhof, Dombühl',
 | 
						|
			typ: 'PUBLICTRANSPORT',
 | 
						|
			zugattribute: [
 | 
						|
				{
 | 
						|
					kategorie: 'INFORMATION',
 | 
						|
					key: 'cB',
 | 
						|
					value: 'Tel. 0981-9714925, Anmeldung bis 90 Min. vor Abfahrt (Mo-So: 9-15 Uhr)',
 | 
						|
				},
 | 
						|
			],
 | 
						|
			kurzText: 'Bus',
 | 
						|
			mittelText: 'Bus 807',
 | 
						|
			langText: 'Bus 807',
 | 
						|
		},
 | 
						|
	};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 'bus-807',
 | 
						|
		fahrtNr: '807',
 | 
						|
		name: 'Bus 807',
 | 
						|
		public: true,
 | 
						|
		product: 'bus',
 | 
						|
		productName: 'Bus',
 | 
						|
		mode: 'bus',
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
 | 
						|
tap.test('parses ris entry correctly', (t) => {
 | 
						|
	const input = {
 | 
						|
		journeyID: '20241207-79693bf3-2ed5-325f-8a99-154bad5f5cf3',
 | 
						|
		transport: {
 | 
						|
			type: 'HIGH_SPEED_TRAIN',
 | 
						|
			journeyDescription: 'RB 51 (15538)',
 | 
						|
			label: '',
 | 
						|
			category: 'RB',
 | 
						|
			categoryInternal: 'RB',
 | 
						|
			number: 15538,
 | 
						|
			line: '51',
 | 
						|
			replacementTransport: null,
 | 
						|
		},
 | 
						|
	};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 'rb-51-15538',
 | 
						|
		fahrtNr: '15538',
 | 
						|
		name: 'RB 51',
 | 
						|
		public: true,
 | 
						|
		product: 'nationalExpress',
 | 
						|
		productName: 'RB',
 | 
						|
		mode: 'train',
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
tap.test('parses dbnav trip with long name correctly', (t) => {
 | 
						|
	const input = {fahrplan: {regulaererFahrplan: 'daily'}, kurztext: 'ag', mitteltext: 'ag RE22', langtext: 'ag RE22', gleis: '13', himNotizen: [], echtzeitNotizen: [], verkehrsmittelNummer: '84100', richtung: 'Nürnberg Hbf', produktGattung: 'RB', reisetag: '2025-01-17'};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 'ag-re22',
 | 
						|
		name: 'ag RE22',
 | 
						|
		fahrtNr: '84100',
 | 
						|
		public: true,
 | 
						|
		productName: 'ag',
 | 
						|
		product: 'regional',
 | 
						|
		mode: 'train',
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
tap.test('parses dbnav trip sbahn correctly', (t) => {
 | 
						|
	const input = {fahrplan: {regulaererFahrplan: 'Mo - Sa', tageOhneFahrt: 'not 18., 21. Apr 2025, 1., 29. May 2025, 9., 19. Jun 2025, 3. Oct 2025, 1. Nov 2025'}, kurztext: 'S', mitteltext: 'S 6', gleis: '4', attributNotizen: [], echtzeitNotizen: [], himNotizen: [], verkehrsmittelNummer: '6', richtung: 'Köln-Worringen', produktGattung: 'SBAHN', reisetag: '2025-01-10'};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 's-6',
 | 
						|
		fahrtNr: '6',
 | 
						|
		name: 'S 6',
 | 
						|
		public: true,
 | 
						|
		productName: 'S',
 | 
						|
		mode: 'train',
 | 
						|
		product: 'suburban',
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
tap.test('parses dbnav leg with long name correctly', (t) => {
 | 
						|
	const input = {administrationId: 'S9____', risZuglaufId: 'ag_84100', risAbfahrtId: '8001679_2025-01-17T16:20:00+01:00', kurztext: 'ag', mitteltext: 'ag RE22', langtext: 'ag RE22 (63070) / ag RE22 (84100)', zuglaufId: 'foo', reservierungsMeldungen: [], nummer: 0, abschnittsDauer: 3900, typ: 'FAHRZEUG', verkehrsmittelNummer: '84100', richtung: 'Nürnberg Hbf', produktGattung: 'RB', wagenreihung: false};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 'ag-84100',
 | 
						|
		fahrtNr: '84100',
 | 
						|
		name: 'ag RE22',
 | 
						|
		public: true,
 | 
						|
		productName: 'ag',
 | 
						|
		mode: 'train',
 | 
						|
		product: 'regional',
 | 
						|
		adminCode: 'S9____',
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
tap.test('parses dbnav leg sbahn correctly', (t) => {
 | 
						|
	const input = {
 | 
						|
		administrationId: '8003S_',
 | 
						|
		risZuglaufId: 'S_31600',
 | 
						|
		risAbfahrtId: '8003368_2025-01-10T17:21:00+01:00',
 | 
						|
		kurztext: 'S',
 | 
						|
		mitteltext: 'S 6',
 | 
						|
		langtext: 'S 6',
 | 
						|
		zuglaufId: '2|#VN#1#ST#1736364871#PI#1#ZI#212722#TA#5#DA#100125#1S#8004948#1T#1614#LS#8003373#LT#1746#PU#81#RT#1#CA#s#ZE#6#ZB#S      6#PC#4#FR#8004948#FT#1614#TO#8003373#TT#1746#',
 | 
						|
		nummer: 4,
 | 
						|
		typ: 'FAHRZEUG',
 | 
						|
		abgangsDatum: '2025-01-10T17:21:00+01:00',
 | 
						|
		ankunftsDatum: '2025-01-10T17:23:00+01:00',
 | 
						|
		verkehrsmittelNummer: '6',
 | 
						|
		richtung: 'Köln-Worringen',
 | 
						|
		produktGattung: 'SBAHN',
 | 
						|
		wagenreihung: true,
 | 
						|
	};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 's-31600',
 | 
						|
		fahrtNr: '31600',
 | 
						|
		name: 'S 6',
 | 
						|
		public: true,
 | 
						|
		productName: 'S',
 | 
						|
		mode: 'train',
 | 
						|
		product: 'suburban',
 | 
						|
		adminCode: '8003S_',
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
 | 
						|
tap.test('parses dbnav board ruf correctly', (t) => {
 | 
						|
	const input = {zuglaufId: 'foo', kurztext: 'RUF', mitteltext: 'RUF 9870', produktGattung: 'ANRUFPFLICHTIGEVERKEHRE'};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 'ruf-9870',
 | 
						|
		name: 'RUF 9870',
 | 
						|
		fahrtNr: '9870',
 | 
						|
		public: true,
 | 
						|
		product: 'taxi',
 | 
						|
		productName: 'RUF',
 | 
						|
		mode: 'taxi',
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
tap.test('parses regio guide ruf correctly', (t) => {
 | 
						|
	const input = {train: {journeyId: 'foo', category: 'RUF', type: 'SHUTTLE', no: 47403, lineName: '9870'}, category: 'SHUTTLE', administration: {id: 'vrn062', operatorCode: 'DPN', operatorName: 'Nahreisezug'}};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 'ruf-9870-47403',
 | 
						|
		name: 'RUF 9870',
 | 
						|
		fahrtNr: '47403',
 | 
						|
		public: true,
 | 
						|
		product: 'taxi',
 | 
						|
		productName: 'RUF',
 | 
						|
		mode: 'taxi',
 | 
						|
		adminCode: 'vrn062',
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 | 
						|
 | 
						|
 | 
						|
tap.test('parses regio guide trip line correctly', (t) => {
 | 
						|
	const input = {
 | 
						|
		name: 'S 5',
 | 
						|
		no: 36552,
 | 
						|
		journeyId: '20250114-2080f6df-62d4-3c0f-8a89-0db06bc5c2c8',
 | 
						|
		tenantId: 'hessen',
 | 
						|
		administrationId: '800528',
 | 
						|
		operatorName: 'DB Regio, S-Bahn Rhein-Main',
 | 
						|
		operatorCode: 'DB',
 | 
						|
		category: 'S',
 | 
						|
		type: 'CITY_TRAIN',
 | 
						|
	};
 | 
						|
	const expected = {
 | 
						|
		type: 'line',
 | 
						|
		id: 's-5-36552',
 | 
						|
		name: 'S 5',
 | 
						|
		fahrtNr: '36552',
 | 
						|
		public: true,
 | 
						|
		product: 'suburban',
 | 
						|
		productName: 'S',
 | 
						|
		mode: 'train',
 | 
						|
		adminCode: '800528',
 | 
						|
		operator: null,
 | 
						|
	};
 | 
						|
 | 
						|
	t.same(parse(ctx, input), expected);
 | 
						|
	t.end();
 | 
						|
});
 |