eZ\Publish\Core\Repository\Tests\Service\Mock\PermissionTest::testCanUserComplex PHP Method

testCanUserComplex() public method

Tests execution paths with permission sets containing limitations.
public testCanUserComplex ( array $roleLimitationEvaluations, array $policyLimitationEvaluations, $userCan )
$roleLimitationEvaluations array
$policyLimitationEvaluations array
    public function testCanUserComplex(array $roleLimitationEvaluations, array $policyLimitationEvaluations, $userCan)
    {
        /** @var $valueObject \eZ\Publish\API\Repository\Values\ValueObject */
        $valueObject = $this->getMock('eZ\\Publish\\API\\Repository\\Values\\ValueObject');
        $limitationServiceMock = $this->getLimitationServiceMock();
        $permissionResolverMock = $this->getPermissionResolverMock(['hasAccess', 'getCurrentUserReference']);
        $permissionSets = $this->getPermissionSetsMock();
        $permissionResolverMock->expects($this->once())->method('hasAccess')->with($this->equalTo('test-module'), $this->equalTo('test-function'))->will($this->returnValue($permissionSets));
        $userRef = new UserReference(14);
        $permissionResolverMock->expects($this->once())->method('getCurrentUserReference')->will($this->returnValue(new UserReference(14)));
        $invocation = 0;
        for ($i = 0; $i < count($permissionSets); ++$i) {
            $limitation = $this->getMock('eZ\\Publish\\SPI\\Limitation\\Type');
            $limitation->expects($this->once())->method('evaluate')->with($permissionSets[$i]['limitation'], $userRef, $valueObject, array($valueObject))->will($this->returnValue($roleLimitationEvaluations[$i]));
            $limitationServiceMock->expects($this->at($invocation++))->method('getLimitationType')->with('test-role-limitation-identifier')->will($this->returnValue($limitation));
            if (!$roleLimitationEvaluations[$i]) {
                continue;
            }
            for ($j = 0; $j < count($permissionSets[$i]['policies']); ++$j) {
                /** @var $policy \eZ\Publish\API\Repository\Values\User\Policy */
                $policy = $permissionSets[$i]['policies'][$j];
                $limitations = $policy->getLimitations();
                for ($k = 0; $k < count($limitations); ++$k) {
                    $limitationsPass = true;
                    $limitation = $this->getMock('eZ\\Publish\\SPI\\Limitation\\Type');
                    $limitation->expects($this->once())->method('evaluate')->with($limitations[$k], $userRef, $valueObject, array($valueObject))->will($this->returnValue($policyLimitationEvaluations[$i][$j][$k]));
                    $limitationServiceMock->expects($this->at($invocation++))->method('getLimitationType')->with('test-policy-limitation-identifier')->will($this->returnValue($limitation));
                    if (!$policyLimitationEvaluations[$i][$j][$k]) {
                        $limitationsPass = false;
                        break;
                    }
                }
                /** @var $limitationsPass */
                if ($limitationsPass) {
                    break 2;
                }
            }
        }
        self::assertEquals($userCan, $permissionResolverMock->canUser('test-module', 'test-function', $valueObject, [$valueObject]));
    }