- 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.
176 lines
6.2 KiB
PHP
176 lines
6.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Framework\LiveComponents\Batch\BatchResponse;
|
|
use App\Framework\LiveComponents\Batch\BatchResult;
|
|
|
|
describe('BatchResponse', function () {
|
|
it('creates response with variadic constructor', function () {
|
|
$result1 = BatchResult::success(operationId: 'op-1', html: '<div>Test</div>');
|
|
$result2 = BatchResult::failure(error: 'Failed', operationId: 'op-2');
|
|
|
|
$response = new BatchResponse($result1, $result2);
|
|
|
|
expect($response->results)->toHaveCount(2);
|
|
expect($response->totalOperations)->toBe(2);
|
|
expect($response->successCount)->toBe(1);
|
|
expect($response->failureCount)->toBe(1);
|
|
});
|
|
|
|
it('calculates statistics correctly', function () {
|
|
$results = [
|
|
BatchResult::success(operationId: 'op-1'),
|
|
BatchResult::success(operationId: 'op-2'),
|
|
BatchResult::success(operationId: 'op-3'),
|
|
BatchResult::failure(error: 'Error', operationId: 'op-4'),
|
|
];
|
|
|
|
$response = new BatchResponse(...$results);
|
|
|
|
expect($response->totalOperations)->toBe(4);
|
|
expect($response->successCount)->toBe(3);
|
|
expect($response->failureCount)->toBe(1);
|
|
});
|
|
|
|
it('creates from results array', function () {
|
|
$results = [
|
|
BatchResult::success(operationId: 'op-1'),
|
|
BatchResult::success(operationId: 'op-2'),
|
|
];
|
|
|
|
$response = BatchResponse::fromResults($results);
|
|
|
|
expect($response->results)->toHaveCount(2);
|
|
expect($response->totalOperations)->toBe(2);
|
|
});
|
|
|
|
it('gets result by index', function () {
|
|
$result1 = BatchResult::success(operationId: 'op-1');
|
|
$result2 = BatchResult::success(operationId: 'op-2');
|
|
|
|
$response = new BatchResponse($result1, $result2);
|
|
|
|
expect($response->getResult(0))->toBe($result1);
|
|
expect($response->getResult(1))->toBe($result2);
|
|
expect($response->getResult(2))->toBeNull();
|
|
});
|
|
|
|
it('gets all results', function () {
|
|
$result1 = BatchResult::success(operationId: 'op-1');
|
|
$result2 = BatchResult::failure(error: 'Error', operationId: 'op-2');
|
|
|
|
$response = new BatchResponse($result1, $result2);
|
|
|
|
expect($response->getResults())->toBe([$result1, $result2]);
|
|
});
|
|
|
|
it('gets successful results only', function () {
|
|
$success1 = BatchResult::success(operationId: 'op-1');
|
|
$success2 = BatchResult::success(operationId: 'op-2');
|
|
$failure = BatchResult::failure(error: 'Error', operationId: 'op-3');
|
|
|
|
$response = new BatchResponse($success1, $failure, $success2);
|
|
|
|
$successfulResults = $response->getSuccessfulResults();
|
|
|
|
expect($successfulResults)->toHaveCount(2);
|
|
expect($successfulResults)->toContain($success1);
|
|
expect($successfulResults)->toContain($success2);
|
|
expect($successfulResults)->not->toContain($failure);
|
|
});
|
|
|
|
it('gets failed results only', function () {
|
|
$success = BatchResult::success(operationId: 'op-1');
|
|
$failure1 = BatchResult::failure(error: 'Error 1', operationId: 'op-2');
|
|
$failure2 = BatchResult::failure(error: 'Error 2', operationId: 'op-3');
|
|
|
|
$response = new BatchResponse($success, $failure1, $failure2);
|
|
|
|
$failedResults = $response->getFailedResults();
|
|
|
|
expect($failedResults)->toHaveCount(2);
|
|
expect($failedResults)->toContain($failure1);
|
|
expect($failedResults)->toContain($failure2);
|
|
expect($failedResults)->not->toContain($success);
|
|
});
|
|
|
|
it('checks if full success', function () {
|
|
$allSuccess = new BatchResponse(
|
|
BatchResult::success(operationId: 'op-1'),
|
|
BatchResult::success(operationId: 'op-2')
|
|
);
|
|
|
|
expect($allSuccess->isFullSuccess())->toBeTrue();
|
|
|
|
$partial = new BatchResponse(
|
|
BatchResult::success(operationId: 'op-1'),
|
|
BatchResult::failure(error: 'Error', operationId: 'op-2')
|
|
);
|
|
|
|
expect($partial->isFullSuccess())->toBeFalse();
|
|
});
|
|
|
|
it('checks if full failure', function () {
|
|
$allFailed = new BatchResponse(
|
|
BatchResult::failure(error: 'Error 1', operationId: 'op-1'),
|
|
BatchResult::failure(error: 'Error 2', operationId: 'op-2')
|
|
);
|
|
|
|
expect($allFailed->isFullFailure())->toBeTrue();
|
|
|
|
$partial = new BatchResponse(
|
|
BatchResult::success(operationId: 'op-1'),
|
|
BatchResult::failure(error: 'Error', operationId: 'op-2')
|
|
);
|
|
|
|
expect($partial->isFullFailure())->toBeFalse();
|
|
});
|
|
|
|
it('checks if has partial failure', function () {
|
|
$partial = new BatchResponse(
|
|
BatchResult::success(operationId: 'op-1'),
|
|
BatchResult::success(operationId: 'op-2'),
|
|
BatchResult::failure(error: 'Error', operationId: 'op-3')
|
|
);
|
|
|
|
expect($partial->hasPartialFailure())->toBeTrue();
|
|
|
|
$allSuccess = new BatchResponse(
|
|
BatchResult::success(operationId: 'op-1'),
|
|
BatchResult::success(operationId: 'op-2')
|
|
);
|
|
|
|
expect($allSuccess->hasPartialFailure())->toBeFalse();
|
|
|
|
$allFailed = new BatchResponse(
|
|
BatchResult::failure(error: 'Error 1', operationId: 'op-1'),
|
|
BatchResult::failure(error: 'Error 2', operationId: 'op-2')
|
|
);
|
|
|
|
expect($allFailed->hasPartialFailure())->toBeFalse();
|
|
});
|
|
|
|
it('converts to array', function () {
|
|
$response = new BatchResponse(
|
|
BatchResult::success(operationId: 'op-1', html: '<div>Test</div>', state: ['value' => 1]),
|
|
BatchResult::failure(error: 'Error', errorCode: 'TEST_ERROR', operationId: 'op-2')
|
|
);
|
|
|
|
$array = $response->toArray();
|
|
|
|
expect($array)->toHaveKey('results');
|
|
expect($array)->toHaveKey('total_operations');
|
|
expect($array)->toHaveKey('success_count');
|
|
expect($array)->toHaveKey('failure_count');
|
|
|
|
expect($array['results'])->toHaveCount(2);
|
|
expect($array['total_operations'])->toBe(2);
|
|
expect($array['success_count'])->toBe(1);
|
|
expect($array['failure_count'])->toBe(1);
|
|
|
|
expect($array['results'][0]['success'])->toBeTrue();
|
|
expect($array['results'][1]['success'])->toBeFalse();
|
|
});
|
|
});
|