ldc-arcadia-api/tests/Integration/Infra/Services/Health/LaravelSystemHealthCheckerConformityTest.php

109 lines
4.3 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Integration\Infra\Services\Health;
use Application\Health\Enums\ComponentStatus;
use Application\Health\Enums\HealthStatus;
use Domain\Ports\Directories\ArcadiaBrandDirectory;
use Domain\Ports\Directories\EmployeeDirectory;
use Domain\Ports\Directories\IncoCompositionDirectory;
use Domain\Ports\Directories\IncoSheetDirectory;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Infra\Config\ArcadiaStorageConfig;
use Infra\Services\Health\LaravelSystemHealthChecker;
use Shared\Paginated;
use Shared\Pagination;
use Tests\TestCase;
covers(LaravelSystemHealthChecker::class);
uses(TestCase::class, RefreshDatabase::class);
describe('LaravelSystemHealthChecker checkArcadiaConformity Integration Test', function (): void {
it('returns healthy status when all directory probes succeed', function (): void {
// GIVEN
$storageConfig = resolve(ArcadiaStorageConfig::class);
$brandDirectory = mock(ArcadiaBrandDirectory::class);
$employeeDirectory = mock(EmployeeDirectory::class);
$incoSheetDirectory = mock(IncoSheetDirectory::class);
$incoCompoDirectory = mock(IncoCompositionDirectory::class);
$brandDirectory->shouldReceive('findAll')->withAnyArgs()->once()->andReturn([]);
$employeeDirectory->shouldReceive('findAll')
->withAnyArgs()
->once()
->andReturn(new Paginated(Pagination::ofPage(1, 5), [], 0));
$incoSheetDirectory->shouldReceive('findAll')
->withAnyArgs()
->once()
->andReturn(new Paginated(Pagination::ofPage(1, 5), [], 0));
$incoCompoDirectory->shouldReceive('findByIncoId')->withAnyArgs()->once()->andReturn(null);
$checker = new LaravelSystemHealthChecker(
$storageConfig,
$brandDirectory,
$employeeDirectory,
$incoSheetDirectory,
$incoCompoDirectory,
);
// WHEN
$result = $checker->checkArcadiaConformity();
// THEN
expect($result->isConform())->toBeTrue()
->and($result->status)->toBe(HealthStatus::HEALTHY)
->and(count($result->checks))->toBe(4)
->and($result->checks[0]->status)->toBe(ComponentStatus::UP)
->and($result->checks[1]->status)->toBe(ComponentStatus::UP)
->and($result->checks[2]->status)->toBe(ComponentStatus::UP)
->and($result->checks[3]->status)->toBe(ComponentStatus::UP);
});
it('returns unhealthy status with captured dissonance when a directory probe fails', function (): void {
// GIVEN
$storageConfig = resolve(ArcadiaStorageConfig::class);
$brandDirectory = mock(ArcadiaBrandDirectory::class);
$employeeDirectory = mock(EmployeeDirectory::class);
$incoSheetDirectory = mock(IncoSheetDirectory::class);
$incoCompoDirectory = mock(IncoCompositionDirectory::class);
$brandDirectory->shouldReceive('findAll')
->withAnyArgs()
->once()
->andThrow(new \RuntimeException('ORA-00904: "LIB_MARQ": invalid identifier'));
$employeeDirectory->shouldReceive('findAll')
->withAnyArgs()
->once()
->andReturn(new Paginated(Pagination::ofPage(1, 5), [], 0));
$incoSheetDirectory->shouldReceive('findAll')
->withAnyArgs()
->once()
->andReturn(new Paginated(Pagination::ofPage(1, 5), [], 0));
$incoCompoDirectory->shouldReceive('findByIncoId')
->withAnyArgs()
->once()
->andReturn(null);
$checker = new LaravelSystemHealthChecker(
$storageConfig,
$brandDirectory,
$employeeDirectory,
$incoSheetDirectory,
$incoCompoDirectory,
);
// WHEN
$result = $checker->checkArcadiaConformity();
// THEN
expect($result->isConform())->toBeFalse()
->and($result->hasDissonances())->toBeTrue()
->and($result->status)->toBe(HealthStatus::UNHEALTHY)
->and($result->checks[0]->status)->toBe(ComponentStatus::DOWN)
->and($result->checks[0]->errorMessage)->toContain('ORA-00904')
->and($result->checks[1]->status)->toBe(ComponentStatus::UP);
});
});