- 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.
169 lines
4.8 KiB
PHP
169 lines
4.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Framework\Cache\Warming\ValueObjects\WarmupResult;
|
|
|
|
describe('WarmupResult', function () {
|
|
it('creates result with valid data', function () {
|
|
$result = new WarmupResult(
|
|
strategyName: 'test_strategy',
|
|
itemsWarmed: 10,
|
|
itemsFailed: 2,
|
|
durationSeconds: 1.5,
|
|
memoryUsedBytes: 1024000
|
|
);
|
|
|
|
expect($result->strategyName)->toBe('test_strategy');
|
|
expect($result->itemsWarmed)->toBe(10);
|
|
expect($result->itemsFailed)->toBe(2);
|
|
expect($result->durationSeconds)->toBe(1.5);
|
|
expect($result->memoryUsedBytes)->toBe(1024000);
|
|
});
|
|
|
|
it('calculates success correctly', function () {
|
|
$successResult = new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: 10,
|
|
itemsFailed: 0,
|
|
durationSeconds: 1.0,
|
|
memoryUsedBytes: 1024
|
|
);
|
|
|
|
expect($successResult->isSuccess())->toBeTrue();
|
|
|
|
$failureResult = new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: 0,
|
|
itemsFailed: 5,
|
|
durationSeconds: 1.0,
|
|
memoryUsedBytes: 1024
|
|
);
|
|
|
|
expect($failureResult->isSuccess())->toBeFalse();
|
|
});
|
|
|
|
it('calculates success rate', function () {
|
|
$result = new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: 8,
|
|
itemsFailed: 2,
|
|
durationSeconds: 1.0,
|
|
memoryUsedBytes: 1024
|
|
);
|
|
|
|
expect($result->getSuccessRate())->toBe(0.8);
|
|
});
|
|
|
|
it('handles zero total items', function () {
|
|
$result = new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: 0,
|
|
itemsFailed: 0,
|
|
durationSeconds: 0.1,
|
|
memoryUsedBytes: 1024
|
|
);
|
|
|
|
expect($result->getSuccessRate())->toBe(0.0);
|
|
});
|
|
|
|
it('calculates items per second', function () {
|
|
$result = new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: 100,
|
|
itemsFailed: 0,
|
|
durationSeconds: 2.0,
|
|
memoryUsedBytes: 1024
|
|
);
|
|
|
|
expect($result->getItemsPerSecond())->toBe(50.0);
|
|
});
|
|
|
|
it('handles zero duration', function () {
|
|
$result = new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: 10,
|
|
itemsFailed: 0,
|
|
durationSeconds: 0.0,
|
|
memoryUsedBytes: 1024
|
|
);
|
|
|
|
expect($result->getItemsPerSecond())->toBe(0.0);
|
|
});
|
|
|
|
it('calculates memory in MB', function () {
|
|
$result = new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: 10,
|
|
itemsFailed: 0,
|
|
durationSeconds: 1.0,
|
|
memoryUsedBytes: 2048000 // 2MB
|
|
);
|
|
|
|
expect($result->getMemoryUsedMB())->toBe(2.0);
|
|
});
|
|
|
|
it('converts to array', function () {
|
|
$result = new WarmupResult(
|
|
strategyName: 'test_strategy',
|
|
itemsWarmed: 10,
|
|
itemsFailed: 2,
|
|
durationSeconds: 1.5,
|
|
memoryUsedBytes: 1024000,
|
|
errors: [['item' => 'test', 'error' => 'failed']],
|
|
metadata: ['key' => 'value']
|
|
);
|
|
|
|
$array = $result->toArray();
|
|
|
|
expect($array)->toBeArray();
|
|
expect($array['strategy_name'])->toBe('test_strategy');
|
|
expect($array['items_warmed'])->toBe(10);
|
|
expect($array['items_failed'])->toBe(2);
|
|
expect($array['duration_seconds'])->toBe(1.5);
|
|
expect($array['memory_used_bytes'])->toBe(1024000);
|
|
expect($array['errors'])->toHaveCount(1);
|
|
expect($array['metadata'])->toHaveKey('key');
|
|
});
|
|
|
|
it('throws on negative items warmed', function () {
|
|
new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: -1,
|
|
itemsFailed: 0,
|
|
durationSeconds: 1.0,
|
|
memoryUsedBytes: 1024
|
|
);
|
|
})->throws(InvalidArgumentException::class);
|
|
|
|
it('throws on negative items failed', function () {
|
|
new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: 10,
|
|
itemsFailed: -1,
|
|
durationSeconds: 1.0,
|
|
memoryUsedBytes: 1024
|
|
);
|
|
})->throws(InvalidArgumentException::class);
|
|
|
|
it('throws on negative duration', function () {
|
|
new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: 10,
|
|
itemsFailed: 0,
|
|
durationSeconds: -1.0,
|
|
memoryUsedBytes: 1024
|
|
);
|
|
})->throws(InvalidArgumentException::class);
|
|
|
|
it('throws on negative memory', function () {
|
|
new WarmupResult(
|
|
strategyName: 'test',
|
|
itemsWarmed: 10,
|
|
itemsFailed: 0,
|
|
durationSeconds: 1.0,
|
|
memoryUsedBytes: -1024
|
|
);
|
|
})->throws(InvalidArgumentException::class);
|
|
});
|