<?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'); 
    } 
} 
 
 |