ModelTest.php 12.7 KB
Newer Older
Jens Segers's avatar
Jens Segers committed
1 2
<?php

3
class ModelTest extends TestCase {
Jens Segers's avatar
Jens Segers committed
4 5 6 7

	public function tearDown()
	{
		User::truncate();
8
		Soft::truncate();
Jens Segers's avatar
Jens Segers committed
9
		Book::truncate();
Jens Segers's avatar
Jens Segers committed
10
		Item::truncate();
Jens Segers's avatar
Jens Segers committed
11 12 13 14
	}

	public function testNewModel()
	{
15
		$user = new User;
Jens Segers's avatar
Jens Segers committed
16
		$this->assertInstanceOf('Jenssegers\Mongodb\Model', $user);
17
		$this->assertInstanceOf('Jenssegers\Mongodb\Connection', $user->getConnection());
Jens Segers's avatar
Jens Segers committed
18 19 20 21 22 23 24
		$this->assertEquals(false, $user->exists);
		$this->assertEquals('users', $user->getTable());
		$this->assertEquals('_id', $user->getKeyName());
	}

	public function testInsert()
	{
25
		$user = new User;
Jens Segers's avatar
Jens Segers committed
26 27
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
28
		$user->age = 35;
29

Jens Segers's avatar
Jens Segers committed
30 31 32 33 34
		$user->save();

		$this->assertEquals(true, $user->exists);
		$this->assertEquals(1, User::count());

35
		$this->assertTrue(isset($user->_id));
36
		$this->assertTrue(is_string($user->_id));
Jens Segers's avatar
Jens Segers committed
37 38
		$this->assertNotEquals('', (string) $user->_id);
		$this->assertNotEquals(0, strlen((string) $user->_id));
39
		$this->assertInstanceOf('Carbon\Carbon', $user->created_at);
Jens Segers's avatar
Jens Segers committed
40

41 42 43
		$raw = $user->getAttributes();
		$this->assertInstanceOf('MongoId', $raw['_id']);

Jens Segers's avatar
Jens Segers committed
44
		$this->assertEquals('John Doe', $user->name);
Jens Segers's avatar
Jens Segers committed
45 46 47 48 49
		$this->assertEquals(35, $user->age);
	}

	public function testUpdate()
	{
50
		$user = new User;
Jens Segers's avatar
Jens Segers committed
51 52
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
53 54 55
		$user->age = 35;
		$user->save();

56 57 58
		$raw = $user->getAttributes();
		$this->assertInstanceOf('MongoId', $raw['_id']);

Jens Segers's avatar
Jens Segers committed
59 60 61 62 63 64
		$check = User::find($user->_id);

		$check->age = 36;
		$check->save();

		$this->assertEquals(true, $check->exists);
65 66
		$this->assertInstanceOf('Carbon\Carbon', $check->created_at);
		$this->assertInstanceOf('Carbon\Carbon', $check->updated_at);
Jens Segers's avatar
Jens Segers committed
67 68
		$this->assertEquals(1, User::count());

Jens Segers's avatar
Jens Segers committed
69
		$this->assertEquals('John Doe', $check->name);
Jens Segers's avatar
Jens Segers committed
70
		$this->assertEquals(36, $check->age);
Jens Segers's avatar
Jens Segers committed
71

72
		$user->update(['age' => 20]);
Jens Segers's avatar
Jens Segers committed
73

74 75 76
		$raw = $user->getAttributes();
		$this->assertInstanceOf('MongoId', $raw['_id']);

Jens Segers's avatar
Jens Segers committed
77 78
		$check = User::find($user->_id);
		$this->assertEquals(20, $check->age);
Jens Segers's avatar
Jens Segers committed
79 80
	}

81
	public function testManualStringId()
82 83 84 85 86 87 88 89 90 91 92 93 94
	{
		$user = new User;
		$user->_id = '4af9f23d8ead0e1d32000000';
		$user->name = 'John Doe';
		$user->title = 'admin';
		$user->age = 35;
		$user->save();

		$this->assertEquals(true, $user->exists);
		$this->assertEquals('4af9f23d8ead0e1d32000000', $user->_id);

		$raw = $user->getAttributes();
		$this->assertInstanceOf('MongoId', $raw['_id']);
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123

		$user = new User;
		$user->_id = 'customId';
		$user->name = 'John Doe';
		$user->title = 'admin';
		$user->age = 35;
		$user->save();

		$this->assertEquals(true, $user->exists);
		$this->assertEquals('customId', $user->_id);

		$raw = $user->getAttributes();
		$this->assertInternalType('string', $raw['_id']);
	}

	public function testManualIntId()
	{
		$user = new User;
		$user->_id = 1;
		$user->name = 'John Doe';
		$user->title = 'admin';
		$user->age = 35;
		$user->save();

		$this->assertEquals(true, $user->exists);
		$this->assertEquals(1, $user->_id);

		$raw = $user->getAttributes();
		$this->assertInternalType('integer', $raw['_id']);
124 125
	}

Jens Segers's avatar
Jens Segers committed
126 127
	public function testDelete()
	{
128
		$user = new User;
Jens Segers's avatar
Jens Segers committed
129 130
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
131 132 133 134 135 136 137 138 139 140 141 142 143
		$user->age = 35;
		$user->save();

		$this->assertEquals(true, $user->exists);
		$this->assertEquals(1, User::count());

		$user->delete();

		$this->assertEquals(0, User::count());
	}

	public function testAll()
	{
144
		$user = new User;
Jens Segers's avatar
Jens Segers committed
145 146
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
147 148 149
		$user->age = 35;
		$user->save();

150
		$user = new User;
Jens Segers's avatar
Jens Segers committed
151 152
		$user->name = 'Jane Doe';
		$user->title = 'user';
Jens Segers's avatar
Jens Segers committed
153 154 155 156 157 158
		$user->age = 32;
		$user->save();

		$all = User::all();

		$this->assertEquals(2, count($all));
159 160
		$this->assertContains('John Doe', $all->lists('name'));
		$this->assertContains('Jane Doe', $all->lists('name'));
Jens Segers's avatar
Jens Segers committed
161 162 163 164
	}

	public function testFind()
	{
165
		$user = new User;
Jens Segers's avatar
Jens Segers committed
166 167
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
168 169 170 171 172 173 174
		$user->age = 35;
		$user->save();

		$check = User::find($user->_id);

		$this->assertInstanceOf('Jenssegers\Mongodb\Model', $check);
		$this->assertEquals(true, $check->exists);
175
		$this->assertEquals($user->_id, $check->_id);
Jens Segers's avatar
Jens Segers committed
176

Jens Segers's avatar
Jens Segers committed
177
		$this->assertEquals('John Doe', $check->name);
Jens Segers's avatar
Jens Segers committed
178 179 180
		$this->assertEquals(35, $check->age);
	}

Jens Segers's avatar
Jens Segers committed
181 182
	public function testGet()
	{
183 184 185 186
		User::insert([
			['name' => 'John Doe'],
			['name' => 'Jane Doe']
		]);
Jens Segers's avatar
Jens Segers committed
187 188 189 190 191 192 193 194 195

		$users = User::get();
		$this->assertEquals(2, count($users));
		$this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $users);
		$this->assertInstanceOf('Jenssegers\Mongodb\Model', $users[0]);
	}

	public function testFirst()
	{
196 197 198 199
		User::insert([
			['name' => 'John Doe'],
			['name' => 'Jane Doe']
		]);
Jens Segers's avatar
Jens Segers committed
200

Jens Segers's avatar
Jens Segers committed
201
		$user = User::first();
Jens Segers's avatar
Jens Segers committed
202 203 204 205
		$this->assertInstanceOf('Jenssegers\Mongodb\Model', $user);
		$this->assertEquals('John Doe', $user->name);
	}

Jens Segers's avatar
Jens Segers committed
206 207 208 209 210 211 212 213 214 215 216 217 218
	public function testNoDocument()
	{
		$items = Item::where('name', 'nothing')->get();
		$this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $items);
		$this->assertEquals(0, $items->count());

		$item =Item::where('name', 'nothing')->first();
		$this->assertEquals(null, $item);

		$item = Item::find('51c33d8981fec6813e00000a');
		$this->assertEquals(null, $item);
	}

Jens Segers's avatar
Jens Segers committed
219 220
	public function testFindOrfail()
	{
221
		$this->setExpectedException('Illuminate\Database\Eloquent\ModelNotFoundException');
222
		User::findOrfail('51c33d8981fec6813e00000a');
Jens Segers's avatar
Jens Segers committed
223 224 225 226
	}

	public function testCreate()
	{
227
		$user = User::create(['name' => 'Jane Poe']);
Jens Segers's avatar
Jens Segers committed
228 229 230

		$this->assertInstanceOf('Jenssegers\Mongodb\Model', $user);
		$this->assertEquals(true, $user->exists);
Jens Segers's avatar
Jens Segers committed
231
		$this->assertEquals('Jane Poe', $user->name);
Jens Segers's avatar
Jens Segers committed
232 233 234

		$check = User::where('name', 'Jane Poe')->first();
		$this->assertEquals($user, $check);
Jens Segers's avatar
Jens Segers committed
235 236 237 238
	}

	public function testDestroy()
	{
239
		$user = new User;
Jens Segers's avatar
Jens Segers committed
240 241
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
242 243 244 245 246 247 248 249 250 251
		$user->age = 35;
		$user->save();

		User::destroy((string) $user->_id);

		$this->assertEquals(0, User::count());
	}

	public function testTouch()
	{
252
		$user = new User;
Jens Segers's avatar
Jens Segers committed
253 254
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
255 256 257 258 259
		$user->age = 35;
		$user->save();

		$old = $user->updated_at;

Jens Segers's avatar
Jens Segers committed
260
		sleep(1);
Jens Segers's avatar
Jens Segers committed
261 262 263 264 265 266
		$user->touch();
		$check = User::find($user->_id);

		$this->assertNotEquals($old, $check->updated_at);
	}

267 268
	public function testSoftDelete()
	{
269 270
		Soft::create(['name' => 'John Doe']);
		Soft::create(['name' => 'Jane Doe']);
271 272 273 274

		$this->assertEquals(2, Soft::count());

		$user = Soft::where('name', 'John Doe')->first();
275
		$this->assertEquals(true, $user->exists);
276 277
		$this->assertEquals(false, $user->trashed());
		$this->assertNull($user->deleted_at);
278 279

		$user->delete();
280 281
		$this->assertEquals(true, $user->trashed());
		$this->assertNotNull($user->deleted_at);
282

283 284
		$user = Soft::where('name', 'John Doe')->first();
		$this->assertNull($user);
285

286 287
		$this->assertEquals(1, Soft::count());
		$this->assertEquals(2, Soft::withTrashed()->count());
288

289 290 291 292
		$user = Soft::withTrashed()->where('name', 'John Doe')->first();
		$this->assertNotNull($user);
		$this->assertInstanceOf('Carbon\Carbon', $user->deleted_at);
		$this->assertEquals(true, $user->trashed());
293

294 295
		$user->restore();
		$this->assertEquals(2, Soft::count());
296 297
	}

Jens Segers's avatar
Jens Segers committed
298 299 300 301 302 303 304 305
	public function testPrimaryKey()
	{
		$user = new User;
		$this->assertEquals('_id', $user->getKeyName());

		$book = new Book;
		$this->assertEquals('title', $book->getKeyName());

Jens Segers's avatar
Jens Segers committed
306 307
		$book->title = 'A Game of Thrones';
		$book->author = 'George R. R. Martin';
Jens Segers's avatar
Jens Segers committed
308 309
		$book->save();

Jens Segers's avatar
Jens Segers committed
310
		$this->assertEquals('A Game of Thrones', $book->getKey());
Jens Segers's avatar
Jens Segers committed
311

Jens Segers's avatar
Jens Segers committed
312
		$check = Book::find('A Game of Thrones');
Jens Segers's avatar
Jens Segers committed
313
		$this->assertEquals('title', $check->getKeyName());
Jens Segers's avatar
Jens Segers committed
314 315 316 317 318 319
		$this->assertEquals('A Game of Thrones', $check->getKey());
		$this->assertEquals('A Game of Thrones', $check->title);
	}

	public function testScope()
	{
320 321 322 323
		Item::insert([
			['name' => 'knife', 'type' => 'sharp'],
			['name' => 'spoon', 'type' => 'round']
		]);
Jens Segers's avatar
Jens Segers committed
324 325 326

		$sharp = Item::sharp()->get();
		$this->assertEquals(1, $sharp->count());
Jens Segers's avatar
Jens Segers committed
327 328
	}

Jens Segers's avatar
Jens Segers committed
329 330
	public function testToArray()
	{
331
		$item = Item::create(['name' => 'fork', 'type' => 'sharp']);
332

Jens Segers's avatar
Jens Segers committed
333
		$array = $item->toArray();
334
		$keys = array_keys($array); sort($keys);
335
		$this->assertEquals(['_id', 'created_at', 'name', 'type', 'updated_at'], $keys);
Jens Segers's avatar
Jens Segers committed
336 337
		$this->assertTrue(is_string($array['created_at']));
		$this->assertTrue(is_string($array['updated_at']));
338
		$this->assertTrue(is_string($array['_id']));
Jens Segers's avatar
Jens Segers committed
339 340
	}

Jens Segers's avatar
Jens Segers committed
341 342
	public function testUnset()
	{
343 344
		$user1 = User::create(['name' => 'John Doe', 'note1' => 'ABC', 'note2' => 'DEF']);
		$user2 = User::create(['name' => 'Jane Doe', 'note1' => 'ABC', 'note2' => 'DEF']);
Jens Segers's avatar
Jens Segers committed
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361

		$user1->unset('note1');

		$this->assertFalse(isset($user1->note1));
		$this->assertTrue(isset($user1->note2));
		$this->assertTrue(isset($user2->note1));
		$this->assertTrue(isset($user2->note2));

		// Re-fetch to be sure
		$user1 = User::find($user1->_id);
		$user2 = User::find($user2->_id);

		$this->assertFalse(isset($user1->note1));
		$this->assertTrue(isset($user1->note2));
		$this->assertTrue(isset($user2->note1));
		$this->assertTrue(isset($user2->note2));

362
		$user2->unset(['note1', 'note2']);
Jens Segers's avatar
Jens Segers committed
363 364 365 366 367

		$this->assertFalse(isset($user2->note1));
		$this->assertFalse(isset($user2->note2));
	}

368 369
	public function testDates()
	{
370
		$birthday = new DateTime('1980/1/1');
371
		$user = User::create(['name' => 'John Doe', 'birthday' => $birthday]);
372
		$this->assertInstanceOf('Carbon\Carbon', $user->birthday);
373

374 375 376
		$check = User::find($user->_id);
		$this->assertInstanceOf('Carbon\Carbon', $check->birthday);
		$this->assertEquals($user->birthday, $check->birthday);
377

378 379
		$user = User::where('birthday', '>', new DateTime('1975/1/1'))->first();
		$this->assertEquals('John Doe', $user->name);
380 381 382

		// test custom date format for json output
		$json = $user->toArray();
383 384
		$this->assertEquals((string) $user->birthday, $json['birthday']);
		$this->assertEquals((string) $user->created_at, $json['created_at']);
385 386

		// test default date format for json output
387
		$item = Item::create(['name' => 'sword']);
388 389
		$json = $item->toArray();
		$this->assertEquals($item->created_at->format('Y-m-d H:i:s'), $json['created_at']);
Jens Segers's avatar
Jens Segers committed
390

391
		$user = User::create(['name' => 'Jane Doe', 'birthday' => time()]);
Jens Segers's avatar
Jens Segers committed
392 393
		$this->assertInstanceOf('Carbon\Carbon', $user->birthday);

394
		$user = User::create(['name' => 'Jane Doe', 'birthday' => 'Monday 8th of August 2005 03:12:46 PM']);
Jens Segers's avatar
Jens Segers committed
395 396
		$this->assertInstanceOf('Carbon\Carbon', $user->birthday);

397
		$user = User::create(['name' => 'Jane Doe', 'birthday' => '2005-08-08']);
Jens Segers's avatar
Jens Segers committed
398
		$this->assertInstanceOf('Carbon\Carbon', $user->birthday);
Jens Segers's avatar
Jens Segers committed
399

400
		$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => '2005-08-08']]);
Jens Segers's avatar
Jens Segers committed
401
		$this->assertInstanceOf('Carbon\Carbon', $user->getAttribute('entry.date'));
402 403 404

		$user->setAttribute('entry.date', new DateTime);
		$this->assertInstanceOf('Carbon\Carbon', $user->getAttribute('entry.date'));
405 406
	}

Jens Segers's avatar
Jens Segers committed
407 408
	public function testIdAttribute()
	{
409
		$user = User::create(['name' => 'John Doe']);
Jens Segers's avatar
Jens Segers committed
410 411
		$this->assertEquals($user->id, $user->_id);

412
		$user = User::create(['id' => 'custom_id', 'name' => 'John Doe']);
Jens Segers's avatar
Jens Segers committed
413 414 415
		$this->assertNotEquals($user->id, $user->_id);
	}

416 417
	public function testPushPull()
	{
418
		$user = User::create(['name' => 'John Doe']);
Jens Segers's avatar
Jens Segers committed
419 420

		$user->push('tags', 'tag1');
421
		$user->push('tags', ['tag1', 'tag2']);
Jens Segers's avatar
Jens Segers committed
422
		$user->push('tags', 'tag2', true);
423

424
		$this->assertEquals(['tag1', 'tag1', 'tag2'], $user->tags);
425
		$user = User::where('_id', $user->_id)->first();
426
		$this->assertEquals(['tag1', 'tag1', 'tag2'], $user->tags);
427

Jens Segers's avatar
Jens Segers committed
428 429
		$user->pull('tags', 'tag1');

430
		$this->assertEquals(['tag2'], $user->tags);
Jens Segers's avatar
Jens Segers committed
431
		$user = User::where('_id', $user->_id)->first();
432
		$this->assertEquals(['tag2'], $user->tags);
Jens Segers's avatar
Jens Segers committed
433 434

		$user->push('tags', 'tag3');
435
		$user->pull('tags', ['tag2', 'tag3']);
Jens Segers's avatar
Jens Segers committed
436

437
		$this->assertEquals([], $user->tags);
Jens Segers's avatar
Jens Segers committed
438
		$user = User::where('_id', $user->_id)->first();
439
		$this->assertEquals([], $user->tags);
440 441
	}

442 443
	public function testRaw()
	{
444 445 446
		User::create(['name' => 'John Doe', 'age' => 35]);
		User::create(['name' => 'Jane Doe', 'age' => 35]);
		User::create(['name' => 'Harry Hoe', 'age' => 15]);
447 448 449

		$users = User::raw(function($collection)
		{
450
			return $collection->find(['age' => 35]);
451 452 453 454 455 456
		});
		$this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $users);
		$this->assertInstanceOf('Jenssegers\Mongodb\Model', $users[0]);

		$user = User::raw(function($collection)
		{
457
			return $collection->findOne(['age' => 35]);
458 459 460 461 462 463 464 465 466 467 468
		});
		$this->assertInstanceOf('Jenssegers\Mongodb\Model', $user);

		$count = User::raw(function($collection)
		{
			return $collection->count();
		});
		$this->assertEquals(3, $count);

		$result = User::raw(function($collection)
		{
469
			return $collection->insert(['name' => 'Yvonne Yoe', 'age' => 35]);
470 471 472 473
		});
		$this->assertTrue(is_array($result));
	}

474 475
	public function testDotNotation()
	{
476
		$user = User::create([
477 478 479 480 481
			'name' => 'John Doe',
			'address' => [
				'city' => 'Paris',
				'country' => 'France',
			]
482
		]);
483 484 485 486 487 488

		$this->assertEquals('Paris', $user->getAttribute('address.city'));
		$this->assertEquals('Paris', $user['address.city']);
		$this->assertEquals('Paris', $user->{'address.city'});
	}

489
}