Completed
Push — master ( 5d6416...bf92bc )
by Mike
11:08
created

testCursorModelResultsCreatesCache()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 11

Duplication

Lines 16
Ratio 100 %

Importance

Changes 0
Metric Value
dl 16
loc 16
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 11
nc 1
nop 0
1
<?php namespace GeneaLabs\LaravelModelCaching\Tests\Unit;
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\Store;
7
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedAuthor;
8
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedBook;
9
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedProfile;
10
use GeneaLabs\LaravelModelCaching\Tests\Fixtures\UncachedStore;
11
use GeneaLabs\LaravelModelCaching\Tests\TestCase;
12
use Illuminate\Foundation\Testing\RefreshDatabase;
13
14
/**
15
 * @SuppressWarnings(PHPMD.TooManyPublicMethods)
16
 */
17
class CachedBuilderTest extends TestCase
18
{
19
    use RefreshDatabase;
20
21 View Code Duplication
    public function setUp()
1 ignored issue
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
22
    {
23
        parent::setUp();
24
25
        cache()->flush();
26
        factory(Author::class, 10)->create()
27
            ->each(function($author) {
28
                factory(Book::class, random_int(2, 10))->make()
29
                    ->each(function ($book) use ($author) {
30
                        $book->author()->associate($author);
31
                        $book->save();
32
                    });
33
                factory(Profile::class)->make([
34
                    'author_id' => $author->id,
35
                ]);
36
            });
37
38
        $bookIds = (new Book)->all()->pluck('id');
39
        factory(Store::class, 10)->create()
40
            ->each(function ($store) use ($bookIds) {
41
                $store->books()->sync(rand($bookIds->min(), $bookIds->max()));
42
            });
43
        cache()->flush();
44
    }
45
46
    public function testCacheIsEmptyBeforeLoadingModels()
47
    {
48
        $results = cache()->tags([
49
                'genealabslaravelmodelcachingtestsfixturesauthor',
50
                'genealabslaravelmodelcachingtestsfixturesbook'
51
            ])
52
            ->get('genealabslaravelmodelcachingtestsfixturesauthor_1_2_3_4_5_6_7_8_9_10-genealabslaravelmodelcachingtestsfixturesbooks');
53
54
        $this->assertNull($results);
55
    }
56
57
    public function testCacheIsNotEmptyAfterLoadingModels()
58
    {
59
        (new Author)->with('books')->get();
60
61
        $results = cache()->tags([
62
                'genealabslaravelmodelcachingtestsfixturesauthor',
63
                'genealabslaravelmodelcachingtestsfixturesbook'
64
            ])
65
            ->get('genealabslaravelmodelcachingtestsfixturesauthor-books');
66
67
        $this->assertNotNull($results);
68
    }
69
70
    public function testCreatingModelClearsCache()
71
    {
72
        (new Author)->with('books')->get();
73
74
        factory(Author::class)->create();
75
76
        $results = cache()->tags([
77
                'genealabslaravelmodelcachingtestsfixturesauthor',
78
                'genealabslaravelmodelcachingtestsfixturesbook'
79
            ])
80
            ->get('genealabslaravelmodelcachingtestsfixturesauthor_1_2_3_4_5_6_7_8_9_10-genealabslaravelmodelcachingtestsfixturesbooks');
81
82
        $this->assertNull($results);
83
    }
84
85 View Code Duplication
    public function testUpdatingModelClearsCache()
86
    {
87
        $author = (new Author)->with('books')->get()->first();
88
        $author->name = "John Jinglheimer";
89
        $author->save();
90
91
        $results = cache()->tags([
92
                'genealabslaravelmodelcachingtestsfixturesauthor',
93
                'genealabslaravelmodelcachingtestsfixturesbook'
94
            ])
95
            ->get('genealabslaravelmodelcachingtestsfixturesauthor_1_2_3_4_5_6_7_8_9_10-genealabslaravelmodelcachingtestsfixturesbooks');
96
97
        $this->assertNull($results);
98
    }
99
100 View Code Duplication
    public function testDeletingModelClearsCache()
101
    {
102
        $author = (new Author)->with('books')->get()->first();
103
        $author->delete();
104
105
        $results = cache()->tags([
106
                'genealabslaravelmodelcachingtestsfixturesauthor',
107
                'genealabslaravelmodelcachingtestsfixturesbook'
108
            ])
109
            ->get('genealabslaravelmodelcachingtestsfixturesauthor_1_2_3_4_5_6_7_8_9_10-genealabslaravelmodelcachingtestsfixturesbooks');
110
111
        $this->assertNull($results);
112
    }
113
114 View Code Duplication
    public function testHasManyRelationshipIsCached()
115
    {
116
        $authors = (new Author)->with('books')->get();
117
118
        $results = collect(cache()->tags([
119
                'genealabslaravelmodelcachingtestsfixturesauthor',
120
                'genealabslaravelmodelcachingtestsfixturesbook'
121
            ])
122
            ->get("genealabslaravelmodelcachingtestsfixturesauthor-books"));
123
124
        $this->assertNotNull($results);
125
        $this->assertEmpty($authors->diffAssoc($results));
126
        $this->assertNotEmpty($authors);
127
        $this->assertNotEmpty($results);
128
        $this->assertEquals($authors->count(), $results->count());
129
    }
130
131 View Code Duplication
    public function testBelongsToRelationshipIsCached()
132
    {
133
        $books = (new Book)->with('author')->get();
134
135
        $results = collect(cache()->tags([
136
                'genealabslaravelmodelcachingtestsfixturesbook',
137
                'genealabslaravelmodelcachingtestsfixturesauthor'
138
            ])
139
            ->get("genealabslaravelmodelcachingtestsfixturesbook-author"));
140
141
        $this->assertNotNull($results);
142
        $this->assertEmpty($books->diffAssoc($results));
143
        $this->assertNotEmpty($books);
144
        $this->assertNotEmpty($results);
145
        $this->assertEquals($books->count(), $results->count());
146
    }
147
148 View Code Duplication
    public function testBelongsToManyRelationshipIsCached()
149
    {
150
        $books = (new Book)->with('stores')->get();
151
152
        $results = collect(cache()->tags([
153
                'genealabslaravelmodelcachingtestsfixturesbook',
154
                'genealabslaravelmodelcachingtestsfixturesstore'
155
            ])
156
            ->get("genealabslaravelmodelcachingtestsfixturesbook-stores"));
157
158
        $this->assertNotNull($results);
159
        $this->assertEmpty($books->diffAssoc($results));
160
        $this->assertNotEmpty($books);
161
        $this->assertNotEmpty($results);
162
        $this->assertEquals($books->count(), $results->count());
163
    }
164
165 View Code Duplication
    public function testHasOneRelationshipIsCached()
166
    {
167
        $authors = (new Author)->with('profile')->get();
168
169
        $results = collect(cache()
170
            ->tags([
171
                'genealabslaravelmodelcachingtestsfixturesauthor',
172
                'genealabslaravelmodelcachingtestsfixturesprofile'
173
            ])
174
            ->get("genealabslaravelmodelcachingtestsfixturesauthor-profile"));
175
176
        $this->assertNotNull($results);
177
        $this->assertEmpty($authors->diffAssoc($results));
178
        $this->assertNotEmpty($authors);
179
        $this->assertNotEmpty($results);
180
        $this->assertEquals($authors->count(), $results->count());
181
    }
182
183 View Code Duplication
    public function testAvgModelResultsCreatesCache()
184
    {
185
        $authorId = (new Author)->with('books', 'profile')
186
            ->avg('id');
187
        $key = 'genealabslaravelmodelcachingtestsfixturesauthor-avg_id';
188
        $tags = [
189
            'genealabslaravelmodelcachingtestsfixturesauthor',
190
        ];
191
192
        $cachedResult = cache()->tags($tags)
193
            ->get($key);
194
        $liveResult = (new UncachedAuthor)->with('books', 'profile')
195
            ->avg('id');
196
197
        $this->assertEquals($authorId, $cachedResult);
198
        $this->assertEquals($liveResult, $cachedResult);
199
    }
200
201
    public function testChunkModelResultsCreatesCache()
202
    {
203
        $cachedChunks = collect([
204
            'authors' => collect(),
205
            'keys' => collect(),
206
        ]);
207
        $chunkSize = 3;
208
        $tags = [
209
            'genealabslaravelmodelcachingtestsfixturesauthor',
210
            'genealabslaravelmodelcachingtestsfixturesbook',
211
            'genealabslaravelmodelcachingtestsfixturesprofile',
212
        ];
213
        $uncachedChunks = collect();
214
215
        (new Author)->with('books', 'profile')
216
            ->chunk($chunkSize, function ($chunk) use (&$cachedChunks, $chunkSize) {
217
                $offset = '';
218
219
                if ($cachedChunks['authors']->count()) {
220
                    $offsetIncrement = $cachedChunks['authors']->count() * $chunkSize;
221
                    $offset = "-offset_{$offsetIncrement}";
222
                }
223
224
                $cachedChunks['authors']->push($chunk);
225
                $cachedChunks['keys']->push("genealabslaravelmodelcachingtestsfixturesauthor-books-profile{$offset}-limit_3");
226
            });
227
228
        (new UncachedAuthor)->with('books', 'profile')
229
            ->chunk($chunkSize, function ($chunk) use (&$uncachedChunks) {
230
                $uncachedChunks->push($chunk);
231
            });
232
233
        for ($index = 0; $index < $cachedChunks['authors']->count(); $index++) {
234
            $key = $cachedChunks['keys'][$index];
235
            $cachedResults = cache()->tags($tags)
236
                ->get($key);
237
238
            $this->assertEmpty($cachedChunks['authors'][$index]->diffAssoc($cachedResults));
239
            $this->assertEmpty($uncachedChunks[$index]->diffAssoc($cachedResults));
240
        }
241
    }
242
243 View Code Duplication
    public function testCountModelResultsCreatesCache()
244
    {
245
        $authors = (new Author)->with('books', 'profile')
246
            ->count();
247
        $key = 'genealabslaravelmodelcachingtestsfixturesauthor-count';
248
        $tags = [
249
            'genealabslaravelmodelcachingtestsfixturesauthor',
250
        ];
251
252
        $cachedResults = cache()->tags($tags)
253
            ->get($key);
254
        $liveResults = (new UncachedAuthor)->with('books', 'profile')
255
            ->count();
256
257
        $this->assertEquals($authors, $cachedResults);
258
        $this->assertEquals($liveResults, $cachedResults);
259
    }
260
261 View Code Duplication
    public function testCursorModelResultsCreatesCache()
262
    {
263
        $authors = (new Author)->with('books', 'profile')
264
            ->cursor();
265
        $key = 'genealabslaravelmodelcachingtestsfixturesauthor-cursor';
266
        $tags = [
267
            'genealabslaravelmodelcachingtestsfixturesauthor',
268
        ];
269
270
        $cachedResults = cache()->tags($tags)
271
            ->get($key);
272
        $liveResults = collect((new UncachedAuthor)->with('books', 'profile')
273
            ->cursor());
274
275
        $this->assertEmpty($authors->diffAssoc($cachedResults));
1 ignored issue
show
Bug introduced by
The method diffAssoc() does not exist on Generator. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

275
        $this->assertEmpty($authors->/** @scrutinizer ignore-call */ diffAssoc($cachedResults));

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
276
        $this->assertEmpty($liveResults->diffAssoc($cachedResults));
277
    }
278
279
    public function testFindModelResultsCreatesCache()
280
    {
281
        $author = (new Author)->find(1);
282
        $key = 'genealabslaravelmodelcachingtestsfixturesauthor_1';
283
        $tags = [
284
            'genealabslaravelmodelcachingtestsfixturesauthor',
285
        ];
286
287
        $cachedResults = collect()->push(cache()->tags($tags)
288
            ->get($key));
289
        $liveResults = collect()->push((new UncachedAuthor)->find(1));
290
291
        $this->assertEquals($author, $cachedResults->first());
292
        $this->assertEmpty($liveResults->diffAssoc($cachedResults));
293
    }
294
295 View Code Duplication
    public function testGetModelResultsCreatesCache()
296
    {
297
        $authors = (new Author)->with('books', 'profile')
298
            ->get();
299
        $key = 'genealabslaravelmodelcachingtestsfixturesauthor-books-profile';
300
        $tags = [
301
            'genealabslaravelmodelcachingtestsfixturesauthor',
302
            'genealabslaravelmodelcachingtestsfixturesbook',
303
            'genealabslaravelmodelcachingtestsfixturesprofile',
304
        ];
305
306
        $cachedResults = cache()->tags($tags)
307
            ->get($key);
308
        $liveResults = (new UncachedAuthor)->with('books', 'profile')
309
            ->get();
310
311
        $this->assertEquals($authors, $cachedResults);
312
        $this->assertEmpty($liveResults->diffAssoc($cachedResults));
313
    }
314
315 View Code Duplication
    public function testMaxModelResultsCreatesCache()
316
    {
317
        $authorId = (new Author)->with('books', 'profile')
318
            ->max('id');
319
        $key = 'genealabslaravelmodelcachingtestsfixturesauthor-max_id';
320
        $tags = [
321
            'genealabslaravelmodelcachingtestsfixturesauthor',
322
        ];
323
324
        $cachedResult = cache()->tags($tags)
325
            ->get($key);
326
        $liveResult = (new UncachedAuthor)->with('books', 'profile')
327
            ->max('id');
328
329
        $this->assertEquals($authorId, $cachedResult);
330
        $this->assertEquals($liveResult, $cachedResult);
331
    }
332
333 View Code Duplication
    public function testMinModelResultsCreatesCache()
334
    {
335
        $authorId = (new Author)->with('books', 'profile')
336
            ->min('id');
337
        $key = 'genealabslaravelmodelcachingtestsfixturesauthor-min_id';
338
        $tags = [
339
            'genealabslaravelmodelcachingtestsfixturesauthor',
340
        ];
341
342
        $cachedResult = cache()->tags($tags)
343
            ->get($key);
344
        $liveResult = (new UncachedAuthor)->with('books', 'profile')
345
            ->min('id');
346
347
        $this->assertEquals($authorId, $cachedResult);
348
        $this->assertEquals($liveResult, $cachedResult);
349
    }
350
351 View Code Duplication
    public function testPluckModelResultsCreatesCache()
352
    {
353
        $authors = (new Author)->with('books', 'profile')
354
            ->pluck('id');
355
        $key = 'genealabslaravelmodelcachingtestsfixturesauthor_id-books-profile-pluck_id';
356
        $tags = [
357
            'genealabslaravelmodelcachingtestsfixturesauthor',
358
            'genealabslaravelmodelcachingtestsfixturesbook',
359
            'genealabslaravelmodelcachingtestsfixturesprofile',
360
        ];
361
362
        $cachedResults = cache()->tags($tags)
363
            ->get($key);
364
        $liveResults = (new UncachedAuthor)->with('books', 'profile')
365
            ->pluck('id');
366
367
        $this->assertEmpty($authors->diffAssoc($cachedResults));
368
        $this->assertEmpty($liveResults->diffAssoc($cachedResults));
369
    }
370
371 View Code Duplication
    public function testSumModelResultsCreatesCache()
372
    {
373
        $authorId = (new Author)->with('books', 'profile')
374
            ->sum('id');
375
        $key = 'genealabslaravelmodelcachingtestsfixturesauthor-sum_id';
376
        $tags = [
377
            'genealabslaravelmodelcachingtestsfixturesauthor',
378
        ];
379
380
        $cachedResult = cache()->tags($tags)
381
            ->get($key);
382
        $liveResult = (new UncachedAuthor)->with('books', 'profile')
383
            ->sum('id');
384
385
        $this->assertEquals($authorId, $cachedResult);
386
        $this->assertEquals($liveResult, $cachedResult);
387
    }
388
389 View Code Duplication
    public function testValueModelResultsCreatesCache()
390
    {
391
        $authors = (new Author)->with('books', 'profile')
392
            ->value('name');
393
        $key = 'genealabslaravelmodelcachingtestsfixturesauthor_name-books-profile-first';
394
        $tags = [
395
            'genealabslaravelmodelcachingtestsfixturesauthor',
396
            'genealabslaravelmodelcachingtestsfixturesbook',
397
            'genealabslaravelmodelcachingtestsfixturesprofile',
398
        ];
399
400
        $cachedResults = cache()->tags($tags)
401
            ->get($key)
402
            ->name;
403
404
        $liveResults = (new UncachedAuthor)->with('books', 'profile')
405
            ->value('name');
406
407
        $this->assertEquals($authors, $cachedResults);
408
        $this->assertEquals($liveResults, $cachedResults);
409
    }
410
}
411