Skip to content

Commit 360a61c

Browse files
committed
Add more tests, fix nested whereNull
1 parent f748947 commit 360a61c

File tree

11 files changed

+326
-65
lines changed

11 files changed

+326
-65
lines changed

src/CacheKey.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ protected function getTypeClause($where) : string
106106

107107
protected function getValuesClause(array $where = null) : string
108108
{
109-
if (in_array($where["type"], ["NotNull"])) {
109+
if (in_array($where["type"], ["NotNull", "Null"])) {
110110
return "";
111111
}
112112

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Integration\CachedBuilder;
2+
3+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Author;
4+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Book;
5+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Profile;
6+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Publisher;
7+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Store;
8+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedAuthor;
9+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedBook;
10+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedProfile;
11+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedPublisher;
12+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedStore;
13+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Http\Resources\Author as AuthorResource;
14+
use GeneaLabs\LaravelModelCaching\Tests\IntegrationTestCase;
15+
use Illuminate\Foundation\Testing\RefreshDatabase;
16+
use Illuminate\Support\Collection;
17+
18+
class FirstTest extends IntegrationTestCase
19+
{
20+
use RefreshDatabase;
21+
22+
public function testFirstReturnsAllAttributesForModel()
23+
{
24+
$author = (new Author)->where("id", "=", 1)->first();
25+
$uncachedAuthor = (new UncachedAuthor)->where("id", "=", 1)->first();
26+
27+
$this->assertEquals($author->id, $uncachedAuthor->id);
28+
$this->assertEquals($author->created_at, $uncachedAuthor->created_at);
29+
$this->assertEquals($author->updated_at, $uncachedAuthor->updated_at);
30+
$this->assertEquals($author->email, $uncachedAuthor->email);
31+
$this->assertEquals($author->name, $uncachedAuthor->name);
32+
}
33+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Integration\CachedBuilder;
2+
3+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Author;
4+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Book;
5+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Profile;
6+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Publisher;
7+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Store;
8+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedAuthor;
9+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedBook;
10+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedProfile;
11+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedPublisher;
12+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedStore;
13+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Http\Resources\Author as AuthorResource;
14+
use GeneaLabs\LaravelModelCaching\Tests\IntegrationTestCase;
15+
use Illuminate\Foundation\Testing\RefreshDatabase;
16+
use Illuminate\Support\Collection;
17+
18+
class WhereHasTest extends IntegrationTestCase
19+
{
20+
use RefreshDatabase;
21+
22+
public function testWhereHasClause()
23+
{
24+
$authors = (new Author)
25+
->whereHas("books")
26+
->get();
27+
$uncachedAuthors = (new UncachedAuthor)
28+
->whereHas("books")
29+
->get();
30+
31+
$this->assertEquals($authors->pluck("id"), $uncachedAuthors->pluck("id"));
32+
}
33+
34+
public function testNestedWhereHasClauses()
35+
{
36+
$authors = (new Author)
37+
->where("id", ">", 0)
38+
->whereHas("books", function ($query) {
39+
$query->whereNull("description");
40+
})
41+
->get();
42+
$uncachedAuthors = (new UncachedAuthor)
43+
->where("id", ">", 0)
44+
->whereHas("books", function ($query) {
45+
$query->whereNull("description");
46+
})
47+
->get();
48+
49+
$this->assertEquals($authors->pluck("id"), $uncachedAuthors->pluck("id"));
50+
}
51+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Integration\CachedBuilder;
2+
3+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Author;
4+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Book;
5+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Profile;
6+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Publisher;
7+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Store;
8+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedAuthor;
9+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedBook;
10+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedProfile;
11+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedPublisher;
12+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedStore;
13+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Http\Resources\Author as AuthorResource;
14+
use GeneaLabs\LaravelModelCaching\Tests\IntegrationTestCase;
15+
use Illuminate\Foundation\Testing\RefreshDatabase;
16+
use Illuminate\Support\Collection;
17+
18+
class WhereNullTest extends IntegrationTestCase
19+
{
20+
use RefreshDatabase;
21+
22+
public function testWhereNullClause()
23+
{
24+
$books = (new Book)
25+
->whereNull("description")
26+
->get();
27+
$uncachedBooks = (new UncachedBook)
28+
->whereNull("description")
29+
->get();
30+
31+
$this->assertEquals($books->pluck("id"), $uncachedBooks->pluck("id"));
32+
}
33+
34+
public function testNestedWhereNullClauses()
35+
{
36+
$books = (new Book)
37+
->where(function ($query) {
38+
$query->whereNull("description");
39+
})
40+
->get();
41+
$uncachedBooks = (new UncachedBook)
42+
->where(function ($query) {
43+
$query->whereNull("description");
44+
})
45+
->get();
46+
47+
$this->assertEquals($books->pluck("id"), $uncachedBooks->pluck("id"));
48+
}
49+
}

tests/Integration/CachedBuilder/WhereRawTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,24 @@ public function testMultipleWhereRawCacheUniquely()
6969
$this->assertEquals($cachedBook1->title, $book1->title);
7070
$this->assertEquals($cachedBook2->title, $book2->title);
7171
}
72+
73+
public function testNestedWhereRawClauses()
74+
{
75+
$expectedIds = [
76+
1,
77+
2,
78+
3,
79+
5,
80+
6,
81+
];
82+
83+
$authors = (new Author)
84+
->where(function ($query) {
85+
$query->orWhereRaw("id BETWEEN 1 AND 3")
86+
->orWhereRaw("id BETWEEN 5 AND 6");
87+
})
88+
->get();
89+
90+
$this->assertEquals($expectedIds, $authors->pluck("id")->toArray());
91+
}
7292
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Integration\CachedBuilder;
2+
3+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Author;
4+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Book;
5+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Profile;
6+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Publisher;
7+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Store;
8+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedAuthor;
9+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedBook;
10+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedProfile;
11+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedPublisher;
12+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedStore;
13+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Http\Resources\Author as AuthorResource;
14+
use GeneaLabs\LaravelModelCaching\Tests\IntegrationTestCase;
15+
use Illuminate\Foundation\Testing\RefreshDatabase;
16+
use Illuminate\Support\Collection;
17+
18+
class WhereTest extends IntegrationTestCase
19+
{
20+
use RefreshDatabase;
21+
22+
public function testWithQuery()
23+
{
24+
$books = (new Book)
25+
->where(function ($query) {
26+
$query->where("id", ">", "1")
27+
->where("id", "<", "5");
28+
})
29+
->get();
30+
$uncachedBooks = (new UncachedBook)
31+
->where(function ($query) {
32+
$query->where("id", ">", "1")
33+
->where("id", "<", "5");
34+
})
35+
->get();
36+
37+
$this->assertEquals($books->pluck("id"), $uncachedBooks->pluck("id"));
38+
}
39+
40+
public function testColumnsRelationshipWhereClauseParsing()
41+
{
42+
$author = (new Author)
43+
->orderBy('name')
44+
->first();
45+
$authors = (new Author)
46+
->where('name', '=', $author->name)
47+
->get();
48+
$key = sha1('genealabs:laravel-model-caching:testing:genealabslaravelmodelcachingtestsfixturesauthor-name_=_' .
49+
$author->name);
50+
$tags = ['genealabs:laravel-model-caching:testing:genealabslaravelmodelcachingtestsfixturesauthor'];
51+
52+
$cachedResults = $this->cache()
53+
->tags($tags)
54+
->get($key)['value'];
55+
$liveResults = (new UncachedAuthor)
56+
->where('name', '=', $author->name)
57+
->get();
58+
59+
$this->assertEmpty($authors->diffKeys($cachedResults));
60+
$this->assertEmpty($liveResults->diffKeys($cachedResults));
61+
}
62+
63+
private function processWhereClauseTestWithOperator(string $operator)
64+
{
65+
$author = (new Author)->first();
66+
$authors = (new Author)
67+
->where('name', $operator, $author->name)
68+
->get();
69+
$keyParts = [
70+
'genealabs:laravel-model-caching:testing:genealabslaravelmodelcachingtestsfixturesauthor-name',
71+
'_',
72+
str_replace(' ', '_', strtolower($operator)),
73+
'_',
74+
$author->name,
75+
];
76+
$key = sha1(implode('', $keyParts));
77+
$tags = ['genealabs:laravel-model-caching:testing:genealabslaravelmodelcachingtestsfixturesauthor'];
78+
79+
$cachedResults = $this->cache()
80+
->tags($tags)
81+
->get($key)['value'];
82+
$liveResults = (new UncachedAuthor)
83+
->where('name', $operator, $author->name)
84+
->get();
85+
86+
$this->assertEmpty($authors->diffKeys($cachedResults));
87+
$this->assertEmpty($liveResults->diffKeys($cachedResults));
88+
}
89+
90+
public function testWhereClauseParsingOfOperators()
91+
{
92+
$this->processWhereClauseTestWithOperator('=');
93+
$this->processWhereClauseTestWithOperator('!=');
94+
$this->processWhereClauseTestWithOperator('<>');
95+
$this->processWhereClauseTestWithOperator('>');
96+
$this->processWhereClauseTestWithOperator('<');
97+
$this->processWhereClauseTestWithOperator('LIKE');
98+
$this->processWhereClauseTestWithOperator('NOT LIKE');
99+
}
100+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Integration\CachedBuilder;
2+
3+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Author;
4+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Book;
5+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Profile;
6+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Publisher;
7+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Store;
8+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedAuthor;
9+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedBook;
10+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedProfile;
11+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedPublisher;
12+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedStore;
13+
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\Http\Resources\Author as AuthorResource;
14+
use GeneaLabs\LaravelModelCaching\Tests\IntegrationTestCase;
15+
use Illuminate\Foundation\Testing\RefreshDatabase;
16+
use Illuminate\Support\Collection;
17+
18+
class WithTest extends IntegrationTestCase
19+
{
20+
use RefreshDatabase;
21+
22+
public function testWithQuery()
23+
{
24+
$author = (new Author)
25+
->where("id", 1)
26+
->with([
27+
'books' => function ($query) {
28+
$query->where("id", "<", 100);
29+
}
30+
])
31+
->first();
32+
$uncachedAuthor = (new UncachedAuthor)->with([
33+
'books' => function ($query) {
34+
$query->where("id", "<", 100);
35+
},
36+
])
37+
->where("id", 1)
38+
->first();
39+
40+
$this->assertEquals($uncachedAuthor->books()->count(), $author->books()->count());
41+
$this->assertEquals($uncachedAuthor->id, $author->id);
42+
}
43+
}

tests/Integration/CachedBuilderPaginationTest.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,31 @@ public function testPaginationReturnsCorrectLinks()
7070
$this->assertContains($page2ActiveLink, (string) $booksPage2->links());
7171
$this->assertContains($page24ActiveLink, (string) $booksPage24->links());
7272
}
73+
74+
public function testPaginationWithOptionsReturnsCorrectLinks()
75+
{
76+
$page1ActiveLink = starts_with(app()->version(), "5.5")
77+
? '<li class="active"><span>1</span></li>'
78+
: '<li class="page-item active" aria-current="page"><span class="page-link">1</span></li>';
79+
$page2ActiveLink = starts_with(app()->version(), "5.5")
80+
? '<li class="active"><span>2</span></li>'
81+
: '<li class="page-item active" aria-current="page"><span class="page-link">2</span></li>';
82+
$page24ActiveLink = starts_with(app()->version(), "5.5")
83+
? '<li class="active"><span>24</span></li>'
84+
: '<li class="page-item active" aria-current="page"><span class="page-link">24</span></li>';
85+
86+
$booksPage1 = (new Book)
87+
->paginate(2);
88+
$booksPage2 = (new Book)
89+
->paginate(2, ['*'], null, 2);
90+
$booksPage24 = (new Book)
91+
->paginate(2, ['*'], null, 24);
92+
93+
$this->assertCount(2, $booksPage1);
94+
$this->assertCount(2, $booksPage2);
95+
$this->assertCount(2, $booksPage24);
96+
$this->assertContains($page1ActiveLink, (string) $booksPage1->links());
97+
$this->assertContains($page2ActiveLink, (string) $booksPage2->links());
98+
$this->assertContains($page24ActiveLink, (string) $booksPage24->links());
99+
}
73100
}

0 commit comments

Comments
 (0)