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]));
}