QueryTest.php 9.86 KB
Newer Older
Jens Segers's avatar
Jens Segers committed
1 2
<?php

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

Jens Segers's avatar
Jens Segers committed
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
    public function setUp()
    {
        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]);
    }

    public function tearDown()
    {
        User::truncate();
        parent::tearDown();
    }

    public function testWhere()
    {
        $users = User::where('age', 35)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
30
        $this->assertCount(3, $users);
31

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

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

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

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

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

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

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

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

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

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

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

    public function testSelect()
    {
        $user = User::where('name', 'John Doe')->select('name')->first();

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

Jens Segers's avatar
Jens Segers committed
80 81 82 83
        $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
84
        $this->assertNull($user->age);
Jens Segers's avatar
Jens Segers committed
85 86

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

Jens Segers's avatar
Jens Segers committed
88 89
        $this->assertEquals('John Doe', $user->name);
        $this->assertEquals('admin', $user->title);
Gabriel Caruso's avatar
Gabriel Caruso committed
90
        $this->assertNull($user->age);
Jens Segers's avatar
Jens Segers committed
91 92 93 94

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

        $this->assertEquals('John Doe', $user->name);
Gabriel Caruso's avatar
Gabriel Caruso committed
95
        $this->assertNull($user->age);
Jens Segers's avatar
Jens Segers committed
96 97 98 99 100
    }

    public function testOrWhere()
    {
        $users = User::where('age', 13)->orWhere('title', 'admin')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
101
        $this->assertCount(4, $users);
Jens Segers's avatar
Jens Segers committed
102 103

        $users = User::where('age', 13)->orWhere('age', 23)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
104
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
105 106 107 108 109
    }

    public function testBetween()
    {
        $users = User::whereBetween('age', [0, 25])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
110
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
111 112

        $users = User::whereBetween('age', [13, 23])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
113
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
114 115 116

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

Jens Segers's avatar
Jens Segers committed
120 121 122
    public function testIn()
    {
        $users = User::whereIn('age', [13, 23])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
123
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
124 125

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

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

Jens Segers's avatar
Jens Segers committed
131 132
        $users = User::whereNotNull('age')
                     ->whereNotIn('age', [33, 35])->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
133
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
134 135 136 137 138
    }

    public function testWhereNull()
    {
        $users = User::whereNull('age')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
139
        $this->assertCount(1, $users);
Jens Segers's avatar
Jens Segers committed
140 141 142 143 144
    }

    public function testWhereNotNull()
    {
        $users = User::whereNotNull('age')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
145
        $this->assertCount(8, $users);
Jens Segers's avatar
Jens Segers committed
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
    }

    public function testOrder()
    {
        $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);
    }

    public function testGroupBy()
    {
        $users = User::groupBy('title')->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
172
        $this->assertCount(3, $users);
Jens Segers's avatar
Jens Segers committed
173 174

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

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

        $users = User::groupBy('age')->take(2)->get();
Gabriel Caruso's avatar
Gabriel Caruso committed
181
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
182 183 184 185 186 187 188

        $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
189
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
190 191 192 193 194
        $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
195
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
196 197 198 199 200 201 202 203 204 205 206 207 208
        $this->assertNotNull($users[0]->name);
    }

    public function testCount()
    {
        $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);
    }

209 210 211 212 213 214
    public function testExists()
    {
        $this->assertFalse(User::where('age', '>', 37)->exists());
        $this->assertTrue(User::where('age', '<', 37)->exists());
    }

Jens Segers's avatar
Jens Segers committed
215 216
    public function testSubquery()
    {
Jens Segers's avatar
Jens Segers committed
217
        $users = User::where('title', 'admin')->orWhere(function ($query) {
218
            $query->where('name', 'Tommy Toe')
Jens Segers's avatar
Jens Segers committed
219
                      ->orWhere('name', 'Error');
220
        })
Jens Segers's avatar
Jens Segers committed
221 222
            ->get();

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

Jens Segers's avatar
Jens Segers committed
225
        $users = User::where('title', 'user')->where(function ($query) {
226
            $query->where('age', 35)
Jens Segers's avatar
Jens Segers committed
227
                      ->orWhere('name', 'like', '%harry%');
228
        })
Jens Segers's avatar
Jens Segers committed
229 230
            ->get();

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

Jens Segers's avatar
Jens Segers committed
233
        $users = User::where('age', 35)->orWhere(function ($query) {
234
            $query->where('title', 'admin')
Jens Segers's avatar
Jens Segers committed
235
                      ->orWhere('name', 'Error');
236
        })
Jens Segers's avatar
Jens Segers committed
237 238
            ->get();

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

        $users = User::whereNull('deleted_at')
                ->where('title', 'admin')
Jens Segers's avatar
Jens Segers committed
243
                ->where(function ($query) {
Jens Segers's avatar
Jens Segers committed
244 245 246 247 248 249 250 251
                    $query->where('age', '>', 15)
                          ->orWhere('name', 'Harry Hoe');
                })
                ->get();

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

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

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

    public function testWhereRaw()
    {
        $where = ['age' => ['$gt' => 30, '$lt' => 40]];
        $users = User::whereRaw($where)->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
269
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
270 271 272 273 274

        $where1 = ['age' => ['$gt' => 30, '$lte' => 35]];
        $where2 = ['age'           => ['$gt' => 35, '$lt' => 40]];
        $users = User::whereRaw($where1)->orWhereRaw($where2)->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
275
        $this->assertCount(6, $users);
Jens Segers's avatar
Jens Segers committed
276 277 278 279
    }

    public function testMultipleOr()
    {
Jens Segers's avatar
Jens Segers committed
280
        $users = User::where(function ($query) {
Jens Segers's avatar
Jens Segers committed
281 282
            $query->where('age', 35)->orWhere('age', 33);
        })
Jens Segers's avatar
Jens Segers committed
283
        ->where(function ($query) {
Jens Segers's avatar
Jens Segers committed
284 285 286
            $query->where('name', 'John Doe')->orWhere('name', 'Jane Doe');
        })->get();

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

Jens Segers's avatar
Jens Segers committed
289
        $users = User::where(function ($query) {
Jens Segers's avatar
Jens Segers committed
290 291
            $query->orWhere('age', 35)->orWhere('age', 33);
        })
Jens Segers's avatar
Jens Segers committed
292
        ->where(function ($query) {
Jens Segers's avatar
Jens Segers committed
293 294 295
            $query->orWhere('name', 'John Doe')->orWhere('name', 'Jane Doe');
        })->get();

Gabriel Caruso's avatar
Gabriel Caruso committed
296
        $this->assertCount(2, $users);
Jens Segers's avatar
Jens Segers committed
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
    }

    public function testPaginate()
    {
        $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());
    }
312
}