ModelTest.php 10.1 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 25
		$this->assertEquals(false, $user->exists);
		$this->assertEquals('users', $user->getTable());
		$this->assertEquals('_id', $user->getKeyName());
		$this->assertEquals('users._id', $user->getQualifiedKeyName());
	}

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

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

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

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

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

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

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

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

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

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

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

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

		$user->update(array('age' => 20));

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

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

	public function testDelete()
	{
84
		$user = new User;
Jens Segers's avatar
Jens Segers committed
85 86
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
87 88 89 90 91 92 93 94 95 96 97 98 99
		$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()
	{
100
		$user = new User;
Jens Segers's avatar
Jens Segers committed
101 102
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
103 104 105
		$user->age = 35;
		$user->save();

106
		$user = new User;
Jens Segers's avatar
Jens Segers committed
107 108
		$user->name = 'Jane Doe';
		$user->title = 'user';
Jens Segers's avatar
Jens Segers committed
109 110 111 112 113 114
		$user->age = 32;
		$user->save();

		$all = User::all();

		$this->assertEquals(2, count($all));
115 116
		$this->assertContains('John Doe', $all->lists('name'));
		$this->assertContains('Jane Doe', $all->lists('name'));
Jens Segers's avatar
Jens Segers committed
117 118 119 120
	}

	public function testFind()
	{
121
		$user = new User;
Jens Segers's avatar
Jens Segers committed
122 123
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
124 125 126 127 128 129 130
		$user->age = 35;
		$user->save();

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

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

Jens Segers's avatar
Jens Segers committed
133
		$this->assertEquals('John Doe', $check->name);
Jens Segers's avatar
Jens Segers committed
134 135 136
		$this->assertEquals(35, $check->age);
	}

Jens Segers's avatar
Jens Segers committed
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
	public function testGet()
	{
		User::insert(array(
			array('name' => 'John Doe'),
			array('name' => 'Jane Doe')
		));

		$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()
	{
		User::insert(array(
			array('name' => 'John Doe'),
			array('name' => 'Jane Doe')
		));

		$user = User::get()->first();
		$this->assertInstanceOf('Jenssegers\Mongodb\Model', $user);
		$this->assertEquals('John Doe', $user->name);
	}

Jens Segers's avatar
Jens Segers committed
162 163 164 165 166 167 168 169 170 171 172 173 174
	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
175 176
	public function testFindOrfail()
	{
177
		$this->setExpectedException('Illuminate\Database\Eloquent\ModelNotFoundException');
178
		User::findOrfail('51c33d8981fec6813e00000a');
Jens Segers's avatar
Jens Segers committed
179 180 181 182 183 184 185 186
	}

	public function testCreate()
	{
		$user = User::create(array('name' => 'Jane Poe'));

		$this->assertInstanceOf('Jenssegers\Mongodb\Model', $user);
		$this->assertEquals(true, $user->exists);
Jens Segers's avatar
Jens Segers committed
187
		$this->assertEquals('Jane Poe', $user->name);
Jens Segers's avatar
Jens Segers committed
188 189 190

		$check = User::where('name', 'Jane Poe')->first();
		$this->assertEquals($user, $check);
Jens Segers's avatar
Jens Segers committed
191 192 193 194
	}

	public function testDestroy()
	{
195
		$user = new User;
Jens Segers's avatar
Jens Segers committed
196 197
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
198 199 200 201 202 203 204 205 206 207
		$user->age = 35;
		$user->save();

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

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

	public function testTouch()
	{
208
		$user = new User;
Jens Segers's avatar
Jens Segers committed
209 210
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
211 212 213 214 215
		$user->age = 35;
		$user->save();

		$old = $user->updated_at;

Jens Segers's avatar
Jens Segers committed
216
		sleep(1);
Jens Segers's avatar
Jens Segers committed
217 218 219 220 221 222
		$user->touch();
		$check = User::find($user->_id);

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

223 224 225
	public function testSoftDelete()
	{
		$user = new Soft;
Jens Segers's avatar
Jens Segers committed
226
		$user->name = 'Softy';
227 228 229 230 231 232 233 234 235 236 237 238 239
		$user->save();
		$this->assertEquals(true, $user->exists);

		$user->delete();

		$check = Soft::find($user->_id);
		$this->assertEquals(null, $check);

		$all = Soft::get();
		$this->assertEquals(0, $all->count());

		$all = Soft::withTrashed()->get();
		$this->assertEquals(1, $all->count());
240 241

		$check = $all[0];
242
		$this->assertInstanceOf('Carbon\Carbon', $check->deleted_at);
243 244 245 246 247
		$this->assertEquals(true, $check->trashed());

		$check->restore();
		$all = Soft::get();
		$this->assertEquals(1, $all->count());
248 249
	}

Jens Segers's avatar
Jens Segers committed
250 251 252 253 254 255 256 257
	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
258 259
		$book->title = 'A Game of Thrones';
		$book->author = 'George R. R. Martin';
Jens Segers's avatar
Jens Segers committed
260 261
		$book->save();

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

Jens Segers's avatar
Jens Segers committed
264
		$check = Book::find('A Game of Thrones');
Jens Segers's avatar
Jens Segers committed
265
		$this->assertEquals('title', $check->getKeyName());
Jens Segers's avatar
Jens Segers committed
266 267 268 269 270 271 272 273 274 275 276 277 278
		$this->assertEquals('A Game of Thrones', $check->getKey());
		$this->assertEquals('A Game of Thrones', $check->title);
	}

	public function testScope()
	{
		Item::insert(array(
			array('name' => 'knife', 'type' => 'sharp'),
			array('name' => 'spoon', 'type' => 'round')
		));

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

Jens Segers's avatar
Jens Segers committed
281 282
	public function testToArray()
	{
Jens Segers's avatar
Jens Segers committed
283
		$item = Item::create(array('name' => 'fork', 'type' => 'sharp'));
284

Jens Segers's avatar
Jens Segers committed
285
		$array = $item->toArray();
286 287
		$keys = array_keys($array); sort($keys);
		$this->assertEquals(array('_id', 'created_at', 'name', 'type', 'updated_at'), $keys);
Jens Segers's avatar
Jens Segers committed
288 289
		$this->assertTrue(is_string($array['created_at']));
		$this->assertTrue(is_string($array['updated_at']));
Jens Segers's avatar
Jens Segers committed
290 291
	}

Jens Segers's avatar
Jens Segers committed
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
	public function testUnset()
	{
		$user1 = User::create(array('name' => 'John Doe', 'note1' => 'ABC', 'note2' => 'DEF'));
		$user2 = User::create(array('name' => 'Jane Doe', 'note1' => 'ABC', 'note2' => 'DEF'));

		$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));

		$user2->unset(array('note1', 'note2'));

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

319 320
	public function testDates()
	{
321 322
		$birthday = new DateTime('1980/1/1');
		$user = User::create(array('name' => 'John Doe', 'birthday' => $birthday));
323
		$this->assertInstanceOf('Carbon\Carbon', $user->birthday);
324

325 326 327
		$check = User::find($user->_id);
		$this->assertInstanceOf('Carbon\Carbon', $check->birthday);
		$this->assertEquals($user->birthday, $check->birthday);
328

329 330
		$user = User::where('birthday', '>', new DateTime('1975/1/1'))->first();
		$this->assertEquals('John Doe', $user->name);
331 332 333 334 335 336 337 338 339 340

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

		// test default date format for json output
		$item = Item::create(array('name' => 'sword'));
		$json = $item->toArray();
		$this->assertEquals($item->created_at->format('Y-m-d H:i:s'), $json['created_at']);
341 342
	}

Jens Segers's avatar
Jens Segers committed
343 344 345 346 347 348 349 350 351
	public function testIdAttribute()
	{
		$user = User::create(array('name' => 'John Doe'));
		$this->assertEquals($user->id, $user->_id);

		$user = User::create(array('id' => 'custom_id', 'name' => 'John Doe'));
		$this->assertNotEquals($user->id, $user->_id);
	}

352 353 354 355 356 357 358
	public function testPushPull()
	{
		$user = User::create(array('name' => 'John Doe', 'tags' => array()));

		$result = User::where('_id', $user->_id)->push('tags', 'tag1');
		$user = User::where('_id', $user->_id)->first();

Jens Segers's avatar
Jens Segers committed
359
		$this->assertTrue(is_int($result));
360 361 362 363
		$this->assertTrue(is_array($user->tags));
		$this->assertEquals(1, count($user->tags));
	}

364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
	public function testRaw()
	{
		User::create(array('name' => 'John Doe', 'age' => 35));
		User::create(array('name' => 'Jane Doe', 'age' => 35));
		User::create(array('name' => 'Harry Hoe', 'age' => 15));

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

		$user = User::raw(function($collection)
		{
			return $collection->findOne(array('age' => 35));
		});
		$this->assertInstanceOf('Jenssegers\Mongodb\Model', $user);

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

		$result = User::raw(function($collection)
		{
			return $collection->insert(array('name' => 'Yvonne Yoe', 'age' => 35));
		});
		$this->assertTrue(is_array($result));
	}

396
}