Passed
Push — master ( 80fed1...32ef61 )
by Peter
09:46
created

AdminResourceSqlDataMapperTest   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 208
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 12
eloc 114
c 2
b 0
f 0
dl 0
loc 208
rs 10

12 Methods

Rating   Name   Duplication   Size   Complexity  
A testAdd() 0 20 1
A testGetById() 0 19 1
A assertEntity() 0 5 1
A testAddThrowsExceptionIfCalledWithInvalidEntity() 0 8 1
A testDelete() 0 18 1
A testGetByUserId() 0 25 1
A testDeleteThrowsExceptionIfCalledWithInvalidEntity() 0 8 1
A setUp() 0 5 1
A testUpdateThrowsExceptionIfCalledWithInvalidEntity() 0 8 1
A testGetByIdentifier() 0 19 1
A testUpdate() 0 18 1
A testGetAll() 0 24 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AbterPhp\Admin\Orm\DataMapper;
6
7
use AbterPhp\Admin\Domain\Entities\AdminResource;
8
use AbterPhp\Admin\Orm\DataMappers\AdminResourceSqlDataMapper;
9
use AbterPhp\Admin\TestCase\Orm\DataMapperTestCase;
10
use AbterPhp\Framework\Domain\Entities\IStringerEntity;
11
use AbterPhp\Framework\TestDouble\Database\MockStatementFactory;
12
use PHPUnit\Framework\MockObject\MockObject;
13
14
class AdminResourceSqlDataMapperTest extends DataMapperTestCase
15
{
16
    /** @var AdminResourceSqlDataMapper */
17
    protected $sut;
18
19
    public function setUp(): void
20
    {
21
        parent::setUp();
22
23
        $this->sut = new AdminResourceSqlDataMapper($this->readConnectionMock, $this->writeConnectionMock);
24
    }
25
26
    public function testAdd()
27
    {
28
        $nextId     = '9b6ae58b-1aff-4344-a2ae-cda43a40674e';
29
        $identifier = 'foo';
30
31
        $sql0       = 'INSERT INTO admin_resources (id, identifier) VALUES (?, ?)'; // phpcs:ignore
32
        $values     = [[$nextId, \PDO::PARAM_STR], [$identifier, \PDO::PARAM_STR]];
33
        $statement0 = MockStatementFactory::createWriteStatement($this, $values);
34
35
        $this->writeConnectionMock
36
            ->expects($this->once())
37
            ->method('prepare')
38
            ->with($sql0)
39
            ->willReturn($statement0);
40
41
        $entity = new AdminResource($nextId, $identifier);
42
43
        $this->sut->add($entity);
44
45
        $this->assertSame($nextId, $entity->getId());
46
    }
47
48
    public function testDelete()
49
    {
50
        $id         = '8fe2f659-dbe5-4995-9e07-f49fb018cfe7';
51
        $identifier = 'foo';
52
53
        $sql0       = 'UPDATE admin_resources AS admin_resources SET deleted_at = NOW() WHERE (id = ?)'; // phpcs:ignore
54
        $values     = [[$id, \PDO::PARAM_STR]];
55
        $statement0 = MockStatementFactory::createWriteStatement($this, $values);
56
57
        $this->writeConnectionMock
58
            ->expects($this->once())
59
            ->method('prepare')
60
            ->with($sql0)
61
            ->willReturn($statement0);
62
63
        $entity = new AdminResource($id, $identifier);
64
65
        $this->sut->delete($entity);
66
    }
67
68
    public function testGetAll()
69
    {
70
        $id0         = '24bd4165-1229-4a6e-a679-76bf90743ee1';
71
        $identifier0 = 'foo';
72
        $id1         = '51eac0fc-2b26-4231-9559-469e59fae694';
73
        $identifier1 = 'bar';
74
75
        $sql0         = 'SELECT ar.id, ar.identifier FROM admin_resources AS ar WHERE (ar.deleted_at IS NULL)'; // phpcs:ignore
76
        $values       = [];
77
        $expectedData = [
78
            ['id' => $id0, 'identifier' => $identifier0],
79
            ['id' => $id1, 'identifier' => $identifier1],
80
        ];
81
        $statement0   = MockStatementFactory::createReadStatement($this, $values, $expectedData);
82
83
        $this->readConnectionMock
84
            ->expects($this->once())
85
            ->method('prepare')
86
            ->with($sql0)
87
            ->willReturn($statement0);
88
89
        $actualResult = $this->sut->getAll();
90
91
        $this->assertCollection($expectedData, $actualResult);
92
    }
93
94
    public function testGetById()
95
    {
96
        $id         = '4b72daf8-81a9-400f-b865-28306d1c1646';
97
        $identifier = 'foo';
98
99
        $sql0         = 'SELECT ar.id, ar.identifier FROM admin_resources AS ar WHERE (ar.deleted_at IS NULL) AND (ar.id = :admin_resource_id)'; // phpcs:ignore
100
        $values       = ['admin_resource_id' => [$id, \PDO::PARAM_STR]];
101
        $expectedData = [['id' => $id, 'identifier' => $identifier]];
102
        $statement0   = MockStatementFactory::createReadStatement($this, $values, $expectedData);
103
104
        $this->readConnectionMock
105
            ->expects($this->once())
106
            ->method('prepare')
107
            ->with($sql0)
108
            ->willReturn($statement0);
109
110
        $actualResult = $this->sut->getById($id);
111
112
        $this->assertEntity($expectedData[0], $actualResult);
113
    }
114
115
    public function testGetByIdentifier()
116
    {
117
        $id         = '998ac138-85be-4b8f-ac7a-3fb8c249a7bf';
118
        $identifier = 'foo';
119
120
        $sql0         = 'SELECT ar.id, ar.identifier FROM admin_resources AS ar WHERE (ar.deleted_at IS NULL) AND (ar.identifier = :identifier)'; // phpcs:ignore
121
        $values       = ['identifier' => [$identifier, \PDO::PARAM_STR]];
122
        $expectedData = [['id' => $id, 'identifier' => $identifier]];
123
        $statement0   = MockStatementFactory::createReadStatement($this, $values, $expectedData);
124
125
        $this->readConnectionMock
126
            ->expects($this->once())
127
            ->method('prepare')
128
            ->with($sql0)
129
            ->willReturn($statement0);
130
131
        $actualResult = $this->sut->getByIdentifier($identifier);
132
133
        $this->assertEntity($expectedData[0], $actualResult);
134
    }
135
136
    public function testGetByUserId()
137
    {
138
        $userId      = '81704325-5d93-4987-8425-8a80062db406';
139
        $id0         = '24bd4165-1229-4a6e-a679-76bf90743ee1';
140
        $identifier0 = 'foo';
141
        $id1         = '51eac0fc-2b26-4231-9559-469e59fae694';
142
        $identifier1 = 'bar';
143
144
        $sql0         = 'SELECT ar.id, ar.identifier FROM admin_resources AS ar INNER JOIN user_groups_admin_resources AS ugar ON ugar.admin_resource_id = ar.id INNER JOIN user_groups AS ug ON ug.id = ugar.user_group_id INNER JOIN users_user_groups AS uug ON uug.user_group_id = ug.id WHERE (ar.deleted_at IS NULL) AND (uug.user_id = :user_id) GROUP BY ar.id'; // phpcs:ignore
145
        $values       = ['user_id' => [$userId, \PDO::PARAM_STR]];
146
        $expectedData = [
147
            ['id' => $id0, 'identifier' => $identifier0],
148
            ['id' => $id1, 'identifier' => $identifier1],
149
        ];
150
        $statement0   = MockStatementFactory::createReadStatement($this, $values, $expectedData);
151
152
        $this->readConnectionMock
153
            ->expects($this->once())
154
            ->method('prepare')
155
            ->with($sql0)
156
            ->willReturn($statement0);
157
158
        $actualResult = $this->sut->getByUserId($userId);
159
160
        $this->assertCollection($expectedData, $actualResult);
161
    }
162
163
    public function testUpdate()
164
    {
165
        $id         = '91693481-276e-495b-82a1-33209c47ca09';
166
        $identifier = 'foo';
167
168
        $sql0       = 'UPDATE admin_resources AS admin_resources SET identifier = ? WHERE (id = ?) AND (deleted_at IS NULL)'; // phpcs:ignore
169
        $values    = [[$identifier, \PDO::PARAM_STR], [$id, \PDO::PARAM_STR]];
170
        $statement0 = MockStatementFactory::createWriteStatement($this, $values);
171
172
        $this->writeConnectionMock
173
            ->expects($this->once())
174
            ->method('prepare')
175
            ->with($sql0)
176
            ->willReturn($statement0);
177
178
        $entity = new AdminResource($id, $identifier);
179
180
        $this->sut->update($entity);
181
    }
182
183
    public function testAddThrowsExceptionIfCalledWithInvalidEntity()
184
    {
185
        $this->expectException(\InvalidArgumentException::class);
186
187
        /** @var IStringerEntity|MockObject $entity */
188
        $entity = $this->createMock(IStringerEntity::class);
189
190
        $this->sut->add($entity);
191
    }
192
193
    public function testDeleteThrowsExceptionIfCalledWithInvalidEntity()
194
    {
195
        $this->expectException(\InvalidArgumentException::class);
196
197
        /** @var IStringerEntity|MockObject $entity */
198
        $entity = $this->createMock(IStringerEntity::class);
199
200
        $this->sut->delete($entity);
201
    }
202
203
    public function testUpdateThrowsExceptionIfCalledWithInvalidEntity()
204
    {
205
        $this->expectException(\InvalidArgumentException::class);
206
207
        /** @var IStringerEntity|MockObject $entity */
208
        $entity = $this->createMock(IStringerEntity::class);
209
210
        $this->sut->update($entity);
211
    }
212
213
    /**
214
     * @param array         $expectedData
215
     * @param AdminResource $entity
216
     */
217
    protected function assertEntity(array $expectedData, $entity)
218
    {
219
        $this->assertInstanceOf(AdminResource::class, $entity);
220
        $this->assertEquals($expectedData['id'], $entity->getId());
221
        $this->assertSame($expectedData['identifier'], $entity->getIdentifier());
222
    }
223
}
224