From b67b1258e6556d79149fcc0fa36c2e774378ec95 Mon Sep 17 00:00:00 2001 From: David Stone Date: Sun, 21 Jun 2026 19:48:48 -0600 Subject: [PATCH] fix: stabilize multisite test bootstrap --- .../WP_Ultimo/Managers/Site_Manager_Test.php | 4 +-- tests/WP_Ultimo/Models/Domain_Test.php | 2 +- tests/WP_Ultimo/Models/Site_Test.php | 26 ++++++++++--------- tests/bootstrap.php | 20 +++++++++++++- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/tests/WP_Ultimo/Managers/Site_Manager_Test.php b/tests/WP_Ultimo/Managers/Site_Manager_Test.php index 404d87e28..1b8c14c65 100644 --- a/tests/WP_Ultimo/Managers/Site_Manager_Test.php +++ b/tests/WP_Ultimo/Managers/Site_Manager_Test.php @@ -1669,8 +1669,8 @@ public function test_site_network_id(): void { $site = new \WP_Ultimo\Models\Site(); - // Default is 1 - $this->assertEquals(1, $site->get_site_id()); + // Unsaved sites defer network selection to save() instead of hard-coding network 1. + $this->assertEquals(0, $site->get_site_id()); $site->set_site_id(2); $this->assertEquals(2, $site->get_site_id()); diff --git a/tests/WP_Ultimo/Models/Domain_Test.php b/tests/WP_Ultimo/Models/Domain_Test.php index f661801a9..f7911d745 100644 --- a/tests/WP_Ultimo/Models/Domain_Test.php +++ b/tests/WP_Ultimo/Models/Domain_Test.php @@ -604,8 +604,8 @@ public function test_validation_rules_stage_in_constraint(): void { $domain = new Domain(); $rules = $domain->validation_rules(); - $this->assertStringContainsString('required', $rules['stage']); $this->assertStringContainsString('in:', $rules['stage']); + $this->assertStringContainsString('default:checking-dns', $rules['stage']); $this->assertStringContainsString('checking-dns', $rules['stage']); $this->assertStringContainsString('done', $rules['stage']); $this->assertStringContainsString('failed', $rules['stage']); diff --git a/tests/WP_Ultimo/Models/Site_Test.php b/tests/WP_Ultimo/Models/Site_Test.php index 23e0586cc..daa53f253 100644 --- a/tests/WP_Ultimo/Models/Site_Test.php +++ b/tests/WP_Ultimo/Models/Site_Test.php @@ -123,9 +123,9 @@ public function test_site_validation_rules(): void { // Test field constraints $this->assertStringContainsString('required', $validation_rules['title'], 'Title should be required.'); - $this->assertStringContainsString('required', $validation_rules['customer_id'], 'Customer ID should be required.'); $this->assertStringContainsString('integer', $validation_rules['customer_id'], 'Customer ID should be integer.'); - $this->assertStringContainsString('min:2', $validation_rules['description'], 'Description should have minimum length.'); + $this->assertStringContainsString('default:', $validation_rules['customer_id'], 'Customer ID should be optional for regular WordPress subsites.'); + $this->assertStringContainsString('default:', $validation_rules['description'], 'Description should be optional metadata.'); } /** @@ -135,15 +135,16 @@ public function test_domain_path_handling(): void { $test_domain = 'test-example.com'; $test_path = '/test-path'; - $this->site->set_domain($test_domain); - $this->site->set_path($test_path); + $site = new Site(); + $site->set_domain($test_domain); + $site->set_path($test_path); - $this->assertEquals($test_domain, $this->site->get_domain(), 'Domain should be set and retrieved correctly.'); - $this->assertEquals($test_path, $this->site->get_path(), 'Path should be set and retrieved correctly.'); + $this->assertEquals($test_domain, $site->get_domain(), 'Domain should be set and retrieved correctly.'); + $this->assertEquals($test_path, $site->get_path(), 'Path should be set and retrieved correctly.'); // Test URL generation $expected_url = set_url_scheme(esc_url(sprintf($test_domain . '/' . trim($test_path, '/')))); - $this->assertEquals($expected_url, $this->site->get_site_url(), 'Site URL should be generated correctly.'); + $this->assertEquals($expected_url, $site->get_site_url(), 'Unsaved site URL should be generated from domain and path.'); } /** @@ -300,16 +301,17 @@ public function test_url_generation(): void { $domain = 'test-site.com'; $path = '/my-site'; - $this->site->set_domain($domain); - $this->site->set_path($path); + $site = new Site(); + $site->set_domain($domain); + $site->set_path($path); // Test site URL - $site_url = $this->site->get_site_url(); + $site_url = $site->get_site_url(); $expected_url = set_url_scheme(esc_url(sprintf($domain . '/' . trim($path, '/')))); - $this->assertEquals($expected_url, $site_url, 'Site URL should be generated correctly.'); + $this->assertEquals($expected_url, $site_url, 'Unsaved site URL should be generated correctly.'); // Test active site URL (without mapped domain) - $active_url = $this->site->get_active_site_url(); + $active_url = $site->get_active_site_url(); $this->assertEquals($expected_url, $active_url, 'Active site URL should match site URL when no mapping exists.'); } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 9018cfb5e..ecb02efdd 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -15,8 +15,26 @@ $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; } +// WordPress multisite site-creation and URL helpers expect a host-like web +// request environment. Keep it deterministic for CLI-based PHPUnit runs. +if ( ! isset( $_SERVER['HTTP_HOST'] ) ) { + $_SERVER['HTTP_HOST'] = 'example.org'; +} + +if ( ! isset( $_SERVER['SERVER_NAME'] ) ) { + $_SERVER['SERVER_NAME'] = 'example.org'; +} + +if ( ! isset( $_SERVER['REQUEST_URI'] ) ) { + $_SERVER['REQUEST_URI'] = '/'; +} + if ( ! $_tests_dir ) { - $_tests_dir = rtrim(sys_get_temp_dir(), '/\\') . '/wordpress-tests-lib'; + if ( file_exists('/tmp/wordpress-tests-lib/includes/functions.php') ) { + $_tests_dir = '/tmp/wordpress-tests-lib'; + } else { + $_tests_dir = rtrim(sys_get_temp_dir(), '/\\') . '/wordpress-tests-lib'; + } } // Forward custom PHPUnit Polyfills configuration to PHPUnit bootstrap file.