EmbeddedRelationsTest.php 30.8 KB
Newer Older
1 2
<?php

Jens Segers's avatar
Jens Segers committed
3 4
class EmbeddedRelationsTest extends TestCase
{
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

    public function tearDown()
    {
        Mockery::close();

        User::truncate();
        Book::truncate();
        Item::truncate();
        Role::truncate();
        Client::truncate();
        Group::truncate();
        Photo::truncate();
    }

    public function testEmbedsManySave()
    {
21 22
        $user = User::create(['name' => 'John Doe']);
        $address = new Address(['city' => 'London']);
23 24

        $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
25 26 27 28
        $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
        $events->shouldReceive('until')->once()->with('eloquent.creating: ' . get_class($address), $address)->andReturn(true);
        $events->shouldReceive('fire')->once()->with('eloquent.created: ' . get_class($address), $address);
        $events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($address), $address);
29 30 31 32

        $address = $user->addresses()->save($address);
        $address->unsetEventDispatcher();

33 34
        $this->assertNotNull($user->addresses);
        $this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $user->addresses);
35
        $this->assertEquals(['London'], $user->addresses->lists('city')->all());
36 37 38 39 40 41
        $this->assertInstanceOf('DateTime', $address->created_at);
        $this->assertInstanceOf('DateTime', $address->updated_at);
        $this->assertNotNull($address->_id);
        $this->assertTrue(is_string($address->_id));

        $raw = $address->getAttributes();
Jens Segers's avatar
Jens Segers committed
42
        $this->assertInstanceOf('MongoDB\BSON\ObjectID', $raw['_id']);
43

44
        $address = $user->addresses()->save(new Address(['city' => 'Paris']));
45 46

        $user = User::find($user->_id);
47
        $this->assertEquals(['London', 'Paris'], $user->addresses->lists('city')->all());
48 49

        $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
50 51 52 53
        $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
        $events->shouldReceive('until')->once()->with('eloquent.updating: ' . get_class($address), $address)->andReturn(true);
        $events->shouldReceive('fire')->once()->with('eloquent.updated: ' . get_class($address), $address);
        $events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($address), $address);
54 55 56 57 58 59 60 61 62

        $address->city = 'New York';
        $user->addresses()->save($address);
        $address->unsetEventDispatcher();

        $this->assertEquals(2, count($user->addresses));
        $this->assertEquals(2, count($user->addresses()->get()));
        $this->assertEquals(2, $user->addresses->count());
        $this->assertEquals(2, $user->addresses()->count());
63
        $this->assertEquals(['London', 'New York'], $user->addresses->lists('city')->all());
64 65

        $freshUser = User::find($user->_id);
66
        $this->assertEquals(['London', 'New York'], $freshUser->addresses->lists('city')->all());
67 68 69 70 71 72 73 74 75

        $address = $user->addresses->first();
        $this->assertEquals('London', $address->city);
        $this->assertInstanceOf('DateTime', $address->created_at);
        $this->assertInstanceOf('DateTime', $address->updated_at);
        $this->assertInstanceOf('User', $address->user);
        $this->assertEmpty($address->relationsToArray()); // prevent infinite loop

        $user = User::find($user->_id);
76
        $user->addresses()->save(new Address(['city' => 'Bruxelles']));
77
        $this->assertEquals(['London', 'New York', 'Bruxelles'], $user->addresses->lists('city')->all());
78

79 80 81
        $address = $user->addresses[1];
        $address->city = "Manhattan";
        $user->addresses()->save($address);
82
        $this->assertEquals(['London', 'Manhattan', 'Bruxelles'], $user->addresses->lists('city')->all());
83 84

        $freshUser = User::find($user->_id);
85
        $this->assertEquals(['London', 'Manhattan', 'Bruxelles'], $freshUser->addresses->lists('city')->all());
86 87
    }

88 89 90 91
    // public function testEmbedsManySaveModel()
    // {
    //     $user = User::create(['name' => 'John Doe']);
    //     $address = new Address(['city' => 'London']);
92

93 94 95 96 97
    //     $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
    //     $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
    //     $events->shouldReceive('until')->once()->with('eloquent.creating: ' . get_class($address), $address)->andReturn(true);
    //     $events->shouldReceive('fire')->once()->with('eloquent.created: ' . get_class($address), $address);
    //     $events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($address), $address);
98

99
    //     $address->save();
100

101 102 103 104 105
    //     $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
    //     $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
    //     $events->shouldReceive('until')->once()->with('eloquent.updating: ' . get_class($address), $address)->andReturn(true);
    //     $events->shouldReceive('fire')->once()->with('eloquent.updated: ' . get_class($address), $address);
    //     $events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($address), $address);
106

107 108 109
    //     $address->city = 'Paris';
    //     $address->save();
    // }
110

111 112
    public function testEmbedsToArray()
    {
113 114
        $user = User::create(['name' => 'John Doe']);
        $user->addresses()->saveMany([new Address(['city' => 'London']), new Address(['city' => 'Bristol'])]);
115 116 117 118 119 120

        $array = $user->toArray();
        $this->assertFalse(array_key_exists('_addresses', $array));
        $this->assertTrue(array_key_exists('addresses', $array));
    }

121 122
    public function testEmbedsManyAssociate()
    {
123 124
        $user = User::create(['name' => 'John Doe']);
        $address = new Address(['city' => 'London']);
125

126
        $user->addresses()->associate($address);
127
        $this->assertEquals(['London'], $user->addresses->lists('city')->all());
128 129 130
        $this->assertNotNull($address->_id);

        $freshUser = User::find($user->_id);
131
        $this->assertEquals([], $freshUser->addresses->lists('city')->all());
132 133 134

        $address->city = 'Londinium';
        $user->addresses()->associate($address);
135
        $this->assertEquals(['Londinium'], $user->addresses->lists('city')->all());
136 137

        $freshUser = User::find($user->_id);
138
        $this->assertEquals([], $freshUser->addresses->lists('city')->all());
139 140 141 142
    }

    public function testEmbedsManySaveMany()
    {
143 144
        $user = User::create(['name' => 'John Doe']);
        $user->addresses()->saveMany([new Address(['city' => 'London']), new Address(['city' => 'Bristol'])]);
145
        $this->assertEquals(['London', 'Bristol'], $user->addresses->lists('city')->all());
146 147

        $freshUser = User::find($user->id);
148
        $this->assertEquals(['London', 'Bristol'], $freshUser->addresses->lists('city')->all());
149 150 151 152
    }

    public function testEmbedsManyDuplicate()
    {
153 154
        $user = User::create(['name' => 'John Doe']);
        $address = new Address(['city' => 'London']);
155 156 157
        $user->addresses()->save($address);
        $user->addresses()->save($address);
        $this->assertEquals(1, $user->addresses->count());
158
        $this->assertEquals(['London'], $user->addresses->lists('city')->all());
159 160 161 162 163 164 165

        $user = User::find($user->id);
        $this->assertEquals(1, $user->addresses->count());

        $address->city = 'Paris';
        $user->addresses()->save($address);
        $this->assertEquals(1, $user->addresses->count());
166
        $this->assertEquals(['Paris'], $user->addresses->lists('city')->all());
167

168
        $user->addresses()->create(['_id' => $address->_id, 'city' => 'Bruxelles']);
169
        $this->assertEquals(1, $user->addresses->count());
170
        $this->assertEquals(['Bruxelles'], $user->addresses->lists('city')->all());
171 172 173 174
    }

    public function testEmbedsManyCreate()
    {
175 176
        $user = User::create([]);
        $address = $user->addresses()->create(['city' => 'Bruxelles']);
177 178
        $this->assertInstanceOf('Address', $address);
        $this->assertTrue(is_string($address->_id));
179
        $this->assertEquals(['Bruxelles'], $user->addresses->lists('city')->all());
180 181

        $raw = $address->getAttributes();
Jens Segers's avatar
Jens Segers committed
182
        $this->assertInstanceOf('MongoDB\BSON\ObjectID', $raw['_id']);
183 184

        $freshUser = User::find($user->id);
185
        $this->assertEquals(['Bruxelles'], $freshUser->addresses->lists('city')->all());
186

187 188
        $user = User::create([]);
        $address = $user->addresses()->create(['_id' => '', 'city' => 'Bruxelles']);
189 190 191
        $this->assertTrue(is_string($address->_id));

        $raw = $address->getAttributes();
Jens Segers's avatar
Jens Segers committed
192
        $this->assertInstanceOf('MongoDB\BSON\ObjectID', $raw['_id']);
193 194 195 196
    }

    public function testEmbedsManyCreateMany()
    {
197 198
        $user = User::create([]);
        list($bruxelles, $paris) = $user->addresses()->createMany([['city' => 'Bruxelles'], ['city' => 'Paris']]);
199 200
        $this->assertInstanceOf('Address', $bruxelles);
        $this->assertEquals('Bruxelles', $bruxelles->city);
201
        $this->assertEquals(['Bruxelles', 'Paris'], $user->addresses->lists('city')->all());
202 203

        $freshUser = User::find($user->id);
204
        $this->assertEquals(['Bruxelles', 'Paris'], $freshUser->addresses->lists('city')->all());
205 206
    }

Jens Segers's avatar
Jens Segers committed
207
    public function testEmbedsManyDestroy()
208
    {
209 210
        $user = User::create(['name' => 'John Doe']);
        $user->addresses()->saveMany([new Address(['city' => 'London']), new Address(['city' => 'Bristol']), new Address(['city' => 'Bruxelles'])]);
211 212 213 214

        $address = $user->addresses->first();

        $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
215 216
        $events->shouldReceive('until')->once()->with('eloquent.deleting: ' . get_class($address), Mockery::type('Address'))->andReturn(true);
        $events->shouldReceive('fire')->once()->with('eloquent.deleted: ' . get_class($address), Mockery::type('Address'));
217 218

        $user->addresses()->destroy($address->_id);
219
        $this->assertEquals(['Bristol', 'Bruxelles'], $user->addresses->lists('city')->all());
220 221 222 223 224

        $address->unsetEventDispatcher();

        $address = $user->addresses->first();
        $user->addresses()->destroy($address);
225
        $this->assertEquals(['Bruxelles'], $user->addresses->lists('city')->all());
226

227 228
        $user->addresses()->create(['city' => 'Paris']);
        $user->addresses()->create(['city' => 'San Francisco']);
229 230

        $freshUser = User::find($user->id);
231
        $this->assertEquals(['Bruxelles', 'Paris', 'San Francisco'], $freshUser->addresses->lists('city')->all());
232 233 234

        $ids = $user->addresses->lists('_id');
        $user->addresses()->destroy($ids);
235
        $this->assertEquals([], $user->addresses->lists('city')->all());
236 237

        $freshUser = User::find($user->id);
238
        $this->assertEquals([], $freshUser->addresses->lists('city')->all());
239

240 241
        list($london, $bristol, $bruxelles) = $user->addresses()->saveMany([new Address(['city' => 'London']), new Address(['city' => 'Bristol']), new Address(['city' => 'Bruxelles'])]);
        $user->addresses()->destroy([$london, $bruxelles]);
242
        $this->assertEquals(['Bristol'], $user->addresses->lists('city')->all());
Jens Segers's avatar
Jens Segers committed
243
    }
244

245 246
    public function testEmbedsManyDelete()
    {
247 248
        $user = User::create(['name' => 'John Doe']);
        $user->addresses()->saveMany([new Address(['city' => 'London']), new Address(['city' => 'Bristol']), new Address(['city' => 'Bruxelles'])]);
249 250 251 252

        $address = $user->addresses->first();

        $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
253 254
        $events->shouldReceive('until')->once()->with('eloquent.deleting: ' . get_class($address), Mockery::type('Address'))->andReturn(true);
        $events->shouldReceive('fire')->once()->with('eloquent.deleted: ' . get_class($address), Mockery::type('Address'));
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270

        $address->delete();

        $this->assertEquals(2, $user->addresses()->count());
        $this->assertEquals(2, $user->addresses->count());

        $address->unsetEventDispatcher();

        $address = $user->addresses->first();
        $address->delete();

        $user = User::where('name', 'John Doe')->first();
        $this->assertEquals(1, $user->addresses()->count());
        $this->assertEquals(1, $user->addresses->count());
    }

271 272
    public function testEmbedsManyDissociate()
    {
273 274
        $user = User::create([]);
        $cordoba = $user->addresses()->create(['city' => 'Cordoba']);
275 276 277 278 279 280 281 282 283 284

        $user->addresses()->dissociate($cordoba->id);

        $freshUser = User::find($user->id);
        $this->assertEquals(0, $user->addresses->count());
        $this->assertEquals(1, $freshUser->addresses->count());
    }

    public function testEmbedsManyAliases()
    {
285 286
        $user = User::create(['name' => 'John Doe']);
        $address = new Address(['city' => 'London']);
287 288

        $address = $user->addresses()->attach($address);
289
        $this->assertEquals(['London'], $user->addresses->lists('city')->all());
290 291

        $user->addresses()->detach($address);
292
        $this->assertEquals([], $user->addresses->lists('city')->all());
293 294 295 296
    }

    public function testEmbedsManyCreatingEventReturnsFalse()
    {
297 298
        $user = User::create(['name' => 'John Doe']);
        $address = new Address(['city' => 'London']);
299 300

        $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
301 302
        $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
        $events->shouldReceive('until')->once()->with('eloquent.creating: ' . get_class($address), $address)->andReturn(false);
303 304 305 306 307 308 309

        $this->assertFalse($user->addresses()->save($address));
        $address->unsetEventDispatcher();
    }

    public function testEmbedsManySavingEventReturnsFalse()
    {
310 311
        $user = User::create(['name' => 'John Doe']);
        $address = new Address(['city' => 'Paris']);
312 313 314
        $address->exists = true;

        $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
315
        $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(false);
316 317 318 319 320 321 322

        $this->assertFalse($user->addresses()->save($address));
        $address->unsetEventDispatcher();
    }

    public function testEmbedsManyUpdatingEventReturnsFalse()
    {
323 324
        $user = User::create(['name' => 'John Doe']);
        $address = new Address(['city' => 'New York']);
325 326 327
        $user->addresses()->save($address);

        $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
328 329
        $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($address), $address)->andReturn(true);
        $events->shouldReceive('until')->once()->with('eloquent.updating: ' . get_class($address), $address)->andReturn(false);
330 331 332 333 334 335 336 337 338

        $address->city = 'Warsaw';

        $this->assertFalse($user->addresses()->save($address));
        $address->unsetEventDispatcher();
    }

    public function testEmbedsManyDeletingEventReturnsFalse()
    {
339 340
        $user = User::create(['name' => 'John Doe']);
        $user->addresses()->save(new Address(['city' => 'New York']));
341 342 343 344

        $address = $user->addresses->first();

        $address->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
345
        $events->shouldReceive('until')->once()->with('eloquent.deleting: ' . get_class($address), Mockery::mustBe($address))->andReturn(false);
346 347

        $this->assertEquals(0, $user->addresses()->destroy($address));
348
        $this->assertEquals(['New York'], $user->addresses->lists('city')->all());
349 350 351 352 353 354

        $address->unsetEventDispatcher();
    }

    public function testEmbedsManyFindOrContains()
    {
355 356 357
        $user = User::create(['name' => 'John Doe']);
        $address1 = $user->addresses()->save(new Address(['city' => 'New York']));
        $address2 = $user->addresses()->save(new Address(['city' => 'Paris']));
358 359 360 361 362 363 364 365 366 367 368 369 370

        $address = $user->addresses()->find($address1->_id);
        $this->assertEquals($address->city, $address1->city);

        $address = $user->addresses()->find($address2->_id);
        $this->assertEquals($address->city, $address2->city);

        $this->assertTrue($user->addresses()->contains($address2->_id));
        $this->assertFalse($user->addresses()->contains('123'));
    }

    public function testEmbedsManyEagerLoading()
    {
371 372 373
        $user1 = User::create(['name' => 'John Doe']);
        $user1->addresses()->save(new Address(['city' => 'New York']));
        $user1->addresses()->save(new Address(['city' => 'Paris']));
374

375 376 377
        $user2 = User::create(['name' => 'Jane Doe']);
        $user2->addresses()->save(new Address(['city' => 'Berlin']));
        $user2->addresses()->save(new Address(['city' => 'Paris']));
378 379 380 381

        $user = User::find($user1->id);
        $relations = $user->getRelations();
        $this->assertFalse(array_key_exists('addresses', $relations));
382 383
        $this->assertArrayHasKey('addresses', $user->toArray());
        $this->assertTrue(is_array($user->toArray()['addresses']));
384 385 386 387 388

        $user = User::with('addresses')->get()->first();
        $relations = $user->getRelations();
        $this->assertTrue(array_key_exists('addresses', $relations));
        $this->assertEquals(2, $relations['addresses']->count());
389
        $this->assertArrayHasKey('addresses', $user->toArray());
390
        $this->assertTrue(is_array($user->toArray()['addresses']));
391 392
    }

393
    public function testEmbedsManyDeleteAll()
394
    {
395 396 397
        $user1 = User::create(['name' => 'John Doe']);
        $user1->addresses()->save(new Address(['city' => 'New York']));
        $user1->addresses()->save(new Address(['city' => 'Paris']));
398

399 400 401
        $user2 = User::create(['name' => 'Jane Doe']);
        $user2->addresses()->save(new Address(['city' => 'Berlin']));
        $user2->addresses()->save(new Address(['city' => 'Paris']));
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418

        $user1->addresses()->delete();
        $this->assertEquals(0, $user1->addresses()->count());
        $this->assertEquals(0, $user1->addresses->count());
        $this->assertEquals(2, $user2->addresses()->count());
        $this->assertEquals(2, $user2->addresses->count());

        $user1 = User::find($user1->id);
        $user2 = User::find($user2->id);
        $this->assertEquals(0, $user1->addresses()->count());
        $this->assertEquals(0, $user1->addresses->count());
        $this->assertEquals(2, $user2->addresses()->count());
        $this->assertEquals(2, $user2->addresses->count());
    }

    public function testEmbedsManyCollectionMethods()
    {
419 420 421 422 423
        $user = User::create(['name' => 'John Doe']);
        $user->addresses()->save(new Address(['city' => 'Paris', 'country' => 'France', 'visited' => 4, 'created_at' => new DateTime('3 days ago')]));
        $user->addresses()->save(new Address(['city' => 'Bruges', 'country' => 'Belgium', 'visited' => 7, 'created_at' => new DateTime('5 days ago')]));
        $user->addresses()->save(new Address(['city' => 'Brussels', 'country' => 'Belgium', 'visited' => 2, 'created_at' => new DateTime('4 days ago')]));
        $user->addresses()->save(new Address(['city' => 'Ghent', 'country' => 'Belgium', 'visited' => 13, 'created_at' => new DateTime('2 days ago')]));
424

425 426 427 428
        $this->assertEquals(['Paris', 'Bruges', 'Brussels', 'Ghent'], $user->addresses()->lists('city')->all());
        $this->assertEquals(['Bruges', 'Brussels', 'Ghent', 'Paris'], $user->addresses()->sortBy('city')->lists('city')->all());
        $this->assertEquals([], $user->addresses()->where('city', 'New York')->lists('city')->all());
        $this->assertEquals(['Bruges', 'Brussels', 'Ghent'], $user->addresses()->where('country', 'Belgium')->lists('city')->all());
429
        $this->assertEquals(['Bruges', 'Brussels', 'Ghent'], $user->addresses()->where('country', 'Belgium')->sortBy('city')->lists('city')->all());
430

431
        $results = $user->addresses->first();
432 433
        $this->assertInstanceOf('Address', $results);

434 435
        $results = $user->addresses()->where('country', 'Belgium');
        $this->assertInstanceOf('Illuminate\Database\Eloquent\Collection', $results);
436 437
        $this->assertEquals(3, $results->count());

438
        $results = $user->addresses()->whereIn('visited', [7, 13]);
439
        $this->assertEquals(2, $results->count());
440 441 442 443
    }

    public function testEmbedsOne()
    {
444 445
        $user = User::create(['name' => 'John Doe']);
        $father = new User(['name' => 'Mark Doe']);
446 447

        $father->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
448 449 450 451
        $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($father), $father)->andReturn(true);
        $events->shouldReceive('until')->once()->with('eloquent.creating: ' . get_class($father), $father)->andReturn(true);
        $events->shouldReceive('fire')->once()->with('eloquent.created: ' . get_class($father), $father);
        $events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($father), $father);
452 453 454 455

        $father = $user->father()->save($father);
        $father->unsetEventDispatcher();

456
        $this->assertNotNull($user->father);
457 458 459 460 461 462 463
        $this->assertEquals('Mark Doe', $user->father->name);
        $this->assertInstanceOf('DateTime', $father->created_at);
        $this->assertInstanceOf('DateTime', $father->updated_at);
        $this->assertNotNull($father->_id);
        $this->assertTrue(is_string($father->_id));

        $raw = $father->getAttributes();
Jens Segers's avatar
Jens Segers committed
464
        $this->assertInstanceOf('MongoDB\BSON\ObjectID', $raw['_id']);
465 466

        $father->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
467 468 469 470
        $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($father), $father)->andReturn(true);
        $events->shouldReceive('until')->once()->with('eloquent.updating: ' . get_class($father), $father)->andReturn(true);
        $events->shouldReceive('fire')->once()->with('eloquent.updated: ' . get_class($father), $father);
        $events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($father), $father);
471 472 473 474 475

        $father->name = 'Tom Doe';
        $user->father()->save($father);
        $father->unsetEventDispatcher();

476
        $this->assertNotNull($user->father);
477 478
        $this->assertEquals('Tom Doe', $user->father->name);

479
        $father = new User(['name' => 'Jim Doe']);
480 481

        $father->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
482 483 484 485
        $events->shouldReceive('until')->once()->with('eloquent.saving: ' . get_class($father), $father)->andReturn(true);
        $events->shouldReceive('until')->once()->with('eloquent.creating: ' . get_class($father), $father)->andReturn(true);
        $events->shouldReceive('fire')->once()->with('eloquent.created: ' . get_class($father), $father);
        $events->shouldReceive('fire')->once()->with('eloquent.saved: ' . get_class($father), $father);
486 487 488 489

        $father = $user->father()->save($father);
        $father->unsetEventDispatcher();

490
        $this->assertNotNull($user->father);
491 492 493
        $this->assertEquals('Jim Doe', $user->father->name);
    }

494 495
    public function testEmbedsOneAssociate()
    {
496 497
        $user = User::create(['name' => 'John Doe']);
        $father = new User(['name' => 'Mark Doe']);
498 499

        $father->setEventDispatcher($events = Mockery::mock('Illuminate\Events\Dispatcher'));
500
        $events->shouldReceive('until')->times(0)->with('eloquent.saving: ' . get_class($father), $father);
501 502 503 504

        $father = $user->father()->associate($father);
        $father->unsetEventDispatcher();

505
        $this->assertNotNull($user->father);
506 507 508
        $this->assertEquals('Mark Doe', $user->father->name);
    }

Jens Segers's avatar
Jens Segers committed
509 510 511 512 513 514
    public function testEmbedsOneNullAssociation()
    {
        $user = User::create();
        $this->assertNull($user->father);
    }

515 516
    public function testEmbedsOneDelete()
    {
517 518
        $user = User::create(['name' => 'John Doe']);
        $father = $user->father()->save(new User(['name' => 'Mark Doe']));
519 520 521 522 523

        $user->father()->delete();
        $this->assertNull($user->father);
    }

524 525
    public function testEmbedsManyToArray()
    {
526 527 528 529
        $user = User::create(['name' => 'John Doe']);
        $user->addresses()->save(new Address(['city' => 'New York']));
        $user->addresses()->save(new Address(['city' => 'Paris']));
        $user->addresses()->save(new Address(['city' => 'Brussels']));
530 531

        $array = $user->toArray();
532 533
        $this->assertArrayHasKey('addresses', $array);
        $this->assertTrue(is_array($array['addresses']));
534 535
    }

536 537
    public function testEmbeddedSave()
    {
538 539 540
        $user = User::create(['name' => 'John Doe']);
        $address = $user->addresses()->create(['city' => 'New York']);
        $father = $user->father()->create(['name' => 'Mark Doe']);
541 542 543 544 545 546 547 548 549 550 551 552 553

        $address->city = 'Paris';
        $address->save();

        $father->name = 'Steve Doe';
        $father->save();

        $this->assertEquals('Paris', $user->addresses->first()->city);
        $this->assertEquals('Steve Doe', $user->father->name);

        $user = User::where('name', 'John Doe')->first();
        $this->assertEquals('Paris', $user->addresses->first()->city);
        $this->assertEquals('Steve Doe', $user->father->name);
Jens Segers's avatar
Jens Segers committed
554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569

        $address = $user->addresses()->first();
        $father = $user->father;

        $address->city = 'Ghent';
        $address->save();

        $father->name = 'Mark Doe';
        $father->save();

        $this->assertEquals('Ghent', $user->addresses->first()->city);
        $this->assertEquals('Mark Doe', $user->father->name);

        $user = User::where('name', 'John Doe')->first();
        $this->assertEquals('Ghent', $user->addresses->first()->city);
        $this->assertEquals('Mark Doe', $user->father->name);
570 571
    }

572 573
    public function testNestedEmbedsOne()
    {
574 575 576 577
        $user = User::create(['name' => 'John Doe']);
        $father = $user->father()->create(['name' => 'Mark Doe']);
        $grandfather = $father->father()->create(['name' => 'Steve Doe']);
        $greatgrandfather = $grandfather->father()->create(['name' => 'Tom Doe']);
578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601

        $user->name = 'Tim Doe';
        $user->save();

        $father->name = 'Sven Doe';
        $father->save();

        $greatgrandfather->name = 'Ron Doe';
        $greatgrandfather->save();

        $this->assertEquals('Tim Doe', $user->name);
        $this->assertEquals('Sven Doe', $user->father->name);
        $this->assertEquals('Steve Doe', $user->father->father->name);
        $this->assertEquals('Ron Doe', $user->father->father->father->name);

        $user = User::where('name', 'Tim Doe')->first();
        $this->assertEquals('Tim Doe', $user->name);
        $this->assertEquals('Sven Doe', $user->father->name);
        $this->assertEquals('Steve Doe', $user->father->father->name);
        $this->assertEquals('Ron Doe', $user->father->father->father->name);
    }

    public function testNestedEmbedsMany()
    {
602 603 604 605 606 607
        $user = User::create(['name' => 'John Doe']);
        $country1 = $user->addresses()->create(['country' => 'France']);
        $country2 = $user->addresses()->create(['country' => 'Belgium']);
        $city1 = $country1->addresses()->create(['city' => 'Paris']);
        $city2 = $country2->addresses()->create(['city' => 'Ghent']);
        $city3 = $country2->addresses()->create(['city' => 'Brussels']);
608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623

        $city3->city = 'Bruges';
        $city3->save();

        $this->assertEquals(2, $user->addresses()->count());
        $this->assertEquals(1, $user->addresses()->first()->addresses()->count());
        $this->assertEquals(2, $user->addresses()->last()->addresses()->count());

        $user = User::where('name', 'John Doe')->first();
        $this->assertEquals(2, $user->addresses()->count());
        $this->assertEquals(1, $user->addresses()->first()->addresses()->count());
        $this->assertEquals(2, $user->addresses()->last()->addresses()->count());
    }

    public function testNestedMixedEmbeds()
    {
624 625 626 627
        $user = User::create(['name' => 'John Doe']);
        $father = $user->father()->create(['name' => 'Mark Doe']);
        $country1 = $father->addresses()->create(['country' => 'France']);
        $country2 = $father->addresses()->create(['country' => 'Belgium']);
628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644

        $country2->country = 'England';
        $country2->save();

        $father->name = 'Steve Doe';
        $father->save();

        $this->assertEquals('France', $user->father->addresses()->first()->country);
        $this->assertEquals('England', $user->father->addresses()->last()->country);
        $this->assertEquals('Steve Doe', $user->father->name);

        $user = User::where('name', 'John Doe')->first();
        $this->assertEquals('France', $user->father->addresses()->first()->country);
        $this->assertEquals('England', $user->father->addresses()->last()->country);
        $this->assertEquals('Steve Doe', $user->father->name);
    }

Jens Segers's avatar
Jens Segers committed
645 646
    public function testDoubleAssociate()
    {
647 648
        $user = User::create(['name' => 'John Doe']);
        $address = new Address(['city' => 'Paris']);
Jens Segers's avatar
Jens Segers committed
649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664

        $user->addresses()->associate($address);
        $user->addresses()->associate($address);
        $address = $user->addresses()->first();
        $user->addresses()->associate($address);
        $this->assertEquals(1, $user->addresses()->count());

        $user = User::where('name', 'John Doe')->first();
        $user->addresses()->associate($address);
        $this->assertEquals(1, $user->addresses()->count());

        $user->save();
        $user->addresses()->associate($address);
        $this->assertEquals(1, $user->addresses()->count());
    }

Jens Segers's avatar
Jens Segers committed
665 666
    public function testSaveEmptyModel()
    {
667
        $user = User::create(['name' => 'John Doe']);
Jens Segers's avatar
Jens Segers committed
668 669
        $user->addresses()->save(new Address);
        $this->assertNotNull($user->addresses);
Jens Segers's avatar
Jens Segers committed
670
        $this->assertEquals(1, $user->addresses()->count());
Jens Segers's avatar
Jens Segers committed
671 672
    }

Jens Segers's avatar
Jens Segers committed
673 674
    public function testIncrementEmbedded()
    {
675 676
        $user = User::create(['name' => 'John Doe']);
        $address = $user->addresses()->create(['city' => 'New York', 'visited' => 5]);
Jens Segers's avatar
Jens Segers committed
677 678 679 680 681 682 683

        $address->increment('visited');
        $this->assertEquals(6, $address->visited);
        $this->assertEquals(6, $user->addresses()->first()->visited);

        $user = User::where('name', 'John Doe')->first();
        $this->assertEquals(6, $user->addresses()->first()->visited);
684

685 686 687
        $user = User::where('name', 'John Doe')->first();
        $address = $user->addresses()->first();

688 689
        $address->decrement('visited');
        $this->assertEquals(5, $address->visited);
690
        $this->assertEquals(5, $user->addresses()->first()->visited);
691 692 693

        $user = User::where('name', 'John Doe')->first();
        $this->assertEquals(5, $user->addresses()->first()->visited);
Jens Segers's avatar
Jens Segers committed
694 695
    }

696 697
    public function testPaginateEmbedsMany()
    {
698 699 700 701
        $user = User::create(['name' => 'John Doe']);
        $user->addresses()->save(new Address(['city' => 'New York']));
        $user->addresses()->save(new Address(['city' => 'Paris']));
        $user->addresses()->save(new Address(['city' => 'Brussels']));
702 703 704

        $results = $user->addresses()->paginate(2);
        $this->assertEquals(2, $results->count());
705
        $this->assertEquals(3, $results->total());
706
    }
707
}