feat(cache): Tool lit/cache-clear zum gezielten Leeren des Caches
lit/cache-clear leert den Seiten-Cache von WP Super Cache für die ganze Website (scope all, Recht manage_options) oder einen Beitrag (scope post, Recht edit_post); Probelauf ohne confirm, Ausführen mit confirm: true. Das CapabilityGate sperrt das Tool, wenn WP Super Cache bricht; eine Sperre zur Laufzeit wird als Fehler gemeldet. Listener und Tool teilen die 30-s-Drosselung mit Nachlauf (SuperCachePurger); der Listener ignoriert die Einträge des Tools. Behoben vor dem Commit: die Verdrahtung des Purgers erfasste die Registry zu früh (immer gesperrt), jetzt per Referenz und mit Test über Plugin::integrations(). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
d3e5d4fac0
commit
1ac347e76f
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace LIT\MCP\Tests\Unit\Integrations\SuperCache;
|
||||
|
||||
use Brain\Monkey\Functions;
|
||||
use LIT\MCP\Integrations\SuperCache\SuperCacheFeature;
|
||||
use LIT\MCP\Integrations\SuperCache\SuperCachePurger;
|
||||
use LIT\MCP\Tests\Unit\TestCase;
|
||||
|
||||
final class SuperCachePurgerTest extends TestCase
|
||||
{
|
||||
public function testALockedWholePurgeDoesNothingAndSaysSo(): void
|
||||
{
|
||||
$previous = ini_set('error_log', '/dev/null');
|
||||
Functions\expect('get_transient')->never();
|
||||
$purger = new SuperCachePurger(
|
||||
static fn (SuperCacheFeature $feature): bool => false,
|
||||
static fn (): bool => true,
|
||||
static fn (int $id) => self::fail('no post purge'),
|
||||
static fn (int $blog) => self::fail('no whole purge')
|
||||
);
|
||||
|
||||
self::assertSame(SuperCachePurger::LOCKED, $purger->everything());
|
||||
self::assertFalse($purger->post(3));
|
||||
ini_set('error_log', (string) $previous);
|
||||
}
|
||||
|
||||
public function testThrottledReadsTheStamp(): void
|
||||
{
|
||||
$stamp = false;
|
||||
Functions\when('get_transient')->alias(static function () use (&$stamp) {
|
||||
return $stamp;
|
||||
});
|
||||
$purger = new SuperCachePurger(static fn (): bool => true);
|
||||
|
||||
self::assertFalse($purger->throttled());
|
||||
$stamp = (string) (time() - 5);
|
||||
self::assertTrue($purger->throttled());
|
||||
$stamp = time() - 31;
|
||||
self::assertFalse($purger->throttled());
|
||||
}
|
||||
|
||||
/** The stamp is read once: a transient expiring between two reads must not schedule the trailing purge in 1970. */
|
||||
public function testEverythingReadsTheStampOnceAndSchedulesTheTrailingPurgeInTheFuture(): void
|
||||
{
|
||||
$reads = 0;
|
||||
$scheduledAt = [];
|
||||
Functions\when('get_transient')->alias(static function () use (&$reads) {
|
||||
return ++$reads === 1 ? time() - 5 : false;
|
||||
});
|
||||
Functions\when('wp_next_scheduled')->justReturn(false);
|
||||
Functions\when('wp_schedule_single_event')->alias(static function (int $at) use (&$scheduledAt): bool {
|
||||
$scheduledAt[] = $at;
|
||||
|
||||
return true;
|
||||
});
|
||||
$purger = new SuperCachePurger(static fn (): bool => true);
|
||||
|
||||
self::assertSame(SuperCachePurger::THROTTLED, $purger->everything());
|
||||
|
||||
self::assertSame(1, $reads);
|
||||
self::assertCount(1, $scheduledAt);
|
||||
self::assertGreaterThanOrEqual(time(), $scheduledAt[0]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user