diff --git a/lib/Alchemy/Phrasea/Border/Checker/AbstractChecker.php b/lib/Alchemy/Phrasea/Border/Checker/AbstractChecker.php index cb395d6de0..ec535ea930 100644 --- a/lib/Alchemy/Phrasea/Border/Checker/AbstractChecker.php +++ b/lib/Alchemy/Phrasea/Border/Checker/AbstractChecker.php @@ -19,8 +19,19 @@ use Alchemy\Phrasea\Border\File; */ abstract class AbstractChecker implements CheckerInterface { + /** + * @var Application + */ protected $app; + + /** + * @var \databox[] + */ protected $databoxes = []; + + /** + * @var \collection[] + */ protected $collections = []; public function __construct(Application $app) @@ -32,8 +43,8 @@ abstract class AbstractChecker implements CheckerInterface * Restrict the checker to a set of databoxes. * Warning, you can not restrict on both databoxes and collections * - * @param databox|array $databoxes A databox or an array of databoxes - * @return Boolean + * @param \databox[] $databoxes A databox or an array of databoxes + * @return bool * * @throws \LogicException If already restricted to collections * @throws \InvalidArgumentException In case invalid databoxes are provided @@ -60,8 +71,8 @@ abstract class AbstractChecker implements CheckerInterface * Restrict the checker to a set of collections. * Warning, you can not restrict on both databoxes and collections * - * @param collection|array $collections - * @return Boolean + * @param \collection[] $collections + * @return bool * * @throws \LogicException If already restricted to databoxes * @throws \InvalidArgumentException In case invalid collections are provided diff --git a/lib/Alchemy/Phrasea/Border/Manager.php b/lib/Alchemy/Phrasea/Border/Manager.php index b0c74650b8..1dc81a8015 100644 --- a/lib/Alchemy/Phrasea/Border/Manager.php +++ b/lib/Alchemy/Phrasea/Border/Manager.php @@ -44,6 +44,9 @@ use Symfony\Component\Filesystem\Exception\IOException; */ class Manager { + /** + * @var CheckerInterface[] + */ protected $checkers = []; protected $app; protected $filesystem; @@ -159,7 +162,9 @@ class Manager } foreach ($this->checkers as $checker) { - $visa->addResponse($checker->check($this->app['orm.em'], $file)); + if ($checker->isApplicable($file)) { + $visa->addResponse($checker->check($this->app['orm.em'], $file)); + } } return $visa; diff --git a/tests/Alchemy/Tests/Phrasea/Border/ManagerGetVisaTest.php b/tests/Alchemy/Tests/Phrasea/Border/ManagerGetVisaTest.php new file mode 100644 index 0000000000..7fc3bfa96b --- /dev/null +++ b/tests/Alchemy/Tests/Phrasea/Border/ManagerGetVisaTest.php @@ -0,0 +1,79 @@ +app = $this->prophesize(Application::class); + $this->app->offsetGet('orm.em')->willReturn($this->prophesize(EntityManager::class)); + + $this->sut = new Manager($this->app->reveal()); + } + + public function testGetVisaWithoutAnyCheckers() + { + $file = $this->prophesize(File::class); + + $visa = $this->sut->getVisa($file->reveal()); + + $this->assertInstanceOf(Visa::class, $visa); + } + + public function testGetVisaWithOnlyOneCheckerApplicable() + { + $file = $this->prophesize(File::class); + + $checker1 = $this->prophesize(CheckerInterface::class); + $checker1->isApplicable($file->reveal()) + ->willReturn(false); + $checker1->check(Argument::any(), $file->reveal()) + ->shouldNotBeCalled(); + + $checker2 = $this->prophesize(CheckerInterface::class); + $checker2->isApplicable($file->reveal()) + ->willReturn(true); + $checker2->check(Argument::any(), $file->reveal()) + ->willReturn(new Response(true, $checker2->reveal())); + + $this->sut->registerCheckers([$checker1->reveal(), $checker2->reveal()]); + + $visa = $this->sut->getVisa($file->reveal()); + + $this->assertInstanceOf(Visa::class, $visa); + $responses = $visa->getResponses(); + + $this->assertCount(1, $responses); + $this->assertSame($checker2->reveal(), $responses[0]->getChecker()); + } +}