<?php

namespace tests\codeception\unit\models;

use Yii;
use yii\codeception\TestCase;
use Codeception\Specify;
use yii\rbac\PhpManager;

class MockRule extends \yii\rbac\Rule {

	const NAME = 'mock';

	public function init() {
		parent::init();
		$this->name = self::NAME;
	}

	public static $PASS = true;

	public function execute($user, $item, $params) {
		return self::$PASS;
	}

}

class InstanceAuthorizationTest extends TestCase {

	use Specify;

	private $auth;

	protected function setUp() {
		parent::setUp();
		$this->auth = new PhpManager;
		$this->auth->removeAll();
	}

	public function testSanity() {
		expect($this->auth->add(new MockRule))->true();

		$base = $this->auth->createRole("base");
		expect($this->auth->add($base))->true();

		$implied = $this->auth->createRole("implied");
		$implied->ruleName = MockRule::NAME;
		$this->auth->add($implied);

		$this->auth->addChild($implied, $base);

		expect($this->auth->getChildren($base->name))->greaterThan(0);

		$this->auth->assign($implied, 0);
		expect($this->auth->checkAccess(0, 'derp'))->false();
		expect($this->auth->checkAccess(0, $implied->name))->true();
		expect($this->auth->checkAccess(0, $base->name))->true();

		MockRule::$PASS = false;
		expect($this->auth->checkAccess(0, $implied->name))->false();
		expect($this->auth->checkAccess(0, $base->name))->false();
	}

}