lt-public-transport-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +283 -0
- package/assets/architecture.png +0 -0
- package/dist/config.d.ts +221 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +200 -0
- package/dist/config.js.map +1 -0
- package/dist/enrichment/index.d.ts +6 -0
- package/dist/enrichment/index.d.ts.map +1 -0
- package/dist/enrichment/index.js +6 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/route-matcher.d.ts +64 -0
- package/dist/enrichment/route-matcher.d.ts.map +1 -0
- package/dist/enrichment/route-matcher.js +121 -0
- package/dist/enrichment/route-matcher.js.map +1 -0
- package/dist/errors.d.ts +70 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +104 -0
- package/dist/errors.js.map +1 -0
- package/dist/gtfs/index.d.ts +7 -0
- package/dist/gtfs/index.d.ts.map +1 -0
- package/dist/gtfs/index.js +7 -0
- package/dist/gtfs/index.js.map +1 -0
- package/dist/gtfs/parser.d.ts +39 -0
- package/dist/gtfs/parser.d.ts.map +1 -0
- package/dist/gtfs/parser.js +189 -0
- package/dist/gtfs/parser.js.map +1 -0
- package/dist/gtfs/sync.d.ts +72 -0
- package/dist/gtfs/sync.d.ts.map +1 -0
- package/dist/gtfs/sync.js +271 -0
- package/dist/gtfs/sync.js.map +1 -0
- package/dist/index.d.ts +203 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +342 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/gps-full.d.ts +39 -0
- package/dist/parsers/gps-full.d.ts.map +1 -0
- package/dist/parsers/gps-full.js +212 -0
- package/dist/parsers/gps-full.js.map +1 -0
- package/dist/parsers/gps-lite.d.ts +60 -0
- package/dist/parsers/gps-lite.d.ts.map +1 -0
- package/dist/parsers/gps-lite.js +141 -0
- package/dist/parsers/gps-lite.js.map +1 -0
- package/dist/parsers/index.d.ts +7 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +7 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/schemas.d.ts +129 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +200 -0
- package/dist/schemas.js.map +1 -0
- package/dist/scripts/test-city-specific.d.ts +2 -0
- package/dist/scripts/test-city-specific.d.ts.map +1 -0
- package/dist/scripts/test-city-specific.js +264 -0
- package/dist/scripts/test-city-specific.js.map +1 -0
- package/dist/scripts/test-config-options.d.ts +2 -0
- package/dist/scripts/test-config-options.d.ts.map +1 -0
- package/dist/scripts/test-config-options.js +166 -0
- package/dist/scripts/test-config-options.js.map +1 -0
- package/dist/scripts/test-data-quality.d.ts +2 -0
- package/dist/scripts/test-data-quality.d.ts.map +1 -0
- package/dist/scripts/test-data-quality.js +204 -0
- package/dist/scripts/test-data-quality.js.map +1 -0
- package/dist/scripts/test-error-handling.d.ts +2 -0
- package/dist/scripts/test-error-handling.d.ts.map +1 -0
- package/dist/scripts/test-error-handling.js +146 -0
- package/dist/scripts/test-error-handling.js.map +1 -0
- package/dist/scripts/test-live.d.ts +2 -0
- package/dist/scripts/test-live.d.ts.map +1 -0
- package/dist/scripts/test-live.js +121 -0
- package/dist/scripts/test-live.js.map +1 -0
- package/dist/types.d.ts +120 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/coordinates.d.ts +68 -0
- package/dist/utils/coordinates.d.ts.map +1 -0
- package/dist/utils/coordinates.js +98 -0
- package/dist/utils/coordinates.js.map +1 -0
- package/dist/utils/encoding.d.ts +47 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +153 -0
- package/dist/utils/encoding.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/time.d.ts +50 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +94 -0
- package/dist/utils/time.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { LtTransport } from '../index.js';
|
|
2
|
+
const results = [];
|
|
3
|
+
function pass(name, message) {
|
|
4
|
+
results.push({ name, passed: true, message });
|
|
5
|
+
console.log(` ā
${name}: ${message}`);
|
|
6
|
+
}
|
|
7
|
+
function fail(name, message) {
|
|
8
|
+
results.push({ name, passed: false, message });
|
|
9
|
+
console.log(` ā ${name}: ${message}`);
|
|
10
|
+
}
|
|
11
|
+
function warn(name, message) {
|
|
12
|
+
results.push({ name, passed: true, message: `ā ļø ${message}` });
|
|
13
|
+
console.log(` ā ļø ${name}: ${message}`);
|
|
14
|
+
}
|
|
15
|
+
async function testFilterStaleOption() {
|
|
16
|
+
console.log('\nš Testing filterStale Option...');
|
|
17
|
+
// Get vehicles with stale filter OFF
|
|
18
|
+
const clientNoFilter = new LtTransport({ filterStale: false });
|
|
19
|
+
const vehiclesUnfiltered = await clientNoFilter.getVehicles('vilnius');
|
|
20
|
+
const staleCount = vehiclesUnfiltered.filter(v => v.isStale).length;
|
|
21
|
+
// Get vehicles with stale filter ON
|
|
22
|
+
const clientWithFilter = new LtTransport({ filterStale: true });
|
|
23
|
+
const vehiclesFiltered = await clientWithFilter.getVehicles('vilnius');
|
|
24
|
+
const staleInFiltered = vehiclesFiltered.filter(v => v.isStale).length;
|
|
25
|
+
if (staleCount > 0) {
|
|
26
|
+
if (staleInFiltered === 0) {
|
|
27
|
+
pass('filter-stale', `Correctly filtered ${String(staleCount)} stale vehicles`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
fail('filter-stale', `Still has ${String(staleInFiltered)} stale vehicles after filtering`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
warn('filter-stale', 'No stale vehicles in current data - cannot verify filter');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function testFilterInvalidCoordsOption() {
|
|
38
|
+
console.log('\nš Testing filterInvalidCoords Option...');
|
|
39
|
+
// Get vehicles with coord filter OFF
|
|
40
|
+
const clientNoFilter = new LtTransport({ filterInvalidCoords: false });
|
|
41
|
+
const vehiclesUnfiltered = await clientNoFilter.getVehicles('vilnius');
|
|
42
|
+
// Check for invalid coordinates (outside Lithuania bounds)
|
|
43
|
+
const invalidCoords = vehiclesUnfiltered.filter(v => v.latitude < 53.5 || v.latitude > 56.5 ||
|
|
44
|
+
v.longitude < 20.5 || v.longitude > 27.0 ||
|
|
45
|
+
v.latitude === 0 || v.longitude === 0);
|
|
46
|
+
// Get vehicles with coord filter ON
|
|
47
|
+
const clientWithFilter = new LtTransport({ filterInvalidCoords: true });
|
|
48
|
+
const vehiclesFiltered = await clientWithFilter.getVehicles('vilnius');
|
|
49
|
+
const invalidInFiltered = vehiclesFiltered.filter(v => v.latitude < 53.5 || v.latitude > 56.5 ||
|
|
50
|
+
v.longitude < 20.5 || v.longitude > 27.0 ||
|
|
51
|
+
v.latitude === 0 || v.longitude === 0);
|
|
52
|
+
if (invalidCoords.length > 0) {
|
|
53
|
+
if (invalidInFiltered.length < invalidCoords.length) {
|
|
54
|
+
pass('filter-coords', `Filtered ${String(invalidCoords.length - invalidInFiltered.length)} invalid coord vehicles`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
fail('filter-coords', `Invalid coords not filtered: ${String(invalidInFiltered.length)} remain`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
pass('filter-coords', 'All coordinates are valid - filter not needed');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function testAutoEnrichOption() {
|
|
65
|
+
console.log('\nš Testing autoEnrich Option...');
|
|
66
|
+
// Test with a silver tier city (needs enrichment)
|
|
67
|
+
const city = 'panevezys';
|
|
68
|
+
// First sync GTFS
|
|
69
|
+
const clientWithEnrich = new LtTransport({ autoEnrich: true });
|
|
70
|
+
await clientWithEnrich.sync(city);
|
|
71
|
+
// Get vehicles with autoEnrich ON
|
|
72
|
+
const vehiclesEnriched = await clientWithEnrich.getVehicles(city);
|
|
73
|
+
const withDestination = vehiclesEnriched.filter(v => v.destination !== null);
|
|
74
|
+
// Get vehicles with autoEnrich OFF
|
|
75
|
+
const clientNoEnrich = new LtTransport({ autoEnrich: false });
|
|
76
|
+
await clientNoEnrich.sync(city);
|
|
77
|
+
const vehiclesNotEnriched = await clientNoEnrich.getVehicles(city);
|
|
78
|
+
const withDestinationNoEnrich = vehiclesNotEnriched.filter(v => v.destination !== null);
|
|
79
|
+
if (vehiclesEnriched.length > 0) {
|
|
80
|
+
if (withDestination.length > withDestinationNoEnrich.length) {
|
|
81
|
+
pass('auto-enrich', `autoEnrich added destinations: ${String(withDestination.length)} vs ${String(withDestinationNoEnrich.length)}`);
|
|
82
|
+
}
|
|
83
|
+
else if (withDestinationNoEnrich.length === 0) {
|
|
84
|
+
pass('auto-enrich', 'Enrichment working - no destinations without it');
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
warn('auto-enrich', `Similar destination counts: ${String(withDestination.length)} vs ${String(withDestinationNoEnrich.length)}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
warn('auto-enrich', 'No vehicles available for PanevÄžys');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function testStaleThresholdCustomization() {
|
|
95
|
+
console.log('\nš Testing staleThresholdMs Customization...');
|
|
96
|
+
// Very short threshold (1 second) - almost everything should be stale
|
|
97
|
+
const clientShortThreshold = new LtTransport({
|
|
98
|
+
staleThresholdMs: 1000, // 1 second
|
|
99
|
+
filterStale: false
|
|
100
|
+
});
|
|
101
|
+
const vehiclesShort = await clientShortThreshold.getVehicles('vilnius');
|
|
102
|
+
const staleShort = vehiclesShort.filter(v => v.isStale).length;
|
|
103
|
+
// Long threshold (1 hour) - nothing should be stale
|
|
104
|
+
const clientLongThreshold = new LtTransport({
|
|
105
|
+
staleThresholdMs: 3600000, // 1 hour
|
|
106
|
+
filterStale: false
|
|
107
|
+
});
|
|
108
|
+
const vehiclesLong = await clientLongThreshold.getVehicles('vilnius');
|
|
109
|
+
const staleLong = vehiclesLong.filter(v => v.isStale).length;
|
|
110
|
+
if (staleShort > staleLong) {
|
|
111
|
+
pass('stale-threshold', `Threshold works: ${String(staleShort)} stale (1s) vs ${String(staleLong)} stale (1h)`);
|
|
112
|
+
}
|
|
113
|
+
else if (staleShort === 0 && staleLong === 0) {
|
|
114
|
+
warn('stale-threshold', 'All data is very fresh - cannot verify threshold');
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
fail('stale-threshold', `Unexpected: ${String(staleShort)} (1s) vs ${String(staleLong)} (1h)`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function testSyncThrottling() {
|
|
121
|
+
console.log('\nš Testing Sync Throttling...');
|
|
122
|
+
const client = new LtTransport();
|
|
123
|
+
// First sync
|
|
124
|
+
const start1 = Date.now();
|
|
125
|
+
await client.sync('vilnius');
|
|
126
|
+
const time1 = Date.now() - start1;
|
|
127
|
+
// Immediate second sync - should be throttled (skipped)
|
|
128
|
+
const start2 = Date.now();
|
|
129
|
+
const result2 = await client.sync('vilnius');
|
|
130
|
+
const time2 = Date.now() - start2;
|
|
131
|
+
if (time2 < time1 / 2 || result2.status === 'up-to-date') {
|
|
132
|
+
pass('sync-throttle', `Second sync was fast/skipped: ${String(time1)}ms vs ${String(time2)}ms`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
warn('sync-throttle', `Both syncs took similar time: ${String(time1)}ms vs ${String(time2)}ms`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function runAllTests() {
|
|
139
|
+
console.log('āļø CONFIGURATION OPTIONS TESTS');
|
|
140
|
+
console.log('==============================\n');
|
|
141
|
+
await testFilterStaleOption();
|
|
142
|
+
await testFilterInvalidCoordsOption();
|
|
143
|
+
await testAutoEnrichOption();
|
|
144
|
+
await testStaleThresholdCustomization();
|
|
145
|
+
await testSyncThrottling();
|
|
146
|
+
console.log('\n==============================');
|
|
147
|
+
console.log('RESULTS SUMMARY');
|
|
148
|
+
console.log('==============================');
|
|
149
|
+
const passed = results.filter(r => r.passed).length;
|
|
150
|
+
const failed = results.filter(r => !r.passed).length;
|
|
151
|
+
console.log(`\nPassed: ${String(passed)}/${String(results.length)}`);
|
|
152
|
+
console.log(`Failed: ${String(failed)}/${String(results.length)}`);
|
|
153
|
+
if (failed > 0) {
|
|
154
|
+
console.log('\nFailed tests:');
|
|
155
|
+
results.filter(r => !r.passed).forEach(r => { console.log(` - ${r.name}: ${r.message}`); });
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
console.log('\nā
All configuration tests passed!');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
runAllTests().catch((err) => {
|
|
163
|
+
console.error('Test runner failed:', err);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
});
|
|
166
|
+
//# sourceMappingURL=test-config-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-config-options.js","sourceRoot":"","sources":["../../src/scripts/test-config-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAoB1C,MAAM,OAAO,GAAiB,EAAE,CAAC;AAEjC,SAAS,IAAI,CAAC,IAAY,EAAE,OAAe;IACzC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,OAAe;IACzC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,OAAe;IACzC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,qBAAqB;IAClC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,qCAAqC;IACrC,MAAM,cAAc,GAAG,IAAI,WAAW,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,MAAM,kBAAkB,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAEpE,oCAAoC;IACpC,MAAM,gBAAgB,GAAG,IAAI,WAAW,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAEvE,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,EAAE,sBAAsB,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,EAAE,aAAa,MAAM,CAAC,eAAe,CAAC,iCAAiC,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,cAAc,EAAE,0DAA0D,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,6BAA6B;IAC1C,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAE1D,qCAAqC;IACrC,MAAM,cAAc,GAAG,IAAI,WAAW,CAAC,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,MAAM,kBAAkB,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAEvE,2DAA2D;IAC3D,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAClD,CAAC,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC,QAAQ,GAAG,IAAI;QACtC,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI;QACxC,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CACtC,CAAC;IAEF,oCAAoC;IACpC,MAAM,gBAAgB,GAAG,IAAI,WAAW,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAEvE,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACpD,CAAC,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC,QAAQ,GAAG,IAAI;QACtC,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI;QACxC,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CACtC,CAAC;IAEF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,IAAI,iBAAiB,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;YACpD,IAAI,CAAC,eAAe,EAAE,YAAY,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACtH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,EAAE,gCAAgC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,eAAe,EAAE,+CAA+C,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,kDAAkD;IAClD,MAAM,IAAI,GAAW,WAAW,CAAC;IAEjC,kBAAkB;IAClB,MAAM,gBAAgB,GAAG,IAAI,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElC,kCAAkC;IAClC,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;IAE7E,mCAAmC;IACnC,MAAM,cAAc,GAAG,IAAI,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,mBAAmB,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;IAExF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,IAAI,eAAe,CAAC,MAAM,GAAG,uBAAuB,CAAC,MAAM,EAAE,CAAC;YAC5D,IAAI,CAAC,aAAa,EAAE,kCAAkC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvI,CAAC;aAAM,IAAI,uBAAuB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,aAAa,EAAE,iDAAiD,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,EAAE,+BAA+B,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpI,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,aAAa,EAAE,qCAAqC,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,+BAA+B;IAC5C,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAE9D,sEAAsE;IACtE,MAAM,oBAAoB,GAAG,IAAI,WAAW,CAAC;QAC3C,gBAAgB,EAAE,IAAI,EAAG,WAAW;QACpC,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAE/D,oDAAoD;IACpD,MAAM,mBAAmB,GAAG,IAAI,WAAW,CAAC;QAC1C,gBAAgB,EAAE,OAAO,EAAE,SAAS;QACpC,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAE7D,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,MAAM,CAAC,UAAU,CAAC,kBAAkB,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAClH,CAAC;SAAM,IAAI,UAAU,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,iBAAiB,EAAE,kDAAkD,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,iBAAiB,EAAE,eAAe,MAAM,CAAC,UAAU,CAAC,YAAY,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IAEjC,aAAa;IACb,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;IAElC,wDAAwD;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;IAElC,IAAI,KAAK,GAAG,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACzD,IAAI,CAAC,eAAe,EAAE,iCAAiC,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClG,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,eAAe,EAAE,iCAAiC,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAEhD,MAAM,qBAAqB,EAAE,CAAC;IAC9B,MAAM,6BAA6B,EAAE,CAAC;IACtC,MAAM,oBAAoB,EAAE,CAAC;IAC7B,MAAM,+BAA+B,EAAE,CAAC;IACxC,MAAM,kBAAkB,EAAE,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEnE,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACnC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-data-quality.d.ts","sourceRoot":"","sources":["../../src/scripts/test-data-quality.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { LtTransport } from '../index.js';
|
|
2
|
+
import { ALL_CITY_IDS, CITY_CONFIGS } from '../config.js';
|
|
3
|
+
const results = [];
|
|
4
|
+
const issues = [];
|
|
5
|
+
// Lithuania bounding box
|
|
6
|
+
const LT_BOUNDS = {
|
|
7
|
+
minLat: 53.5,
|
|
8
|
+
maxLat: 56.5,
|
|
9
|
+
minLon: 20.5,
|
|
10
|
+
maxLon: 27.0,
|
|
11
|
+
};
|
|
12
|
+
// Valid vehicle types
|
|
13
|
+
const VALID_TYPES = ['bus', 'trolleybus', 'ferry', 'unknown'];
|
|
14
|
+
function pass(name, message) {
|
|
15
|
+
results.push({ name, passed: true, message });
|
|
16
|
+
console.log(` ā
${name}: ${message}`);
|
|
17
|
+
}
|
|
18
|
+
function fail(name, message) {
|
|
19
|
+
results.push({ name, passed: false, message });
|
|
20
|
+
console.log(` ā ${name}: ${message}`);
|
|
21
|
+
}
|
|
22
|
+
function warn(name, message) {
|
|
23
|
+
results.push({ name, passed: true, message: `ā ļø ${message}` });
|
|
24
|
+
console.log(` ā ļø ${name}: ${message}`);
|
|
25
|
+
}
|
|
26
|
+
function addIssue(city, vehicle, field, value, issue) {
|
|
27
|
+
issues.push({ city, vehicleId: vehicle.id, field, value, issue });
|
|
28
|
+
}
|
|
29
|
+
function validateCoordinates(city, vehicles) {
|
|
30
|
+
let outOfBounds = 0;
|
|
31
|
+
let zeroCoords = 0;
|
|
32
|
+
for (const v of vehicles) {
|
|
33
|
+
if (v.latitude === 0 && v.longitude === 0) {
|
|
34
|
+
zeroCoords++;
|
|
35
|
+
addIssue(city, v, 'coordinates', `${String(v.latitude)},${String(v.longitude)}`, 'Zero coordinates');
|
|
36
|
+
}
|
|
37
|
+
else if (v.latitude < LT_BOUNDS.minLat || v.latitude > LT_BOUNDS.maxLat ||
|
|
38
|
+
v.longitude < LT_BOUNDS.minLon || v.longitude > LT_BOUNDS.maxLon) {
|
|
39
|
+
outOfBounds++;
|
|
40
|
+
addIssue(city, v, 'coordinates', `${String(v.latitude)},${String(v.longitude)}`, 'Outside Lithuania bounds');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (outOfBounds === 0 && zeroCoords === 0) {
|
|
44
|
+
pass(`${city}-coords`, `All ${String(vehicles.length)} vehicles have valid coordinates`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
warn(`${city}-coords`, `${String(outOfBounds)} out of bounds, ${String(zeroCoords)} zero coords (of ${String(vehicles.length)})`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function validateVehicleTypes(city, vehicles) {
|
|
51
|
+
let invalidTypes = 0;
|
|
52
|
+
for (const v of vehicles) {
|
|
53
|
+
if (!VALID_TYPES.includes(v.type)) {
|
|
54
|
+
invalidTypes++;
|
|
55
|
+
addIssue(city, v, 'type', v.type, 'Invalid vehicle type');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (invalidTypes === 0) {
|
|
59
|
+
pass(`${city}-types`, `All vehicle types are valid`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
fail(`${city}-types`, `${String(invalidTypes)} vehicles have invalid types`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function validateRequiredFields(city, vehicles) {
|
|
66
|
+
let missingFields = 0;
|
|
67
|
+
for (const v of vehicles) {
|
|
68
|
+
if (!v.id || v.id === '') {
|
|
69
|
+
missingFields++;
|
|
70
|
+
addIssue(city, v, 'id', v.id, 'Missing ID');
|
|
71
|
+
}
|
|
72
|
+
if (!v.vehicleNumber || v.vehicleNumber === '') {
|
|
73
|
+
missingFields++;
|
|
74
|
+
addIssue(city, v, 'vehicleNumber', v.vehicleNumber, 'Missing vehicle number');
|
|
75
|
+
}
|
|
76
|
+
// Route is always defined in Vehicle interface, but check for empty string
|
|
77
|
+
if (v.route === '') {
|
|
78
|
+
// Route can be empty for some cities, this is just informational
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (missingFields === 0) {
|
|
82
|
+
pass(`${city}-fields`, `All required fields present`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
fail(`${city}-fields`, `${String(missingFields)} missing required fields`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function validateMeasurementTime(city, vehicles) {
|
|
89
|
+
const now = Date.now();
|
|
90
|
+
const oneDayAgo = now - 86400000;
|
|
91
|
+
let futureTime = 0;
|
|
92
|
+
let veryOld = 0;
|
|
93
|
+
let invalidDate = 0;
|
|
94
|
+
for (const v of vehicles) {
|
|
95
|
+
const time = v.measuredAt.getTime();
|
|
96
|
+
if (isNaN(time)) {
|
|
97
|
+
invalidDate++;
|
|
98
|
+
addIssue(city, v, 'measuredAt', String(v.measuredAt), 'Invalid date');
|
|
99
|
+
}
|
|
100
|
+
else if (time > now + 300000) { // More than 5 min in future
|
|
101
|
+
futureTime++;
|
|
102
|
+
addIssue(city, v, 'measuredAt', v.measuredAt.toISOString(), 'Future timestamp');
|
|
103
|
+
}
|
|
104
|
+
else if (time < oneDayAgo) {
|
|
105
|
+
veryOld++;
|
|
106
|
+
addIssue(city, v, 'measuredAt', v.measuredAt.toISOString(), 'More than 24h old');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (invalidDate === 0 && futureTime === 0 && veryOld === 0) {
|
|
110
|
+
pass(`${city}-time`, `All measurement times are valid`);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
warn(`${city}-time`, `${String(futureTime)} future, ${String(veryOld)} old, ${String(invalidDate)} invalid`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function validateTextQuality(city, vehicles) {
|
|
117
|
+
// Common mojibake patterns
|
|
118
|
+
const mojibakePatterns = [
|
|
119
|
+
/Ƥ|ƶ|ü|ĆĀ©|ĆĀØ|Ć /, // UTF-8 decoded as Latin-1
|
|
120
|
+
/�/, // Replacement character
|
|
121
|
+
// eslint-disable-next-line no-control-regex
|
|
122
|
+
/[\x00-\x1F]/, // Control characters
|
|
123
|
+
];
|
|
124
|
+
let mojibakeCount = 0;
|
|
125
|
+
for (const v of vehicles) {
|
|
126
|
+
const textsToCheck = [v.route, v.vehicleNumber];
|
|
127
|
+
if (v.destination !== null) {
|
|
128
|
+
textsToCheck.push(v.destination);
|
|
129
|
+
}
|
|
130
|
+
for (const text of textsToCheck) {
|
|
131
|
+
for (const pattern of mojibakePatterns) {
|
|
132
|
+
if (pattern.test(text)) {
|
|
133
|
+
mojibakeCount++;
|
|
134
|
+
addIssue(city, v, 'text', text, 'Possible mojibake/encoding issue');
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (mojibakeCount === 0) {
|
|
141
|
+
pass(`${city}-text`, `No encoding issues detected`);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
fail(`${city}-text`, `${String(mojibakeCount)} texts with encoding issues`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function runAllTests() {
|
|
148
|
+
console.log('š DATA QUALITY VALIDATION');
|
|
149
|
+
console.log('==========================\n');
|
|
150
|
+
const client = new LtTransport({
|
|
151
|
+
filterInvalidCoords: false, // We want to see invalid coords
|
|
152
|
+
filterStale: false, // We want to see stale data
|
|
153
|
+
});
|
|
154
|
+
for (const city of ALL_CITY_IDS) {
|
|
155
|
+
if (!CITY_CONFIGS[city].gps.enabled) {
|
|
156
|
+
console.log(`\nāļø Skipping ${city} (GPS disabled)`);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
console.log(`\nš Validating ${city.toUpperCase()}...`);
|
|
160
|
+
try {
|
|
161
|
+
const vehicles = await client.getVehicles(city);
|
|
162
|
+
if (vehicles.length === 0) {
|
|
163
|
+
warn(`${city}-empty`, 'No vehicles returned');
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
console.log(` Found ${String(vehicles.length)} vehicles`);
|
|
167
|
+
validateCoordinates(city, vehicles);
|
|
168
|
+
validateVehicleTypes(city, vehicles);
|
|
169
|
+
validateRequiredFields(city, vehicles);
|
|
170
|
+
validateMeasurementTime(city, vehicles);
|
|
171
|
+
validateTextQuality(city, vehicles);
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
fail(`${city}-fetch`, `Failed to fetch: ${err instanceof Error ? err.message : String(err)}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
console.log('\n==========================');
|
|
178
|
+
console.log('RESULTS SUMMARY');
|
|
179
|
+
console.log('==========================');
|
|
180
|
+
const passed = results.filter(r => r.passed).length;
|
|
181
|
+
const failed = results.filter(r => !r.passed).length;
|
|
182
|
+
console.log(`\nPassed: ${String(passed)}/${String(results.length)}`);
|
|
183
|
+
console.log(`Failed: ${String(failed)}/${String(results.length)}`);
|
|
184
|
+
if (issues.length > 0) {
|
|
185
|
+
console.log(`\nTotal issues found: ${String(issues.length)}`);
|
|
186
|
+
console.log('Sample issues (first 10):');
|
|
187
|
+
issues.slice(0, 10).forEach(i => {
|
|
188
|
+
console.log(` - [${i.city}] ${i.vehicleId}: ${i.field} = "${i.value}" (${i.issue})`);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
if (failed > 0) {
|
|
192
|
+
console.log('\nFailed tests:');
|
|
193
|
+
results.filter(r => !r.passed).forEach(r => { console.log(` - ${r.name}: ${r.message}`); });
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
console.log('\nā
All data quality tests passed!');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
runAllTests().catch((err) => {
|
|
201
|
+
console.error('Test runner failed:', err);
|
|
202
|
+
process.exit(1);
|
|
203
|
+
});
|
|
204
|
+
//# sourceMappingURL=test-data-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-data-quality.js","sourceRoot":"","sources":["../../src/scripts/test-data-quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-error-handling.d.ts","sourceRoot":"","sources":["../../src/scripts/test-error-handling.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { LtTransport } from '../index.js';
|
|
2
|
+
import { GpsNotAvailableError, InvalidCityError, TransportNetworkError } from '../errors.js';
|
|
3
|
+
const results = [];
|
|
4
|
+
function pass(name, message) {
|
|
5
|
+
results.push({ name, passed: true, message });
|
|
6
|
+
console.log(` ā
${name}: ${message}`);
|
|
7
|
+
}
|
|
8
|
+
function fail(name, message) {
|
|
9
|
+
results.push({ name, passed: false, message });
|
|
10
|
+
console.log(` ā ${name}: ${message}`);
|
|
11
|
+
}
|
|
12
|
+
async function testBronzeTierGpsError() {
|
|
13
|
+
console.log('\nš Testing Bronze Tier GPS Error (Å iauliai, Utena)...');
|
|
14
|
+
const client = new LtTransport();
|
|
15
|
+
// Å iauliai
|
|
16
|
+
try {
|
|
17
|
+
await client.getVehicles('siauliai');
|
|
18
|
+
fail('siauliai-gps', 'Should have thrown GpsNotAvailableError');
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
if (err instanceof GpsNotAvailableError) {
|
|
22
|
+
pass('siauliai-gps', `Correctly threw GpsNotAvailableError: ${err.message}`);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
fail('siauliai-gps', `Wrong error type: ${String(err)}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Utena
|
|
29
|
+
try {
|
|
30
|
+
await client.getVehicles('utena');
|
|
31
|
+
fail('utena-gps', 'Should have thrown GpsNotAvailableError');
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
if (err instanceof GpsNotAvailableError) {
|
|
35
|
+
pass('utena-gps', `Correctly threw GpsNotAvailableError: ${err.message}`);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
fail('utena-gps', `Wrong error type: ${String(err)}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function testInvalidCityError() {
|
|
43
|
+
console.log('\nš Testing Invalid City ID Error...');
|
|
44
|
+
const client = new LtTransport();
|
|
45
|
+
const invalidCities = ['tokyo', 'riga', 'warsaw', '', 'VILNIUS', 'Vilnius'];
|
|
46
|
+
for (const city of invalidCities) {
|
|
47
|
+
try {
|
|
48
|
+
// Cast to any to bypass TypeScript check - we're testing runtime validation
|
|
49
|
+
await client.getVehicles(city);
|
|
50
|
+
fail(`invalid-city-${city || 'empty'}`, 'Should have thrown InvalidCityError');
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (err instanceof InvalidCityError) {
|
|
54
|
+
pass(`invalid-city-${city || 'empty'}`, `Correctly rejected: "${city}"`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Might be a different error for some edge cases
|
|
58
|
+
fail(`invalid-city-${city || 'empty'}`, `Unexpected error: ${String(err)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function testSyncRequiredError() {
|
|
64
|
+
console.log('\nš Testing Sync Required Error...');
|
|
65
|
+
// Create a fresh client with a unique cache dir to ensure no cached data
|
|
66
|
+
const client = new LtTransport({
|
|
67
|
+
cacheDir: `/tmp/lt-transport-test-${String(Date.now())}`,
|
|
68
|
+
});
|
|
69
|
+
// Try to get routes without syncing first
|
|
70
|
+
try {
|
|
71
|
+
await client.getRoutes('vilnius');
|
|
72
|
+
fail('sync-required-routes', 'Should have thrown SyncRequiredError');
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
if (err instanceof Error && err.message.includes('sync')) {
|
|
76
|
+
pass('sync-required-routes', `Correctly requires sync: ${err.message}`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
fail('sync-required-routes', `Unexpected error: ${String(err)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Same for stops
|
|
83
|
+
try {
|
|
84
|
+
await client.getStops('vilnius');
|
|
85
|
+
fail('sync-required-stops', 'Should have thrown SyncRequiredError');
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
if (err instanceof Error && err.message.includes('sync')) {
|
|
89
|
+
pass('sync-required-stops', `Correctly requires sync: ${err.message}`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
fail('sync-required-stops', `Unexpected error: ${String(err)}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function testNetworkTimeout() {
|
|
97
|
+
console.log('\nš Testing Network Timeout Handling...');
|
|
98
|
+
// Very short timeout to trigger timeout errors
|
|
99
|
+
const client = new LtTransport({
|
|
100
|
+
requestTimeout: 1, // 1ms - should definitely timeout
|
|
101
|
+
});
|
|
102
|
+
try {
|
|
103
|
+
await client.getVehicles('vilnius');
|
|
104
|
+
fail('network-timeout', 'Should have thrown a timeout/network error');
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
if (err instanceof TransportNetworkError) {
|
|
108
|
+
pass('network-timeout', `Correctly threw TransportNetworkError: ${err.message}`);
|
|
109
|
+
}
|
|
110
|
+
else if (err instanceof Error && (err.message.includes('timeout') || err.message.includes('abort'))) {
|
|
111
|
+
pass('network-timeout', `Threw timeout-related error: ${err.message}`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// Might still pass if the request was cached or very fast
|
|
115
|
+
fail('network-timeout', `Unexpected result: ${String(err)}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function runAllTests() {
|
|
120
|
+
console.log('š“ ERROR HANDLING TESTS');
|
|
121
|
+
console.log('========================\n');
|
|
122
|
+
await testBronzeTierGpsError();
|
|
123
|
+
await testInvalidCityError();
|
|
124
|
+
await testSyncRequiredError();
|
|
125
|
+
await testNetworkTimeout();
|
|
126
|
+
console.log('\n========================');
|
|
127
|
+
console.log('RESULTS SUMMARY');
|
|
128
|
+
console.log('========================');
|
|
129
|
+
const passed = results.filter(r => r.passed).length;
|
|
130
|
+
const failed = results.filter(r => !r.passed).length;
|
|
131
|
+
console.log(`\nPassed: ${String(passed)}/${String(results.length)}`);
|
|
132
|
+
console.log(`Failed: ${String(failed)}/${String(results.length)}`);
|
|
133
|
+
if (failed > 0) {
|
|
134
|
+
console.log('\nFailed tests:');
|
|
135
|
+
results.filter(r => !r.passed).forEach(r => { console.log(` - ${r.name}: ${r.message}`); });
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.log('\nā
All error handling tests passed!');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
runAllTests().catch((err) => {
|
|
143
|
+
console.error('Test runner failed:', err);
|
|
144
|
+
process.exit(1);
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=test-error-handling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-error-handling.js","sourceRoot":"","sources":["../../src/scripts/test-error-handling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-live.d.ts","sourceRoot":"","sources":["../../src/scripts/test-live.ts"],"names":[],"mappings":""}
|