createCanViewFunctionProvider()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 3
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 5
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AbterPhp\Framework\Bootstrappers\Authorization;
6
7
use AbterPhp\Framework\Authorization\CombinedAdapter;
8
use AbterPhp\Framework\Authorization\Constant\Role;
9
use AbterPhp\Framework\Constant\Env;
10
use AbterPhp\Framework\Environments\Environment;
11
use Casbin\Enforcer;
12
use Opulence\Ioc\Container;
13
use Opulence\Sessions\ISession;
14
use Opulence\Views\Compilers\Fortune\ITranspiler;
15
use PHPUnit\Framework\TestCase;
16
17
class EnforcerBootstrapperTest extends TestCase
18
{
19
    /** @var EnforcerBootstrapper - System Under Test */
20
    protected EnforcerBootstrapper $sut;
21
22
    private const ACL = '[request_definition]
23
r = sub, obj, act
24
25
[policy_definition]
26
p = sub, obj, act
27
28
[policy_effect]
29
e = some(where (p.eft == allow))
30
31
[matchers]
32
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act';
33
34
    public function setUp(): void
35
    {
36
        Environment::unsetVar(Env::DIR_AUTH_CONFIG);
37
        Environment::unsetVar(Env::ENV_NAME);
38
39
        $this->sut = new EnforcerBootstrapper();
40
    }
41
42
    public function testRegisterBindingsWithoutSession(): void
43
    {
44
        Environment::setVar(Env::DIR_AUTH_CONFIG, '/tmp');
45
        Environment::setVar(Env::ENV_NAME, 'foo');
46
47
        file_put_contents('/tmp/model.conf', static::ACL);
48
49
        $mockAdapter = $this->getMockBuilder(CombinedAdapter::class)->disableOriginalConstructor()->getMock();
50
51
        $container = new Container();
52
        $container->bindInstance(CombinedAdapter::class, $mockAdapter);
53
54
        $this->sut->registerBindings($container);
55
56
        $actual = $container->resolve(Enforcer::class);
57
        $this->assertInstanceOf(Enforcer::class, $actual);
58
    }
59
60
    public function testRegisterBindingsWithSession(): void
61
    {
62
        $usernameStub = 'Foo';
63
64
        Environment::setVar(Env::DIR_AUTH_CONFIG, '/tmp');
65
        Environment::setVar(Env::ENV_NAME, 'foo');
66
67
        file_put_contents('/tmp/model.conf', static::ACL);
68
69
        $mockAdapter = $this->getMockBuilder(CombinedAdapter::class)->disableOriginalConstructor()->getMock();
70
        $sessionMock = $this->getMockBuilder(ISession::class)->getMock();
71
        $sessionMock->expects($this->any())->method('get')->with()->willReturn($usernameStub);
72
        $mockTranspiler = $this->getMockBuilder(ITranspiler::class)->getMock();
73
74
        $container = new Container();
75
        $container->bindInstance(CombinedAdapter::class, $mockAdapter);
76
        $container->bindInstance(ISession::class, $sessionMock);
77
        $container->bindInstance(ITranspiler::class, $mockTranspiler);
78
79
        $this->sut->registerBindings($container);
80
81
        $actual = $container->resolve(Enforcer::class);
82
        $this->assertInstanceOf(Enforcer::class, $actual);
83
    }
84
85
    /**
86
     * @return array
87
     */
88
    public function createCanViewFunctionProvider(): array
89
    {
90
        return [
91
            [true],
92
            [false],
93
        ];
94
    }
95
96
    /**
97
     * @dataProvider createCanViewFunctionProvider
98
     *
99
     * @param bool $expectedResult
100
     */
101
    public function testCreateCanViewViewFunctionChecksReadRole(bool $expectedResult): void
102
    {
103
        $usernameStub = 'foo';
104
        $keyStub      = 'bar';
105
106
        $enforcerMock = $this->getMockBuilder(Enforcer::class)->disableOriginalConstructor()->getMock();
107
        $enforcerMock
108
            ->expects($this->once())
109
            ->method('enforce')
110
            ->with($usernameStub, "admin_resource_$keyStub", Role::READ)
111
            ->willReturn($expectedResult);
112
113
        $actual = $this->sut->createCanViewViewFunction($usernameStub, $enforcerMock)($keyStub);
114
        $this->assertEquals($expectedResult, $actual);
115
    }
116
}
117