diff --git a/templates/admin/dashboard.php b/templates/admin/dashboard.php index c59eddd..8c405ea 100644 --- a/templates/admin/dashboard.php +++ b/templates/admin/dashboard.php @@ -10,22 +10,33 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } + +$sync_pairs = $settings->syncPairs(); + +if ( array() === $sync_pairs ) { + $sync_pairs = array( + array( + 'name' => '', + 'source_url' => '', + 'destination_url' => '', + 'username' => '', + 'application_password' => '', + 'default_direction' => 'push', + 'content_types' => array( 'posts', 'terms', 'media', 'custom_post_types' ), + 'url_mappings' => array( + array( + 'source' => '', + 'destination' => '', + ), + ), + ), + ); +} ?>

-
-

- -

-
-
@@ -40,35 +51,130 @@ if ( ! defined( 'ABSPATH' ) ) {
-

- - - - - - - - - - - - - - - - - - - -
syncPairs() ) ); ?>
loggingLevel() ); ?>
+

+
+ + + +

+ $pair ) : ?> +
+

automaticUrlReplacementEnabled() - ? __( 'Enabled', 'wp-content-sync' ) - : __( 'Disabled', 'wp-content-sync' ) + printf( + /* translators: %d: sync pair number. */ + esc_html__( 'Sync Pair %d', 'wp-content-sync' ), + (int) $index + 1 ); ?> -

conflictStrategy() ); ?>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

diff --git a/tests/Unit/Admin/DashboardTemplateTest.php b/tests/Unit/Admin/DashboardTemplateTest.php index 8681013..6acfc5e 100644 --- a/tests/Unit/Admin/DashboardTemplateTest.php +++ b/tests/Unit/Admin/DashboardTemplateTest.php @@ -30,8 +30,33 @@ class DashboardTemplateTest extends TestCase { self::assertStringContainsString( 'The package JSON file was validated successfully.', $output ); } - private function renderDashboard(): string { - $settings = Settings::fromArray( array() ); + public function test_it_renders_settings_form_with_nonce_and_escaped_pair_values(): void { + $settings = Settings::fromArray( + array( + 'sync_pairs' => array( + array( + 'name' => 'Staging', + 'source_url' => 'https://example.test', + 'destination_url' => 'https://staging.example.test', + 'username' => 'codex', + ), + ), + ) + ); + + $output = $this->renderDashboard( $settings ); + + self::assertStringContainsString( 'action="https://example.test/wp-admin/admin-post.php"', $output ); + self::assertStringContainsString( 'name="action" value="wpcs_save_settings"', $output ); + self::assertStringContainsString( 'name="wpcs_settings_nonce"', $output ); + self::assertStringContainsString( 'Staging', $output ); + self::assertStringNotContainsString( 'Staging', $output ); + self::assertStringContainsString( 'name="wpcs_settings[sync_pairs][0][application_password]"', $output ); + self::assertStringContainsString( 'name="wpcs_settings[sync_pairs][0][url_mappings][0][source]"', $output ); + } + + private function renderDashboard( ?Settings $settings = null ): string { + $settings = $settings ?? Settings::fromArray( array() ); ob_start(); include WPCS_PLUGIN_DIR . 'templates/admin/dashboard.php';