fix: collect dataset transfer failures instead of breaking execution

This commit is contained in:
Björn Fromme
2026-04-22 11:23:52 +02:00
parent 9b84893d88
commit d5dfb6c550
2 changed files with 115 additions and 9 deletions
+81
View File
@@ -12,6 +12,7 @@ use App\Service\TravelDataProvider;
use App\Service\TravelSnapshotManager;
use League\Flysystem\DirectoryListing;
use League\Flysystem\FilesystemOperator;
use League\Flysystem\UnableToListContents;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Command\Command;
@@ -193,4 +194,84 @@ class BpnXmlSyncCommandTest extends TestCase
$this->assertSame(Command::SUCCESS, $tester->getStatusCode());
}
public function testContingentTransferFailureDoesNotFailSuccessfulTravelSync(): void
{
$newerTimestamp = "24.03.2026 12:00:00\nExport\n3 Dateien\n";
$olderTimestamp = "24.03.2026 10:00:00\nExport\n3 Dateien\n";
$this->xmlSource->method('read')->willReturn($newerTimestamp);
$this->xmlExport->method('fileExists')->willReturn(true);
$this->xmlExport->method('read')->willReturn($olderTimestamp);
$this->xmlSource->method('listContents')->willReturn(new DirectoryListing([]));
$this->xmlExport->method('listContents')->willReturn(new DirectoryListing([]));
$this->xmlSourceContingents->method('read')->willReturn($newerTimestamp);
$this->xmlExportContingents->method('fileExists')->willReturn(true);
$this->xmlExportContingents->method('read')->willReturn($olderTimestamp);
$this->xmlSourceContingents->method('listContents')
->willThrowException(UnableToListContents::atLocation('.', false, new \RuntimeException('SFTP unavailable')));
$fileMap = [
101 => ['hotels' => ['H1' => null]],
];
$this->travelLoader->expects($this->once())
->method('generateFilesMap')
->willReturn($fileMap);
$this->travelDataService->expects($this->once())
->method('syncSnapshotsFromXml')
->with($fileMap, $this->isInstanceOf(\Closure::class))
->willReturn(['processed' => 1, 'failed' => 0]);
$this->travelSnapshotService->expects($this->once())
->method('purgeOrphanedFutureSnapshots')
->with([101])
->willReturn(0);
$this->cache->expects($this->once())
->method('invalidateTags')
->with(['xml-sync']);
$tester = new CommandTester($this->command);
$tester->execute([]);
$this->assertSame(Command::SUCCESS, $tester->getStatusCode());
$this->assertStringContainsString('[contingents] Sync failed', $tester->getDisplay());
$this->assertStringContainsString('datasets: contingents', $tester->getDisplay());
}
public function testTravelTransferFailureDoesNotPreventContingentsSync(): void
{
$newerTimestamp = "24.03.2026 12:00:00\nExport\n3 Dateien\n";
$olderTimestamp = "24.03.2026 10:00:00\nExport\n3 Dateien\n";
$this->xmlSource->method('read')->willReturn($newerTimestamp);
$this->xmlExport->method('fileExists')->willReturn(true);
$this->xmlExport->method('read')->willReturn($olderTimestamp);
$this->xmlSource->method('listContents')
->willThrowException(UnableToListContents::atLocation('.', false, new \RuntimeException('SFTP unavailable')));
$this->xmlSourceContingents->method('read')->willReturn($newerTimestamp);
$this->xmlExportContingents->method('fileExists')->willReturn(true);
$this->xmlExportContingents->method('read')->willReturn($olderTimestamp);
$this->xmlSourceContingents->method('listContents')->willReturn(new DirectoryListing([]));
$this->xmlExportContingents->method('listContents')->willReturn(new DirectoryListing([]));
$this->travelLoader->expects($this->never())->method('generateFilesMap');
$this->travelDataService->expects($this->never())->method('syncSnapshotsFromXml');
$this->travelSnapshotService->expects($this->never())->method('purgeOrphanedFutureSnapshots');
$this->cache->expects($this->once())
->method('invalidateTags')
->with(['xml-sync']);
$tester = new CommandTester($this->command);
$tester->execute([]);
$this->assertSame(Command::SUCCESS, $tester->getStatusCode());
$this->assertStringContainsString('[travel] Sync failed', $tester->getDisplay());
$this->assertStringContainsString('[contingents] Synced 0 files, deleted 0', $tester->getDisplay());
$this->assertStringContainsString('datasets: travel', $tester->getDisplay());
}
}