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 — main ( c80371...476dc3 )
by Pedro
41:10 queued 26:15
created

CrudPanelColumnsTest::testRemoveColumnsByName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 0
dl 0
loc 9
rs 10
c 0
b 0
f 0
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\BaseDBCrudPanel
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 testMakeFirstColumnReturnFalseWhenNoColumnsExist()
601
    {
602
        $this->assertEmpty($this->crudPanel->columns());
603
        $column = $this->crudPanel->makeFirstColumn();
604
        $this->assertFalse($column);
605
    }
606
607
    public function testItCanAddADefaultTypeToTheColumn()
608
    {
609
        $column = $this->crudPanel->addDefaultTypeToColumn(['name' => 'name']);
610
611
        $this->assertEquals('text', $column['type']);
612
    }
613
614
    public function testItReturnFalseWhenTryingToAddTypeToAColumnWithoutName()
615
    {
616
        $column = $this->crudPanel->addDefaultTypeToColumn(['attribute' => 'name']);
617
618
        $this->assertFalse($column);
619
    }
620
621
    public function testItCanChangeTheColumnKey()
622
    {
623
        $this->crudPanel->column('test');
624
625
        $this->assertEquals('test', $this->crudPanel->columns()['test']['key']);
626
627
        $this->crudPanel->column('test')->key('new_key');
628
629
        $this->assertEquals('new_key', $this->crudPanel->columns()['new_key']['key']);
630
    }
631
632
    public function testItCanAddAFluentColumn()
633
    {
634
        $this->crudPanel->setModel(User::class);
635
636
        $this->crudPanel->column('my_column')->label('my_column');
637
638
        $this->assertCount(1, $this->crudPanel->columns());
639
640
        $this->assertEquals([
641
            'name' => 'my_column',
642
            'type' => 'text',
643
            'label' => 'my_column',
644
            'key' => 'my_column',
645
            'priority' => 0,
646
            'tableColumn' => false,
647
            'orderable' => false,
648
            'searchLogic' => false,
649
        ], $this->crudPanel->columns()['my_column']);
650
    }
651
652
    public function testItCanMakeAColumnFirstFluently()
653
    {
654
        $this->crudPanel->column('test1');
655
        $this->crudPanel->column('test2')->makeFirst();
656
        $crudColumns = $this->crudPanel->columns();
657
        $firstColumn = reset($crudColumns);
658
        $this->assertEquals($firstColumn['name'], 'test2');
659
    }
660
661
    public function testItCanMakeAColumnLastFluently()
662
    {
663
        $this->crudPanel->column('test1');
664
        $this->crudPanel->column('test2');
665
        $this->crudPanel->column('test1')->makeLast();
666
        $crudColumns = $this->crudPanel->columns();
667
        $firstColumn = reset($crudColumns);
668
        $this->assertEquals($firstColumn['name'], 'test2');
669
    }
670
671
    public function testItCanPlaceColumnsFluently()
672
    {
673
        $this->crudPanel->column('test1');
674
        $this->crudPanel->column('test2');
675
        $this->crudPanel->column('test3')->after('test1');
676
677
        $crudColumnsNames = array_column($this->crudPanel->columns(), 'name');
678
        $this->assertEquals($crudColumnsNames, ['test1', 'test3', 'test2']);
679
680
        $this->crudPanel->column('test4')->before('test1');
681
        $crudColumnsNames = array_column($this->crudPanel->columns(), 'name');
682
        $this->assertEquals($crudColumnsNames, ['test4', 'test1', 'test3', 'test2']);
683
    }
684
685
    public function testItCanRemoveColumnAttributesFluently()
686
    {
687
        $this->crudPanel->column('test1')->type('test');
688
        $this->assertEquals($this->crudPanel->columns()['test1']['type'], 'test');
689
        $this->crudPanel->column('test1')->forget('type');
690
        $this->assertNull($this->crudPanel->columns()['test1']['type'] ?? null);
691
    }
692
693
    public function testItCanRemoveColumnFluently()
694
    {
695
        $this->crudPanel->column('test1')->type('test');
696
        $this->assertCount(1, $this->crudPanel->columns());
697
        $this->crudPanel->column('test1')->remove();
698
        $this->assertCount(0, $this->crudPanel->columns());
699
    }
700
701
    public function testItCanAddAColumnToCrudFromClass()
702
    {
703
        CrudColumn::name('test');
704
        $this->assertCount(1, $this->crudPanel->columns());
705
    }
706
707
    public function testItCanAddAFluentColumnUsingArray()
708
    {
709
        $this->crudPanel->column($this->oneColumnArray);
710
        $this->assertCount(1, $this->crudPanel->columns());
711
    }
712
713
    public function testItCanAddAFluentColumnUsingArrayWithoutName()
714
    {
715
        $this->crudPanel->column(['type' => 'text']);
716
        $this->assertCount(1, $this->crudPanel->columns());
717
    }
718
719
    public function testColumnLinkToThrowsExceptionWhenNotAllRequiredParametersAreFilled()
720
    {
721
        $this->expectException(\Exception::class);
722
        $this->expectExceptionMessage('Route [article.show.detail] expects parameters [id, detail]. Insufficient parameters provided in column: [articles].');
723
        $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

723
        $this->crudPanel->column('articles')->/** @scrutinizer ignore-call */ entity('articles')->linkTo('article.show.detail', ['test' => 'testing']);
Loading history...
724
    }
725
726
    public function testItThrowsExceptionIfRouteNotFound()
727
    {
728
        $this->expectException(\Exception::class);
729
        $this->expectExceptionMessage('Route [users.route.doesnt.exist] not found while building the link for column [id].');
730
731
        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

731
        CrudColumn::name('id')->linkTo('users.route.doesnt.exist')->/** @scrutinizer ignore-call */ toArray();
Loading history...
732
    }
733
734
    public function testColumnLinkToWithRouteNameOnly()
735
    {
736
        $this->crudPanel->column('articles')->entity('articles')->linkTo('articles.show');
737
        $columnArray = $this->crudPanel->columns()['articles'];
738
        $reflection = new \ReflectionFunction($columnArray['wrapper']['href']);
739
        $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

739
        /** @scrutinizer ignore-call */ 
740
        $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...
740
        $this->crudPanel->entry = Article::first();
741
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
742
        $this->assertEquals('articles.show', $arguments['route']);
743
        $this->assertCount(1, $arguments['parameters']);
744
        $this->assertEquals('http://localhost/admin/articles/1/show', $url);
745
    }
746
747
    public function testColumnLinkToWithRouteNameAndAdditionalParameters()
748
    {
749
        $this->crudPanel->column('articles')->entity('articles')->linkTo('articles.show', ['test' => 'testing', 'test2' => 'testing2']);
750
        $columnArray = $this->crudPanel->columns()['articles'];
751
        $reflection = new \ReflectionFunction($columnArray['wrapper']['href']);
752
        $arguments = $reflection->getClosureUsedVariables();
753
        $this->assertEquals('articles.show', $arguments['route']);
754
        $this->assertCount(3, $arguments['parameters']);
755
        $this->crudPanel->entry = Article::first();
756
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
757
        $this->assertEquals('http://localhost/admin/articles/1/show?test=testing&test2=testing2', $url);
758
    }
759
760
    public function testColumnLinkToWithCustomParameters()
761
    {
762
        $this->crudPanel->column('articles')->entity('articles')->linkTo('article.show.detail', ['detail' => 'testing', 'otherParam' => 'test']);
763
        $columnArray = $this->crudPanel->columns()['articles'];
764
        $this->crudPanel->entry = Article::first();
765
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
766
        $this->assertEquals('http://localhost/admin/articles/1/show/testing?otherParam=test', $url);
767
    }
768
769
    public function testColumnLinkToWithCustomClosureParameters()
770
    {
771
        $this->crudPanel->column('articles')
772
                        ->entity('articles')
773
                        ->linkTo('article.show.detail', ['detail' => fn ($entry, $related_key) => $related_key, 'otherParam' => fn ($entry) => $entry->content]);
774
        $columnArray = $this->crudPanel->columns()['articles'];
775
        $this->crudPanel->entry = Article::first();
776
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
777
        $this->assertEquals('http://localhost/admin/articles/1/show/1?otherParam=Some%20Content', $url);
778
    }
779
780
    public function testColumnLinkToDontAutoInferParametersIfAllProvided()
781
    {
782
        $this->crudPanel->column('articles')
783
                        ->entity('articles')
784
                        ->linkTo('article.show.detail', ['id' => 123, 'detail' => fn ($entry, $related_key) => $related_key, 'otherParam' => fn ($entry) => $entry->content]);
785
        $columnArray = $this->crudPanel->columns()['articles'];
786
        $this->crudPanel->entry = Article::first();
787
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
788
        $this->assertEquals('http://localhost/admin/articles/123/show/1?otherParam=Some%20Content', $url);
789
    }
790
791
    public function testColumnLinkToAutoInferAnySingleParameter()
792
    {
793
        $this->crudPanel->column('articles')
794
                        ->entity('articles')
795
                        ->linkTo('article.show.detail', ['id' => 123, 'otherParam' => fn ($entry) => $entry->content]);
796
        $columnArray = $this->crudPanel->columns()['articles'];
797
        $this->crudPanel->entry = Article::first();
798
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
799
        $this->assertEquals('http://localhost/admin/articles/123/show/1?otherParam=Some%20Content', $url);
800
    }
801
802
    public function testColumnLinkToWithClosure()
803
    {
804
        $this->crudPanel->column('articles')
805
                        ->entity('articles')
806
                        ->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

806
                        ->linkTo(/** @scrutinizer ignore-type */ fn ($entry) => route('articles.show', $entry->content));
Loading history...
807
        $columnArray = $this->crudPanel->columns()['articles'];
808
        $this->crudPanel->entry = Article::first();
809
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
810
        $this->assertEquals('http://localhost/admin/articles/Some%20Content/show', $url);
811
    }
812
813
    public function testColumnArrayDefinitionLinkToRouteAsClosure()
814
    {
815
        $this->crudPanel->setModel(User::class);
816
        $this->crudPanel->column([
817
            'name' => 'articles',
818
            'entity' => 'articles',
819
            'linkTo' => fn ($entry) => route('articles.show', ['id' => $entry->id, 'test' => 'testing']),
820
        ]);
821
        $columnArray = $this->crudPanel->columns()['articles'];
822
        $this->crudPanel->entry = Article::first();
823
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
824
        $this->assertEquals('http://localhost/admin/articles/1/show?test=testing', $url);
825
    }
826
827
    public function testColumnArrayDefinitionLinkToRouteNameOnly()
828
    {
829
        $this->crudPanel->setModel(User::class);
830
        $this->crudPanel->column([
831
            'name' => 'articles',
832
            'entity' => 'articles',
833
            'linkTo' => 'articles.show',
834
        ]);
835
        $columnArray = $this->crudPanel->columns()['articles'];
836
        $this->crudPanel->entry = Article::first();
837
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
838
        $this->assertEquals('http://localhost/admin/articles/1/show', $url);
839
    }
840
841
    public function testColumnArrayDefinitionLinkToRouteNameAndAdditionalParameters()
842
    {
843
        $this->crudPanel->setModel(User::class);
844
        $this->crudPanel->column([
845
            'name' => 'articles',
846
            'entity' => 'articles',
847
            'linkTo' => [
848
                'route' => 'articles.show',
849
                'parameters' => [
850
                    'test' => 'testing',
851
                    'test2' => fn ($entry) => $entry->content,
852
                ],
853
            ],
854
        ]);
855
        $columnArray = $this->crudPanel->columns()['articles'];
856
        $reflection = new \ReflectionFunction($columnArray['wrapper']['href']);
857
        $arguments = $reflection->getClosureUsedVariables();
858
        $this->assertEquals('articles.show', $arguments['route']);
859
        $this->assertCount(3, $arguments['parameters']);
860
        $this->crudPanel->entry = Article::first();
861
        $url = $columnArray['wrapper']['href']($this->crudPanel, $columnArray, $this->crudPanel->entry, 1);
862
        $this->assertEquals('http://localhost/admin/articles/1/show?test=testing&test2=Some%20Content', $url);
863
    }
864
}
865