From 488d884c23213168eb5595191722a635da44125b Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Wed, 20 May 2026 13:01:13 -0400 Subject: [PATCH 1/2] Tests: Add unit tests for wp_ajax_menu_locations_save() Co-authored-by: Junie --- .../ajax-actions/menuLocationsSave.php | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 tests/phpunit/tests/admin/includes/ajax-actions/menuLocationsSave.php diff --git a/tests/phpunit/tests/admin/includes/ajax-actions/menuLocationsSave.php b/tests/phpunit/tests/admin/includes/ajax-actions/menuLocationsSave.php new file mode 100644 index 0000000000000..e9f7d8fed0a2a --- /dev/null +++ b/tests/phpunit/tests/admin/includes/ajax-actions/menuLocationsSave.php @@ -0,0 +1,141 @@ +user->create( array( 'role' => 'administrator' ) ); + self::$subscriber_id = $factory->user->create( array( 'role' => 'subscriber' ) ); + } + + /** + * Tests successful saving of menu locations. + * + * @ticket 65252 + */ + public function test_menu_locations_save_success(): void { + wp_set_current_user( self::$admin_id ); + + $menu_id = self::factory()->term->create( + array( + 'name' => 'Test Menu', + 'taxonomy' => 'nav_menu', + ) + ); + + $_POST = array( + 'action' => 'menu-locations-save', + 'menu-settings-column-nonce' => wp_create_nonce( 'add-menu_item' ), + 'menu-locations' => array( + 'primary' => $menu_id, + ), + ); + + try { + $this->_handleAjax( 'menu-locations-save' ); + } catch ( WPAjaxDieStopException $e ) { + $this->assertSame( '1', $e->getMessage(), 'The AJAX response should be 1.' ); + } + + $locations = get_theme_mod( 'nav_menu_locations' ); + $this->assertIsArray( $locations ); + $this->assertSame( $menu_id, $locations['primary'] ); + } + + /** + * Tests failure due to invalid nonce. + * + * @ticket 65252 + */ + public function test_menu_locations_save_invalid_nonce(): void { + wp_set_current_user( self::$admin_id ); + + $_POST = array( + 'action' => 'menu-locations-save', + 'menu-settings-column-nonce' => 'invalid-nonce', + 'menu-locations' => array( + 'primary' => 1, + ), + ); + + $this->expectException( WPAjaxDieStopException::class ); + $this->expectExceptionMessage( '-1' ); + + $this->_handleAjax( 'menu-locations-save' ); + } + + /** + * Tests failure due to missing menu-locations. + * + * @ticket 65252 + */ + public function test_menu_locations_save_missing_locations(): void { + wp_set_current_user( self::$admin_id ); + + $_POST = array( + 'action' => 'menu-locations-save', + 'menu-settings-column-nonce' => wp_create_nonce( 'add-menu_item' ), + ); + + $this->expectException( WPAjaxDieStopException::class ); + $this->expectExceptionMessage( '0' ); + + $this->_handleAjax( 'menu-locations-save' ); + } + + /** + * Tests failure due to insufficient permissions. + * + * @ticket 65252 + */ + public function test_menu_locations_save_insufficient_permissions(): void { + wp_set_current_user( self::$subscriber_id ); + + $_POST = array( + 'action' => 'menu-locations-save', + 'menu-settings-column-nonce' => wp_create_nonce( 'add-menu_item' ), + 'menu-locations' => array( + 'primary' => 1, + ), + ); + + $this->expectException( WPAjaxDieStopException::class ); + $this->expectExceptionMessage( '-1' ); + + $this->_handleAjax( 'menu-locations-save' ); + } +} From 2ca24d5b0c74ce194fa77bd7d8eb6ef4b477ae11 Mon Sep 17 00:00:00 2001 From: Paul Bearne Date: Wed, 20 May 2026 13:16:44 -0400 Subject: [PATCH 2/2] Refactor $_POST structure in menuLocationsSave tests --- .../ajax-actions/menuLocationsSave.php | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/phpunit/tests/admin/includes/ajax-actions/menuLocationsSave.php b/tests/phpunit/tests/admin/includes/ajax-actions/menuLocationsSave.php index e9f7d8fed0a2a..12e1c2b67523b 100644 --- a/tests/phpunit/tests/admin/includes/ajax-actions/menuLocationsSave.php +++ b/tests/phpunit/tests/admin/includes/ajax-actions/menuLocationsSave.php @@ -58,9 +58,9 @@ public function test_menu_locations_save_success(): void { ); $_POST = array( - 'action' => 'menu-locations-save', - 'menu-settings-column-nonce' => wp_create_nonce( 'add-menu_item' ), - 'menu-locations' => array( + 'action' => 'menu-locations-save', + 'menu-settings-column-nonce' => wp_create_nonce( 'add-menu_item' ), + 'menu-locations' => array( 'primary' => $menu_id, ), ); @@ -85,9 +85,9 @@ public function test_menu_locations_save_invalid_nonce(): void { wp_set_current_user( self::$admin_id ); $_POST = array( - 'action' => 'menu-locations-save', - 'menu-settings-column-nonce' => 'invalid-nonce', - 'menu-locations' => array( + 'action' => 'menu-locations-save', + 'menu-settings-column-nonce' => 'invalid-nonce', + 'menu-locations' => array( 'primary' => 1, ), ); @@ -107,8 +107,8 @@ public function test_menu_locations_save_missing_locations(): void { wp_set_current_user( self::$admin_id ); $_POST = array( - 'action' => 'menu-locations-save', - 'menu-settings-column-nonce' => wp_create_nonce( 'add-menu_item' ), + 'action' => 'menu-locations-save', + 'menu-settings-column-nonce' => wp_create_nonce( 'add-menu_item' ), ); $this->expectException( WPAjaxDieStopException::class ); @@ -126,9 +126,9 @@ public function test_menu_locations_save_insufficient_permissions(): void { wp_set_current_user( self::$subscriber_id ); $_POST = array( - 'action' => 'menu-locations-save', - 'menu-settings-column-nonce' => wp_create_nonce( 'add-menu_item' ), - 'menu-locations' => array( + 'action' => 'menu-locations-save', + 'menu-settings-column-nonce' => wp_create_nonce( 'add-menu_item' ), + 'menu-locations' => array( 'primary' => 1, ), );