| 
<?php
 /*
 * This file is part of Chevere.
 *
 * (c) Rodolfo Berrios <[email protected]>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
 
 declare(strict_types=1);
 
 namespace Chevere\Tests;
 
 use ArgumentCountError;
 use Chevere\Parameter\Cast;
 use Chevere\Tests\src\TestActionNoParams;
 use Chevere\Tests\src\TestActionParam;
 use Chevere\Tests\src\TestActionParams;
 use Chevere\Workflow\Run;
 use OutOfBoundsException;
 use OverflowException;
 use PHPUnit\Framework\TestCase;
 use function Chevere\Workflow\async;
 use function Chevere\Workflow\variable;
 use function Chevere\Workflow\workflow;
 
 final class RunTest extends TestCase
 {
 public function testConstruct(): void
 {
 $workflow = workflow()
 ->withAddedJob(
 job: async(
 new TestActionParam(),
 foo: variable('foo'),
 )
 );
 $arguments = [
 'foo' => 'bar',
 ];
 $run = new Run($workflow, ...$arguments);
 $this->assertMatchesRegularExpression(
 '/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i',
 $run->uuid()
 );
 $this->assertSame($workflow, $run->workflow());
 $this->assertSame($arguments, $run->arguments()->toArray());
 $this->expectException(OutOfBoundsException::class);
 $run->response('not-found');
 }
 
 public function testWithStepResponse(): void
 {
 $workflow = workflow()
 ->withAddedJob(
 job0: async(
 new TestActionParam(),
 foo: variable('foo')
 ),
 job1: async(
 new TestActionParams(),
 foo: variable('baz'),
 bar: variable('bar')
 )
 );
 $arguments = [
 'foo' => 'hola',
 'bar' => 'mundo',
 'baz' => 'ql',
 ];
 $run = (new Run($workflow, ...$arguments));
 $workflowRunWithStepResponse = $run->withResponse('job0', new Cast([]));
 $this->assertNotSame($run, $workflowRunWithStepResponse);
 $this->assertSame([], $workflowRunWithStepResponse->response('job0')->array());
 }
 
 public function testWithAddedNotFound(): void
 {
 $workflow = workflow()
 ->withAddedJob(
 job0: async(
 new TestActionParam(),
 foo: variable('foo')
 )
 );
 $arguments = [
 'foo' => 'hola',
 ];
 $this->expectException(OutOfBoundsException::class);
 (new Run($workflow, ...$arguments))
 ->withResponse(
 'not-found',
 new Cast([])
 );
 }
 
 public function testWithAddedMissingArguments(): void
 {
 $workflow = workflow()
 ->withAddedJob(
 job0: async(
 new TestActionNoParams()
 ),
 job1: async(
 new TestActionParam(),
 foo: variable('foo')
 )
 );
 $this->expectException(ArgumentCountError::class);
 (new Run($workflow))
 ->withResponse(
 'job0',
 new Cast('')
 );
 }
 
 public function testWithSkip(): void
 {
 $workflow = workflow(
 job1: async(new TestActionNoParams()),
 job2: async(new TestActionNoParams())
 );
 $run = new Run($workflow);
 $this->assertCount(0, $run->skip());
 $immutable = $run->withSkip('job1', 'job2');
 $this->assertNotSame($run, $immutable);
 $this->assertCount(2, $immutable->skip());
 $this->assertSame(['job1', 'job2'], $immutable->skip()->toArray());
 $this->expectException(OverflowException::class);
 $this->expectExceptionMessage('Job job1 already skipped');
 $immutable->withSkip('job1');
 }
 
 public function testWithSkipMissingJob(): void
 {
 $workflow = workflow();
 $run = new Run($workflow);
 $this->expectException(OutOfBoundsException::class);
 $run->withSkip('job1', 'job2');
 }
 }
 
 |