Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Passed
Push — add-misc-tests ( dbdc6c )
by Pedro
11:23
created

testItDoesNotAttemptToGetEntityWhenColumnNameIsArray()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 4
rs 10
1
<?php
2
3
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
4
5
use Backpack\CRUD\app\Library\CrudPanel\CrudColumn;
6
use Backpack\CRUD\Tests\config\Models\Article;
7
use Backpack\CRUD\Tests\config\Models\User;
8
9
/**
10
 * @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Columns
11
 * @covers Backpack\CRUD\app\Library\CrudPanel\Traits\ColumnsProtectedMethods
12
 * @covers Backpack\CRUD\app\Library\CrudPanel\CrudColumn
13
 * @covers Backpack\CRUD\app\Library\CrudPanel\CrudPanel
14
 */
15
class CrudPanelColumnsTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel
16
{
17
    private $oneColumnArray = [
18
        'name' => 'column1',
19
        'label' => 'Column1',
20
    ];
21
22
    private $expectedOneColumnArray = [
23
        'column1' => [
24
            'label' => 'Column1',
25
            'name' => 'column1',
26
            'key' => 'column1',
27
            'type' => 'text',
28
            'tableColumn' => false,
29
            'orderable' => false,
30
            'searchLogic' => false,
31
            'priority' => 0,
32
        ],
33
    ];
34
35
    private $otherOneColumnArray = [
36
        'name' => 'column4',
37
        'label' => 'Column4',
38
    ];
39
40
    private $twoColumnsArray = [
41
        [
42
            'name' => 'column1',
43
            'label' => 'Column1',
44
        ],
45
        [
46
            'name' => 'column2',
47
            'label' => 'Column2',
48
        ],
49
    ];
50
51
    private $expectedTwoColumnsArray = [
52
        'column1' => [
53
            'name' => 'column1',
54
            'key' => 'column1',
55
            'label' => 'Column1',
56
            'type' => 'text',
57
            'tableColumn' => false,
58
            'orderable' => false,
59
            'searchLogic' => false,
60
            'priority' => 0,
61
62
        ],
63
        'column2' => [
64
            'name' => 'column2',
65
            'key' => 'column2',
66
            'label' => 'Column2',
67
            'type' => 'text',
68
            'tableColumn' => false,
69
            'orderable' => false,
70
            'searchLogic' => false,
71
            'priority' => 1,
72
        ],
73
    ];
74
75
    private $threeColumnsArray = [
76
        [
77
            'name' => 'column1',
78
            'label' => 'Column1',
79
        ],
80
        [
81
            'name' => 'column2',
82
            'label' => 'Column2',
83
        ],
84
        [
85
            'name' => 'column3',
86
            'label' => 'Column3',
87
        ],
88
    ];
89
90
    private $expectedThreeColumnsArray = [
91
        'column1' => [
92
            'name' => 'column1',
93
            'key' => 'column1',
94
            'label' => 'Column1',
95
            'type' => 'text',
96
            'tableColumn' => false,
97
            'orderable' => false,
98
            'searchLogic' => false,
99
            'priority' => 0,
100
        ],
101
        'column2' => [
102
            'name' => 'column2',
103
            'key' => 'column2',
104
            'label' => 'Column2',
105
            'type' => 'text',
106
            'tableColumn' => false,
107
            'orderable' => false,
108
            'searchLogic' => false,
109
            'priority' => 1,
110
        ],
111
        'column3' => [
112
            'name' => 'column3',
113
            'key' => 'column3',
114
            'label' => 'Column3',
115
            'type' => 'text',
116
            'tableColumn' => false,
117
            'orderable' => false,
118
            'searchLogic' => false,
119
            'priority' => 2,
120
        ],
121
    ];
122
123
    private $expectedRelationColumnsArrayWithoutPro = [
124
        'accountDetails' => [
125
            'name' => 'accountDetails',
126
            'label' => 'AccountDetails',
127
            'type' => 'text',
128
            'key' => 'accountDetails',
129
            'priority' => 0,
130
            'tableColumn' => false,
131
            'orderable' => false,
132
            'searchLogic' => false,
133
            'entity' => 'accountDetails',
134
            'model' => 'Backpack\CRUD\Tests\Config\Models\AccountDetails',
135
            'relation_type' => 'HasOne',
136
            'attribute' => 'nickname',
137
        ],
138
        'accountDetails__nickname' => [
139
            'name' => 'accountDetails.nickname',
140
            'label' => 'AccountDetails.nickname',
141
            'type' => 'text',
142
            'key' => 'accountDetails__nickname',
143
            'priority' => 1,
144
            'attribute' => 'nickname',
145
            'tableColumn' => false,
146
            'orderable' => false,
147
            'searchLogic' => false,
148
            'relation_type' => 'HasOne',
149
            'entity' => 'accountDetails.nickname',
150
            'model' => 'Backpack\CRUD\Tests\Config\Models\AccountDetails',
151
        ],
152
        'accountDetails__user' => [
153
            'name' => 'accountDetails.user',
154
            'label' => 'AccountDetails.user',
155
            'type' => 'select',
156
            'key' => 'accountDetails__user',
157
            'priority' => 2,
158
            'tableColumn' => false,
159
            'orderable' => false,
160
            'searchLogic' => false,
161
            'relation_type' => 'BelongsTo',
162
            'entity' => 'accountDetails.user',
163
            'model' => 'Backpack\CRUD\Tests\Config\Models\User',
164
            'attribute' => 'name',
165
        ],
166
    ];
167
168
    private $expectedRelationColumnsArrayWithPro = [
169
        'accountDetails' => [
170
            'name' => 'accountDetails',
171
            'label' => 'AccountDetails',
172
            'type' => 'relationship',
173
            'key' => 'accountDetails',
174
            'priority' => 0,
175
            'tableColumn' => false,
176
            'orderable' => false,
177
            'searchLogic' => false,
178
            'entity' => 'accountDetails',
179
            'model' => 'Backpack\CRUD\Tests\Config\Models\AccountDetails',
180
            'relation_type' => 'HasOne',
181
            'attribute' => 'nickname',
182
        ],
183
        'accountDetails__nickname' => [
184
            'name' => 'accountDetails.nickname',
185
            'label' => 'AccountDetails.nickname',
186
            'type' => 'relationship',
187
            'key' => 'accountDetails__nickname',
188
            'priority' => 1,
189
            'attribute' => 'nickname',
190
            'tableColumn' => false,
191
            'orderable' => false,
192
            'searchLogic' => false,
193
            'relation_type' => 'HasOne',
194
            'entity' => 'accountDetails.nickname',
195
            'model' => 'Backpack\CRUD\Tests\Config\Models\AccountDetails',
196
        ],
197
        'accountDetails__user' => [
198
            'name' => 'accountDetails.user',
199
            'label' => 'AccountDetails.user',
200
            'type' => 'relationship',
201
            'key' => 'accountDetails__user',
202
            'priority' => 2,
203
            'tableColumn' => false,
204
            'orderable' => false,
205
            'searchLogic' => false,
206
            'relation_type' => 'BelongsTo',
207
            'entity' => 'accountDetails.user',
208
            'model' => 'Backpack\CRUD\Tests\Config\Models\User',
209
            'attribute' => 'name',
210
        ],
211
    ];
212
213
    private $relationColumnArray = [
214
        'name' => 'nickname',
215
        'type' => 'select',
216
        'entity' => 'accountDetails',
217
        'attribute' => 'nickname',
218
    ];
219
220
    private $expectedRelationColumnArray = [
221
        'nickname' => [
222
            'name' => 'nickname',
223
            'type' => 'select',
224
            'entity' => 'accountDetails',
225
            'attribute' => 'nickname',
226
            'label' => 'Nickname',
227
            'model' => 'Backpack\CRUD\Tests\Config\Models\AccountDetails',
228
            'key' => 'nickname',
229
            'tableColumn' => false,
230
            'orderable' => false,
231
            'searchLogic' => false,
232
            'priority' => 0,
233
            'relation_type' => 'HasOne',
234
        ],
235
    ];
236
237
    private $nestedRelationColumnArray = [
238
        'name' => 'accountDetails.article',
239
    ];
240
241
    private $secondNestedRelationColumnArray = [
242
        'name' => 'accountDetails.article',
243
        'attribute' => 'content',
244
        'key' => 'ac_article_content',
245
    ];
246
247
    private $expectedNestedRelationColumnArrayWithPro = [
248
        'accountDetails__article' => [
249
            'name' => 'accountDetails.article',
250
            'type' => 'relationship',
251
            'entity' => 'accountDetails.article',
252
            'label' => 'AccountDetails.article',
253
            'model' => 'Backpack\CRUD\Tests\Config\Models\Article',
254
            'key' => 'accountDetails__article',
255
            'tableColumn' => false,
256
            'orderable' => false,
257
            'searchLogic' => false,
258
            'priority' => 0,
259
            'relation_type' => 'BelongsTo',
260
            'attribute' => 'content',
261
        ],
262
        'ac_article_content' => [
263
            'name' => 'accountDetails.article',
264
            'type' => 'relationship',
265
            'entity' => 'accountDetails.article',
266
            'label' => 'AccountDetails.article',
267
            'model' => 'Backpack\CRUD\Tests\Config\Models\Article',
268
            'key' => 'ac_article_content',
269
            'tableColumn' => false,
270
            'orderable' => false,
271
            'searchLogic' => false,
272
            'priority' => 1,
273
            'relation_type' => 'BelongsTo',
274
            'attribute' => 'content',
275
        ],
276
    ];
277
278
    private $expectedNestedRelationColumnArrayWithoutPro = [
279
        'accountDetails__article' => [
280
            'name' => 'accountDetails.article',
281
            'type' => 'select',
282
            'entity' => 'accountDetails.article',
283
            'label' => 'AccountDetails.article',
284
            'model' => 'Backpack\CRUD\Tests\Config\Models\Article',
285
            'key' => 'accountDetails__article',
286
            'tableColumn' => false,
287
            'orderable' => false,
288
            'searchLogic' => false,
289
            'priority' => 0,
290
            'relation_type' => 'BelongsTo',
291
            'attribute' => 'content',
292
        ],
293
        'ac_article_content' => [
294
            'name' => 'accountDetails.article',
295
            'type' => 'select',
296
            'entity' => 'accountDetails.article',
297
            'label' => 'AccountDetails.article',
298
            'model' => 'Backpack\CRUD\Tests\Config\Models\Article',
299
            'key' => 'ac_article_content',
300
            'tableColumn' => false,
301
            'orderable' => false,
302
            'searchLogic' => false,
303
            'priority' => 1,
304
            'relation_type' => 'BelongsTo',
305
            'attribute' => 'content',
306
        ],
307
    ];
308
309
    /**
310
     * Setup the test environment.
311
     *
312
     * @return void
313
     */
314
    protected function setUp(): void
315
    {
316
        parent::setUp();
317
318
        $this->crudPanel->setOperation('list');
319
    }
320
321
    public function testAddColumnByName()
322
    {
323
        $this->crudPanel->addColumn('column1');
324
325
        $this->assertEquals($this->expectedOneColumnArray, $this->crudPanel->columns());
326
    }
327
328
    public function testAddColumnsByName()
329
    {
330
        $this->crudPanel->addColumns(['column1', 'column2']);
331
332
        $this->assertEquals(2, count($this->crudPanel->columns()));
333
        $this->assertEquals($this->expectedTwoColumnsArray, $this->crudPanel->columns());
334
    }
335
336
    public function testAddColumnAsArray()
337
    {
338
        $this->crudPanel->addColumn($this->oneColumnArray);
339
340
        $this->assertEquals($this->expectedOneColumnArray, $this->crudPanel->columns());
341
    }
342
343
    public function testAddColumnsAsArray()
344
    {
345
        $this->crudPanel->addColumns($this->twoColumnsArray);
346
347
        $this->assertEquals(2, count($this->crudPanel->columns()));
348
        $this->assertEquals($this->expectedTwoColumnsArray, $this->crudPanel->columns());
349
    }
350
351
    public function testAddColumnNotArray()
352
    {
353
        $this->expectException(PHP_MAJOR_VERSION == 7 ? \ErrorException::class : \TypeError::class);
354
        // Why? When calling count() on a non-countable entity,
355
        // PHP 7.x will through ErrorException, but PHP 8.x will throw TypeError.
356
357
        $this->crudPanel->addColumns('column1');
0 ignored issues
show
Bug introduced by
'column1' of type string is incompatible with the type array expected by parameter $columns of Backpack\CRUD\app\Librar...CrudPanel::addColumns(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

357
        $this->crudPanel->addColumns(/** @scrutinizer ignore-type */ 'column1');
Loading history...
358
    }
359
360
    public function testAddRelationsByName()
361
    {
362
        $this->crudPanel->setModel(User::class);
363
        $this->crudPanel->addColumn('accountDetails');
364
        $this->crudPanel->addColumn('accountDetails.nickname');
365
        $this->crudPanel->addColumn('accountDetails.user');
366
367
        if (backpack_pro()) {
368
            $this->assertEquals($this->expectedRelationColumnsArrayWithPro, $this->crudPanel->columns());
369
        } else {
370
            $this->assertEquals($this->expectedRelationColumnsArrayWithoutPro, $this->crudPanel->columns());
371
        }
372
    }
373
374
    public function testAddRelationColumn()
375
    {
376
        $this->crudPanel->setModel(User::class);
377
        $this->crudPanel->addColumn($this->relationColumnArray);
378
379
        $this->assertEquals($this->expectedRelationColumnArray, $this->crudPanel->columns());
380
    }
381
382
    public function testAddNestedRelationColumn()
383
    {
384
        $this->crudPanel->setModel(User::class);
385
        $this->crudPanel->addColumn($this->nestedRelationColumnArray);
386
        $this->crudPanel->addColumn($this->secondNestedRelationColumnArray);
387
388
        if (backpack_pro()) {
389
            $this->assertEquals($this->expectedNestedRelationColumnArrayWithPro, $this->crudPanel->columns());
390
        } else {
391
            $this->assertEquals($this->expectedNestedRelationColumnArrayWithoutPro, $this->crudPanel->columns());
392
        }
393
    }
394
395
    public function testMoveColumnBefore()
396
    {
397
        $this->crudPanel->addColumns($this->twoColumnsArray);
398
399
        $this->crudPanel->beforeColumn('column1');
400
401
        $keys = array_keys($this->crudPanel->columns());
402
        $this->assertEquals($this->expectedTwoColumnsArray['column2'], $this->crudPanel->columns()[$keys[0]]);
403
        $this->assertEquals(['column2', 'column1'], $keys);
404
    }
405
406
    public function testMoveColumnBeforeUnknownColumnName()
407
    {
408
        $this->crudPanel->addColumns($this->twoColumnsArray);
409
410
        $this->crudPanel->beforeColumn('column3');
411
412
        $this->assertEquals(array_keys($this->expectedTwoColumnsArray), array_keys($this->crudPanel->columns()));
413
    }
414
415
    public function testMoveColumnAfter()
416
    {
417
        $this->crudPanel->addColumns($this->threeColumnsArray);
418
419
        $this->crudPanel->afterColumn('column1');
420
421
        $keys = array_keys($this->crudPanel->columns());
422
        $this->assertEquals($this->expectedThreeColumnsArray['column3'], $this->crudPanel->columns()[$keys[1]]);
423
        $this->assertEquals(['column1', 'column3', 'column2'], $keys);
424
    }
425
426
    public function testMoveColumnAfterUnknownColumnName()
427
    {
428
        $this->crudPanel->addColumns($this->twoColumnsArray);
429
430
        $this->crudPanel->afterColumn('column3');
431
432
        $this->assertEquals(array_keys($this->expectedTwoColumnsArray), array_keys($this->crudPanel->columns()));
433
    }
434
435
    public function testRemoveColumnByName()
436
    {
437
        $this->crudPanel->addColumns(['column1', 'column2', 'column3']);
438
439
        $this->crudPanel->removeColumn('column1');
440
441
        $this->assertEquals(2, count($this->crudPanel->columns()));
442
        $this->assertEquals(['column2', 'column3'], array_keys($this->crudPanel->columns()));
443
        $this->assertNotContains($this->oneColumnArray, $this->crudPanel->columns());
444
    }
445
446
    public function testItCanRemoveAllColumns()
447
    {
448
        $this->crudPanel->addColumns(['column1', 'column2', 'column3']);
449
450
        $this->crudPanel->removeAllColumns();
451
452
        $this->assertEmpty($this->crudPanel->columns());
453
    }
454
455
    public function testItCanSetColumnDetails()
456
    {
457
        $this->crudPanel->addColumns(['column1', 'column2', 'column3', 'column4', 'column5']);
458
459
        $this->crudPanel->setColumnsDetails(['column1', 'column2'], ['label' => 'New Label']);
460
        $this->crudPanel->setColumnDetails('column3', ['label' => 'Old Label']);
461
        $this->crudPanel->modifyColumn('column4', ['label' => 'Alias Label']);
462
        $this->crudPanel->setColumnLabel('column5', 'Setting Label');
463
464
        $this->assertEquals('New Label', $this->crudPanel->columns()['column1']['label']);
465
        $this->assertEquals('New Label', $this->crudPanel->columns()['column2']['label']);
466
        $this->assertEquals('Old Label', $this->crudPanel->columns()['column3']['label']);
467
        $this->assertEquals('Alias Label', $this->crudPanel->columns()['column4']['label']);
468
        $this->assertEquals('Setting Label', $this->crudPanel->columns()['column5']['label']);
469
    }
470
471
    public function testItCanFindAColumnById()
472
    {
473
        $this->crudPanel->addColumns(['column1', 'column2', 'column3']);
474
475
        $column = $this->crudPanel->findColumnById(1);
476
477
        $this->assertEquals('column2', $column['name']);
478
    }
479
480
    public function testItCanGetAndSetActionsColumnPriority()
481
    {
482
        $this->assertEquals(1, $this->crudPanel->getActionsColumnPriority());
483
        $this->crudPanel->setActionsColumnPriority(2);
484
        $this->assertEquals(2, $this->crudPanel->getActionsColumnPriority());
485
    }
486
487
    public function testItCanGetAndSetColumnsRemovingPreviouslySet()
488
    {
489
        $this->crudPanel->addColumns(['column1', 'column2', 'column3']);
490
491
        $this->crudPanel->setColumns('column4');
492
493
        $this->assertEquals(1, count($this->crudPanel->columns()));
494
        $this->assertEquals(['column4'], array_keys($this->crudPanel->columns()));
495
496
        $this->crudPanel->setColumns(['column5', 'column6']);
497
        $this->assertEquals(2, count($this->crudPanel->columns()));
498
        $this->assertEquals(['column5', 'column6'], array_keys($this->crudPanel->columns()));
499
500
        $this->crudPanel->setColumns(['column7', [
501
            'name' => 'column8',
502
        ]]);
503
        $this->assertEquals(2, count($this->crudPanel->columns()));
504
        $this->assertEquals(['column7', 'column8'], array_keys($this->crudPanel->columns()));
505
    }
506
507
    public function testRemoveUnknownColumnName()
508
    {
509
        $unknownColumnName = 'column4';
510
        $this->crudPanel->addColumns(['column1', 'column2', 'column3']);
511
512
        $this->crudPanel->removeColumn($unknownColumnName);
513
514
        $this->assertEquals(3, count($this->crudPanel->columns()));
515
        $this->assertEquals(['column1', 'column2', 'column3'], array_keys($this->crudPanel->columns()));
516
        $this->assertNotContains($this->otherOneColumnArray, $this->crudPanel->columns());
517
    }
518
519
    public function testRemoveColumnsByName()
520
    {
521
        $this->crudPanel->addColumns(['column1', 'column2', 'column3']);
522
523
        $this->crudPanel->removeColumns($this->twoColumnsArray);
524
525
        $this->assertEquals(1, count($this->crudPanel->columns()));
526
        $this->assertEquals(['column3'], array_keys($this->crudPanel->columns()));
527
        $this->assertNotEquals($this->expectedThreeColumnsArray, $this->crudPanel->columns());
528
    }
529
530
    public function testRemoveUnknownColumnsByName()
531
    {
532
        $unknownColumnNames = ['column4', 'column5'];
533
        $this->crudPanel->addColumns(['column1', 'column2', 'column3']);
534
535
        $this->crudPanel->removeColumns($unknownColumnNames);
536
537
        $this->assertEquals(3, count($this->crudPanel->columns()));
538
        $this->assertEquals(['column1', 'column2', 'column3'], array_keys($this->crudPanel->columns()));
539
        $this->assertNotContains($this->otherOneColumnArray, $this->crudPanel->columns());
540
    }
541
542
    public function testItThrowsAnErrorWhenAttemptingToChangeTheKeyInAColumnWithoutName()
543
    {
544
        $this->expectException(\Exception::class);
545
        $this->crudPanel->addColumn(['type' => 'text'])->key('new_key');
0 ignored issues
show
Bug introduced by
The method key() does not exist on Backpack\CRUD\app\Library\CrudPanel\CrudPanel. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

545
        $this->crudPanel->addColumn(['type' => 'text'])->/** @scrutinizer ignore-call */ key('new_key');
Loading history...
546
    }
547
548
    public function itCanSetTheUploadAttributeOnColumn()
549
    {
550
        $this->crudPanel->addColumn('column1')->upload();
0 ignored issues
show
Bug introduced by
The method upload() does not exist on Backpack\CRUD\app\Library\CrudPanel\CrudPanel. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

550
        $this->crudPanel->addColumn('column1')->/** @scrutinizer ignore-call */ upload();
Loading history...
551
552
        $this->assertEquals(true, $this->crudPanel->columns()['column1']['upload']);
553
    }
554
555
    public function testOrderColumns()
556
    {
557
        $this->crudPanel->addColumns($this->threeColumnsArray);
558
559
        $this->crudPanel->orderColumns(['column2', 'column1', 'column3']);
560
561
        $this->assertEquals(['column2', 'column1', 'column3'], array_keys($this->crudPanel->columns()));
562
    }
563
564
    public function testOrderColumnsIncompleteList()
565
    {
566
        $this->crudPanel->addColumns($this->threeColumnsArray);
567
568
        $this->crudPanel->orderColumns(['column2', 'column3']);
569
570
        $this->assertEquals(['column2', 'column3', 'column1'], array_keys($this->crudPanel->columns()));
571
    }
572
573
    public function testOrderColumnsEmptyList()
574
    {
575
        $this->crudPanel->addColumns($this->threeColumnsArray);
576
577
        $this->crudPanel->orderColumns([]);
578
579
        $this->assertEquals($this->expectedThreeColumnsArray, $this->crudPanel->columns());
580
    }
581
582
    public function testOrderColumnsUnknownList()
583
    {
584
        $this->crudPanel->addColumns($this->threeColumnsArray);
585
586
        $this->crudPanel->orderColumns(['column4', 'column5', 'column6']);
587
588
        $this->assertEquals($this->expectedThreeColumnsArray, $this->crudPanel->columns());
589
    }
590
591
    public function testOrderColumnsMixedList()
592
    {
593
        $this->crudPanel->addColumns($this->threeColumnsArray);
594
595
        $this->crudPanel->orderColumns(['column2', 'column5', 'column6']);
596
597
        $this->assertEquals(['column2', 'column1', 'column3'], array_keys($this->crudPanel->columns()));
598
    }
599
600
    public function testItDoesNotAttemptToGetEntityWhenColumnNameIsArray()
601
    {
602
        $this->crudPanel->addColumn(['name' => ['test1', 'test2'], 'label' => 'Column1', 'type' => 'text', 'key' => 'column1']);
603
        $this->assertArrayNotHasKey('entity', $this->crudPanel->firstColumnWhere('key', 'column1'));
0 ignored issues
show
Bug introduced by
$this->crudPanel->firstC...Where('key', 'column1') of type boolean is incompatible with the type ArrayAccess|array expected by parameter $array of PHPUnit\Framework\Assert::assertArrayNotHasKey(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

603
        $this->assertArrayNotHasKey('entity', /** @scrutinizer ignore-type */ $this->crudPanel->firstColumnWhere('key', 'column1'));
Loading history...
604
    }
605
606
    public function testItCanInferTheEntityFromColumnNameUsingEntity_idConvention()
607
    {
608
        $this->crudPanel->addColumn('article_id');
609
610
        $this->assertEquals('article', $this->crudPanel->firstColumnWhere('name', 'article_id')['entity']);
611
    }
612
613
    public function testItAlwaysHasDatabaseColumnWhenDriverIsNotSql()
614
    {
615
        $this->crudPanel = new \Backpack\CRUD\Tests\config\CrudPanel\NoSqlDriverCrudPanel();
616
        $this->crudPanel->setModel(User::class);
617
618
        $this->assertTrue($this->invokeMethod($this->crudPanel, 'hasDatabaseColumn', ['test', 'test']));
619
    }
620
621
    public function testItCanGetTheColumnTypeFromModelCasts()
622
    {
623
        $this->crudPanel->addColumn('arrayCast');
624
        $this->crudPanel->addColumn('jsonCast');
625
        $this->crudPanel->addColumn('dateCast');
626
        $this->crudPanel->addColumn('booleanCast');
627
        $this->crudPanel->addColumn('datetimeCast');
628
        $this->crudPanel->addColumn('numberCast');
629
630
        $this->assertEquals('array', $this->crudPanel->firstColumnWhere('name', 'arrayCast')['type']);
631
        $this->assertEquals('json', $this->crudPanel->firstColumnWhere('name', 'jsonCast')['type']);
632
        $this->assertEquals('date', $this->crudPanel->firstColumnWhere('name', 'dateCast')['type']);
633
        $this->assertEquals('check', $this->crudPanel->firstColumnWhere('name', 'booleanCast')['type']);
634
        $this->assertEquals('datetime', $this->crudPanel->firstColumnWhere('name', 'datetimeCast')['type']);
635
        $this->assertEquals('number', $this->crudPanel->firstColumnWhere('name', 'numberCast')['type']);
636
    }
637
638
    public function testItCanGetTheColumnTypeFromModelDates()
639
    {
640
        $this->crudPanel->addColumn('created_at');
641
642
        $this->assertEquals('datetime', $this->crudPanel->firstColumnWhere('name', 'created_at')['type']);
643
    }
644
645
    public function testMakeFirstColumnReturnFalseWhenNoColumnsExist()
646
    {
647
        $this->assertEmpty($this->crudPanel->columns());
648
        $column = $this->crudPanel->makeFirstColumn();
649
        $this->assertFalse($column);
650
    }
651
652
    public function testItSetsTextColumnTypeForTranslatableColumns()
653
    {
654
        $this->crudPanel->setModel(\Backpack\CRUD\Tests\config\Models\TestModelWithTranslations::class);
655
        $this->crudPanel->addColumn('translatableColumn');
656
657
        $this->assertEquals('text', $this->crudPanel->firstColumnWhere('name', 'translatableColumn')['type']);
658
    }
659
660
    public function testItCanAddADefaultTypeToTheColumn()
661
    {
662
        $column = $this->crudPanel->addDefaultTypeToColumn(['name' => 'name']);
663
664
        $this->assertEquals('text', $column['type']);
665
    }
666
667
    public function testItReturnFalseWhenTryingToAddTypeToAColumnWithoutName()
668
    {
669
        $column = $this->crudPanel->addDefaultTypeToColumn(['attribute' => 'name']);
670
671
        $this->assertFalse($column);
672
    }
673
674
    public function testItCanChangeTheColumnKey()
675
    {
676
        $this->crudPanel->column('test');
677
678
        $this->assertEquals('test', $this->crudPanel->columns()['test']['key']);
679
680
        $this->crudPanel->column('test')->key('new_key');
681
682
        $this->assertEquals('new_key', $this->crudPanel->columns()['new_key']['key']);
683
    }
684
685
    public function testItCanAddAFluentColumn()
686
    {
687
        $this->crudPanel->setModel(User::class);
688
689
        $this->crudPanel->column('my_column')->label('my_column');
690
691
        $this->assertCount(1, $this->crudPanel->columns());
692
693
        $this->assertEquals([
694
            'name' => 'my_column',
695
            'type' => 'text',
696
            'label' => 'my_column',
697
            'key' => 'my_column',
698
            'priority' => 0,
699
            'tableColumn' => false,
700
            'orderable' => false,
701
            'searchLogic' => false,
702
        ], $this->crudPanel->columns()['my_column']);
703
    }
704
705
    public function testItCanMakeAColumnFirstFluently()
706
    {
707
        $this->crudPanel->column('test1');
708
        $this->crudPanel->column('test2')->makeFirst();
709
        $crudColumns = $this->crudPanel->columns();
710
        $firstColumn = reset($crudColumns);
711
        $this->assertEquals($firstColumn['name'], 'test2');
712
    }
713
714
    public function testItCanMakeAColumnLastFluently()
715
    {
716
        $this->crudPanel->column('test1');
717
        $this->crudPanel->column('test2');
718
        $this->crudPanel->column('test1')->makeLast();
719
        $crudColumns = $this->crudPanel->columns();
720
        $firstColumn = reset($crudColumns);
721
        $this->assertEquals($firstColumn['name'], 'test2');
722
    }
723
724
    public function testItCanPlaceColumnsFluently()
725
    {
726
        $this->crudPanel->column('test1');
727
        $this->crudPanel->column('test2');
728
        $this->crudPanel->column('test3')->after('test1');
729
730
        $crudColumnsNames = array_column($this->crudPanel->columns(), 'name');
731
        $this->assertEquals($crudColumnsNames, ['test1', 'test3', 'test2']);
732
733
        $this->crudPanel->column('test4')->before('test1');
734
        $crudColumnsNames = array_column($this->crudPanel->columns(), 'name');
735
        $this->assertEquals($crudColumnsNames, ['test4', 'test1', 'test3', 'test2']);
736
    }
737
738
    public function testItCanRemoveColumnAttributesFluently()
739
    {
740
        $this->crudPanel->column('test1')->type('test');
741
        $this->assertEquals($this->crudPanel->columns()['test1']['type'], 'test');
742
        $this->crudPanel->column('test1')->forget('type');
743
        $this->assertNull($this->crudPanel->columns()['test1']['type'] ?? null);
744
    }
745
746
    public function testItCanRemoveColumnFluently()
747
    {
748
        $this->crudPanel->column('test1')->type('test');
749
        $this->assertCount(1, $this->crudPanel->columns());
750
        $this->crudPanel->column('test1')->remove();
751
        $this->assertCount(0, $this->crudPanel->columns());
752
    }
753
754
    public function testItCanAddAColumnToCrudFromClass()
755
    {
756
        CrudColumn::name('test');
757
        $this->assertCount(1, $this->crudPanel->columns());
758
    }
759
760
    public function testItCanAddAFluentColumnUsingArray()
761
    {
762
        $this->crudPanel->column($this->oneColumnArray);
763
        $this->assertCount(1, $this->crudPanel->columns());
764
    }
765
766
    public function testItCanAddAFluentColumnUsingArrayWithoutName()
767
    {
768
        $this->crudPanel->column(['type' => 'text']);
769
        $this->assertCount(1, $this->crudPanel->columns());
770
    }
771
772
    public function testColumnLinkToThrowsExceptionWhenNotAllRequiredParametersAreFilled()
773
    {
774
        $this->expectException(\Exception::class);
775
        $this->expectExceptionMessage('Route [article.show.detail] expects parameters [id, detail]. Insufficient parameters provided in column: [articles].');
776
        $this->crudPanel->column('articles')->entity('articles')->linkTo('article.show.detail', ['test' => 'testing']);
0 ignored issues
show
Bug introduced by
The method entity() does not exist on Backpack\CRUD\app\Library\CrudPanel\CrudColumn. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

776
        $this->crudPanel->column('articles')->/** @scrutinizer ignore-call */ entity('articles')->linkTo('article.show.detail', ['test' => 'testing']);
Loading history...
777
    }
778
779
    public function testItThrowsExceptionIfRouteNotFound()
780
    {
781
        $this->expectException(\Exception::class);
782
        $this->expectExceptionMessage('Route [users.route.doesnt.exist] not found while building the link for column [id].');
783
784
        CrudColumn::name('id')->linkTo('users.route.doesnt.exist')->toArray();
0 ignored issues
show
Bug introduced by
The method toArray() does not exist on Backpack\CRUD\app\Library\CrudPanel\CrudColumn. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

784
        CrudColumn::name('id')->linkTo('users.route.doesnt.exist')->/** @scrutinizer ignore-call */ toArray();
Loading history...
785
    }
786
787
    public function testColumnLinkToWithRouteNameOnly()
788
    {
789
        $this->crudPanel->column('articles')->entity('articles')->linkTo('articles.show');
790
        $columnArray = $this->crudPanel->columns()['articles'];
791
        $reflection = new \ReflectionFunction($columnArray['wrapper']['href']);
792
        $arguments = $reflection->getClosureUsedVariables();
0 ignored issues
show
Bug introduced by
The method getClosureUsedVariables() does not exist on ReflectionFunction. Did you maybe mean getClosure()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

792
        /** @scrutinizer ignore-call */ 
793
        $arguments = $reflection->getClosureUsedVariables();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
793
        $this->crudPanel->entry = $this->makeAnArticleModel();
794
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
795
        $this->assertEquals('articles.show', $arguments['route']);
796
        $this->assertCount(1, $arguments['parameters']);
797
        $this->assertEquals('http://localhost/admin/articles/1/show', $url);
798
    }
799
800
    public function testColumnLinkToWithRouteNameAndAdditionalParameters()
801
    {
802
        $this->crudPanel->column('articles')->entity('articles')->linkTo('articles.show', ['test' => 'testing', 'test2' => 'testing2']);
803
        $columnArray = $this->crudPanel->columns()['articles'];
804
        $reflection = new \ReflectionFunction($columnArray['wrapper']['href']);
805
        $arguments = $reflection->getClosureUsedVariables();
806
        $this->assertEquals('articles.show', $arguments['route']);
807
        $this->assertCount(3, $arguments['parameters']);
808
        $this->crudPanel->entry = $this->makeAnArticleModel();
809
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
810
        $this->assertEquals('http://localhost/admin/articles/1/show?test=testing&test2=testing2', $url);
811
    }
812
813
    public function testColumnLinkToWithCustomParameters()
814
    {
815
        $this->crudPanel->column('articles')->entity('articles')->linkTo('article.show.detail', ['detail' => 'testing', 'otherParam' => 'test']);
816
        $columnArray = $this->crudPanel->columns()['articles'];
817
        $this->crudPanel->entry = $this->makeAnArticleModel();
818
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
819
        $this->assertEquals('http://localhost/admin/articles/1/show/testing?otherParam=test', $url);
820
    }
821
822
    public function testColumnLinkToWithCustomClosureParameters()
823
    {
824
        $this->crudPanel->column('articles')
825
                        ->entity('articles')
826
                        ->linkTo('article.show.detail', ['detail' => fn ($entry, $related_key) => $related_key, 'otherParam' => fn ($entry) => $entry->content]);
827
        $columnArray = $this->crudPanel->columns()['articles'];
828
        $this->crudPanel->entry = $this->makeAnArticleModel();
829
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
830
        $this->assertEquals('http://localhost/admin/articles/1/show/1?otherParam=Some%20Content', $url);
831
    }
832
833
    public function testColumnLinkToDontAutoInferParametersIfAllProvided()
834
    {
835
        $this->crudPanel->column('articles')
836
                        ->entity('articles')
837
                        ->linkTo('article.show.detail', ['id' => 123, 'detail' => fn ($entry, $related_key) => $related_key, 'otherParam' => fn ($entry) => $entry->content]);
838
        $columnArray = $this->crudPanel->columns()['articles'];
839
        $this->crudPanel->entry = $this->makeAnArticleModel();
840
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
841
        $this->assertEquals('http://localhost/admin/articles/123/show/1?otherParam=Some%20Content', $url);
842
    }
843
844
    public function testColumnLinkToAutoInferAnySingleParameter()
845
    {
846
        $this->crudPanel->column('articles')
847
                        ->entity('articles')
848
                        ->linkTo('article.show.detail', ['id' => 123, 'otherParam' => fn ($entry) => $entry->content]);
849
        $columnArray = $this->crudPanel->columns()['articles'];
850
        $this->crudPanel->entry = $this->makeAnArticleModel();
851
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
852
        $this->assertEquals('http://localhost/admin/articles/123/show/1?otherParam=Some%20Content', $url);
853
    }
854
855
    public function testColumnLinkToWithClosure()
856
    {
857
        $this->crudPanel->column('articles')
858
                        ->entity('articles')
859
                        ->linkTo(fn ($entry) => route('articles.show', $entry->content));
0 ignored issues
show
Bug introduced by
function(...) { /* ... */ } of type callable is incompatible with the type string expected by parameter $routeName of Backpack\CRUD\app\Librar...el\CrudColumn::linkTo(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

859
                        ->linkTo(/** @scrutinizer ignore-type */ fn ($entry) => route('articles.show', $entry->content));
Loading history...
860
        $columnArray = $this->crudPanel->columns()['articles'];
861
        $this->crudPanel->entry = $this->makeAnArticleModel();
862
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
863
        $this->assertEquals('http://localhost/admin/articles/Some%20Content/show', $url);
864
    }
865
866
    public function testColumnArrayDefinitionLinkToRouteAsClosure()
867
    {
868
        $this->crudPanel->setModel(User::class);
869
        $this->crudPanel->column([
870
            'name' => 'articles',
871
            'entity' => 'articles',
872
            'linkTo' => fn ($entry) => route('articles.show', ['id' => $entry->id, 'test' => 'testing']),
873
        ]);
874
        $columnArray = $this->crudPanel->columns()['articles'];
875
        $this->crudPanel->entry = $this->makeAnArticleModel();
876
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
877
        $this->assertEquals('http://localhost/admin/articles/1/show?test=testing', $url);
878
    }
879
880
    public function testColumnArrayDefinitionLinkToRouteNameOnly()
881
    {
882
        $this->crudPanel->setModel(User::class);
883
        $this->crudPanel->column([
884
            'name' => 'articles',
885
            'entity' => 'articles',
886
            'linkTo' => 'articles.show',
887
        ]);
888
        $columnArray = $this->crudPanel->columns()['articles'];
889
        $this->crudPanel->entry = $this->makeAnArticleModel();
890
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
891
        $this->assertEquals('http://localhost/admin/articles/1/show', $url);
892
    }
893
894
    public function testColumnArrayDefinitionLinkToRouteNameAndAdditionalParameters()
895
    {
896
        $this->crudPanel->setModel(User::class);
897
        $this->crudPanel->column([
898
            'name' => 'articles',
899
            'entity' => 'articles',
900
            'linkTo' => [
901
                'route' => 'articles.show',
902
                'parameters' => [
903
                    'test' => 'testing',
904
                    'test2' => fn ($entry) => $entry->content,
905
                ],
906
            ],
907
        ]);
908
        $columnArray = $this->crudPanel->columns()['articles'];
909
        $reflection = new \ReflectionFunction($columnArray['wrapper']['href']);
910
        $arguments = $reflection->getClosureUsedVariables();
911
        $this->assertEquals('articles.show', $arguments['route']);
912
        $this->assertCount(3, $arguments['parameters']);
913
        $this->crudPanel->entry = $this->makeAnArticleModel();
914
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
915
        $this->assertEquals('http://localhost/admin/articles/1/show?test=testing&test2=Some%20Content', $url);
916
    }
917
}
918