Skip to content

Commit 98f53e1

Browse files
committed
Add nested relationship test
1 parent c248ee3 commit 98f53e1

9 files changed

+126
-4
lines changed

tests/Fixtures/Book.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ public function author() : BelongsTo
2020
return $this->belongsTo(Author::class);
2121
}
2222

23+
public function publisher() : BelongsTo
24+
{
25+
return $this->belongsTo(Publisher::class);
26+
}
27+
2328
public function stores() : BelongsToMany
2429
{
2530
return $this->belongsToMany(Store::class);

tests/Fixtures/Publisher.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Fixtures;
2+
3+
use GeneaLabs\LaravelModelCaching\CachedModel;
4+
use Illuminate\Database\Eloquent\Relations\HasMany;
5+
6+
class Publisher extends CachedModel
7+
{
8+
protected $fillable = [
9+
'name',
10+
];
11+
12+
public function books() : HasMany
13+
{
14+
return $this->hasMany(Book::class);
15+
}
16+
}

tests/Fixtures/UncachedBook.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ public function author() : BelongsTo
2121
return $this->belongsTo(UncachedAuthor::class);
2222
}
2323

24+
public function publisher() : BelongsTo
25+
{
26+
return $this->belongsTo(UncachedPublisher::class);
27+
}
28+
2429
public function stores() : BelongsToMany
2530
{
2631
return $this->belongsToMany(UncachedStore::class);

tests/Fixtures/UncachedPublisher.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Fixtures;
2+
3+
use GeneaLabs\LaravelModelCaching\CachedModel;
4+
use Illuminate\Database\Eloquent\Relations\HasMany;
5+
6+
class UncachedPublisher extends CachedModel
7+
{
8+
protected $fillable = [
9+
'name',
10+
];
11+
protected $table = 'publishers';
12+
13+
public function books() : HasMany
14+
{
15+
return $this->hasMany(Book::class, 'publisher_id', 'id');
16+
}
17+
}

tests/Unit/CachedBuilderTest.php

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Author;
44
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Book;
55
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Profile;
6+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Publisher;
67
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Store;
78
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedAuthor;
89
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedBook;
910
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedProfile;
11+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedPublisher;
1012
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedStore;
1113
use GeneaLabs\LaravelModelCaching\Tests\TestCase;
1214
use Illuminate\Foundation\Testing\RefreshDatabase;
@@ -23,11 +25,13 @@ public function setUp()
2325
parent::setUp();
2426

2527
cache()->flush();
28+
$publishers = factory(Publisher::class, 10)->create();
2629
factory(Author::class, 10)->create()
27-
->each(function($author) {
30+
->each(function($author) use ($publishers) {
2831
factory(Book::class, random_int(2, 10))->make()
29-
->each(function ($book) use ($author) {
32+
->each(function ($book) use ($author, $publishers) {
3033
$book->author()->associate($author);
34+
$book->publisher()->associate($publishers[rand(0, 9)]);
3135
$book->save();
3236
});
3337
factory(Profile::class)->make([
@@ -407,4 +411,31 @@ public function testValueModelResultsCreatesCache()
407411
$this->assertEquals($authors, $cachedResults);
408412
$this->assertEquals($liveResults, $cachedResults);
409413
}
414+
415+
public function testNestedRelationshipEagerloading()
416+
{
417+
$authors = collect()->push(
418+
(new Author)->with('books.publisher')
419+
->first()
420+
);
421+
$key = 'genealabslaravelmodelcachingtestsfixturesauthor-books-books.publisher-first';
422+
$tags = [
423+
'genealabslaravelmodelcachingtestsfixturesauthor',
424+
'genealabslaravelmodelcachingtestsfixturesbook',
425+
'genealabslaravelmodelcachingtestsfixturespublisher',
426+
];
427+
428+
$cachedResults = collect()->push(
429+
cache()->tags($tags)
430+
->get($key)
431+
);
432+
433+
$liveResults = collect()->push(
434+
(new UncachedAuthor)->with('books.publisher')
435+
->first()
436+
);
437+
438+
$this->assertEmpty($authors->diffAssoc($cachedResults));
439+
$this->assertEmpty($liveResults->diffAssoc($cachedResults));
440+
}
410441
}

tests/Unit/CachedModelTest.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Author;
44
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Book;
55
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Profile;
6+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Publisher;
67
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Store;
78
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedAuthor;
89
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedBook;
910
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedProfile;
11+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedPublisher;
1012
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedStore;
1113
use GeneaLabs\LaravelModelCaching\Tests\TestCase;
1214
use Illuminate\Foundation\Testing\RefreshDatabase;
@@ -20,11 +22,13 @@ public function setUp()
2022
parent::setUp();
2123

2224
cache()->flush();
25+
$publishers = factory(Publisher::class, 10)->create();
2326
factory(Author::class, 10)->create()
24-
->each(function($author) {
27+
->each(function($author) use ($publishers) {
2528
factory(Book::class, random_int(2, 10))->make()
26-
->each(function ($book) use ($author) {
29+
->each(function ($book) use ($author, $publishers) {
2730
$book->author()->associate($author);
31+
$book->publisher()->associate($publishers[rand(0, 9)]);
2832
$book->save();
2933
});
3034
factory(Profile::class)->make([
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
use Faker\Generator as Faker;
4+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Publisher;
5+
6+
$factory->define(Publisher::class, function (Faker $faker) {
7+
return [
8+
'name' => $faker->name,
9+
];
10+
});
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
use Illuminate\Database\Schema\Blueprint;
4+
use Illuminate\Database\Migrations\Migration;
5+
6+
class CreatePublishers extends Migration
7+
{
8+
public function up()
9+
{
10+
Schema::create('publishers', function (Blueprint $table) {
11+
$table->increments('id');
12+
$table->timestamps();
13+
14+
$table->string('name');
15+
});
16+
}
17+
18+
public function down()
19+
{
20+
//
21+
}
22+
}

tests/database/migrations/2017_09_21_010109_create_books.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,23 @@ public function up()
1010
Schema::create('books', function (Blueprint $table) {
1111
$table->increments('id');
1212
$table->unsignedInteger('author_id');
13+
$table->unsignedInteger('publisher_id');
1314
$table->timestamps();
1415

1516
$table->text('description');
1617
$table->dateTime('published_at');
1718
$table->string('title');
19+
20+
$table->foreign('author_id')
21+
->references('id')
22+
->on('authors')
23+
->onUpdate('CASCADE')
24+
->onDelete('CASCADE');
25+
$table->foreign('publisher_id')
26+
->references('id')
27+
->on('publishers')
28+
->onUpdate('CASCADE')
29+
->onDelete('CASCADE');
1830
});
1931
}
2032

0 commit comments

Comments
 (0)