2016-03-25 15:43:30 +00:00
< ? php
namespace Symfony\Component\Workflow\Tests ;
2017-02-20 13:34:33 +00:00
use PHPUnit\Framework\TestCase ;
2019-07-31 20:19:25 +01:00
use Symfony\Bridge\PhpUnit\ForwardCompatTestTrait ;
2016-03-25 15:43:30 +00:00
use Symfony\Component\EventDispatcher\EventDispatcherInterface ;
use Symfony\Component\Workflow\Definition ;
use Symfony\Component\Workflow\MarkingStore\MarkingStoreInterface ;
use Symfony\Component\Workflow\Registry ;
2016-12-04 22:08:15 +00:00
use Symfony\Component\Workflow\SupportStrategy\SupportStrategyInterface ;
2016-03-25 15:43:30 +00:00
use Symfony\Component\Workflow\Workflow ;
2017-02-20 13:34:33 +00:00
class RegistryTest extends TestCase
2016-03-25 15:43:30 +00:00
{
2019-07-31 20:19:25 +01:00
use ForwardCompatTestTrait ;
2016-03-25 15:43:30 +00:00
private $registry ;
2019-07-31 20:19:25 +01:00
private function doSetUp ()
2016-03-25 15:43:30 +00:00
{
$this -> registry = new Registry ();
2019-01-16 09:39:14 +00:00
$this -> registry -> add ( new Workflow ( new Definition ([], []), $this -> getMockBuilder ( MarkingStoreInterface :: class ) -> getMock (), $this -> getMockBuilder ( EventDispatcherInterface :: class ) -> getMock (), 'workflow1' ), $this -> createSupportStrategy ( Subject1 :: class ));
$this -> registry -> add ( new Workflow ( new Definition ([], []), $this -> getMockBuilder ( MarkingStoreInterface :: class ) -> getMock (), $this -> getMockBuilder ( EventDispatcherInterface :: class ) -> getMock (), 'workflow2' ), $this -> createSupportStrategy ( Subject2 :: class ));
$this -> registry -> add ( new Workflow ( new Definition ([], []), $this -> getMockBuilder ( MarkingStoreInterface :: class ) -> getMock (), $this -> getMockBuilder ( EventDispatcherInterface :: class ) -> getMock (), 'workflow3' ), $this -> createSupportStrategy ( Subject2 :: class ));
2016-03-25 15:43:30 +00:00
}
2019-07-31 20:19:25 +01:00
private function doTearDown ()
2016-03-25 15:43:30 +00:00
{
$this -> registry = null ;
}
public function testGetWithSuccess ()
{
$workflow = $this -> registry -> get ( new Subject1 ());
$this -> assertInstanceOf ( Workflow :: class , $workflow );
$this -> assertSame ( 'workflow1' , $workflow -> getName ());
$workflow = $this -> registry -> get ( new Subject1 (), 'workflow1' );
$this -> assertInstanceOf ( Workflow :: class , $workflow );
$this -> assertSame ( 'workflow1' , $workflow -> getName ());
$workflow = $this -> registry -> get ( new Subject2 (), 'workflow2' );
$this -> assertInstanceOf ( Workflow :: class , $workflow );
$this -> assertSame ( 'workflow2' , $workflow -> getName ());
}
public function testGetWithMultipleMatch ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Workflow\Exception\InvalidArgumentException' );
$this -> expectExceptionMessage ( 'At least two workflows match this subject. Set a different name on each and use the second (name) argument of this method.' );
2016-03-25 15:43:30 +00:00
$w1 = $this -> registry -> get ( new Subject2 ());
$this -> assertInstanceOf ( Workflow :: class , $w1 );
$this -> assertSame ( 'workflow1' , $w1 -> getName ());
}
public function testGetWithNoMatch ()
{
2019-08-01 23:48:42 +01:00
$this -> expectException ( 'Symfony\Component\Workflow\Exception\InvalidArgumentException' );
$this -> expectExceptionMessage ( 'Unable to find a workflow for class "stdClass".' );
2016-03-25 15:43:30 +00:00
$w1 = $this -> registry -> get ( new \stdClass ());
$this -> assertInstanceOf ( Workflow :: class , $w1 );
$this -> assertSame ( 'workflow1' , $w1 -> getName ());
}
2016-12-04 22:08:15 +00:00
/**
* @ group legacy
*/
public function testGetWithSuccessLegacyStrategy ()
{
$registry = new Registry ();
2019-01-16 09:39:14 +00:00
$registry -> add ( new Workflow ( new Definition ([], []), $this -> getMockBuilder ( MarkingStoreInterface :: class ) -> getMock (), $this -> getMockBuilder ( EventDispatcherInterface :: class ) -> getMock (), 'workflow1' ), Subject1 :: class );
$registry -> add ( new Workflow ( new Definition ([], []), $this -> getMockBuilder ( MarkingStoreInterface :: class ) -> getMock (), $this -> getMockBuilder ( EventDispatcherInterface :: class ) -> getMock (), 'workflow2' ), Subject2 :: class );
2016-12-04 22:08:15 +00:00
$workflow = $registry -> get ( new Subject1 ());
$this -> assertInstanceOf ( Workflow :: class , $workflow );
$this -> assertSame ( 'workflow1' , $workflow -> getName ());
$workflow = $registry -> get ( new Subject1 (), 'workflow1' );
$this -> assertInstanceOf ( Workflow :: class , $workflow );
$this -> assertSame ( 'workflow1' , $workflow -> getName ());
$workflow = $registry -> get ( new Subject2 (), 'workflow2' );
$this -> assertInstanceOf ( Workflow :: class , $workflow );
$this -> assertSame ( 'workflow2' , $workflow -> getName ());
}
private function createSupportStrategy ( $supportedClassName )
{
$strategy = $this -> getMockBuilder ( SupportStrategyInterface :: class ) -> getMock ();
$strategy -> expects ( $this -> any ()) -> method ( 'supports' )
2019-05-30 15:56:20 +01:00
-> willReturnCallback ( function ( $workflow , $subject ) use ( $supportedClassName ) {
2016-12-04 22:08:15 +00:00
return $subject instanceof $supportedClassName ;
2019-05-30 15:56:20 +01:00
});
2016-12-04 22:08:15 +00:00
return $strategy ;
}
2016-03-25 15:43:30 +00:00
}
class Subject1
{
}
class Subject2
{
}