Completed
Push — ezp_30981_content_info_proxy ( 5d5afd...47f956 )
by
unknown
15:40
created

ChainSiteAccessProviderTest::createSiteAcccess()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 2
dl 0
loc 17
rs 9.7
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
5
 * @license For full copyright and license information view LICENSE file distributed with this source code.
6
 */
7
declare(strict_types=1);
8
9
namespace eZ\Publish\Core\MVC\Symfony\SiteAccess\Test\Provider;
10
11
use eZ\Publish\Core\Base\Exceptions\NotFoundException;
12
use eZ\Publish\Core\MVC\Symfony\SiteAccess;
13
use eZ\Publish\Core\MVC\Symfony\SiteAccessGroup;
14
use PHPUnit\Framework\TestCase;
15
use eZ\Publish\Core\MVC\Symfony\SiteAccess\Provider\ChainSiteAccessProvider;
16
use eZ\Publish\Core\MVC\Symfony\SiteAccess\Provider\StaticSiteAccessProvider;
17
use function array_map;
18
19
final class ChainSiteAccessProviderTest extends TestCase
20
{
21
    private const EXISTING_SA_NAME = 'existing_sa';
22
    private const UNDEFINED_SA_NAME = 'undefined_sa';
23
    private const WITHOUT_GROUP_SA_NAME = 'without_group_sa';
24
    private const SA_GROUP = 'group';
25
26
    /** @var \eZ\Publish\Core\MVC\Symfony\SiteAccess\SiteAccessProviderInterface[] */
27
    private $providers;
28
29
    /** @var array */
30
    private $groupsBySiteAccess;
31
32
    protected function setUp(): void
33
    {
34
        parent::setUp();
35
36
        $this->groupsBySiteAccess = [
37
            self::EXISTING_SA_NAME => [self::SA_GROUP],
38
            'first_sa' => [self::SA_GROUP],
39
            'second_sa' => [self::SA_GROUP],
40
        ];
41
        $this->providers = [
42
            new StaticSiteAccessProvider([self::EXISTING_SA_NAME, 'first_sa'], $this->groupsBySiteAccess),
43
            new StaticSiteAccessProvider(['second_sa'], $this->groupsBySiteAccess),
44
            new StaticSiteAccessProvider([self::WITHOUT_GROUP_SA_NAME]),
45
        ];
46
    }
47
48
    public function siteAccessNamesProvider(): array
49
    {
50
        return [
51
            'existing_sa' => [self::EXISTING_SA_NAME],
52
            'sa_without_group' => [self::WITHOUT_GROUP_SA_NAME],
53
        ];
54
    }
55
56
    /**
57
     * @dataProvider siteAccessNamesProvider
58
     */
59
    public function testIsDefined(string $siteAccessName): void
60
    {
61
        $chainSiteAccessProvider = $this->getChainSiteAccessProvider();
62
63
        $this->assertTrue($chainSiteAccessProvider->isDefined($siteAccessName));
64
    }
65
66
    public function testIsDefinedForUndefinedSiteAccess(): void
67
    {
68
        $chainSiteAccessProvider = $this->getChainSiteAccessProvider();
69
70
        $this->assertFalse($chainSiteAccessProvider->isDefined(self::UNDEFINED_SA_NAME));
71
    }
72
73
    public function testGetSiteAccesses(): void
74
    {
75
        $chainSiteAccessProvider = $this->getChainSiteAccessProvider();
76
        $siteAccesses = iterator_to_array($chainSiteAccessProvider->getSiteAccesses());
77
78
        $this->assertCount(4, $siteAccesses);
79
80
        $expectedSiteAccessNames = [
81
            ['name' => self::EXISTING_SA_NAME, 'groups' => [self::SA_GROUP]],
82
            ['name' => 'first_sa', 'groups' => [self::SA_GROUP]],
83
            ['name' => 'second_sa', 'groups' => [self::SA_GROUP]],
84
            ['name' => self::WITHOUT_GROUP_SA_NAME, 'groups' => []],
85
        ];
86
87
        foreach ($expectedSiteAccessNames as $key => $saData) {
88
            $expectedSiteAccess = $this->createSiteAcccess(
89
                $saData['name'], $saData['groups']
90
            );
91
92
            $this->assertEquals($expectedSiteAccess, $siteAccesses[$key]);
93
        }
94
95
        $undefinedSiteAccess = $this->createSiteAcccess(
96
            self::UNDEFINED_SA_NAME, [self::SA_GROUP]
97
        );
98
99
        $this->assertNotContains(
100
            $undefinedSiteAccess,
101
            $siteAccesses
102
        );
103
    }
104
105
    public function getExistingSiteProvider(): array
106
    {
107
        return [
108
            'existing_sa' => [self::EXISTING_SA_NAME, [self::SA_GROUP]],
109
            'sa_without_group' => [self::WITHOUT_GROUP_SA_NAME, []],
110
        ];
111
    }
112
113
    /**
114
     * @dataProvider getExistingSiteProvider
115
     *
116
     * @param string[] $expectedGroups
117
     *
118
     * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException
119
     */
120
    public function testGetExistingSiteAccess(string $siteAccessName, array $expectedGroups): void
121
    {
122
        $chainSiteAccessProvider = $this->getChainSiteAccessProvider();
123
        $expectedSiteAccess = new SiteAccess(
124
            $siteAccessName,
125
            SiteAccess::DEFAULT_MATCHING_TYPE,
126
            null,
127
            StaticSiteAccessProvider::class
128
        );
129
        $expectedSiteAccess->groups = $expectedGroups;
0 ignored issues
show
Documentation Bug introduced by
It seems like $expectedGroups of type array<integer,string> is incompatible with the declared type array<integer,object<eZ\...mfony\SiteAccessGroup>> of property $groups.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
130
131
        $this->assertEquals(
132
            $expectedSiteAccess,
133
            $chainSiteAccessProvider->getSiteAccess($siteAccessName)
134
        );
135
    }
136
137
    public function testGetUndefinedSiteAccess(): void
138
    {
139
        $chainSiteAccessProvider = $this->getChainSiteAccessProvider();
140
141
        $this->expectException(NotFoundException::class);
142
        $this->expectExceptionMessage("Could not find 'Site Access' with identifier 'undefined_sa'");
143
144
        $chainSiteAccessProvider->getSiteAccess(self::UNDEFINED_SA_NAME);
145
    }
146
147
    private function getChainSiteAccessProvider(): ChainSiteAccessProvider
148
    {
149
        return new ChainSiteAccessProvider($this->providers);
150
    }
151
152
    /**
153
     * @param string[] $groupNames
154
     */
155
    private function createSiteAcccess(string $name, array $groupNames = []): SiteAccess
156
    {
157
        $undefinedSiteAccess = new SiteAccess(
158
            $name,
159
            SiteAccess::DEFAULT_MATCHING_TYPE,
160
            null,
161
            StaticSiteAccessProvider::class
162
        );
163
        $undefinedSiteAccess->groups = array_map(
164
            static function (string $groupName) {
165
                return new SiteAccessGroup($groupName);
166
            },
167
            $groupNames
168
        );
169
170
        return $undefinedSiteAccess;
171
    }
172
}
173