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

class ModelTest extends PHPUnit_Framework_TestCase {

5
	public function setUp() {}
Jens Segers's avatar
Jens Segers committed
6 7 8 9

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

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

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

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

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

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

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

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

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

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

		$this->assertEquals(true, $check->exists);
61 62
		$this->assertInstanceOf('Carbon\Carbon', $check->created_at);
		$this->assertInstanceOf('Carbon\Carbon', $check->updated_at);
Jens Segers's avatar
Jens Segers committed
63 64
		$this->assertEquals(1, User::count());

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

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

		$check = User::find($user->_id);
		$this->assertEquals(20, $check->age);
Jens Segers's avatar
Jens Segers committed
72 73 74 75
	}

	public function testDelete()
	{
76
		$user = new User;
Jens Segers's avatar
Jens Segers committed
77 78
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
79 80 81 82 83 84 85 86 87 88 89 90 91
		$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()
	{
92
		$user = new User;
Jens Segers's avatar
Jens Segers committed
93 94
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
95 96 97
		$user->age = 35;
		$user->save();

98
		$user = new User;
Jens Segers's avatar
Jens Segers committed
99 100
		$user->name = 'Jane Doe';
		$user->title = 'user';
Jens Segers's avatar
Jens Segers committed
101 102 103 104 105 106
		$user->age = 32;
		$user->save();

		$all = User::all();

		$this->assertEquals(2, count($all));
107 108
		$this->assertContains('John Doe', $all->lists('name'));
		$this->assertContains('Jane Doe', $all->lists('name'));
Jens Segers's avatar
Jens Segers committed
109 110 111 112
	}

	public function testFind()
	{
113
		$user = new User;
Jens Segers's avatar
Jens Segers committed
114 115
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
116 117 118 119 120 121 122
		$user->age = 35;
		$user->save();

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

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

Jens Segers's avatar
Jens Segers committed
125
		$this->assertEquals('John Doe', $check->name);
Jens Segers's avatar
Jens Segers committed
126 127 128
		$this->assertEquals(35, $check->age);
	}

Jens Segers's avatar
Jens Segers committed
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
	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
154 155 156 157 158 159 160 161 162 163 164 165 166
	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
167 168 169 170 171
	/**
     * @expectedException Illuminate\Database\Eloquent\ModelNotFoundException
     */
	public function testFindOrfail()
	{
172
		User::findOrfail('51c33d8981fec6813e00000a');
Jens Segers's avatar
Jens Segers committed
173 174 175 176 177 178 179 180
	}

	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
181
		$this->assertEquals('Jane Poe', $user->name);
Jens Segers's avatar
Jens Segers committed
182 183 184

		$check = User::where('name', 'Jane Poe')->first();
		$this->assertEquals($user, $check);
Jens Segers's avatar
Jens Segers committed
185 186 187 188
	}

	public function testDestroy()
	{
189
		$user = new User;
Jens Segers's avatar
Jens Segers committed
190 191
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
192 193 194 195 196 197 198 199 200 201
		$user->age = 35;
		$user->save();

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

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

	public function testTouch()
	{
202
		$user = new User;
Jens Segers's avatar
Jens Segers committed
203 204
		$user->name = 'John Doe';
		$user->title = 'admin';
Jens Segers's avatar
Jens Segers committed
205 206 207 208 209
		$user->age = 35;
		$user->save();

		$old = $user->updated_at;

Jens Segers's avatar
Jens Segers committed
210
		sleep(1);
Jens Segers's avatar
Jens Segers committed
211 212 213 214 215 216
		$user->touch();
		$check = User::find($user->_id);

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

217 218 219
	public function testSoftDelete()
	{
		$user = new Soft;
Jens Segers's avatar
Jens Segers committed
220
		$user->name = 'Softy';
221 222 223 224 225 226 227 228 229 230 231 232 233
		$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());
234 235

		$check = $all[0];
236
		$this->assertInstanceOf('Carbon\Carbon', $check->deleted_at);
237 238 239 240 241
		$this->assertEquals(true, $check->trashed());

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

Jens Segers's avatar
Jens Segers committed
244 245 246 247 248 249 250 251
	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
252 253
		$book->title = 'A Game of Thrones';
		$book->author = 'George R. R. Martin';
Jens Segers's avatar
Jens Segers committed
254 255
		$book->save();

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

Jens Segers's avatar
Jens Segers committed
258
		$check = Book::find('A Game of Thrones');
Jens Segers's avatar
Jens Segers committed
259
		$this->assertEquals('title', $check->getKeyName());
Jens Segers's avatar
Jens Segers committed
260 261 262 263 264 265 266 267 268 269 270 271 272
		$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
273 274
	}

Jens Segers's avatar
Jens Segers committed
275 276
	public function testToArray()
	{
Jens Segers's avatar
Jens Segers committed
277
		$item = Item::create(array('name' => 'fork', 'type' => 'sharp'));
278

Jens Segers's avatar
Jens Segers committed
279
		$array = $item->toArray();
280 281
		$keys = array_keys($array); sort($keys);
		$this->assertEquals(array('_id', 'created_at', 'name', 'type', 'updated_at'), $keys);
Jens Segers's avatar
Jens Segers committed
282 283
		$this->assertTrue(is_string($array['created_at']));
		$this->assertTrue(is_string($array['updated_at']));
Jens Segers's avatar
Jens Segers committed
284 285
	}

Jens Segers's avatar
Jens Segers committed
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
	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));
	}

313 314
	public function testDates()
	{
315
		$user = User::create(array('name' => 'John Doe', 'birthday' => new DateTime('1980/1/1')));
316
		$this->assertInstanceOf('Carbon\Carbon', $user->birthday);
317

318 319 320
		$check = User::find($user->_id);
		$this->assertInstanceOf('Carbon\Carbon', $check->birthday);
		$this->assertEquals($user->birthday, $check->birthday);
321

322 323
		$user = User::where('birthday', '>', new DateTime('1975/1/1'))->first();
		$this->assertEquals('John Doe', $user->name);
324 325
	}

Jens Segers's avatar
Jens Segers committed
326 327 328 329 330 331 332 333 334
	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);
	}

335 336 337 338 339 340 341
	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
342
		$this->assertTrue(is_int($result));
343 344 345 346
		$this->assertTrue(is_array($user->tags));
		$this->assertEquals(1, count($user->tags));
	}

347
}