Passed
Pull Request — master (#5)
by aguevaraIL
03:57
created

CreditCest   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 279
Duplicated Lines 0 %

Importance

Changes 8
Bugs 0 Features 0
Metric Value
eloc 121
c 8
b 0
f 0
dl 0
loc 279
rs 10
wmc 15

14 Methods

Rating   Name   Duplication   Size   Complexity  
A authToken() 0 3 1
A update() 0 4 1
A updateDataProvider() 0 27 1
A createDataProvider() 0 35 1
A recordJsonType() 0 4 1
A deleteDataProvider() 0 16 1
A getRoutePattern() 0 3 1
A view() 0 4 1
A fixtures() 0 8 1
A delete() 0 4 1
A create() 0 10 2
A viewDataProvider() 0 13 1
A index() 0 4 1
A indexDataProvider() 0 42 1
1
<?php
2
3
use app\fixtures\{
4
    CreditFixture,
5
    CreditWorkLogFixture,
6
    OauthAccessTokensFixture
7
};
8
use Codeception\{Example, Util\HttpCode};
9
use roaresearch\yii2\roa\test\AbstractResourceCest;
10
11
/**
12
 * Cest to stage resource.
13
 *
14
 * @author Carlos (neverabe) Llamosas <[email protected]>
15
 */
16
class CreditCest extends AbstractResourceCest
17
{
18
    protected function authToken(ApiTester $I)
19
    {
20
        $I->amBearerAuthenticated(OauthAccessTokensFixture::SIMPLE_TOKEN);
21
    }
22
23
    /**
24
     * @depends TransitionPermissionCest:fixtures
25
     */
26
    public function fixtures(ApiTester $I)
27
    {
28
        $I->haveFixtures([
29
            'credit' => [
30
                'class' => CreditFixture::class,
31
                'depends' => []
32
            ],
33
            'credit_worklog' => CreditWorkLogFixture::class,
34
        ]);
35
    }
36
37
    /**
38
     * @param  ApiTester $I
39
     * @param  Example $example
40
     * @dataprovider indexDataProvider
41
     * @depends fixtures
42
     * @before authToken
43
     */
44
    public function index(ApiTester $I, Example $example)
45
    {
46
        $I->wantTo('Retrieve list of Credit records.');
47
        $this->internalIndex($I, $example);
48
    }
49
50
    /**
51
     * @return array<string,array> for test `index()`.
52
     */
53
    protected function indexDataProvider()
54
    {
55
        return [
56
            'list' => [
57
                'url' => '/v1/credit',
58
                'httpCode' => HttpCode::OK,
59
                'headers' => [
60
                    'X-Pagination-Total-Count' => 7,
61
                ],
62
            ],
63
            'search integer' => [
64
                'url' => '/v1/credit?activeStage[]=1',
65
                'httpCode' => HttpCode::OK,
66
                'headers' => [
67
                    'X-Pagination-Total-Count' => 5,
68
                ],
69
            ],
70
            'search array' => [
71
                'url' => '/v1/credit?activeStage[]=1&activeStage[]=4',
72
                'httpCode' => HttpCode::OK,
73
                'headers' => [
74
                    'X-Pagination-Total-Count' => 6,
75
                ],
76
            ],
77
            'not found credit' => [
78
                'url' => '/v1/credit/15',
79
                'httpCode' => HttpCode::NOT_FOUND,
80
            ],
81
            'filter by author' => [
82
                'urlParams' => [
83
                    'created_by' => 1,
84
                ],
85
                'httpCode' => HttpCode::OK,
86
                'headers' => [
87
                    'X-Pagination-Total-Count' => 7,
88
                ],
89
            ],
90
            'rule created_by' => [
91
                'urlParams' => [
92
                    'created_by' => 'wo',
93
                ],
94
                'httpCode' => HttpCode::UNPROCESSABLE_ENTITY,
95
            ],
96
        ];
97
    }
98
99
    /**
100
     * @param  ApiTester $I
101
     * @param  Example $example
102
     * @dataprovider viewDataProvider
103
     * @depends fixtures
104
     * @before authToken
105
     */
106
    public function view(ApiTester $I, Example $example)
107
    {
108
        $I->wantTo('Retrieve Credit single record.');
109
        $this->internalView($I, $example);
110
    }
111
112
    /**
113
     * @return array<string,array<string,string>> data for test `view()`.
114
     */
115
    protected function viewDataProvider()
116
    {
117
        return [
118
            'single record' => [
119
                'urlParams' => [
120
                    'id' => 4,
121
                    'expand' => 'workLogs, activeWorkLog',
122
                ],
123
                'httpCode' => HttpCode::OK,
124
            ],
125
            'not found credit record' => [
126
                'url' => '/v1/credit/8',
127
                'httpCode' => HttpCode::NOT_FOUND,
128
            ],
129
        ];
130
    }
131
132
    /**
133
     * @param  ApiTester $I
134
     * @param  Example $example
135
     * @dataprovider createDataProvider
136
     * @depends CreditWorkLogCest:fixtures
137
     * @before authToken
138
     */
139
    public function create(ApiTester $I, Example $example)
140
    {
141
        $I->wantTo('Create a Credit record.');
142
        $this->internalCreate($I, $example);
143
        if (HttpCode::CREATED == $example['httpCode']) {
144
            $worklogRoute = $I->grabDataFromResponseByJsonPath(
145
                '$._links.worklog.href'
146
            )[0];
147
            $I->sendGET($worklogRoute);
148
            $I->seeHTTPHeader('X-PAGINATION-TOTAL-COUNT', 1);
149
        }
150
    }
151
152
    /**
153
     * @return array<string,array> data for test `create()`.
154
     */
155
    protected function createDataProvider()
156
    {
157
        return [
158
            'create credit 1' => [
159
                'data' => [
160
                    'workflow_id' => 2,
161
                    'stage_id' => 4,
162
                ],
163
                'httpCode' => HttpCode::CREATED,
164
            ],
165
            'stage doesn´t belong workflow' => [
166
                'data' => [
167
                    'workflow_id' => 1,
168
                    'stage_id' => 4,
169
                ],
170
                'httpCode' => HttpCode::UNPROCESSABLE_ENTITY,
171
                'validationErrors' => [
172
                    'stage_id' => 'Stage "4" does not belong to the workflow.'
173
                ],
174
            ],
175
            'dont exists' => [
176
                'data' => [
177
                    'workflow_id' => 123,
178
                    'stage_id' => 2,
179
                ],
180
                'httpCode' => HttpCode::UNPROCESSABLE_ENTITY,
181
                'validationErrors' => [
182
                    'workflow_id' => 'Workflow ID is invalid.',
183
                    'stage_id' => 'Not an initial stage for the workflow.'
184
                ],
185
            ],
186
            'not blank' => [
187
                'httpCode' => HttpCode::UNPROCESSABLE_ENTITY,
188
                'validationErrors' => [
189
                    'workflow_id' => 'Workflow ID cannot be blank.'
190
                ],
191
            ],
192
        ];
193
    }
194
195
    /**
196
     * @param  ApiTester $I
197
     * @param  Example $example
198
     * @dataprovider updateDataProvider
199
     * @depends fixtures
200
     * @before authToken
201
     */
202
    public function update(ApiTester $I, Example $example)
203
    {
204
        $I->wantTo('Update a Credit record.');
205
        $this->internalUpdate($I, $example);
206
    }
207
208
    /**
209
     * @return array<string,array> data for test `update()`.
210
     */
211
    protected function updateDataProvider()
212
    {
213
        return [
214
            'update credit 1' => [
215
                'url' => '/v1/credit/1',
216
                'data' => ['workflow_id' => 2],
217
                'httpCode' => HttpCode::OK,
218
            ],
219
            'update credit 10' => [
220
                'url' => '/v1/credit/10',
221
                'data' => ['workflow_id' => 2],
222
                'httpCode' => HttpCode::NOT_FOUND,
223
            ],
224
            'not exists' => [
225
                'url' => '/v1/credit/1',
226
                'data' => ['workflow_id' => 123],
227
                'httpCode' => HttpCode::UNPROCESSABLE_ENTITY,
228
                'validationErrors' => [
229
                    'workflow_id' => 'Workflow ID is invalid.',
230
                ],
231
            ],
232
            'not blank' => [
233
                'url' => '/v1/credit/1',
234
                'data' => ['workflow_id' => ''],
235
                'httpCode' => HttpCode::UNPROCESSABLE_ENTITY,
236
                'validationErrors' => [
237
                    'workflow_id' => 'Workflow ID cannot be blank.'
238
                ],
239
            ],
240
        ];
241
    }
242
243
    /**
244
     * @param  ApiTester $I
245
     * @param  Example $example
246
     * @dataprovider deleteDataProvider
247
     * @depends CreditWorkLogCest:create
248
     * @before authToken
249
     */
250
    public function delete(ApiTester $I, Example $example)
251
    {
252
        $I->wantTo('Delete a Credit record.');
253
        $this->internalDelete($I, $example);
254
    }
255
256
    /**
257
     * @return array[] data for test `delete()`.
258
     */
259
    protected function deleteDataProvider()
260
    {
261
        return [
262
            'credit not found' => [
263
                'url' => '/v1/credit/10',
264
                'httpCode' => HttpCode::NOT_FOUND,
265
            ],
266
            'delete credit 5' => [
267
                'url' => '/v1/credit/5',
268
                'httpCode' => HttpCode::NO_CONTENT,
269
            ],
270
            'not found' => [
271
                'url' => '/v1/credit/5',
272
                'httpCode' => HttpCode::NOT_FOUND,
273
                'validationErrors' => [
274
                    'name' => 'The record "5" does not exists.'
275
                ],
276
            ],
277
        ];
278
    }
279
    /**
280
     * @inheritdoc
281
     */
282
    protected function recordJsonType(): array
283
    {
284
        return [
285
            'id' => 'integer:>0',
286
        ];
287
    }
288
289
    /**
290
     * @inheritdoc
291
     */
292
    protected function getRoutePattern(): string
293
    {
294
        return 'v1/credit';
295
    }
296
}
297