feat(Production): Complete production deployment infrastructure

- Add comprehensive health check system with multiple endpoints
- Add Prometheus metrics endpoint
- Add production logging configurations (5 strategies)
- Add complete deployment documentation suite:
  * QUICKSTART.md - 30-minute deployment guide
  * DEPLOYMENT_CHECKLIST.md - Printable verification checklist
  * DEPLOYMENT_WORKFLOW.md - Complete deployment lifecycle
  * PRODUCTION_DEPLOYMENT.md - Comprehensive technical reference
  * production-logging.md - Logging configuration guide
  * ANSIBLE_DEPLOYMENT.md - Infrastructure as Code automation
  * README.md - Navigation hub
  * DEPLOYMENT_SUMMARY.md - Executive summary
- Add deployment scripts and automation
- Add DEPLOYMENT_PLAN.md - Concrete plan for immediate deployment
- Update README with production-ready features

All production infrastructure is now complete and ready for deployment.
This commit is contained in:
2025-10-25 19:18:37 +02:00
parent caa85db796
commit fc3d7e6357
83016 changed files with 378904 additions and 20919 deletions

View File

@@ -0,0 +1,105 @@
<?php
declare(strict_types=1);
use App\Domain\PreSave\ValueObjects\StreamingPlatform;
describe('StreamingPlatform', function () {
describe('display names', function () {
it('returns correct display name for SPOTIFY', function () {
$name = StreamingPlatform::SPOTIFY->getDisplayName();
expect(str_contains($name, 'Spotify'))->toBeTrue();
});
it('returns correct display name for TIDAL', function () {
$name = StreamingPlatform::TIDAL->getDisplayName();
expect(str_contains($name, 'Tidal'))->toBeTrue();
});
it('returns correct display name for APPLE_MUSIC', function () {
$name = StreamingPlatform::APPLE_MUSIC->getDisplayName();
expect(str_contains($name, 'Apple Music'))->toBeTrue();
});
it('returns correct display name for DEEZER', function () {
$name = StreamingPlatform::DEEZER->getDisplayName();
expect(str_contains($name, 'Deezer'))->toBeTrue();
});
it('returns correct display name for YOUTUBE_MUSIC', function () {
$name = StreamingPlatform::YOUTUBE_MUSIC->getDisplayName();
expect(str_contains($name, 'YouTube Music'))->toBeTrue();
});
});
describe('OAuth provider mapping', function () {
it('returns OAuth provider name matching enum value', function () {
expect(str_contains(StreamingPlatform::SPOTIFY->getOAuthProvider(), 'spotify'))->toBeTrue();
expect(str_contains(StreamingPlatform::TIDAL->getOAuthProvider(), 'tidal'))->toBeTrue();
expect(str_contains(StreamingPlatform::APPLE_MUSIC->getOAuthProvider(), 'apple_music'))->toBeTrue();
});
});
describe('platform support status', function () {
it('identifies SPOTIFY as supported', function () {
expect(StreamingPlatform::SPOTIFY->isSupported())->toBeTrue();
});
it('identifies TIDAL as not yet supported', function () {
expect(StreamingPlatform::TIDAL->isSupported())->toBeFalse();
});
it('identifies APPLE_MUSIC as not yet supported', function () {
expect(StreamingPlatform::APPLE_MUSIC->isSupported())->toBeFalse();
});
it('identifies DEEZER as not yet supported', function () {
expect(StreamingPlatform::DEEZER->isSupported())->toBeFalse();
});
it('identifies YOUTUBE_MUSIC as not yet supported', function () {
expect(StreamingPlatform::YOUTUBE_MUSIC->isSupported())->toBeFalse();
});
});
describe('supported platforms list', function () {
it('returns only supported platforms', function () {
$supported = StreamingPlatform::supported();
$supportedCount = 0;
foreach ($supported as $platform) {
if ($platform === StreamingPlatform::SPOTIFY) {
$supportedCount++;
}
}
expect($supportedCount)->toBeGreaterThan(0);
});
it('filters out unsupported platforms', function () {
$supported = StreamingPlatform::supported();
$hasUnsupported = false;
foreach ($supported as $platform) {
if (!$platform->isSupported()) {
$hasUnsupported = true;
}
}
expect($hasUnsupported)->toBeFalse();
});
});
describe('enum cases', function () {
it('has all expected platform cases', function () {
$cases = StreamingPlatform::cases();
$caseValues = array_map(fn($case) => $case->value, $cases);
expect(in_array('spotify', $caseValues))->toBeTrue();
expect(in_array('tidal', $caseValues))->toBeTrue();
expect(in_array('apple_music', $caseValues))->toBeTrue();
expect(in_array('deezer', $caseValues))->toBeTrue();
expect(in_array('youtube_music', $caseValues))->toBeTrue();
});
});
});