1
0

JobOutcomeTest.php 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Tests\Unit\Jobs;
  4. use App\Domain\Jobs\JobOutcome;
  5. use App\Domain\Jobs\JobStatus;
  6. use PHPUnit\Framework\TestCase;
  7. /**
  8. * The HTTP envelope is the public contract — every status in M05 maps to
  9. * a specific code (success=200, skipped_locked=409, failure=500). This
  10. * locks the mapping in.
  11. */
  12. final class JobOutcomeTest extends TestCase
  13. {
  14. public function testSuccessMapsTo200AndIncludesAllFields(): void
  15. {
  16. $outcome = new JobOutcome('demo', JobStatus::Success, 5, 12, 99);
  17. self::assertSame(200, $outcome->httpStatus());
  18. self::assertSame([
  19. 'job' => 'demo',
  20. 'status' => 'success',
  21. 'items_processed' => 5,
  22. 'duration_ms' => 12,
  23. 'run_id' => 99,
  24. ], $outcome->toArray());
  25. }
  26. public function testSkippedLockedMapsTo409(): void
  27. {
  28. $outcome = new JobOutcome('demo', JobStatus::SkippedLocked, 0, 1, 100, 'lock held');
  29. self::assertSame(409, $outcome->httpStatus());
  30. $array = $outcome->toArray();
  31. self::assertSame('skipped_locked', $array['status']);
  32. self::assertSame('lock held', $array['error']);
  33. }
  34. public function testFailureMapsTo500(): void
  35. {
  36. $outcome = new JobOutcome('demo', JobStatus::Failure, 0, 200, 101, 'boom');
  37. self::assertSame(500, $outcome->httpStatus());
  38. }
  39. }