|
8 | 8 | use Statamic\Events\EntrySaved; |
9 | 9 | use Statamic\Events\GlobalSetSaved; |
10 | 10 | use Statamic\Events\GlobalSetDeleted; |
| 11 | +use Statamic\Events\UrlInvalidated; |
| 12 | +use Statamic\Events\StaticCacheCleared; |
11 | 13 | use Statamic\Contracts\Entries\Entry; |
12 | 14 | use Statamic\Contracts\Entries\Collection; |
13 | 15 | use Illuminate\Support\Facades\Event; |
14 | 16 | use Illuminate\Support\Facades\Http; |
15 | 17 | use Illuminate\Support\Facades\Queue; // Add Queue facade |
| 18 | +use Illuminate\Support\Facades\Log; |
16 | 19 | use Eminos\StatamicCloudflareCache\Events\CachePurged; |
17 | 20 | use Eminos\StatamicCloudflareCache\Jobs\PurgeCloudflareCacheJob; |
18 | 21 | use Mockery; |
@@ -355,4 +358,144 @@ public function it_fires_cache_purged_event_after_synchronous_purge_everything() |
355 | 358 | return $e->purgedEverything && empty($e->urls); |
356 | 359 | }); |
357 | 360 | } |
| 361 | + |
| 362 | + #[Test] |
| 363 | + public function it_ignores_legacy_events_when_statamic_static_cache_invalidation_is_enabled() |
| 364 | + { |
| 365 | + Event::fake([CachePurged::class]); |
| 366 | + config([ |
| 367 | + 'cloudflare-cache.use_statamic_static_cache_invalidation' => true, |
| 368 | + 'cloudflare-cache.queue_purge' => false, |
| 369 | + ]); |
| 370 | + |
| 371 | + $entry = $this->mockEntry(); |
| 372 | + $event = new EntrySaved($entry); |
| 373 | + |
| 374 | + $clientMock = $this->mock(Client::class); |
| 375 | + $clientMock->shouldNotReceive('purgeUrls'); |
| 376 | + $clientMock->shouldNotReceive('purgeEverything'); |
| 377 | + |
| 378 | + $listener = $this->app->make(PurgeCloudflareCache::class); |
| 379 | + $listener->handle($event); |
| 380 | + |
| 381 | + Queue::assertNothingPushed(); |
| 382 | + Event::assertNotDispatched(CachePurged::class); |
| 383 | + } |
| 384 | + |
| 385 | + #[Test] |
| 386 | + public function it_purges_invalidated_urls_when_statamic_static_cache_invalidation_is_enabled() |
| 387 | + { |
| 388 | + Event::fake([CachePurged::class]); |
| 389 | + config([ |
| 390 | + 'cloudflare-cache.use_statamic_static_cache_invalidation' => true, |
| 391 | + 'cloudflare-cache.queue_purge' => false, |
| 392 | + ]); |
| 393 | + |
| 394 | + $event = new UrlInvalidated('/test-entry', 'https://example.com'); |
| 395 | + |
| 396 | + $clientMock = $this->mock(Client::class); |
| 397 | + $clientMock->shouldReceive('purgeUrls')->once()->with(['https://example.com/test-entry']); |
| 398 | + $clientMock->shouldNotReceive('purgeEverything'); |
| 399 | + |
| 400 | + $listener = $this->app->make(PurgeCloudflareCache::class); |
| 401 | + $listener->handle($event); |
| 402 | + |
| 403 | + Queue::assertNothingPushed(); |
| 404 | + Event::assertDispatched(CachePurged::class, function ($e) { |
| 405 | + return !$e->purgedEverything && $e->urls === ['https://example.com/test-entry']; |
| 406 | + }); |
| 407 | + } |
| 408 | + |
| 409 | + #[Test] |
| 410 | + public function it_purges_everything_when_static_cache_is_cleared_and_statamic_static_cache_invalidation_is_enabled() |
| 411 | + { |
| 412 | + config([ |
| 413 | + 'cloudflare-cache.use_statamic_static_cache_invalidation' => true, |
| 414 | + 'cloudflare-cache.queue_purge' => false, |
| 415 | + 'cloudflare-cache.purge_everything_fallback' => true, |
| 416 | + ]); |
| 417 | + |
| 418 | + $event = new StaticCacheCleared(); |
| 419 | + |
| 420 | + $clientMock = $this->mock(Client::class); |
| 421 | + $clientMock->shouldReceive('purgeEverything')->once(); |
| 422 | + $clientMock->shouldNotReceive('purgeUrls'); |
| 423 | + |
| 424 | + $listener = $this->app->make(PurgeCloudflareCache::class); |
| 425 | + $listener->handle($event); |
| 426 | + |
| 427 | + Queue::assertNothingPushed(); |
| 428 | + } |
| 429 | + |
| 430 | + #[Test] |
| 431 | + public function it_does_not_purge_when_static_cache_is_cleared_and_fallback_is_disabled() |
| 432 | + { |
| 433 | + config([ |
| 434 | + 'cloudflare-cache.use_statamic_static_cache_invalidation' => true, |
| 435 | + 'cloudflare-cache.queue_purge' => false, |
| 436 | + 'cloudflare-cache.purge_everything_fallback' => false, |
| 437 | + ]); |
| 438 | + |
| 439 | + $event = new StaticCacheCleared(); |
| 440 | + |
| 441 | + $clientMock = $this->mock(Client::class); |
| 442 | + $clientMock->shouldNotReceive('purgeEverything'); |
| 443 | + $clientMock->shouldNotReceive('purgeUrls'); |
| 444 | + |
| 445 | + $listener = $this->app->make(PurgeCloudflareCache::class); |
| 446 | + $listener->handle($event); |
| 447 | + |
| 448 | + Queue::assertNothingPushed(); |
| 449 | + } |
| 450 | + |
| 451 | + #[Test] |
| 452 | + public function it_logs_when_legacy_event_is_skipped_in_statamic_static_cache_invalidation_mode() |
| 453 | + { |
| 454 | + config([ |
| 455 | + 'cloudflare-cache.use_statamic_static_cache_invalidation' => true, |
| 456 | + 'cloudflare-cache.debug' => true, |
| 457 | + ]); |
| 458 | + |
| 459 | + Log::shouldReceive('debug')->once()->withArgs(function ($message, $context = []) { |
| 460 | + return str_contains($message, 'Statamic static cache invalidation mode is enabled') |
| 461 | + && ($context['event'] ?? null) === EntrySaved::class; |
| 462 | + }); |
| 463 | + |
| 464 | + $entry = $this->mockEntry(); |
| 465 | + $event = new EntrySaved($entry); |
| 466 | + |
| 467 | + $clientMock = $this->mock(Client::class); |
| 468 | + $clientMock->shouldNotReceive('purgeUrls'); |
| 469 | + $clientMock->shouldNotReceive('purgeEverything'); |
| 470 | + |
| 471 | + $listener = $this->app->make(PurgeCloudflareCache::class); |
| 472 | + $listener->handle($event); |
| 473 | + |
| 474 | + Queue::assertNothingPushed(); |
| 475 | + } |
| 476 | + |
| 477 | + #[Test] |
| 478 | + public function it_logs_when_static_cache_event_is_skipped_while_mode_is_disabled() |
| 479 | + { |
| 480 | + config([ |
| 481 | + 'cloudflare-cache.use_statamic_static_cache_invalidation' => false, |
| 482 | + 'cloudflare-cache.debug' => true, |
| 483 | + ]); |
| 484 | + |
| 485 | + Log::shouldReceive('debug')->once()->withArgs(function ($message, $context = []) { |
| 486 | + return str_contains($message, 'Statamic static cache invalidation mode is disabled') |
| 487 | + && ($context['event'] ?? null) === UrlInvalidated::class; |
| 488 | + }); |
| 489 | + |
| 490 | + $event = new UrlInvalidated('/test-entry', 'https://example.com'); |
| 491 | + |
| 492 | + $clientMock = $this->mock(Client::class); |
| 493 | + $clientMock->shouldNotReceive('purgeUrls'); |
| 494 | + $clientMock->shouldNotReceive('purgeEverything'); |
| 495 | + |
| 496 | + $listener = $this->app->make(PurgeCloudflareCache::class); |
| 497 | + $listener->handle($event); |
| 498 | + |
| 499 | + Queue::assertNothingPushed(); |
| 500 | + } |
358 | 501 | } |
0 commit comments