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]); } }