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

Test Failed
Pull Request — main (#5478)
by Pedro
27:58
created

testItCanApplyCustomSearchLogicOnColumns()   A

Complexity

Conditions 5
Paths 1

Size

Total Lines 15
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 10
c 1
b 0
f 0
nc 1
nop 3
dl 0
loc 15
rs 9.6111
1
<?php
2
3
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
4
5
use Backpack\CRUD\Tests\config\Models\User;
6
use Backpack\CRUD\Tests\config\Models\UserWithTranslations;
7
use PHPUnit\Framework\Attributes\DataProvider;
8
9
/**
10
 * @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Search
11
 */
12
class CrudPanelSearchTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel
13
{
14
    private string $expectedDefaultColumnValue = '<span>'.PHP_EOL.'                        user'.PHP_EOL.'            </span>';
15
16
    public function setUp(): void
17
    {
18
        parent::setUp();
19
        $this->crudPanel->setModel(User::class);
20
    }
21
22
    #[DataProvider('columnsDefaultSearchLogic')]
23
    public function testItCanApplyCustomSearchLogicOnColumns($searchTerm, $columnType, $resultSql)
24
    {
25
        $this->crudPanel->addColumn([
26
            'name' => 'test',
27
            'type' => $columnType,
28
            'searchLogic' => $columnType,
29
            'tableColumn' => true,
30
            'entity' => $columnType === 'select' ? 'accountDetails' : ($columnType === 'select_multiple' ? 'articles' : false),
31
            'relation_type' => $columnType === 'select' ? 'HasOne' : ($columnType === 'select_multiple' ? 'HasMany' : false),
32
        ]);
33
34
        $this->crudPanel->applySearchTerm($searchTerm);
35
36
        $this->assertEquals($resultSql, $this->crudPanel->query->toRawSql());
37
    }
38
39
    public function testItDoesNotAttemptToSearchTheColumnIfSearchLogicIsDisabled()
40
    {
41
        $this->crudPanel->addColumn([
42
            'name' => 'test',
43
            'type' => 'text',
44
            'searchLogic' => false,
45
            'tableColumn' => true,
46
        ]);
47
48
        $this->crudPanel->applySearchTerm('test');
49
50
        $this->assertEquals('select * from "users"', $this->crudPanel->query->toRawSql());
51
    }
52
53
    public function testItDoesNotAttemptToApplyDefaultLogicIfColumnIsNotATableColumn()
54
    {
55
        $this->crudPanel->addColumn([
56
            'name' => 'test',
57
            'type' => 'text',
58
            'searchLogic' => 'text',
59
            'tableColumn' => false,
60
        ]);
61
62
        $this->crudPanel->applySearchTerm('test');
63
64
        $this->assertEquals('select * from "users"', $this->crudPanel->query->toRawSql());
65
    }
66
67
    public function testItValidateDateAndDatetimeSearchTermsAndDoesNotApplySearchIfValidationFails()
68
    {
69
        $this->crudPanel->addColumn([
70
            'name' => 'test',
71
            'type' => 'date',
72
            'searchLogic' => 'date',
73
            'tableColumn' => true,
74
        ]);
75
76
        $this->crudPanel->addColumn([
77
            'name' => 'test',
78
            'type' => 'datetime',
79
            'searchLogic' => 'datetime',
80
            'tableColumn' => true,
81
        ]);
82
83
        $this->crudPanel->applySearchTerm('invalid-date');
84
85
        $this->assertEquals('select * from "users"', $this->crudPanel->query->toRawSql());
86
    }
87
88
    public function testItCanApplySearchLogicFromClosure()
89
    {
90
        $this->crudPanel->addColumn([
91
            'name' => 'test',
92
            'type' => 'my_custom_type',
93
            'searchLogic' => function ($query, $column, $searchTerm) {
94
                $query->where($column['name'], 'like', "%{$searchTerm}%");
95
            },
96
            'tableColumn' => true,
97
        ]);
98
99
        $this->crudPanel->applySearchTerm('test');
100
101
        $this->assertEquals('select * from "users" where ("test" like \'%test%\')', $this->crudPanel->query->toRawSql());
102
    }
103
104
    public function testItCanGetAndSetPersistentTable()
105
    {
106
        $this->crudPanel->enablePersistentTable(true);
0 ignored issues
show
Unused Code introduced by
The call to Backpack\CRUD\app\Librar...enablePersistentTable() has too many arguments starting with true. ( Ignorable by Annotation )

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

106
        $this->crudPanel->/** @scrutinizer ignore-call */ 
107
                          enablePersistentTable(true);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
107
108
        $this->assertTrue($this->crudPanel->getPersistentTable());
109
110
        $this->crudPanel->disablePersistentTable();
111
112
        $this->assertFalse($this->crudPanel->getPersistentTable());
113
    }
114
115
    public function testItCanGetPersistentTableFromConfig()
116
    {
117
        $this->assertNull($this->crudPanel->getPersistentTable());
118
    }
119
120
    public function testItCanGetAndSetTheResponsiveTable()
121
    {
122
        $this->crudPanel->enableResponsiveTable(true);
0 ignored issues
show
Unused Code introduced by
The call to Backpack\CRUD\app\Librar...enableResponsiveTable() has too many arguments starting with true. ( Ignorable by Annotation )

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

122
        $this->crudPanel->/** @scrutinizer ignore-call */ 
123
                          enableResponsiveTable(true);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
123
124
        $this->assertTrue($this->crudPanel->getResponsiveTable());
125
126
        $this->crudPanel->disableResponsiveTable();
127
128
        $this->assertFalse($this->crudPanel->getResponsiveTable());
129
    }
130
131
    public function testItCanGetPersistentTableDurationFromOperationSetting()
132
    {
133
        $this->crudPanel->setOperationSetting('persistentTableDuration', 10);
134
135
        $this->assertEquals(10, $this->crudPanel->getPersistentTableDuration());
136
    }
137
138
    public function testItCanGetPersistentTableDurantionFromConfig()
139
    {
140
        $this->assertEquals(false, $this->crudPanel->getPersistentTableDuration());
141
142
        config(['backpack.crud.operations.list.persistentTableDuration' => 10]);
143
144
        $this->assertEquals(10, $this->crudPanel->getPersistentTableDuration());
145
    }
146
147
    public function testItCanGetResponsiveTableFromConfig()
148
    {
149
        $this->assertEquals(false, $this->crudPanel->getResponsiveTable());
150
151
        config(['backpack.crud.operations.list.responsiveTable' => true]);
152
153
        $this->assertTrue($this->crudPanel->getResponsiveTable());
154
    }
155
156
    public function testItCanGetTheRenderedViewsForTheColumns()
157
    {
158
        $this->crudPanel->addColumn([
159
            'name' => 'name',
160
            'type' => 'test',
161
        ]);
162
163
        $entries = [$this->makeAUserModel()];
164
165
        $rowColumnsHtml = trim($this->crudPanel->getEntriesAsJsonForDatatables($entries, 1, 0)['data'][0][0]);
166
167
        $this->assertEquals($this->expectedDefaultColumnValue, $rowColumnsHtml);
168
    }
169
170
    public function testItRendersTheDetailsRow()
171
    {
172
        $this->crudPanel->addColumn([
173
            'name' => 'name',
174
            'type' => 'test',
175
        ]);
176
177
        $this->crudPanel->setOperationSetting('detailsRow', true);
178
        $entries = [$this->makeAUserModel()];
179
180
        $rowColumnsHtml = $this->crudPanel->getEntriesAsJsonForDatatables($entries, 1, 0)['data'][0][0];
181
182
        $this->assertStringContainsString('details-row-button', $rowColumnsHtml);
183
    }
184
185
    public function testItRendersTheBulkActions()
186
    {
187
        $this->crudPanel->addColumn([
188
            'name' => 'name',
189
            'type' => 'test',
190
        ]);
191
192
        $this->crudPanel->setOperationSetting('bulkActions', true);
193
        $entries = [$this->makeAUserModel()];
194
195
        $rowColumnsHtml = $this->crudPanel->getEntriesAsJsonForDatatables($entries, 1, 0)['data'][0][0];
196
197
        $this->assertStringContainsString('crud_bulk_actions_line_checkbox', $rowColumnsHtml);
198
    }
199
200
    public function testItRendersTheLineStackButtons()
201
    {
202
        $this->crudPanel->addColumn([
203
            'name' => 'name',
204
            'type' => 'test',
205
        ]);
206
207
        $this->crudPanel->button('test')->stack('line')->type('view')->content('backpack.theme-coreuiv2::buttons.test');
208
        $entries = [$this->makeAUserModel()];
209
210
        $rowColumnsHtml = $this->crudPanel->getEntriesAsJsonForDatatables($entries, 1, 0)['data'][0][1];
211
212
        $this->assertStringContainsString('btn-secondary', $rowColumnsHtml);
213
    }
214
215
    public function testItAppliesCustomOrderByPrimaryKeyForDatatables()
216
    {
217
        $this->crudPanel->applyDatatableOrder();
218
219
        $this->assertEquals('select * from "users" order by "id" desc', $this->crudPanel->query->toRawSql());
220
    }
221
222
    public function testItCanApplyACustomSearchLogic()
223
    {
224
        $this->crudPanel->addColumn([
225
            'name' => 'name',
226
            'type' => 'text',
227
            'tableColumn' => true,
228
            'orderLogic' => function ($query, $column, $searchTerm) {
0 ignored issues
show
Unused Code introduced by
The parameter $column is not used and could be removed. ( Ignorable by Annotation )

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

228
            'orderLogic' => function ($query, /** @scrutinizer ignore-unused */ $column, $searchTerm) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $searchTerm is not used and could be removed. ( Ignorable by Annotation )

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

228
            'orderLogic' => function ($query, $column, /** @scrutinizer ignore-unused */ $searchTerm) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
229
                $query->orderBy('name', 'asc');
230
            },
231
        ]);
232
233
        $this->setupUserCreateRequest();
234
        $this->crudPanel->getRequest()->merge(['order' => [['column' => 0, 'dir' => 'asc']]]);
235
236
        $this->crudPanel->applyDatatableOrder();
237
238
        $this->assertEquals('select * from "users" order by "name" asc, "id" desc', $this->crudPanel->query->toRawSql());
239
    }
240
241
    public function testItDoesNotReplacePrimaryKeyIfItAlreadyExists()
242
    {
243
        $this->crudPanel->addColumn([
244
            'name' => 'name',
245
            'type' => 'text',
246
            'tableColumn' => true,
247
            'orderLogic' => function ($query, $column, $searchTerm) {
0 ignored issues
show
Unused Code introduced by
The parameter $column is not used and could be removed. ( Ignorable by Annotation )

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

247
            'orderLogic' => function ($query, /** @scrutinizer ignore-unused */ $column, $searchTerm) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $searchTerm is not used and could be removed. ( Ignorable by Annotation )

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

247
            'orderLogic' => function ($query, $column, /** @scrutinizer ignore-unused */ $searchTerm) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
248
                $query->orderBy('id', 'asc');
249
            },
250
        ]);
251
252
        $this->setupUserCreateRequest();
253
        $this->crudPanel->getRequest()->merge(['order' => [['column' => 0, 'dir' => 'asc']]]);
254
255
        $this->crudPanel->applyDatatableOrder();
256
257
        $this->assertEquals('select * from "users" order by "id" asc', $this->crudPanel->query->toRawSql());
258
    }
259
260
    public function testItCanApplyDatatableOrderFromRequest()
261
    {
262
        $this->crudPanel->addColumn([
263
            'name' => 'name',
264
            'type' => 'test',
265
            'tableColumn' => true,
266
        ]);
267
        $this->setupUserCreateRequest();
268
        $this->crudPanel->getRequest()->merge(['order' => [['column' => 0, 'dir' => 'asc']]]);
269
270
        $this->crudPanel->applyDatatableOrder();
271
272
        $this->assertEquals('select * from "users" order by "name" asc, "id" desc', $this->crudPanel->query->toRawSql());
273
    }
274
275
    public function testItCanApplySearchLogicForTranslatableJsonColumns()
276
    {
277
        $this->crudPanel->setModel(UserWithTranslations::class);
278
279
        $this->crudPanel->addColumn([
280
            'name' => 'json',
281
            'type' => 'json',
282
            'tableColumn' => true,
283
        ]);
284
        $this->setupUserCreateRequest();
285
        $this->crudPanel->getRequest()->merge(['order' => [['column' => 0, 'dir' => 'asc']]]);
286
287
        $this->crudPanel->applyDatatableOrder();
288
289
        $this->assertEquals('select * from "users" order by json_extract("json", \'$."en"\') asc, "id" desc', $this->crudPanel->query->toRawSql());
290
    }
291
292
    public function testItCanApplySearchLogicForTranslatableColumns()
293
    {
294
        $this->crudPanel->setModel(UserWithTranslations::class);
295
296
        $this->crudPanel->addColumn([
297
            'name' => 'name',
298
            'type' => 'text',
299
            'tableColumn' => true,
300
        ]);
301
        $this->setupUserCreateRequest();
302
        $this->crudPanel->getRequest()->merge(['order' => [['column' => 0, 'dir' => 'asc']]]);
303
304
        $this->crudPanel->applyDatatableOrder();
305
306
        $this->assertEquals('select * from "users" order by "name" asc, "id" desc', $this->crudPanel->query->toRawSql());
307
    }
308
309
    public static function columnsDefaultSearchLogic()
310
    {
311
        return [
312
            ['test', 'text', 'select * from "users" where ("users"."test" like \'%test%\')'],
313
            ['test', 'email', 'select * from "users" where ("users"."test" like \'%test%\')'],
314
            ['test', 'textarea', 'select * from "users" where ("users"."test" like \'%test%\')'],
315
            ['2023-12-24', 'date', 'select * from "users" where (strftime(\'%Y-%m-%d\', "users"."test") = cast(\'2023-12-24\' as text))'],
316
            ['2023-12-24', 'datetime', 'select * from "users" where (strftime(\'%Y-%m-%d\', "users"."test") = cast(\'2023-12-24\' as text))'],
317
            ['test', 'select', 'select * from "users" where (exists (select * from "account_details" where "users"."id" = "account_details"."user_id" and "account_details"."nickname" like \'%test%\'))'],
318
            ['test', 'select_multiple', 'select * from "users" where (exists (select * from "articles" where "users"."id" = "articles"."user_id" and "articles"."content" like \'%test%\'))'],
319
        ];
320
    }
321
}
322