From 3ef67da8ba2054487cd9800f195f204ac5041574 Mon Sep 17 00:00:00 2001 From: Petr Parimucha Date: Mon, 24 Aug 2026 18:39:12 +0200 Subject: [PATCH 1/2] refactor(breeze): move all Breeze-specific code under src/Breeze MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Everything that knows about the Breeze plugin now lives under src/Breeze/ (namespace Parisek\TimberKit\Breeze), so a project that does not run Breeze can see in one directory what is dead weight. A new architecture test enforces the boundary rather than documenting it: naming Breeze anywhere else under src/ fails the build. StarterBase is the sole documented exception, because it keeps the opt-in flags and those flag names are public API — six projects in the fleet already set them. BreezeWarmupSitemap becomes Breeze\WarmupSitemap. The old class name keeps resolving through a class_alias in compat/aliases.php, wired as a composer files autoload entry; the class is final, which rules out a subclass shim. Dropping the alias outright was rejected: the old name has shipped, so removing it would break any consumer still referencing it. No behaviour changes. The warmup logic is untouched — this is a relocation plus the compatibility shim. --- CHANGELOG.md | 12 +++ README.md | 11 ++- compat/aliases.php | 20 +++++ composer.json | 5 +- .../Health}/PreloadChainHealthy.php | 2 +- .../LanguageQuota.php | 2 +- .../PriorityStore.php | 2 +- src/{BreezeWarmup => Breeze}/Scorer.php | 2 +- .../SignalCollector.php | 2 +- src/{BreezeWarmup => Breeze}/SourceNaming.php | 2 +- .../UrlCanonicalizer.php | 2 +- .../WarmupSitemap.php} | 10 +-- src/StarterBase.php | 10 +-- .../ScorerSortTest.php | 4 +- .../Unit/Architecture/BreezeBoundaryTest.php | 84 +++++++++++++++++++ .../Health}/PreloadChainHealthyTest.php | 4 +- .../LanguageQuotaTest.php | 4 +- .../PriorityStoreTest.php | 4 +- .../{BreezeWarmup => Breeze}/ScorerTest.php | 4 +- .../SignalCollectorTest.php | 6 +- .../SourceNamingTest.php | 4 +- .../UrlCanonicalizerTest.php | 4 +- .../FetchSitemapRecordsTest.php | 20 ++--- .../WarmupSitemap}/FetchSitemapUrlsTest.php | 48 +++++------ .../WarmupSitemap}/FilterPreloadUrlsTest.php | 28 +++---- .../WarmupSitemap}/Fixtures.php | 4 +- .../WarmupSitemap}/GetStoredUrlsTest.php | 20 ++--- .../WarmupSitemap}/MergeUrlsTest.php | 18 ++-- .../WarmupSitemap}/RegisterTest.php | 18 ++-- .../RescoreOnMenuUpdateTest.php | 22 ++--- .../WarmupSitemap}/RunRefreshPriorityTest.php | 22 ++--- .../WarmupSitemap}/RunRefreshTest.php | 14 ++-- .../BreezeWarmupPrioritySetupTest.php | 20 ++--- .../BreezeWarmupSitemapSetupTest.php | 8 +- 34 files changed, 282 insertions(+), 160 deletions(-) create mode 100644 compat/aliases.php rename src/{Health/Check => Breeze/Health}/PreloadChainHealthy.php (98%) rename src/{BreezeWarmup => Breeze}/LanguageQuota.php (98%) rename src/{BreezeWarmup => Breeze}/PriorityStore.php (99%) rename src/{BreezeWarmup => Breeze}/Scorer.php (99%) rename src/{BreezeWarmup => Breeze}/SignalCollector.php (99%) rename src/{BreezeWarmup => Breeze}/SourceNaming.php (98%) rename src/{BreezeWarmup => Breeze}/UrlCanonicalizer.php (98%) rename src/{BreezeWarmupSitemap.php => Breeze/WarmupSitemap.php} (98%) rename tests/Property/{BreezeWarmup => Breeze}/ScorerSortTest.php (95%) create mode 100644 tests/Unit/Architecture/BreezeBoundaryTest.php rename tests/Unit/{Health/Check => Breeze/Health}/PreloadChainHealthyTest.php (97%) rename tests/Unit/{BreezeWarmup => Breeze}/LanguageQuotaTest.php (98%) rename tests/Unit/{BreezeWarmup => Breeze}/PriorityStoreTest.php (98%) rename tests/Unit/{BreezeWarmup => Breeze}/ScorerTest.php (98%) rename tests/Unit/{BreezeWarmup => Breeze}/SignalCollectorTest.php (98%) rename tests/Unit/{BreezeWarmup => Breeze}/SourceNamingTest.php (97%) rename tests/Unit/{BreezeWarmup => Breeze}/UrlCanonicalizerTest.php (96%) rename tests/Unit/{BreezeWarmupSitemap => Breeze/WarmupSitemap}/FetchSitemapRecordsTest.php (84%) rename tests/Unit/{BreezeWarmupSitemap => Breeze/WarmupSitemap}/FetchSitemapUrlsTest.php (92%) rename tests/Unit/{BreezeWarmupSitemap => Breeze/WarmupSitemap}/FilterPreloadUrlsTest.php (87%) rename tests/Unit/{BreezeWarmupSitemap => Breeze/WarmupSitemap}/Fixtures.php (96%) rename tests/Unit/{BreezeWarmupSitemap => Breeze/WarmupSitemap}/GetStoredUrlsTest.php (74%) rename tests/Unit/{BreezeWarmupSitemap => Breeze/WarmupSitemap}/MergeUrlsTest.php (86%) rename tests/Unit/{BreezeWarmupSitemap => Breeze/WarmupSitemap}/RegisterTest.php (83%) rename tests/Unit/{BreezeWarmupSitemap => Breeze/WarmupSitemap}/RescoreOnMenuUpdateTest.php (92%) rename tests/Unit/{BreezeWarmupSitemap => Breeze/WarmupSitemap}/RunRefreshPriorityTest.php (80%) rename tests/Unit/{BreezeWarmupSitemap => Breeze/WarmupSitemap}/RunRefreshTest.php (94%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ea6af8..6565e25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/). ## [Unreleased] +### Changed + +- Everything that knows about the Breeze plugin now lives under + `src/Breeze/` (namespace `Parisek\TimberKit\Breeze`), so a project that + does not run Breeze can see in one directory what is dead weight. A test + enforces the boundary: naming Breeze anywhere else under `src/` fails the + build. `StarterBase` is the one exception — it keeps the opt-in flags, + whose names are unchanged. +- `Parisek\TimberKit\BreezeWarmupSitemap` is now + `Parisek\TimberKit\Breeze\WarmupSitemap`. The old name keeps resolving + through a class alias, so no consumer breaks on upgrade. + ### Added - `$breeze_warmup_priority` — order the Breeze warmup list by importance diff --git a/README.md b/README.md index 9ca3850..b0df004 100644 --- a/README.md +++ b/README.md @@ -553,7 +553,16 @@ wp timber-kit wpml-cleanup-theme-domain --apply # delete the rows and compil ## Cache warm-up (Breeze) -`BreezeWarmupSitemap` feeds Breeze's Cache Warmup preloader with every URL from +Everything in this package that knows about Breeze lives under `src/Breeze/` +(`Parisek\TimberKit\Breeze`). A project that does not run the plugin can treat +that whole directory as dead weight, and a test in the suite fails the build if +Breeze is named anywhere else under `src/` — the boundary is enforced, not just +documented. The one exception is `StarterBase`, which keeps the opt-in flags. + +The class was called `BreezeWarmupSitemap` before the move; the old name still +resolves through an alias. + +`Breeze\WarmupSitemap` feeds Breeze's Cache Warmup preloader with every URL from the site's XML sitemap via the `breeze_preload_urls` filter. Breeze 2.5 re-warms the cache after a full purge, but its own URL sources are diff --git a/compat/aliases.php b/compat/aliases.php new file mode 100644 index 0000000..33690c5 --- /dev/null +++ b/compat/aliases.php @@ -0,0 +1,20 @@ +breeze_warmup_priority, $this->breeze_warmup_priority_weights ); diff --git a/tests/Property/BreezeWarmup/ScorerSortTest.php b/tests/Property/Breeze/ScorerSortTest.php similarity index 95% rename from tests/Property/BreezeWarmup/ScorerSortTest.php rename to tests/Property/Breeze/ScorerSortTest.php index ffee5bd..aa78900 100644 --- a/tests/Property/BreezeWarmup/ScorerSortTest.php +++ b/tests/Property/Breeze/ScorerSortTest.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Tests\Property\BreezeWarmup; +namespace Tests\Property\Breeze; use Eris\Generator; -use Parisek\TimberKit\BreezeWarmup\Scorer; +use Parisek\TimberKit\Breeze\Scorer; use Tests\Property\Support\PropertyTestCase; /** diff --git a/tests/Unit/Architecture/BreezeBoundaryTest.php b/tests/Unit/Architecture/BreezeBoundaryTest.php new file mode 100644 index 0000000..1403823 --- /dev/null +++ b/tests/Unit/Architecture/BreezeBoundaryTest.php @@ -0,0 +1,84 @@ + Paths allowed to name Breeze outside src/Breeze/. */ + private const ALLOWED = array( + 'src/StarterBase.php', + ); + + /** + * @return array + */ + private function phpFilesUnderSrc(): array { + $root = dirname( __DIR__, 3 ) . '/src'; + $files = array(); + + $iterator = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator( $root ) ); + foreach ( $iterator as $file ) { + if ( $file->isFile() && 'php' === $file->getExtension() ) { + $files[] = $file->getPathname(); + } + } + + sort( $files ); + + return $files; + } + + public function test_only_the_breeze_directory_names_breeze(): void { + $root = dirname( __DIR__, 3 ); + $offenders = array(); + + foreach ( $this->phpFilesUnderSrc() as $path ) { + $relative = ltrim( str_replace( $root, '', $path ), '/' ); + + if ( str_starts_with( $relative, 'src/Breeze/' ) ) { + continue; + } + if ( in_array( $relative, self::ALLOWED, true ) ) { + continue; + } + + $contents = (string) file_get_contents( $path ); + if ( 1 === preg_match( '/breeze/i', $contents ) ) { + $offenders[] = $relative; + } + } + + $this->assertSame( + array(), + $offenders, + "These files name Breeze outside src/Breeze/:\n" . implode( "\n", $offenders ) + ); + } + + public function test_the_breeze_directory_exists_and_is_not_empty(): void { + // Guards against the boundary passing vacuously if the directory were + // ever removed or renamed without updating this test. + $dir = dirname( __DIR__, 3 ) . '/src/Breeze'; + + $this->assertDirectoryExists( $dir ); + $this->assertNotEmpty( glob( $dir . '/*.php' ) ); + } +} diff --git a/tests/Unit/Health/Check/PreloadChainHealthyTest.php b/tests/Unit/Breeze/Health/PreloadChainHealthyTest.php similarity index 97% rename from tests/Unit/Health/Check/PreloadChainHealthyTest.php rename to tests/Unit/Breeze/Health/PreloadChainHealthyTest.php index c7384f3..c2245e8 100644 --- a/tests/Unit/Health/Check/PreloadChainHealthyTest.php +++ b/tests/Unit/Breeze/Health/PreloadChainHealthyTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Tests\Unit\Health\Check; +namespace Tests\Unit\Breeze\Health; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\Health\Check\PreloadChainHealthy; +use Parisek\TimberKit\Breeze\Health\PreloadChainHealthy; use Parisek\TimberKit\Health\HealthCheck; use Parisek\TimberKit\Health\Result; diff --git a/tests/Unit/BreezeWarmup/LanguageQuotaTest.php b/tests/Unit/Breeze/LanguageQuotaTest.php similarity index 98% rename from tests/Unit/BreezeWarmup/LanguageQuotaTest.php rename to tests/Unit/Breeze/LanguageQuotaTest.php index 3580431..e388480 100644 --- a/tests/Unit/BreezeWarmup/LanguageQuotaTest.php +++ b/tests/Unit/Breeze/LanguageQuotaTest.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmup; +namespace Tests\Unit\Breeze; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmup\LanguageQuota; +use Parisek\TimberKit\Breeze\LanguageQuota; /** * Covers the per-language budget split. diff --git a/tests/Unit/BreezeWarmup/PriorityStoreTest.php b/tests/Unit/Breeze/PriorityStoreTest.php similarity index 98% rename from tests/Unit/BreezeWarmup/PriorityStoreTest.php rename to tests/Unit/Breeze/PriorityStoreTest.php index 8d98bae..6d73383 100644 --- a/tests/Unit/BreezeWarmup/PriorityStoreTest.php +++ b/tests/Unit/Breeze/PriorityStoreTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmup; +namespace Tests\Unit\Breeze; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmup\PriorityStore; +use Parisek\TimberKit\Breeze\PriorityStore; /** * Covers the option row and its optimistic lock. diff --git a/tests/Unit/BreezeWarmup/ScorerTest.php b/tests/Unit/Breeze/ScorerTest.php similarity index 98% rename from tests/Unit/BreezeWarmup/ScorerTest.php rename to tests/Unit/Breeze/ScorerTest.php index 70ba130..cd56897 100644 --- a/tests/Unit/BreezeWarmup/ScorerTest.php +++ b/tests/Unit/Breeze/ScorerTest.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmup; +namespace Tests\Unit\Breeze; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmup\Scorer; +use Parisek\TimberKit\Breeze\Scorer; /** * Covers the scoring core. diff --git a/tests/Unit/BreezeWarmup/SignalCollectorTest.php b/tests/Unit/Breeze/SignalCollectorTest.php similarity index 98% rename from tests/Unit/BreezeWarmup/SignalCollectorTest.php rename to tests/Unit/Breeze/SignalCollectorTest.php index 1d94d93..160c5fc 100644 --- a/tests/Unit/BreezeWarmup/SignalCollectorTest.php +++ b/tests/Unit/Breeze/SignalCollectorTest.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmup; +namespace Tests\Unit\Breeze; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\Attributes\PreserveGlobalState; use PHPUnit\Framework\Attributes\RunInSeparateProcess; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmup\SignalCollector; +use Parisek\TimberKit\Breeze\SignalCollector; /** * Covers the WordPress-facing signal collection. @@ -237,7 +237,7 @@ static function ( string $hook, $value ) { // breeze_get_option() is mocked here via Functions\when(), which — unlike // Functions\expect() — patches the function definition for the rest of - // the process. StarterBase::setupBreezeWarmupSitemap() branches on + // the process. StarterBase::setup_breeze_warmup_sitemap() branches on // function_exists('breeze_get_option') to detect Breeze's absence, so // leaking this mock would falsely make Breeze look installed in later, // unrelated tests. Run in a separate process to keep the leak contained. diff --git a/tests/Unit/BreezeWarmup/SourceNamingTest.php b/tests/Unit/Breeze/SourceNamingTest.php similarity index 97% rename from tests/Unit/BreezeWarmup/SourceNamingTest.php rename to tests/Unit/Breeze/SourceNamingTest.php index 3807caf..fbaec66 100644 --- a/tests/Unit/BreezeWarmup/SourceNamingTest.php +++ b/tests/Unit/Breeze/SourceNamingTest.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmup; +namespace Tests\Unit\Breeze; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmup\SourceNaming; +use Parisek\TimberKit\Breeze\SourceNaming; /** * Covers post-type and language derivation. diff --git a/tests/Unit/BreezeWarmup/UrlCanonicalizerTest.php b/tests/Unit/Breeze/UrlCanonicalizerTest.php similarity index 96% rename from tests/Unit/BreezeWarmup/UrlCanonicalizerTest.php rename to tests/Unit/Breeze/UrlCanonicalizerTest.php index bfd3162..4ac5197 100644 --- a/tests/Unit/BreezeWarmup/UrlCanonicalizerTest.php +++ b/tests/Unit/Breeze/UrlCanonicalizerTest.php @@ -2,11 +2,11 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmup; +namespace Tests\Unit\Breeze; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmup\UrlCanonicalizer; +use Parisek\TimberKit\Breeze\UrlCanonicalizer; /** * Covers `canonicalize()` — the single URL shape every signal is keyed on. diff --git a/tests/Unit/BreezeWarmupSitemap/FetchSitemapRecordsTest.php b/tests/Unit/Breeze/WarmupSitemap/FetchSitemapRecordsTest.php similarity index 84% rename from tests/Unit/BreezeWarmupSitemap/FetchSitemapRecordsTest.php rename to tests/Unit/Breeze/WarmupSitemap/FetchSitemapRecordsTest.php index 2dd1bd1..4b5aced 100644 --- a/tests/Unit/BreezeWarmupSitemap/FetchSitemapRecordsTest.php +++ b/tests/Unit/Breeze/WarmupSitemap/FetchSitemapRecordsTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmupSitemap; +namespace Tests\Unit\Breeze\WarmupSitemap; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\WarmupSitemap; /** * Covers `fetchSitemapRecords()` — the structured replacement for @@ -22,7 +22,7 @@ class FetchSitemapRecordsTest extends TestCase { protected function setUp(): void { parent::setUp(); Monkey\setUp(); - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Functions\when( 'home_url' )->alias( static fn( string $path = '' ): string => 'https://example.test' . $path ); @@ -31,7 +31,7 @@ protected function setUp(): void { } protected function tearDown(): void { - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Monkey\tearDown(); parent::tearDown(); } @@ -57,7 +57,7 @@ public function test_reads_lastmod_into_a_timestamp(): void { ) ); - $records = BreezeWarmupSitemap::fetchSitemapRecords(); + $records = WarmupSitemap::fetchSitemapRecords(); $this->assertCount( 1, $records ); $this->assertSame( strtotime( '2026-08-01T10:00:00+00:00' ), $records[0]['lastmod'] ); @@ -70,7 +70,7 @@ public function test_missing_lastmod_is_null(): void { ) ); - $this->assertNull( BreezeWarmupSitemap::fetchSitemapRecords()[0]['lastmod'] ); + $this->assertNull( WarmupSitemap::fetchSitemapRecords()[0]['lastmod'] ); } public function test_unparseable_lastmod_is_null(): void { @@ -82,7 +82,7 @@ public function test_unparseable_lastmod_is_null(): void { ) ); - $this->assertNull( BreezeWarmupSitemap::fetchSitemapRecords()[0]['lastmod'] ); + $this->assertNull( WarmupSitemap::fetchSitemapRecords()[0]['lastmod'] ); } public function test_post_type_comes_from_the_sub_sitemap_name(): void { @@ -97,7 +97,7 @@ public function test_post_type_comes_from_the_sub_sitemap_name(): void { ) ); - $this->assertSame( 'realizace', BreezeWarmupSitemap::fetchSitemapRecords()[0]['type'] ); + $this->assertSame( 'realizace', WarmupSitemap::fetchSitemapRecords()[0]['type'] ); } public function test_record_carries_a_canonical_key(): void { @@ -107,7 +107,7 @@ public function test_record_carries_a_canonical_key(): void { ) ); - $record = BreezeWarmupSitemap::fetchSitemapRecords()[0]; + $record = WarmupSitemap::fetchSitemapRecords()[0]; $this->assertSame( 'https://example.test/a', $record['url'], 'the original URL is what Breeze must warm' ); $this->assertSame( 'https://example.test/a/', $record['key'] ); @@ -124,7 +124,7 @@ public function test_legacy_string_api_still_works(): void { $this->assertSame( array( 'https://example.test/a/', 'https://example.test/b/' ), - BreezeWarmupSitemap::fetchSitemapUrls() + WarmupSitemap::fetchSitemapUrls() ); } } diff --git a/tests/Unit/BreezeWarmupSitemap/FetchSitemapUrlsTest.php b/tests/Unit/Breeze/WarmupSitemap/FetchSitemapUrlsTest.php similarity index 92% rename from tests/Unit/BreezeWarmupSitemap/FetchSitemapUrlsTest.php rename to tests/Unit/Breeze/WarmupSitemap/FetchSitemapUrlsTest.php index 554366c..791d20d 100644 --- a/tests/Unit/BreezeWarmupSitemap/FetchSitemapUrlsTest.php +++ b/tests/Unit/Breeze/WarmupSitemap/FetchSitemapUrlsTest.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmupSitemap; +namespace Tests\Unit\Breeze\WarmupSitemap; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\Attributes\PreserveGlobalState; use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\WarmupSitemap; /** * Covers `fetchSitemapUrls()`: AIOSEO-first source resolution, sitemap-index @@ -27,14 +27,14 @@ class FetchSitemapUrlsTest extends TestCase { protected function setUp(): void { parent::setUp(); Monkey\setUp(); - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Functions\when( 'is_wp_error' )->justReturn( false ); Functions\when( 'wp_remote_retrieve_response_code' )->alias( fn( $r ) => $r['response']['code'] ?? 200 ); Functions\when( 'wp_remote_retrieve_body' )->alias( fn( $r ) => $r['body'] ?? '' ); } protected function tearDown(): void { - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Monkey\tearDown(); parent::tearDown(); } @@ -50,7 +50,7 @@ function ( $url ) use ( &$requested ) { } ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array( 'https://example.test/wp-sitemap.xml' ), $requested ); $this->assertSame( array( 'https://example.test/page/' ), $result ); @@ -76,7 +76,7 @@ function ( $url ) use ( &$requested ) { } ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array( 'https://example.test/sitemap.xml' ), $requested ); $this->assertSame( array( 'https://example.test/aioseo-page/' ), $result ); @@ -107,7 +107,7 @@ function ( $url ) { } ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); sort( $result ); $this->assertSame( @@ -126,7 +126,7 @@ public function test_foreign_host_urls_are_dropped(): void { ) ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array( 'https://example.test/local/' ), $result ); } @@ -135,7 +135,7 @@ public function test_malformed_xml_degrades_to_empty_array(): void { Functions\when( 'home_url' )->alias( fn( $path = '' ) => 'https://example.test' . $path ); Functions\when( 'wp_remote_get' )->justReturn( Fixtures::response( 'assertSame( array(), $result ); } @@ -145,7 +145,7 @@ public function test_wp_error_response_degrades_to_empty_array(): void { Functions\when( 'wp_remote_get' )->justReturn( 'error-marker' ); Functions\when( 'is_wp_error' )->justReturn( true ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array(), $result ); } @@ -154,7 +154,7 @@ public function test_non_200_response_degrades_to_empty_array(): void { Functions\when( 'home_url' )->alias( fn( $path = '' ) => 'https://example.test' . $path ); Functions\when( 'wp_remote_get' )->justReturn( Fixtures::response( '', 500 ) ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array(), $result ); } @@ -162,7 +162,7 @@ public function test_non_200_response_degrades_to_empty_array(): void { public function test_missing_home_url_degrades_to_empty_array(): void { // No `home_url` mock registered at all — simulates a non-WP load // context where the function is entirely undefined. - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array(), $result ); } @@ -182,7 +182,7 @@ function ( $url ) use ( &$calls ) { } ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array(), $result ); $this->assertSame( 1, $calls ); @@ -217,7 +217,7 @@ function ( $url ) { } ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); // level-4.xml is never fetched: depth 0 (root index) -> depth 1 // (level-2, an index) -> depth 2 (level-3, an index) is where @@ -246,7 +246,7 @@ function ( $url ) { } ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array( 'https://example.test/found-it/' ), $result ); } @@ -268,7 +268,7 @@ function ( $url ) use ( $subLocs ) { } ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); // MAX_SUBSITEMAPS = 50, so only the first 50 of the 60 sub-sitemaps // are followed. @@ -301,7 +301,7 @@ function ( $url ) use ( &$requested ) { } ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertNotContains( 'https://evil.test/sub-sitemap.xml', $requested ); $this->assertSame( array( 'https://example.test/post-1/' ), $result ); @@ -322,7 +322,7 @@ function ( $url ) use ( &$requested ) { } ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array( 'https://example.test/wp-sitemap.xml' ), $requested ); $this->assertSame( array(), $result ); @@ -339,7 +339,7 @@ function ( $url, $args = array() ) use ( &$capturedArgs ) { } ); - BreezeWarmupSitemap::fetchSitemapUrls(); + WarmupSitemap::fetchSitemapUrls(); $this->assertNotEmpty( $capturedArgs ); foreach ( $capturedArgs as $args ) { @@ -354,7 +354,7 @@ public function test_gzip_compressed_sitemap_is_decompressed(): void { Fixtures::gzipResponse( Fixtures::urlset( array( 'https://example.test/gz-page/' ) ) ) ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array( 'https://example.test/gz-page/' ), $result ); } @@ -367,7 +367,7 @@ public function test_oversized_gzip_body_is_rejected_before_decompression(): voi $oversized = "\x1f\x8b" . str_repeat( 'x', 10485760 + 1 ); Functions\when( 'wp_remote_get' )->justReturn( Fixtures::response( $oversized ) ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array(), $result ); } @@ -376,7 +376,7 @@ public function test_empty_urlset_returns_empty_array(): void { Functions\when( 'home_url' )->alias( fn( $path = '' ) => 'https://example.test' . $path ); Functions\when( 'wp_remote_get' )->justReturn( Fixtures::response( Fixtures::urlset( array() ) ) ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array(), $result ); } @@ -393,7 +393,7 @@ public function test_root_element_mismatch_is_ignored_despite_matching_child_nam ) ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); $this->assertSame( array(), $result ); } @@ -404,7 +404,7 @@ public function test_xxe_entity_is_never_expanded(): void { Fixtures::response( Fixtures::xxeUrlset( 'file:///etc/passwd' ) ) ); - $result = BreezeWarmupSitemap::fetchSitemapUrls(); + $result = WarmupSitemap::fetchSitemapUrls(); // Whether libxml refuses to parse the unresolved entity (most likely, // asserted explicitly below) or somehow yields a loc, the result must diff --git a/tests/Unit/BreezeWarmupSitemap/FilterPreloadUrlsTest.php b/tests/Unit/Breeze/WarmupSitemap/FilterPreloadUrlsTest.php similarity index 87% rename from tests/Unit/BreezeWarmupSitemap/FilterPreloadUrlsTest.php rename to tests/Unit/Breeze/WarmupSitemap/FilterPreloadUrlsTest.php index cb3313d..66fdc1a 100644 --- a/tests/Unit/BreezeWarmupSitemap/FilterPreloadUrlsTest.php +++ b/tests/Unit/Breeze/WarmupSitemap/FilterPreloadUrlsTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmupSitemap; +namespace Tests\Unit\Breeze\WarmupSitemap; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\WarmupSitemap; /** * Covers `filterPreloadUrls()` — the `breeze_preload_urls` filter callback. @@ -25,11 +25,11 @@ class FilterPreloadUrlsTest extends TestCase { protected function setUp(): void { parent::setUp(); Monkey\setUp(); - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); } protected function tearDown(): void { - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Monkey\tearDown(); parent::tearDown(); } @@ -52,7 +52,7 @@ public function test_merges_sitemap_urls_into_existing_list(): void { $this->freshStoredData( array( 'https://example.test/a/', 'https://example.test/b/' ) ) ); - $result = BreezeWarmupSitemap::filterPreloadUrls( array( 'https://example.test/' ) ); + $result = WarmupSitemap::filterPreloadUrls( array( 'https://example.test/' ) ); $this->assertSame( array( 'https://example.test/', 'https://example.test/a/', 'https://example.test/b/' ), @@ -65,7 +65,7 @@ public function test_dedupes_sitemap_urls_already_present(): void { $this->freshStoredData( array( 'https://example.test/', 'https://example.test/new/' ) ) ); - $result = BreezeWarmupSitemap::filterPreloadUrls( array( 'https://example.test/' ) ); + $result = WarmupSitemap::filterPreloadUrls( array( 'https://example.test/' ) ); $this->assertSame( array( 'https://example.test/', 'https://example.test/new/' ), @@ -76,7 +76,7 @@ public function test_dedupes_sitemap_urls_already_present(): void { public function test_non_array_input_is_treated_as_empty(): void { Functions\when( 'get_option' )->justReturn( $this->freshStoredData( array( 'https://example.test/a/' ) ) ); - $result = BreezeWarmupSitemap::filterPreloadUrls( null ); + $result = WarmupSitemap::filterPreloadUrls( null ); $this->assertSame( array( 'https://example.test/a/' ), $result ); } @@ -88,7 +88,7 @@ public function test_caps_sitemap_urls_at_default_max(): void { } Functions\when( 'get_option' )->justReturn( $this->freshStoredData( $sitemapUrls ) ); - $result = BreezeWarmupSitemap::filterPreloadUrls( array() ); + $result = WarmupSitemap::filterPreloadUrls( array() ); $this->assertCount( 200, $result ); } @@ -100,7 +100,7 @@ public function test_existing_urls_are_never_counted_against_the_cap(): void { } Functions\when( 'get_option' )->justReturn( $this->freshStoredData( array( 'https://example.test/new/' ) ) ); - $result = BreezeWarmupSitemap::filterPreloadUrls( $existing ); + $result = WarmupSitemap::filterPreloadUrls( $existing ); $this->assertCount( 201, $result ); $this->assertContains( 'https://example.test/new/', $result ); @@ -116,7 +116,7 @@ function ( $filter, $default, ...$args ) { } ); - $result = BreezeWarmupSitemap::filterPreloadUrls( array() ); + $result = WarmupSitemap::filterPreloadUrls( array() ); $this->assertCount( 2, $result ); } @@ -130,7 +130,7 @@ function ( $filter, $default, ...$args ) { ); Functions\expect( 'get_option' )->never(); - $result = BreezeWarmupSitemap::filterPreloadUrls( array( 'https://example.test/' ) ); + $result = WarmupSitemap::filterPreloadUrls( array( 'https://example.test/' ) ); $this->assertSame( array( 'https://example.test/' ), $result ); } @@ -158,7 +158,7 @@ function ( $timestamp, $hook ) use ( &$scheduleCalls ) { } ); - $result = BreezeWarmupSitemap::filterPreloadUrls( array( 'https://example.test/' ) ); + $result = WarmupSitemap::filterPreloadUrls( array( 'https://example.test/' ) ); $this->assertSame( array( 'https://example.test/' ), $result ); $this->assertSame( @@ -188,7 +188,7 @@ function () use ( &$scheduleCalls ) { } ); - $result = BreezeWarmupSitemap::filterPreloadUrls( array() ); + $result = WarmupSitemap::filterPreloadUrls( array() ); $this->assertSame( array( 'https://example.test/stale-page/' ), $result ); $this->assertSame( 1, $scheduleCalls ); @@ -203,7 +203,7 @@ public function test_pending_refresh_job_is_not_scheduled_twice(): void { Functions\expect( 'wp_schedule_single_event' )->never(); Functions\expect( 'wp_remote_get' )->never(); - $result = BreezeWarmupSitemap::filterPreloadUrls( array() ); + $result = WarmupSitemap::filterPreloadUrls( array() ); $this->assertSame( array(), $result ); } diff --git a/tests/Unit/BreezeWarmupSitemap/Fixtures.php b/tests/Unit/Breeze/WarmupSitemap/Fixtures.php similarity index 96% rename from tests/Unit/BreezeWarmupSitemap/Fixtures.php rename to tests/Unit/Breeze/WarmupSitemap/Fixtures.php index ee3dd9a..499ff64 100644 --- a/tests/Unit/BreezeWarmupSitemap/Fixtures.php +++ b/tests/Unit/Breeze/WarmupSitemap/Fixtures.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmupSitemap; +namespace Tests\Unit\Breeze\WarmupSitemap; /** - * Shared XML sitemap fixtures for BreezeWarmupSitemap tests. + * Shared XML sitemap fixtures for WarmupSitemap tests. */ final class Fixtures { diff --git a/tests/Unit/BreezeWarmupSitemap/GetStoredUrlsTest.php b/tests/Unit/Breeze/WarmupSitemap/GetStoredUrlsTest.php similarity index 74% rename from tests/Unit/BreezeWarmupSitemap/GetStoredUrlsTest.php rename to tests/Unit/Breeze/WarmupSitemap/GetStoredUrlsTest.php index dd9b4b8..2effd32 100644 --- a/tests/Unit/BreezeWarmupSitemap/GetStoredUrlsTest.php +++ b/tests/Unit/Breeze/WarmupSitemap/GetStoredUrlsTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmupSitemap; +namespace Tests\Unit\Breeze\WarmupSitemap; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\WarmupSitemap; /** * Covers `getStoredUrls()` — the read-only accessor over the last-known-good @@ -18,11 +18,11 @@ class GetStoredUrlsTest extends TestCase { protected function setUp(): void { parent::setUp(); Monkey\setUp(); - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); } protected function tearDown(): void { - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Monkey\tearDown(); parent::tearDown(); } @@ -32,31 +32,31 @@ public function test_returns_urls_from_stored_option(): void { array( 'urls' => array( 'https://example.test/a/' ), 'fetched_at' => time() ) ); - $this->assertSame( array( 'https://example.test/a/' ), BreezeWarmupSitemap::getStoredUrls() ); + $this->assertSame( array( 'https://example.test/a/' ), WarmupSitemap::getStoredUrls() ); } public function test_returns_empty_array_when_option_missing(): void { Functions\when( 'get_option' )->justReturn( null ); - $this->assertSame( array(), BreezeWarmupSitemap::getStoredUrls() ); + $this->assertSame( array(), WarmupSitemap::getStoredUrls() ); } public function test_returns_empty_array_when_option_is_not_an_array(): void { Functions\when( 'get_option' )->justReturn( 'not-an-array' ); - $this->assertSame( array(), BreezeWarmupSitemap::getStoredUrls() ); + $this->assertSame( array(), WarmupSitemap::getStoredUrls() ); } public function test_returns_empty_array_when_fetched_at_is_missing(): void { Functions\when( 'get_option' )->justReturn( array( 'urls' => array( 'https://example.test/a/' ) ) ); - $this->assertSame( array(), BreezeWarmupSitemap::getStoredUrls() ); + $this->assertSame( array(), WarmupSitemap::getStoredUrls() ); } public function test_returns_empty_array_when_urls_key_is_not_an_array(): void { Functions\when( 'get_option' )->justReturn( array( 'urls' => 'oops', 'fetched_at' => time() ) ); - $this->assertSame( array(), BreezeWarmupSitemap::getStoredUrls() ); + $this->assertSame( array(), WarmupSitemap::getStoredUrls() ); } public function test_filters_out_non_string_url_entries(): void { @@ -69,7 +69,7 @@ public function test_filters_out_non_string_url_entries(): void { $this->assertSame( array( 'https://example.test/a/', 'https://example.test/b/' ), - BreezeWarmupSitemap::getStoredUrls() + WarmupSitemap::getStoredUrls() ); } } diff --git a/tests/Unit/BreezeWarmupSitemap/MergeUrlsTest.php b/tests/Unit/Breeze/WarmupSitemap/MergeUrlsTest.php similarity index 86% rename from tests/Unit/BreezeWarmupSitemap/MergeUrlsTest.php rename to tests/Unit/Breeze/WarmupSitemap/MergeUrlsTest.php index 092b879..a53e76d 100644 --- a/tests/Unit/BreezeWarmupSitemap/MergeUrlsTest.php +++ b/tests/Unit/Breeze/WarmupSitemap/MergeUrlsTest.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmupSitemap; +namespace Tests\Unit\Breeze\WarmupSitemap; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\WarmupSitemap; /** * Covers the merge rule — the only new code that runs inside the purge @@ -20,7 +20,7 @@ class MergeUrlsTest extends TestCase { private const HOME = 'https://example.test/'; public function test_homepage_leads(): void { - $result = BreezeWarmupSitemap::mergeUrls( + $result = WarmupSitemap::mergeUrls( array( 'https://example.test/', 'https://example.test/shop/' ), array( 'https://example.test/kontakt/' ), self::HOME @@ -33,7 +33,7 @@ public function test_breeze_only_entries_come_before_our_list(): void { // Entries the admin typed but which are not in the sitemap cannot be // scored, so they sit right behind the homepage — matching the fact // that `manual` is the second highest weight. - $result = BreezeWarmupSitemap::mergeUrls( + $result = WarmupSitemap::mergeUrls( array( 'https://example.test/', 'https://example.test/akce/' ), array( 'https://example.test/kontakt/' ), self::HOME @@ -46,7 +46,7 @@ public function test_breeze_only_entries_come_before_our_list(): void { } public function test_our_ordering_is_preserved(): void { - $result = BreezeWarmupSitemap::mergeUrls( + $result = WarmupSitemap::mergeUrls( array( 'https://example.test/' ), array( 'https://example.test/first/', 'https://example.test/second/' ), self::HOME @@ -61,7 +61,7 @@ public function test_our_ordering_is_preserved(): void { public function test_homepage_is_never_duplicated(): void { // Breeze builds it with trailingslashit(); a sitemap may emit it // without the slash. Keyed on the raw string those are two URLs. - $result = BreezeWarmupSitemap::mergeUrls( + $result = WarmupSitemap::mergeUrls( array( 'https://example.test/' ), array( 'https://example.test', 'https://example.test/a/' ), self::HOME @@ -74,7 +74,7 @@ public function test_homepage_is_never_duplicated(): void { } public function test_dedup_uses_canonical_keys(): void { - $result = BreezeWarmupSitemap::mergeUrls( + $result = WarmupSitemap::mergeUrls( array( 'https://example.test/', 'https://example.test/akce' ), array( 'https://example.test/akce/' ), self::HOME @@ -87,7 +87,7 @@ public function test_dedup_uses_canonical_keys(): void { } public function test_homepage_missing_from_breeze_list_is_not_invented(): void { - $result = BreezeWarmupSitemap::mergeUrls( + $result = WarmupSitemap::mergeUrls( array( 'https://example.test/shop/' ), array( 'https://example.test/a/' ), self::HOME @@ -102,6 +102,6 @@ public function test_homepage_missing_from_breeze_list_is_not_invented(): void { public function test_empty_ordered_list_returns_breeze_list_unchanged(): void { $existing = array( 'https://example.test/', 'https://example.test/shop/' ); - $this->assertSame( $existing, BreezeWarmupSitemap::mergeUrls( $existing, array(), self::HOME ) ); + $this->assertSame( $existing, WarmupSitemap::mergeUrls( $existing, array(), self::HOME ) ); } } diff --git a/tests/Unit/BreezeWarmupSitemap/RegisterTest.php b/tests/Unit/Breeze/WarmupSitemap/RegisterTest.php similarity index 83% rename from tests/Unit/BreezeWarmupSitemap/RegisterTest.php rename to tests/Unit/Breeze/WarmupSitemap/RegisterTest.php index 706efbf..c923e7c 100644 --- a/tests/Unit/BreezeWarmupSitemap/RegisterTest.php +++ b/tests/Unit/Breeze/WarmupSitemap/RegisterTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmupSitemap; +namespace Tests\Unit\Breeze\WarmupSitemap; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\WarmupSitemap; /** * Covers hook registration: both the `breeze_preload_urls` filter and the @@ -19,11 +19,11 @@ class RegisterTest extends TestCase { protected function setUp(): void { parent::setUp(); Monkey\setUp(); - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); } protected function tearDown(): void { - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Monkey\tearDown(); parent::tearDown(); } @@ -44,7 +44,7 @@ function ( string $tag ) use ( &$actions ) { } ); - BreezeWarmupSitemap::register(); + WarmupSitemap::register(); $this->assertSame( array( 'breeze_preload_urls' ), $filters ); $this->assertSame( array( 'timber_kit_breeze_warmup_sitemap_refresh' ), $actions ); @@ -66,8 +66,8 @@ function () use ( &$actionCalls ) { } ); - BreezeWarmupSitemap::register(); - BreezeWarmupSitemap::register(); + WarmupSitemap::register(); + WarmupSitemap::register(); $this->assertSame( 1, $filterCalls ); $this->assertSame( 1, $actionCalls ); @@ -83,8 +83,8 @@ function ( $filter, $default, ...$args ) { Functions\expect( 'add_filter' )->never(); Functions\expect( 'add_action' )->never(); - BreezeWarmupSitemap::register(); + WarmupSitemap::register(); - $this->assertFalse( BreezeWarmupSitemap::isEnabled() ); + $this->assertFalse( WarmupSitemap::isEnabled() ); } } diff --git a/tests/Unit/BreezeWarmupSitemap/RescoreOnMenuUpdateTest.php b/tests/Unit/Breeze/WarmupSitemap/RescoreOnMenuUpdateTest.php similarity index 92% rename from tests/Unit/BreezeWarmupSitemap/RescoreOnMenuUpdateTest.php rename to tests/Unit/Breeze/WarmupSitemap/RescoreOnMenuUpdateTest.php index 7c6ad5f..f4c940c 100644 --- a/tests/Unit/BreezeWarmupSitemap/RescoreOnMenuUpdateTest.php +++ b/tests/Unit/Breeze/WarmupSitemap/RescoreOnMenuUpdateTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmupSitemap; +namespace Tests\Unit\Breeze\WarmupSitemap; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\WarmupSitemap; /** * Covers the in-place rescore on `wp_update_nav_menu`. @@ -22,11 +22,11 @@ class RescoreOnMenuUpdateTest extends TestCase { protected function setUp(): void { parent::setUp(); Monkey\setUp(); - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); } protected function tearDown(): void { - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Monkey\tearDown(); parent::tearDown(); } @@ -41,7 +41,7 @@ private function enablePriority(): void { Functions\when( 'add_filter' )->justReturn( true ); Functions\when( 'add_action' )->justReturn( true ); - BreezeWarmupSitemap::register( true ); + WarmupSitemap::register( true ); } public function test_reorders_from_stored_signals_without_touching_the_network(): void { @@ -82,7 +82,7 @@ static function ( string $key, $value ) use ( &$written ): bool { } ); - BreezeWarmupSitemap::rescoreOnMenuUpdate(); + WarmupSitemap::rescoreOnMenuUpdate(); $this->assertSame( 'https://example.test/b/', $written['urls'][0], 'the new menu page leads' ); } @@ -101,7 +101,7 @@ public function test_does_nothing_when_signals_are_missing(): void { Functions\when( 'wp_schedule_single_event' )->justReturn( true ); Functions\expect( 'update_option' )->never(); - BreezeWarmupSitemap::rescoreOnMenuUpdate(); + WarmupSitemap::rescoreOnMenuUpdate(); $this->addToAssertionCount( 1 ); } @@ -118,7 +118,7 @@ function ( string $tag, $callback, int $priority = 10 ) use ( &$actions ) { } ); - BreezeWarmupSitemap::register( true ); + WarmupSitemap::register( true ); $this->assertContains( array( 'wp_update_nav_menu', 5 ), $actions ); } @@ -135,7 +135,7 @@ function ( string $tag ) use ( &$actions ) { } ); - BreezeWarmupSitemap::register(); + WarmupSitemap::register(); $this->assertNotContains( 'wp_update_nav_menu', $actions ); } @@ -165,7 +165,7 @@ static function () { } ); - BreezeWarmupSitemap::rescoreOnMenuUpdate(); + WarmupSitemap::rescoreOnMenuUpdate(); $this->addToAssertionCount( 1 ); } @@ -191,7 +191,7 @@ public function test_register_false_leaves_rescore_unreachable_even_with_stored_ Functions\expect( 'update_option' )->never(); Functions\expect( 'wp_remote_get' )->never(); - BreezeWarmupSitemap::rescoreOnMenuUpdate(); + WarmupSitemap::rescoreOnMenuUpdate(); $this->addToAssertionCount( 1 ); } diff --git a/tests/Unit/BreezeWarmupSitemap/RunRefreshPriorityTest.php b/tests/Unit/Breeze/WarmupSitemap/RunRefreshPriorityTest.php similarity index 80% rename from tests/Unit/BreezeWarmupSitemap/RunRefreshPriorityTest.php rename to tests/Unit/Breeze/WarmupSitemap/RunRefreshPriorityTest.php index 661876e..268cee1 100644 --- a/tests/Unit/BreezeWarmupSitemap/RunRefreshPriorityTest.php +++ b/tests/Unit/Breeze/WarmupSitemap/RunRefreshPriorityTest.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmupSitemap; +namespace Tests\Unit\Breeze\WarmupSitemap; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmup\Scorer; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\Scorer; +use Parisek\TimberKit\Breeze\WarmupSitemap; /** * Covers the refresh pipeline: signals in, ordered list out. @@ -22,11 +22,11 @@ class RunRefreshPriorityTest extends TestCase { protected function setUp(): void { parent::setUp(); Monkey\setUp(); - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); } protected function tearDown(): void { - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Monkey\tearDown(); parent::tearDown(); } @@ -37,7 +37,7 @@ public function test_menu_pages_outrank_plain_pages(): void { $this->record( 'https://example.test/kontakt/', array( 'menu' => true ) ), ); - $built = BreezeWarmupSitemap::buildOrderedUrls( $records, Scorer::DEFAULT_WEIGHTS, 1000000000, 50 ); + $built = WarmupSitemap::buildOrderedUrls( $records, Scorer::DEFAULT_WEIGHTS, 1000000000, 50 ); $this->assertSame( 'https://example.test/kontakt/', $built['urls'][0] ); } @@ -48,7 +48,7 @@ public function test_front_page_leads(): void { $this->record( 'https://example.test/', array( 'front_page' => true ) ), ); - $built = BreezeWarmupSitemap::buildOrderedUrls( $records, Scorer::DEFAULT_WEIGHTS, 1000000000, 50 ); + $built = WarmupSitemap::buildOrderedUrls( $records, Scorer::DEFAULT_WEIGHTS, 1000000000, 50 ); $this->assertSame( 'https://example.test/', $built['urls'][0] ); } @@ -56,7 +56,7 @@ public function test_front_page_leads(): void { public function test_signals_are_stored_keyed_by_canonical_url(): void { $records = array( $this->record( 'https://example.test/a/', array( 'menu' => true ) ) ); - $built = BreezeWarmupSitemap::buildOrderedUrls( $records, Scorer::DEFAULT_WEIGHTS, 1000000000, 50 ); + $built = WarmupSitemap::buildOrderedUrls( $records, Scorer::DEFAULT_WEIGHTS, 1000000000, 50 ); $this->assertArrayHasKey( 'https://example.test/a/', $built['signals'] ); $this->assertTrue( $built['signals']['https://example.test/a/']['menu'] ); @@ -67,7 +67,7 @@ public function test_stored_signals_include_manual(): void { // hand-picked URLs down the list. $records = array( $this->record( 'https://example.test/akce/', array( 'manual' => true ) ) ); - $built = BreezeWarmupSitemap::buildOrderedUrls( $records, Scorer::DEFAULT_WEIGHTS, 1000000000, 50 ); + $built = WarmupSitemap::buildOrderedUrls( $records, Scorer::DEFAULT_WEIGHTS, 1000000000, 50 ); $this->assertTrue( $built['signals']['https://example.test/akce/']['manual'] ); } @@ -78,7 +78,7 @@ public function test_cap_is_applied(): void { $records[] = $this->record( 'https://example.test/' . $i . '/' ); } - $built = BreezeWarmupSitemap::buildOrderedUrls( $records, Scorer::DEFAULT_WEIGHTS, 1000000000, 3 ); + $built = WarmupSitemap::buildOrderedUrls( $records, Scorer::DEFAULT_WEIGHTS, 1000000000, 3 ); $this->assertCount( 3, $built['urls'] ); } @@ -90,7 +90,7 @@ public function test_refresh_releases_the_lock_on_failure(): void { Functions\when( 'set_transient' )->justReturn( true ); Functions\expect( 'delete_transient' )->once(); - BreezeWarmupSitemap::runRefresh(); + WarmupSitemap::runRefresh(); // Functions\expect()->once() above is the real assertion (verified on // Mockery::close() in Monkey\tearDown()); this just keeps PHPUnit from diff --git a/tests/Unit/BreezeWarmupSitemap/RunRefreshTest.php b/tests/Unit/Breeze/WarmupSitemap/RunRefreshTest.php similarity index 94% rename from tests/Unit/BreezeWarmupSitemap/RunRefreshTest.php rename to tests/Unit/Breeze/WarmupSitemap/RunRefreshTest.php index d5171bf..82a9651 100644 --- a/tests/Unit/BreezeWarmupSitemap/RunRefreshTest.php +++ b/tests/Unit/Breeze/WarmupSitemap/RunRefreshTest.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Tests\Unit\BreezeWarmupSitemap; +namespace Tests\Unit\Breeze\WarmupSitemap; use Brain\Monkey; use Brain\Monkey\Functions; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\WarmupSitemap; /** * Covers `runRefresh()` — the deferred cron job that does the actual crawl. @@ -21,7 +21,7 @@ class RunRefreshTest extends TestCase { protected function setUp(): void { parent::setUp(); Monkey\setUp(); - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Functions\when( 'home_url' )->alias( fn( $path = '' ) => 'https://example.test' . $path ); Functions\when( 'is_wp_error' )->justReturn( false ); Functions\when( 'wp_remote_retrieve_response_code' )->alias( fn( $r ) => $r['response']['code'] ?? 200 ); @@ -40,7 +40,7 @@ protected function setUp(): void { } protected function tearDown(): void { - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Monkey\tearDown(); parent::tearDown(); } @@ -68,7 +68,7 @@ function ( $key ) use ( &$deletedTransients ) { } ); - BreezeWarmupSitemap::runRefresh(); + WarmupSitemap::runRefresh(); $this->assertCount( 1, $updateOptionCalls ); [ $key, $value, $autoload ] = $updateOptionCalls[0]; @@ -100,7 +100,7 @@ function ( $key ) use ( &$deletedTransients ) { } ); - BreezeWarmupSitemap::runRefresh(); + WarmupSitemap::runRefresh(); $this->assertSame( array( 'timber_kit_breeze_warmup_sitemap_refresh_lock' ), $deletedTransients ); } @@ -120,7 +120,7 @@ function ( $key ) use ( &$deletedTransients ) { } ); - BreezeWarmupSitemap::runRefresh(); + WarmupSitemap::runRefresh(); $this->assertSame( array( 'timber_kit_breeze_warmup_sitemap_refresh_lock' ), $deletedTransients ); } diff --git a/tests/Unit/StarterBase/BreezeWarmupPrioritySetupTest.php b/tests/Unit/StarterBase/BreezeWarmupPrioritySetupTest.php index 26b0ada..36b78dc 100644 --- a/tests/Unit/StarterBase/BreezeWarmupPrioritySetupTest.php +++ b/tests/Unit/StarterBase/BreezeWarmupPrioritySetupTest.php @@ -8,7 +8,7 @@ use Brain\Monkey\Filters; use Brain\Monkey\Functions; use PHPUnit\Framework\TestCase; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\WarmupSitemap; /** * Covers the flag matrix. @@ -22,11 +22,11 @@ class BreezeWarmupPrioritySetupTest extends TestCase { protected function setUp(): void { parent::setUp(); Monkey\setUp(); - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); } protected function tearDown(): void { - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Monkey\tearDown(); parent::tearDown(); } @@ -57,7 +57,7 @@ public function test_priority_off_does_not_wire_the_menu_hook(): void { $actions = array(); $this->captureActions( $actions ); - BreezeWarmupSitemap::register( false, null ); + WarmupSitemap::register( false, null ); $this->assertNotContains( 'wp_update_nav_menu', array_column( $actions, 0 ) ); } @@ -68,7 +68,7 @@ public function test_priority_on_wires_the_menu_hook_at_priority_five(): void { $actions = array(); $this->captureActions( $actions ); - BreezeWarmupSitemap::register( true, null ); + WarmupSitemap::register( true, null ); $this->assertContains( array( 'wp_update_nav_menu', 5 ), $actions ); } @@ -79,9 +79,9 @@ public function test_the_filter_wins_over_the_declared_weights(): void { Filters\expectApplied( 'timberkit_warmup_priority_weights' ) ->andReturn( array( 'menu' => 42 ) ); - BreezeWarmupSitemap::register( true, array( 'menu' => 7 ) ); + WarmupSitemap::register( true, array( 'menu' => 7 ) ); - $this->assertSame( 42, BreezeWarmupSitemap::weights()['menu'] ); + $this->assertSame( 42, WarmupSitemap::weights()['menu'] ); } /** @@ -97,13 +97,13 @@ public function test_registration_hash_agrees_with_what_a_refresh_write_would_st Filters\expectApplied( 'timberkit_warmup_priority_weights' ) ->andReturn( array( 'menu' => 42 ) ); - BreezeWarmupSitemap::register( true, array( 'menu' => 7 ) ); + WarmupSitemap::register( true, array( 'menu' => 7 ) ); - $reflection = new \ReflectionClass( BreezeWarmupSitemap::class ); + $reflection = new \ReflectionClass( WarmupSitemap::class ); $registeredHash = $reflection->getProperty( 'weights_hash' ); $registeredHash->setAccessible( true ); - $writeWouldStore = \Parisek\TimberKit\BreezeWarmup\Scorer::weightsHash( BreezeWarmupSitemap::weights() ); + $writeWouldStore = \Parisek\TimberKit\Breeze\Scorer::weightsHash( WarmupSitemap::weights() ); $this->assertSame( $writeWouldStore, $registeredHash->getValue() ); } diff --git a/tests/Unit/StarterBase/BreezeWarmupSitemapSetupTest.php b/tests/Unit/StarterBase/BreezeWarmupSitemapSetupTest.php index 1febc03..31b4b47 100644 --- a/tests/Unit/StarterBase/BreezeWarmupSitemapSetupTest.php +++ b/tests/Unit/StarterBase/BreezeWarmupSitemapSetupTest.php @@ -6,7 +6,7 @@ use Brain\Monkey; use Brain\Monkey\Functions; -use Parisek\TimberKit\BreezeWarmupSitemap; +use Parisek\TimberKit\Breeze\WarmupSitemap; use Parisek\TimberKit\StarterBase; use PHPUnit\Framework\Attributes\PreserveGlobalState; use PHPUnit\Framework\Attributes\RunInSeparateProcess; @@ -35,12 +35,12 @@ class BreezeWarmupSitemapSetupTest extends TestCase { protected function setUp(): void { parent::setUp(); Monkey\setUp(); - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Functions\when( 'add_action' )->justReturn( true ); } protected function tearDown(): void { - BreezeWarmupSitemap::reset_for_tests(); + WarmupSitemap::reset_for_tests(); Monkey\tearDown(); parent::tearDown(); } @@ -123,6 +123,6 @@ function ( $filter, $default, ...$args ) { ( new BreezeWarmupSitemapSetupStarterBaseStub( true ) )->run_setup_breeze_warmup_sitemap(); - $this->assertFalse( BreezeWarmupSitemap::isEnabled() ); + $this->assertFalse( WarmupSitemap::isEnabled() ); } } From b54efac88de5dc987be5efb28e6b42bc005f1ae3 Mon Sep 17 00:00:00 2001 From: Petr Parimucha Date: Mon, 24 Aug 2026 18:44:15 +0200 Subject: [PATCH 2/2] test(breeze): pin that the pre-move class name still resolves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The alias in compat/aliases.php was invisible to the suite. Every other test uses the new name, so dropping the composer autoload.files entry, mistyping the alias target, or having it fail under an optimised autoloader would all have left the build green — the one thing that must not break on upgrade was the one thing nothing exercised. Three assertions: the legacy name resolves, it resolves to the moved class rather than merely to something, and the shim stays wired through composer.json. Verified to fail on a deliberately mistyped alias. --- .../BackwardCompatibleAliasTest.php | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 tests/Unit/Architecture/BackwardCompatibleAliasTest.php diff --git a/tests/Unit/Architecture/BackwardCompatibleAliasTest.php b/tests/Unit/Architecture/BackwardCompatibleAliasTest.php new file mode 100644 index 0000000..1d906fa --- /dev/null +++ b/tests/Unit/Architecture/BackwardCompatibleAliasTest.php @@ -0,0 +1,60 @@ +assertTrue( + class_exists( self::LEGACY ), + self::LEGACY . ' shipped in v1.37.0 and must keep resolving after the move' + ); + } + + public function test_the_legacy_name_points_at_the_moved_class(): void { + // Resolving is not enough — it has to resolve to the right thing. An + // alias pointing at some other class would satisfy class_exists(). + $this->assertTrue( is_a( self::LEGACY, self::CURRENT, true ) ); + } + + public function test_the_alias_is_wired_through_composer(): void { + // The shim only loads because composer.json lists it under + // autoload.files. Dropping that entry breaks the alias without + // touching a single line of PHP, so pin it explicitly. + $manifest = json_decode( + (string) file_get_contents( dirname( __DIR__, 3 ) . '/composer.json' ), + true + ); + + $this->assertIsArray( $manifest ); + $this->assertContains( + 'compat/aliases.php', + $manifest['autoload']['files'] ?? array(), + 'the alias shim must stay in composer.json autoload.files' + ); + } +}