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,149 @@
<?php
declare(strict_types=1);
use App\Framework\Http\Url\UrlSpec;
use App\Framework\Http\Url\UrlUseCase;
describe('UrlSpec', function () {
describe('enum values', function () {
it('has RFC3986 case', function () {
expect(UrlSpec::RFC3986->value)->toBe('rfc3986');
});
it('has WHATWG case', function () {
expect(UrlSpec::WHATWG->value)->toBe('whatwg');
});
});
describe('use case mapping', function () {
it('maps API_CLIENT to RFC3986', function () {
$spec = UrlSpec::forUseCase(UrlUseCase::API_CLIENT);
expect($spec)->toBe(UrlSpec::RFC3986);
});
it('maps CURL_REQUEST to RFC3986', function () {
$spec = UrlSpec::forUseCase(UrlUseCase::CURL_REQUEST);
expect($spec)->toBe(UrlSpec::RFC3986);
});
it('maps SIGNATURE_GENERATION to RFC3986', function () {
$spec = UrlSpec::forUseCase(UrlUseCase::SIGNATURE_GENERATION);
expect($spec)->toBe(UrlSpec::RFC3986);
});
it('maps CANONICAL_URL to RFC3986', function () {
$spec = UrlSpec::forUseCase(UrlUseCase::CANONICAL_URL);
expect($spec)->toBe(UrlSpec::RFC3986);
});
it('maps BROWSER_REDIRECT to WHATWG', function () {
$spec = UrlSpec::forUseCase(UrlUseCase::BROWSER_REDIRECT);
expect($spec)->toBe(UrlSpec::WHATWG);
});
it('maps DEEP_LINK to WHATWG', function () {
$spec = UrlSpec::forUseCase(UrlUseCase::DEEP_LINK);
expect($spec)->toBe(UrlSpec::WHATWG);
});
it('maps HTML_FORM_ACTION to WHATWG', function () {
$spec = UrlSpec::forUseCase(UrlUseCase::HTML_FORM_ACTION);
expect($spec)->toBe(UrlSpec::WHATWG);
});
it('maps CLIENT_SIDE_URL to WHATWG', function () {
$spec = UrlSpec::forUseCase(UrlUseCase::CLIENT_SIDE_URL);
expect($spec)->toBe(UrlSpec::WHATWG);
});
});
describe('convenience methods', function () {
it('checks if RFC3986', function () {
expect(UrlSpec::RFC3986->isRfc3986())->toBeTrue();
expect(UrlSpec::WHATWG->isRfc3986())->toBeFalse();
});
it('checks if WHATWG', function () {
expect(UrlSpec::WHATWG->isWhatwg())->toBeTrue();
expect(UrlSpec::RFC3986->isWhatwg())->toBeFalse();
});
});
});
describe('UrlUseCase', function () {
describe('enum cases', function () {
it('has all expected use cases', function () {
$cases = UrlUseCase::cases();
expect($cases)->toHaveCount(8);
expect($cases)->toContain(UrlUseCase::API_CLIENT);
expect($cases)->toContain(UrlUseCase::CURL_REQUEST);
expect($cases)->toContain(UrlUseCase::SIGNATURE_GENERATION);
expect($cases)->toContain(UrlUseCase::CANONICAL_URL);
expect($cases)->toContain(UrlUseCase::BROWSER_REDIRECT);
expect($cases)->toContain(UrlUseCase::DEEP_LINK);
expect($cases)->toContain(UrlUseCase::HTML_FORM_ACTION);
expect($cases)->toContain(UrlUseCase::CLIENT_SIDE_URL);
});
});
describe('descriptions', function () {
it('provides description for API_CLIENT', function () {
$desc = UrlUseCase::API_CLIENT->description();
expect($desc)->toContain('API');
expect($desc)->toContain('REST');
});
it('provides description for BROWSER_REDIRECT', function () {
$desc = UrlUseCase::BROWSER_REDIRECT->description();
expect($desc)->toContain('Browser');
expect($desc)->toContain('redirect');
});
it('provides description for SIGNATURE_GENERATION', function () {
$desc = UrlUseCase::SIGNATURE_GENERATION->description();
expect($desc)->toContain('signature');
expect($desc)->toContain('OAuth');
});
it('provides descriptions for all use cases', function () {
foreach (UrlUseCase::cases() as $useCase) {
expect(strlen($useCase->description()))->toBeGreaterThan(0);
}
});
});
describe('recommended spec', function () {
it('recommends RFC3986 for API_CLIENT', function () {
$spec = UrlUseCase::API_CLIENT->recommendedSpec();
expect($spec)->toBe(UrlSpec::RFC3986);
});
it('recommends WHATWG for BROWSER_REDIRECT', function () {
$spec = UrlUseCase::BROWSER_REDIRECT->recommendedSpec();
expect($spec)->toBe(UrlSpec::WHATWG);
});
it('provides recommendation for all use cases', function () {
foreach (UrlUseCase::cases() as $useCase) {
$spec = $useCase->recommendedSpec();
expect($spec)->toBeInstanceOf(UrlSpec::class);
}
});
});
});