QueryTest.php 11.2 KB
Newer Older
Jens Segers's avatar
Jens Segers committed
1
<?php
Simon Schaufelberger's avatar
Simon Schaufelberger committed
2
declare(strict_types=1);
Jens Segers's avatar
Jens Segers committed
3

Jens Segers's avatar
Jens Segers committed
4 5
class QueryTest extends TestCase
{
Jens Segers's avatar
Jens Segers committed
6
    protected static $started = false;
7

Stas's avatar
Stas committed
8
    public function setUp(): void
Jens Segers's avatar
Jens Segers committed
9 10 11 12 13 14 15 16 17 18 19 20 21
    {
        parent::setUp();
        User::create(['name' => 'John Doe', 'age' => 35, 'title' => 'admin']);
        User::create(['name' => 'Jane Doe', 'age' => 33, 'title' => 'admin']);
        User::create(['name' => 'Harry Hoe', 'age' => 13, 'title' => 'user']);
        User::create(['name' => 'Robert Roe', 'age' => 37, 'title' => 'user']);
        User::create(['name' => 'Mark Moe', 'age' => 23, 'title' => 'user']);
        User::create(['name' => 'Brett Boe', 'age' => 35, 'title' => 'user']);
        User::create(['name' => 'Tommy Toe', 'age' => 33, 'title' => 'user']);
        User::create(['name' => 'Yvonne Yoe', 'age' => 35, 'title' => 'admin']);
        User::create(['name' => 'Error', 'age' => null, 'title' => null]);
    }

Stas's avatar
Stas committed
22
    public function tearDown(): void
Jens Segers's avatar
Jens Segers committed
23 24
    {
        User::truncate();
25
        Scoped::truncate();
Jens Segers's avatar
Jens Segers committed
26 27 28
        parent::tearDown();
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
29
    public function testWhere(): void
Jens Segers's avatar
Jens Segers committed
30 31
    {
        $users = User::where('age', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
32
        $this->assertCount(3, $users);
33

Jens Segers's avatar
Jens Segers committed
34
        $users = User::where('age', '=', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
35
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
36 37

        $users = User::where('age', '>=', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
38
        $this->assertCount(4, $users);
Jens Segers's avatar
Jens Segers committed
39 40

        $users = User::where('age', '<=', 18)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
41
        $this->assertCount(1, $users);
Jens Segers's avatar
Jens Segers committed
42 43

        $users = User::where('age', '!=', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
44
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
45 46

        $users = User::where('age', '<>', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
47
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
48 49
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
50
    public function testAndWhere(): void
Jens Segers's avatar
Jens Segers committed
51 52
    {
        $users = User::where('age', 35)->where('title', 'admin')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
53
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
54 55

        $users = User::where('age', '>=', 35)->where('title', 'user')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
56
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
57 58
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
59
    public function testLike(): void
Jens Segers's avatar
Jens Segers committed
60 61
    {
        $users = User::where('name', 'like', '%doe')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
62
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
63 64

        $users = User::where('name', 'like', '%y%')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
65
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
66 67

        $users = User::where('name', 'LIKE', '%y%')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
68
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
69 70

        $users = User::where('name', 'like', 't%')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
71
        $this->assertCount(1, $users);
Jens Segers's avatar
Jens Segers committed
72 73
    }

74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
    public function testNotLike(): void
    {
        $users = User::where('name', 'not like', '%doe')->get();
        $this->assertCount(7, $users);

        $users = User::where('name', 'not like', '%y%')->get();
        $this->assertCount(6, $users);

        $users = User::where('name', 'not LIKE', '%y%')->get();
        $this->assertCount(6, $users);

        $users = User::where('name', 'not like', 't%')->get();
        $this->assertCount(8, $users);
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
89
    public function testSelect(): void
Jens Segers's avatar
Jens Segers committed
90 91 92 93
    {
        $user = User::where('name', 'John Doe')->select('name')->first();

        $this->assertEquals('John Doe', $user->name);
Gabriel Caruso's avatar
Gabriel Caruso committed
94 95
        $this->assertNull($user->age);
        $this->assertNull($user->title);
Jens Segers's avatar
Jens Segers committed
96

Jens Segers's avatar
Jens Segers committed
97 98 99 100
        $user = User::where('name', 'John Doe')->select('name', 'title')->first();

        $this->assertEquals('John Doe', $user->name);
        $this->assertEquals('admin', $user->title);
Gabriel Caruso's avatar
Gabriel Caruso committed
101
        $this->assertNull($user->age);
Jens Segers's avatar
Jens Segers committed
102 103

        $user = User::where('name', 'John Doe')->select(['name', 'title'])->get()->first();
104

Jens Segers's avatar
Jens Segers committed
105 106
        $this->assertEquals('John Doe', $user->name);
        $this->assertEquals('admin', $user->title);
Gabriel Caruso's avatar
Gabriel Caruso committed
107
        $this->assertNull($user->age);
Jens Segers's avatar
Jens Segers committed
108 109 110 111

        $user = User::where('name', 'John Doe')->get(['name'])->first();

        $this->assertEquals('John Doe', $user->name);
Gabriel Caruso's avatar
Gabriel Caruso committed
112
        $this->assertNull($user->age);
Jens Segers's avatar
Jens Segers committed
113 114
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
115
    public function testOrWhere(): void
Jens Segers's avatar
Jens Segers committed
116 117
    {
        $users = User::where('age', 13)->orWhere('title', 'admin')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
118
        $this->assertCount(4, $users);
Jens Segers's avatar
Jens Segers committed
119 120

        $users = User::where('age', 13)->orWhere('age', 23)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
121
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
122 123
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
124
    public function testBetween(): void
Jens Segers's avatar
Jens Segers committed
125 126
    {
        $users = User::whereBetween('age', [0, 25])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
127
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
128 129

        $users = User::whereBetween('age', [13, 23])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
130
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
131 132 133

        // testing whereNotBetween for version 4.1
        $users = User::whereBetween('age', [0, 25], 'and', true)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
134
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
135
    }
Jens Segers's avatar
Jens Segers committed
136

Simon Schaufelberger's avatar
Simon Schaufelberger committed
137
    public function testIn(): void
Jens Segers's avatar
Jens Segers committed
138 139
    {
        $users = User::whereIn('age', [13, 23])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
140
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
141 142

        $users = User::whereIn('age', [33, 35, 13])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
143
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
144 145

        $users = User::whereNotIn('age', [33, 35])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
146
        $this->assertCount(4, $users);
Jens Segers's avatar
Jens Segers committed
147

Jens Segers's avatar
Jens Segers committed
148
        $users = User::whereNotNull('age')
Jens Segers's avatar
Jens Segers committed
149
            ->whereNotIn('age', [33, 35])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
150
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
151 152
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
153
    public function testWhereNull(): void
Jens Segers's avatar
Jens Segers committed
154 155
    {
        $users = User::whereNull('age')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
156
        $this->assertCount(1, $users);
Jens Segers's avatar
Jens Segers committed
157 158
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
159
    public function testWhereNotNull(): void
Jens Segers's avatar
Jens Segers committed
160 161
    {
        $users = User::whereNotNull('age')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
162
        $this->assertCount(8, $users);
Jens Segers's avatar
Jens Segers committed
163 164
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
165
    public function testOrder(): void
Jens Segers's avatar
Jens Segers committed
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
    {
        $user = User::whereNotNull('age')->orderBy('age', 'asc')->first();
        $this->assertEquals(13, $user->age);

        $user = User::whereNotNull('age')->orderBy('age', 'ASC')->first();
        $this->assertEquals(13, $user->age);

        $user = User::whereNotNull('age')->orderBy('age', 'desc')->first();
        $this->assertEquals(37, $user->age);

        $user = User::whereNotNull('age')->orderBy('natural', 'asc')->first();
        $this->assertEquals(35, $user->age);

        $user = User::whereNotNull('age')->orderBy('natural', 'ASC')->first();
        $this->assertEquals(35, $user->age);

        $user = User::whereNotNull('age')->orderBy('natural', 'desc')->first();
        $this->assertEquals(35, $user->age);
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
186
    public function testGroupBy(): void
Jens Segers's avatar
Jens Segers committed
187 188
    {
        $users = User::groupBy('title')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
189
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
190 191

        $users = User::groupBy('age')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
192
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
193 194

        $users = User::groupBy('age')->skip(1)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
195
        $this->assertCount(5, $users);
Jens Segers's avatar
Jens Segers committed
196 197

        $users = User::groupBy('age')->take(2)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
198
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
199 200 201 202 203 204 205

        $users = User::groupBy('age')->orderBy('age', 'desc')->get();
        $this->assertEquals(37, $users[0]->age);
        $this->assertEquals(35, $users[1]->age);
        $this->assertEquals(33, $users[2]->age);

        $users = User::groupBy('age')->skip(1)->take(2)->orderBy('age', 'desc')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
206
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
207 208 209 210 211
        $this->assertEquals(35, $users[0]->age);
        $this->assertEquals(33, $users[1]->age);
        $this->assertNull($users[0]->name);

        $users = User::select('name')->groupBy('age')->skip(1)->take(2)->orderBy('age', 'desc')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
212
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
213 214 215
        $this->assertNotNull($users[0]->name);
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
216
    public function testCount(): void
Jens Segers's avatar
Jens Segers committed
217 218 219 220 221 222 223 224 225
    {
        $count = User::where('age', '<>', 35)->count();
        $this->assertEquals(6, $count);

        // Test for issue #165
        $count = User::select('_id', 'age', 'title')->where('age', '<>', 35)->count();
        $this->assertEquals(6, $count);
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
226
    public function testExists(): void
227 228 229 230 231
    {
        $this->assertFalse(User::where('age', '>', 37)->exists());
        $this->assertTrue(User::where('age', '<', 37)->exists());
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
232
    public function testSubQuery(): void
Jens Segers's avatar
Jens Segers committed
233
    {
Jens Segers's avatar
Jens Segers committed
234
        $users = User::where('title', 'admin')->orWhere(function ($query) {
235
            $query->where('name', 'Tommy Toe')
Jens Segers's avatar
Jens Segers committed
236
                ->orWhere('name', 'Error');
237
        })
Jens Segers's avatar
Jens Segers committed
238 239
            ->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
240
        $this->assertCount(5, $users);
Jens Segers's avatar
Jens Segers committed
241

Jens Segers's avatar
Jens Segers committed
242
        $users = User::where('title', 'user')->where(function ($query) {
243
            $query->where('age', 35)
Jens Segers's avatar
Jens Segers committed
244
                ->orWhere('name', 'like', '%harry%');
245
        })
Jens Segers's avatar
Jens Segers committed
246 247
            ->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
248
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
249

Jens Segers's avatar
Jens Segers committed
250
        $users = User::where('age', 35)->orWhere(function ($query) {
251
            $query->where('title', 'admin')
Jens Segers's avatar
Jens Segers committed
252
                ->orWhere('name', 'Error');
253
        })
Jens Segers's avatar
Jens Segers committed
254 255
            ->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
256
        $this->assertCount(5, $users);
Jens Segers's avatar
Jens Segers committed
257 258

        $users = User::whereNull('deleted_at')
Jens Segers's avatar
Jens Segers committed
259 260 261 262 263 264
            ->where('title', 'admin')
            ->where(function ($query) {
                $query->where('age', '>', 15)
                    ->orWhere('name', 'Harry Hoe');
            })
            ->get();
Jens Segers's avatar
Jens Segers committed
265 266 267 268

        $this->assertEquals(3, $users->count());

        $users = User::whereNull('deleted_at')
Jens Segers's avatar
Jens Segers committed
269 270 271 272 273 274 275 276
            ->where(function ($query) {
                $query->where('name', 'Harry Hoe')
                    ->orWhere(function ($query) {
                        $query->where('age', '>', 15)
                            ->where('title', '<>', 'admin');
                    });
            })
            ->get();
Jens Segers's avatar
Jens Segers committed
277 278 279 280

        $this->assertEquals(5, $users->count());
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
281
    public function testWhereRaw(): void
Jens Segers's avatar
Jens Segers committed
282 283 284 285
    {
        $where = ['age' => ['$gt' => 30, '$lt' => 40]];
        $users = User::whereRaw($where)->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
286
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
287 288

        $where1 = ['age' => ['$gt' => 30, '$lte' => 35]];
Jens Segers's avatar
Jens Segers committed
289
        $where2 = ['age' => ['$gt' => 35, '$lt' => 40]];
Jens Segers's avatar
Jens Segers committed
290 291
        $users = User::whereRaw($where1)->orWhereRaw($where2)->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
292
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
293 294
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
295
    public function testMultipleOr(): void
Jens Segers's avatar
Jens Segers committed
296
    {
Jens Segers's avatar
Jens Segers committed
297
        $users = User::where(function ($query) {
Jens Segers's avatar
Jens Segers committed
298 299
            $query->where('age', 35)->orWhere('age', 33);
        })
Jens Segers's avatar
Jens Segers committed
300 301 302
            ->where(function ($query) {
                $query->where('name', 'John Doe')->orWhere('name', 'Jane Doe');
            })->get();
Jens Segers's avatar
Jens Segers committed
303

Gabriel Caruso's avatar
Gabriel Caruso committed
304
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
305

Jens Segers's avatar
Jens Segers committed
306
        $users = User::where(function ($query) {
Jens Segers's avatar
Jens Segers committed
307 308
            $query->orWhere('age', 35)->orWhere('age', 33);
        })
Jens Segers's avatar
Jens Segers committed
309 310 311
            ->where(function ($query) {
                $query->orWhere('name', 'John Doe')->orWhere('name', 'Jane Doe');
            })->get();
Jens Segers's avatar
Jens Segers committed
312

Gabriel Caruso's avatar
Gabriel Caruso committed
313
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
314 315
    }

Simon Schaufelberger's avatar
Simon Schaufelberger committed
316
    public function testPaginate(): void
Jens Segers's avatar
Jens Segers committed
317 318 319 320 321 322 323 324 325 326 327 328
    {
        $results = User::paginate(2);
        $this->assertEquals(2, $results->count());
        $this->assertNotNull($results->first()->title);
        $this->assertEquals(9, $results->total());

        $results = User::paginate(2, ['name', 'age']);
        $this->assertEquals(2, $results->count());
        $this->assertNull($results->first()->title);
        $this->assertEquals(9, $results->total());
        $this->assertEquals(1, $results->currentPage());
    }
329

Simon Schaufelberger's avatar
Simon Schaufelberger committed
330
    public function testUpdate(): void
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
    {
        $this->assertEquals(1, User::where(['name' => 'John Doe'])->update(['name' => 'Jim Morrison']));
        $this->assertEquals(1, User::where(['name' => 'Jim Morrison'])->count());

        Scoped::create(['favorite' => true]);
        Scoped::create(['favorite' => false]);

        $this->assertCount(1, Scoped::get());
        $this->assertEquals(1, Scoped::query()->update(['name' => 'Johnny']));
        $this->assertCount(1, Scoped::withoutGlobalScopes()->where(['name' => 'Johnny'])->get());

        $this->assertCount(2, Scoped::withoutGlobalScopes()->get());
        $this->assertEquals(2, Scoped::withoutGlobalScopes()->update(['name' => 'Jimmy']));
        $this->assertCount(2, Scoped::withoutGlobalScopes()->where(['name' => 'Jimmy'])->get());
    }
346
}