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

3
class QueryTest extends TestCase {
Jens Segers's avatar
Jens Segers committed
4

5 6 7
	protected static $started = false;

	public function setUp()
Jens Segers's avatar
Jens Segers committed
8
	{
9 10 11
		parent::setUp();

		// only run this stuff once
12 13 14 15 16 17 18 19 20 21
		if (self::$started) return;

		User::create(array('name' => 'John Doe', 'age' => 35, 'title' => 'admin'));
		User::create(array('name' => 'Jane Doe', 'age' => 33, 'title' => 'admin'));
		User::create(array('name' => 'Harry Hoe', 'age' => 13, 'title' => 'user'));
		User::create(array('name' => 'Robert Roe', 'age' => 37, 'title' => 'user'));
		User::create(array('name' => 'Mark Moe', 'age' => 23, 'title' => 'user'));
		User::create(array('name' => 'Brett Boe', 'age' => 35, 'title' => 'user'));
		User::create(array('name' => 'Tommy Toe', 'age' => 33, 'title' => 'user'));
		User::create(array('name' => 'Yvonne Yoe', 'age' => 35, 'title' => 'admin'));
22
		User::create(array('name' => 'Error', 'age' => null, 'title' => null));
23 24

		self::$started = true;
Jens Segers's avatar
Jens Segers committed
25 26
	}

27
	public function testWhere()
28
	{
29 30 31 32 33 34 35 36
		$users = User::where('age', 35)->get();
		$this->assertEquals(3, count($users));

		$users = User::where('age', '=', 35)->get();
		$this->assertEquals(3, count($users));

		$users = User::where('age', '>=', 35)->get();
		$this->assertEquals(4, count($users));
37

38
		$users = User::where('age', '<=', 18)->get();
Jens Segers's avatar
Jens Segers committed
39
		$this->assertEquals(1, count($users));
40

41 42 43 44 45
		$users = User::where('age', '!=', 35)->get();
		$this->assertEquals(6, count($users));

		$users = User::where('age', '<>', 35)->get();
		$this->assertEquals(6, count($users));
46 47
	}

48
	public function testAndWhere()
49
	{
50
		$users = User::where('age', 35)->where('title', 'admin')->get();
51 52
		$this->assertEquals(2, count($users));

53 54
		$users = User::where('age', '>=', 35)->where('title', 'user')->get();
		$this->assertEquals(2, count($users));
55 56
	}

57
	public function testLike()
58
	{
59 60
		$users = User::where('name', 'like', '%doe')->get();
		$this->assertEquals(2, count($users));
61

62 63
		$users = User::where('name', 'like', '%y%')->get();
		$this->assertEquals(3, count($users));
Jens Segers's avatar
Jens Segers committed
64

65 66 67
		$users = User::where('name', 'LIKE', '%y%')->get();
		$this->assertEquals(3, count($users));

68 69
		$users = User::where('name', 'like', 't%')->get();
		$this->assertEquals(1, count($users));
70 71
	}

72
	public function testSelect()
Jens Segers's avatar
Jens Segers committed
73
	{
74
		$user = User::where('name', 'John Doe')->select('name')->first();
Jens Segers's avatar
Jens Segers committed
75

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

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

82 83 84
		$this->assertEquals('John Doe', $user->name);
		$this->assertEquals('admin', $user->title);
		$this->assertEquals(null, $user->age);
Jens Segers's avatar
Jens Segers committed
85

86 87 88 89 90 91
		$user = User::where('name', 'John Doe')->select(array('name', 'title'))->get()->first();

		$this->assertEquals('John Doe', $user->name);
		$this->assertEquals('admin', $user->title);
		$this->assertEquals(null, $user->age);

92
		$user = User::where('name', 'John Doe')->get(array('name'))->first();
Jens Segers's avatar
Jens Segers committed
93

94 95
		$this->assertEquals('John Doe', $user->name);
		$this->assertEquals(null, $user->age);
Jens Segers's avatar
Jens Segers committed
96 97
	}

98
	public function testOrWhere()
Jens Segers's avatar
Jens Segers committed
99
	{
100 101
		$users = User::where('age', 13)->orWhere('title', 'admin')->get();
		$this->assertEquals(4, count($users));
Jens Segers's avatar
Jens Segers committed
102

103 104 105
		$users = User::where('age', 13)->orWhere('age', 23)->get();
		$this->assertEquals(2, count($users));
	}
Jens Segers's avatar
Jens Segers committed
106

107 108 109 110
	public function testBetween()
	{
		$users = User::whereBetween('age', array(0, 25))->get();
		$this->assertEquals(2, count($users));
Jens Segers's avatar
Jens Segers committed
111

112 113
		$users = User::whereBetween('age', array(13, 23))->get();
		$this->assertEquals(2, count($users));
114 115 116 117

		// testing whereNotBetween for version 4.1
		$users = User::whereBetween('age', array(0, 25), 'and', true)->get();
		$this->assertEquals(6, count($users));
Jens Segers's avatar
Jens Segers committed
118 119
	}

120
	public function testIn()
Jens Segers's avatar
Jens Segers committed
121
	{
122 123
		$users = User::whereIn('age', array(13, 23))->get();
		$this->assertEquals(2, count($users));
Jens Segers's avatar
Jens Segers committed
124

125 126
		$users = User::whereIn('age', array(33, 35, 13))->get();
		$this->assertEquals(6, count($users));
Jens Segers's avatar
Jens Segers committed
127

128 129
		$users = User::whereNotIn('age', array(33, 35))->get();
		$this->assertEquals(4, count($users));
Jens Segers's avatar
Jens Segers committed
130

131
		$users = User::whereNotNull('age')
132
					 ->whereNotIn('age', array(33, 35))->get();
133
		$this->assertEquals(3, count($users));
Jens Segers's avatar
Jens Segers committed
134 135
	}

136
	public function testWhereNull()
137
	{
138 139 140
		$users = User::whereNull('age')->get();
		$this->assertEquals(1, count($users));
	}
141

142 143 144 145 146
	public function testWhereNotNull()
	{
		$users = User::whereNotNull('age')->get();
		$this->assertEquals(8, count($users));
	}
147

148 149 150 151
	public function testOrder()
	{
		$user = User::whereNotNull('age')->orderBy('age', 'asc')->first();
		$this->assertEquals(13, $user->age);
152

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

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

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

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

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

169 170 171 172
	public function testGroupBy()
	{
		$users = User::groupBy('title')->get();
		$this->assertEquals(3, count($users));
Jens Segers's avatar
Jens Segers committed
173

174 175
		$users = User::groupBy('age')->get();
		$this->assertEquals(6, count($users));
Jens Segers's avatar
Jens Segers committed
176

177 178
		$users = User::groupBy('age')->skip(1)->get();
		$this->assertEquals(5, count($users));
Jens Segers's avatar
Jens Segers committed
179

180 181
		$users = User::groupBy('age')->take(2)->get();
		$this->assertEquals(2, count($users));
Jens Segers's avatar
Jens Segers committed
182

183 184 185 186
		$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);
Jens Segers's avatar
Jens Segers committed
187

188
		$users = User::groupBy('age')->skip(1)->take(2)->orderBy('age', 'desc')->get();
189
		$this->assertEquals(2, count($users));
190 191
		$this->assertEquals(35, $users[0]->age);
		$this->assertEquals(33, $users[1]->age);
192 193 194 195 196
		$this->assertNull($users[0]->name);

		$users = User::select('name')->groupBy('age')->skip(1)->take(2)->orderBy('age', 'desc')->get();
		$this->assertEquals(2, count($users));
		$this->assertNotNull($users[0]->name);
197
	}
Jens Segers's avatar
Jens Segers committed
198

199 200 201 202 203 204 205 206 207 208
	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
	public function testSubquery()
	{
		$users = User::where('title', 'admin')->orWhere(function($query)
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
			{
				$query->where('name', 'Tommy Toe')
					  ->orWhere('name', 'Error');
			})
			->get();

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

		$users = User::where('title', 'user')->where(function($query)
			{
				$query->where('age', 35)
					  ->orWhere('name', 'like', '%harry%');
			})
			->get();

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

		$users = User::where('age', 35)->orWhere(function($query)
			{
				$query->where('title', 'admin')
					  ->orWhere('name', 'Error');
			})
			->get();

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

		$users = User::whereNull('deleted_at')
				->where('title', 'admin')
				->where(function($query)
				{
					$query->where('age', '>', 15)
						  ->orWhere('name', 'Harry Hoe');
				})
				->get();

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

		$users = User::whereNull('deleted_at')
				->where(function($query)
				{
					$query->where('name', 'Harry Hoe')
						  ->orWhere(function($query)
						  {
							  $query->where('age', '>', 15)
									->where('title', '<>', 'admin');
						  });
				})
				->get();

		$this->assertEquals(5, $users->count());
Jens Segers's avatar
Jens Segers committed
262 263
	}

264
	public function testWhereRaw()
265
	{
266 267 268 269
		$where = array('age' => array('$gt' => 30, '$lt' => 40));
		$users = User::whereRaw($where)->get();

		$this->assertEquals(6, count($users));
270

271 272 273
		$where1 = array('age' => array('$gt' => 30, '$lte' => 35));
		$where2 = array('age' => array('$gt' => 35, '$lt' => 40));
		$users = User::whereRaw($where1)->orWhereRaw($where2)->get();
274

275
		$this->assertEquals(6, count($users));
276 277
	}

278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
	public function testMultipleOr()
	{
		$users = User::where(function($query)
		{
			$query->where('age', 35)->orWhere('age', 33);
		})
		->where(function($query)
		{
			$query->where('name', 'John Doe')->orWhere('name', 'Jane Doe');
		})->get();

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

		$users = User::where(function($query)
		{
			$query->orWhere('age', 35)->orWhere('age', 33);
		})
		->where(function($query)
		{
			$query->orWhere('name', 'John Doe')->orWhere('name', 'Jane Doe');
		})->get();

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

Jens Segers's avatar
Jens Segers committed
303 304 305 306 307 308 309 310 311 312 313
	public function testPaginate()
	{
		$results = User::paginate(2);
		$this->assertEquals(2, $results->count());
		$this->assertNotNull($results->first()->title);

		$results = User::paginate(2, array('name', 'age'));
		$this->assertEquals(2, $results->count());
		$this->assertNull($results->first()->title);
	}

duxet's avatar
duxet committed
314 315 316 317 318 319 320 321 322 323
	/*
	 * FIXME: This should be done in tearDownAfterClass, but something doens't work:
	 *        https://travis-ci.org/duxet/laravel-mongodb/jobs/46657530
	 */
	public function testTruncate()
	{
		User::truncate();
		$this->assertEquals(0, User::count());
	}

324
}