ldc-arcadia-api/tests/Feature/Api/V1/Health/HealthCheckTest.php

157 lines
5.3 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Feature\Api\V1\Health;
use Illuminate\Support\Facades\Config;
use Tests\TestCase;
describe('Health Check API (GET /api/v1/health)', function (): void {
$originalDbDefault = null;
$originalArcadiaDb = null;
$originalCache = null;
$originalMail = null;
$originalMailer = null;
beforeEach(function () use (&$originalDbDefault, &$originalArcadiaDb, &$originalCache, &$originalMail, &$originalMailer): void {
$originalDbDefault = Config::get('database.default');
$originalArcadiaDb = Config::get('database.arcadia_meta_model');
$originalCache = Config::get('cache.default');
$originalMail = Config::get('mail.default');
$originalMailer = Config::get('mail.mailers.smtp');
});
afterEach(function () use (&$originalDbDefault, &$originalArcadiaDb, &$originalCache, &$originalMail, &$originalMailer): void {
Config::set('database.default', $originalDbDefault);
Config::set('database.arcadia_meta_model', $originalArcadiaDb);
Config::set('cache.default', $originalCache);
Config::set('mail.default', $originalMail);
Config::set('mail.mailers.smtp', $originalMailer);
});
it('returns 200 healthy when all infrastructure components are operational', function (): void {
// GIVEN
/** @var TestCase $this */
// WHEN
$response = $this->getJson('/api/v1/health');
// THEN
$response->assertStatus(200)
->assertJsonStructure([
'status',
'timestamp',
'checks' => [
'database_default' => ['status', 'connection'],
'database_arcadia' => ['status', 'connection'],
'cache' => ['status', 'store'],
'mail_smtp' => ['status', 'transport'],
],
])
->assertJson([
'status' => 'healthy',
'checks' => [
'database_default' => ['status' => 'up'],
'database_arcadia' => ['status' => 'up'],
'cache' => ['status' => 'up'],
'mail_smtp' => ['status' => 'up'],
],
]);
});
it('returns 503 unhealthy when default database connection fails', function () use (&$originalDbDefault): void {
// GIVEN
/** @var TestCase $this */
Config::set('database.default', 'invalid_connection');
try {
// WHEN
$response = $this->getJson('/api/v1/health');
// THEN
$response->assertStatus(503)
->assertJson([
'status' => 'unhealthy',
'checks' => [
'database_default' => ['status' => 'down'],
],
]);
} finally {
Config::set('database.default', $originalDbDefault);
}
});
it('returns 503 unhealthy when arcadia database connection fails', function () use (&$originalArcadiaDb): void {
// GIVEN
/** @var TestCase $this */
Config::set('database.arcadia_meta_model', 'invalid_arcadia_connection');
try {
// WHEN
$response = $this->getJson('/api/v1/health');
// THEN
$response->assertStatus(503)
->assertJson([
'status' => 'unhealthy',
'checks' => [
'database_arcadia' => ['status' => 'down'],
],
]);
} finally {
Config::set('database.arcadia_meta_model', $originalArcadiaDb);
}
});
it('returns 503 unhealthy when cache store fails', function () use (&$originalCache): void {
// GIVEN
/** @var TestCase $this */
Config::set('cache.default', 'invalid_cache_store');
try {
// WHEN
$response = $this->getJson('/api/v1/health');
// THEN
$response->assertStatus(503)
->assertJson([
'status' => 'unhealthy',
'checks' => [
'cache' => ['status' => 'down'],
],
]);
} finally {
Config::set('cache.default', $originalCache);
}
});
it('returns 503 unhealthy when smtp server connection fails', function () use (&$originalMail, &$originalMailer): void {
// GIVEN
/** @var TestCase $this */
Config::set('mail.default', 'smtp');
Config::set('mail.mailers.smtp', [
'transport' => 'smtp',
'host' => '127.0.0.1',
'port' => 65432, // Non-existent port
'timeout' => 0.1,
]);
try {
// WHEN
$response = $this->getJson('/api/v1/health');
// THEN
$response->assertStatus(503)
->assertJson([
'status' => 'unhealthy',
'checks' => [
'mail_smtp' => ['status' => 'down'],
],
]);
} finally {
Config::set('mail.default', $originalMail);
Config::set('mail.mailers.smtp', $originalMailer);
}
});
});