feat: import destinations from the MyE&P travel export
This commit is contained in:
1 parent
5c7e702eab
commit
0f76c5a7b6
15 files changed
+791
-422
No files matched your search
@@ -21,7 +21,7 @@ class TravelExportClientTest extends TestCase
|
||||
$this->page([$this->row(3, 300)], 2, 2),
|
||||
]);
|
||||
|
||||
$rows = $this->getClientInstance($httpClient)->fetchAll();
|
||||
$rows = $this->getClientInstance($httpClient)->fetchAll()->rows;
|
||||
|
||||
$this->assertCount(3, $rows);
|
||||
$this->assertEquals([1, 2, 3], array_map(fn ($row) => $row->busProId, $rows));
|
||||
@@ -62,7 +62,7 @@ class TravelExportClientTest extends TestCase
|
||||
], 1, 1),
|
||||
]);
|
||||
|
||||
$rows = $this->getClientInstance($httpClient)->fetchAll();
|
||||
$rows = $this->getClientInstance($httpClient)->fetchAll()->rows;
|
||||
|
||||
$this->assertCount(1, $rows);
|
||||
$this->assertEquals(2, $rows[0]->busProId);
|
||||
@@ -72,7 +72,7 @@ class TravelExportClientTest extends TestCase
|
||||
{
|
||||
$httpClient = $this->mockClient([$this->page([], 1, 1)]);
|
||||
|
||||
$this->assertEquals([], $this->getClientInstance($httpClient)->fetchAll());
|
||||
$this->assertEquals([], $this->getClientInstance($httpClient)->fetchAll()->rows);
|
||||
}
|
||||
|
||||
public function testAPayloadWithoutADataListFails(): void
|
||||
@@ -97,14 +97,71 @@ class TravelExportClientTest extends TestCase
|
||||
'code' => 'AAA',
|
||||
'name' => 'Haus',
|
||||
'costUnit' => null,
|
||||
'country' => 'ch',
|
||||
'country' => 'CH',
|
||||
'countryCode' => 'ch',
|
||||
],
|
||||
'pickups' => [],
|
||||
];
|
||||
}
|
||||
|
||||
private function page(array $rows, int $page, int $totalPages): MockResponse
|
||||
/**
|
||||
* Both counters are losses MyE&P made on its side - a dropped travel, a boarding point with no
|
||||
* town - and the import is the only place they surface, so the client has to carry them out.
|
||||
*/
|
||||
public function testTheCountersMyEpReportsAreCarriedOut(): void
|
||||
{
|
||||
$httpClient = $this->mockClient([$this->page([$this->row(1, 100)], 1, 1, skipped: 3, pickupsWithoutMasterData: 21)]);
|
||||
|
||||
$export = $this->getClientInstance($httpClient)->fetchAll();
|
||||
|
||||
$this->assertSame(3, $export->skipped);
|
||||
$this->assertSame(21, $export->pickupsWithoutMasterData);
|
||||
$this->assertSame('2026-09-29T03:20:00+02:00', $export->generatedAt);
|
||||
}
|
||||
|
||||
/**
|
||||
* They describe the whole export rather than the page, so they repeat unchanged and the first
|
||||
* page answers for the run. Reading the last one instead would be just as correct today and
|
||||
* wrong the moment a page is served from a newer build.
|
||||
*/
|
||||
public function testTheCountersAreReadFromTheFirstPage(): void
|
||||
{
|
||||
$httpClient = $this->mockClient([
|
||||
$this->page([$this->row(1, 100)], 1, 2, skipped: 3, pickupsWithoutMasterData: 21),
|
||||
$this->page([$this->row(2, 200)], 2, 2, skipped: 99, pickupsWithoutMasterData: 99),
|
||||
]);
|
||||
|
||||
$export = $this->getClientInstance($httpClient)->fetchAll();
|
||||
|
||||
$this->assertSame(3, $export->skipped);
|
||||
$this->assertSame(21, $export->pickupsWithoutMasterData);
|
||||
}
|
||||
|
||||
/**
|
||||
* An export whose meta block says nothing must not read as one that dropped nothing by
|
||||
* accident of a missing key, but zero is the only honest default available here.
|
||||
*/
|
||||
public function testAMetaBlockWithoutCountersReadsAsZero(): void
|
||||
{
|
||||
$httpClient = new MockHttpClient(
|
||||
[new MockResponse(json_encode(['data' => [$this->row(1, 100)], 'meta' => ['totalPages' => 1]]))],
|
||||
'https://myep.example/',
|
||||
);
|
||||
|
||||
$export = $this->getClientInstance($httpClient)->fetchAll();
|
||||
|
||||
$this->assertSame(0, $export->skipped);
|
||||
$this->assertSame(0, $export->pickupsWithoutMasterData);
|
||||
$this->assertNull($export->generatedAt);
|
||||
}
|
||||
|
||||
private function page(
|
||||
array $rows,
|
||||
int $page,
|
||||
int $totalPages,
|
||||
int $skipped = 0,
|
||||
int $pickupsWithoutMasterData = 0,
|
||||
): MockResponse {
|
||||
return new MockResponse(json_encode([
|
||||
'data' => $rows,
|
||||
'meta' => [
|
||||
@@ -112,6 +169,9 @@ class TravelExportClientTest extends TestCase
|
||||
'perPage' => 500,
|
||||
'total' => count($rows),
|
||||
'totalPages' => $totalPages,
|
||||
'skipped' => $skipped,
|
||||
'pickupsWithoutMasterData' => $pickupsWithoutMasterData,
|
||||
'generatedAt' => '2026-09-29T03:20:00+02:00',
|
||||
],
|
||||
]));
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user