dbUpdater = $this->prophesize(GeolocationDbUpdaterInterface::class); $this->commandTester = $this->testerForCommand(new DownloadGeoLiteDbCommand($this->dbUpdater->reveal())); } /** * @test * @dataProvider provideFailureParams */ public function showsProperMessageWhenGeoLiteUpdateFails( bool $olderDbExists, string $expectedMessage, int $expectedExitCode, ): void { $checkDbUpdate = $this->dbUpdater->checkDbUpdate(Argument::cetera())->will( function (array $args) use ($olderDbExists): void { [$beforeDownload, $handleProgress] = $args; $beforeDownload($olderDbExists); $handleProgress(100, 50); throw $olderDbExists ? GeolocationDbUpdateFailedException::withOlderDb() : GeolocationDbUpdateFailedException::withoutOlderDb(); }, ); $this->commandTester->execute([]); $output = $this->commandTester->getDisplay(); $exitCode = $this->commandTester->getStatusCode(); self::assertStringContainsString( sprintf('%s GeoLite2 db file...', $olderDbExists ? 'Updating' : 'Downloading'), $output, ); self::assertStringContainsString($expectedMessage, $output); self::assertSame($expectedExitCode, $exitCode); $checkDbUpdate->shouldHaveBeenCalledOnce(); } public function provideFailureParams(): iterable { yield 'existing db' => [ true, '[WARNING] GeoLite2 db file update failed. Visits will continue to be located', ExitCodes::EXIT_WARNING, ]; yield 'not existing db' => [ false, '[ERROR] GeoLite2 db file download failed. It will not be possible to locate', ExitCodes::EXIT_FAILURE, ]; } /** * @test * @dataProvider provideSuccessParams */ public function printsExpectedMessageWhenNoErrorOccurs(callable $checkUpdateBehavior, string $expectedMessage): void { $checkDbUpdate = $this->dbUpdater->checkDbUpdate(Argument::cetera())->will($checkUpdateBehavior); $this->commandTester->execute([]); $output = $this->commandTester->getDisplay(); $exitCode = $this->commandTester->getStatusCode(); self::assertStringContainsString($expectedMessage, $output); self::assertSame(ExitCodes::EXIT_SUCCESS, $exitCode); $checkDbUpdate->shouldHaveBeenCalledOnce(); } public function provideSuccessParams(): iterable { yield 'up to date db' => [fn () => GeolocationResult::CHECK_SKIPPED, '[INFO] GeoLite2 db file is up to date.']; yield 'outdated db' => [function (array $args): GeolocationResult { [$beforeDownload] = $args; $beforeDownload(true); return GeolocationResult::DB_CREATED; }, '[OK] GeoLite2 db file properly downloaded.']; } }