* @copyright 2020 Copyright XEHub Corp. * @license http://www.gnu.org/licenses/lgpl-3.0-standalone.html LGPL * @link https://xpressengine.io */ namespace Xpressengine\Tests\Interception; use Xpressengine\Interception\Advisor; use Xpressengine\Interception\AdvisorCollection; class AdvisorCollectionTest extends \PHPUnit\Framework\TestCase { /** * @var AdvisorCollection */ protected $advisorCollection = null; protected function tearDown() { \Mockery::close(); parent::tearDown(); } protected function setUp() { $this->advisorCollection = new AdvisorCollection(); parent::setUp(); // TODO: Change the autogenerated stub } /** * * @expectedException \Xpressengine\Interception\Exceptions\AdvisorNameAlreadyExistsException */ public function testPutDuplicateAdvisorName() { $advisor1 = new Advisor( 'ad1', 'Xpressengine\Tests\Interception\Document@insertDocument', function ($target, $args) { return $target($args); } ); $this->advisorCollection->put($advisor1); $advisor2 = new Advisor( 'ad1', ['Xpressengine\Tests\Interception\Document@insertDocument', 'Xpressengine\Tests\Interception\Document@deleteDocument'], function ($target, $args) { return $target($args); } ); $this->advisorCollection->put($advisor2); } public function testPutAndGetAdvisorList() { $advisor1 = new Advisor( 'ad1', 'Xpressengine\Tests\Interception\Document@insertDocument', function ($target, $args) { return $target($args); } ); $this->advisorCollection->put($advisor1); $advisor2 = new Advisor( 'ad2', ['Xpressengine\Tests\Interception\Document@insertDocument', 'Xpressengine\Tests\Interception\Document@deleteDocument'], function ($target, $args) { return $target($args); } ); $this->advisorCollection->put($advisor2, ['before' => ['ad1', 'ad3']]); $advisor3 = new Advisor( 'ad3', 'Xpressengine\Tests\Interception\Document@deleteDocument', function ($target, $args) { return $target($args); }); $this->advisorCollection->put($advisor3, ['before'=>['ad1']]); $proxyObject = \Mockery::mock('Proxy'); $advisorList = $this->advisorCollection->getAdvisorList('Xpressengine\Tests\Interception\Document@insertDocument', $proxyObject); $this->assertEquals($advisorList->next(), $advisor1); $this->assertEquals($advisorList->next(), $advisor2); $advisorList = $this->advisorCollection->getAdvisorList('Xpressengine\Tests\Interception\Document@deleteDocument', $proxyObject); $this->assertEquals($advisorList->next(), $advisor3); $this->assertEquals($advisorList->next(), $advisor2); } public function testSetAlias() { $advisor1 = new Advisor( 'ad1', 'Bar@insertDocument', function ($target, $args) { return $target($args); } ); $this->advisorCollection->put($advisor1); $this->advisorCollection->setAlias('Bar', 'Acme\\Bar'); $this->assertEquals(['Bar'=>'Acme\\Bar'], $this->getPropertyValue($this->advisorCollection, 'aliases')); $map = $this->getPropertyValue($this->advisorCollection, 'advisorMap'); $this->assertFalse(isset($map->Bar)); } protected function getPropertyValue($object, $property) { $refl = new \ReflectionObject($object); $repoProp = $refl->getProperty($property); $repoProp->setAccessible(true); return $repoProp->getValue($object); } }