Skip to content

Commit

Permalink
Add tests for server timing setting registration.
Browse files Browse the repository at this point in the history
  • Loading branch information
felixarntz committed Aug 3, 2023
1 parent 61f5ccc commit 585911d
Show file tree
Hide file tree
Showing 2 changed files with 131 additions and 48 deletions.
102 changes: 54 additions & 48 deletions server-timing/load.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,54 +13,6 @@
define( 'PERFLAB_SERVER_TIMING_SETTING', 'perflab_server_timing_settings' );
define( 'PERFLAB_SERVER_TIMING_SCREEN', 'perflab-server-timing' );

/**
* Registers the Server-Timing setting.
*
* @since n.e.x.t
*/
function perflab_register_server_timing_setting() {
register_setting(
PERFLAB_SERVER_TIMING_SCREEN,
PERFLAB_SERVER_TIMING_SETTING,
array(
'type' => 'object',
'sanitize_callback' => 'perflab_sanitize_server_timing_setting',
'default' => array(),
)
);
}
add_action( 'init', 'perflab_register_server_timing_setting' );

/**
* Sanitizes the Server-Timing setting.
*
* @since n.e.x.t
*
* @param mixed $value Server-Timing setting value.
* @return array Sanitized Server-Timing setting value.
*/
function perflab_sanitize_server_timing_setting( $value ) {
if ( ! is_array( $value ) ) {
return array();
}

/*
* Ensure that every element is an indexed array of hook names.
* Any duplicates across a group of hooks are removed.
*/
return array_filter(
array_map(
static function( $hooks ) {
if ( ! is_array( $hooks ) ) {
$hooks = explode( "\n", $hooks );
}
return array_unique( array_filter( array_map( 'sanitize_key', $hooks ) ) );
},
$value
)
);
}

/**
* Provides access the Server-Timing API.
*
Expand Down Expand Up @@ -164,3 +116,57 @@ function perflab_wrap_server_timing( $callback, $metric_slug, $access_cap ) {
return $result;
};
}

/**
* Registers the Server-Timing setting.
*
* @since n.e.x.t
*/
function perflab_register_server_timing_setting() {
register_setting(
PERFLAB_SERVER_TIMING_SCREEN,
PERFLAB_SERVER_TIMING_SETTING,
array(
'type' => 'object',
'sanitize_callback' => 'perflab_sanitize_server_timing_setting',
'default' => array(),
)
);
}
add_action( 'init', 'perflab_register_server_timing_setting' );

/**
* Sanitizes the Server-Timing setting.
*
* @since n.e.x.t
*
* @param mixed $value Server-Timing setting value.
* @return array Sanitized Server-Timing setting value.
*/
function perflab_sanitize_server_timing_setting( $value ) {
if ( ! is_array( $value ) ) {
return array();
}

/*
* Ensure that every element is an indexed array of hook names.
* Any duplicates across a group of hooks are removed.
*/
return array_filter(
array_map(
static function( $hooks ) {
if ( ! is_array( $hooks ) ) {
$hooks = explode( "\n", $hooks );
}
return array_values(
array_unique(
array_filter(
array_map( 'sanitize_key', $hooks )
)
)
);
},
$value
)
);
}
77 changes: 77 additions & 0 deletions tests/server-timing/load-tests.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,81 @@ public function test_perflab_wrap_server_timing() {

$this->assertSame( 123, $wrapped(), 'Calling wrapped callback multiple times should not result in warning' );
}

public function test_perflab_register_server_timing_setting() {
global $new_allowed_options, $wp_registered_settings;

// Reset relevant globals.
$wp_registered_settings = array();
$new_allowed_options = array();

perflab_register_server_timing_setting();

// Assert that the setting is correctly registered.
$settings = get_registered_settings();
$this->assertTrue( isset( $settings[ PERFLAB_SERVER_TIMING_SETTING ] ) );

// Assert that the setting is allowlisted for the relevant screen.
$this->assertTrue( isset( $new_allowed_options[ PERFLAB_SERVER_TIMING_SCREEN ] ) );
$this->assertSame( array( PERFLAB_SERVER_TIMING_SETTING ), $new_allowed_options[ PERFLAB_SERVER_TIMING_SCREEN ] );

// Assert that registered default works correctly.
$this->assertSame( array(), get_option( PERFLAB_SERVER_TIMING_SETTING ) );

// Assert that most basic sanitization works correctly (an array is required).
update_option( PERFLAB_SERVER_TIMING_SETTING, 'invalid' );
$this->assertSame( array(), get_option( PERFLAB_SERVER_TIMING_SETTING ) );
}

/**
* @dataProvider data_perflab_sanitize_server_timing_setting
*
* @param mixed $unsanitized Unsanitized input.
* @param array $expected Expected sanitized output.
*/
public function test_perflab_sanitize_server_timing_setting( $unsanitized, $expected ) {
$sanitized = perflab_sanitize_server_timing_setting( $unsanitized );
$this->assertSame( $expected, $sanitized );
}

public function data_perflab_sanitize_server_timing_setting() {
return array(
'invalid type' => array(
'invalid',
array(),
),
'empty list, array' => array(
array( 'benchmarking_actions' => array() ),
array(),
),
'empty list, string' => array(
array( 'benchmarking_actions' => '' ),
array(),
),
'empty list, string with whitespace' => array(
array( 'benchmarking_actions' => ' ' ),
array(),
),
'regular list, array' => array(
array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ),
array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ),
),
'regular list, string' => array(
array( 'benchmarking_actions' => "after_setup_theme\ninit\nwp_loaded" ),
array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ),
),
'regular list, string with whitespace' => array(
array( 'benchmarking_actions' => "after_setup_theme \ninit \n\nwp_loaded\n" ),
array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ),
),
'regular list, string with unformatted' => array(
array( 'benchmarking_actions' => "After_Setup_Theme\ninit?\nWP_Loaded" ),
array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ),
),
'regular list, array with duplicates' => array(
array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded', 'init' ) ),
array( 'benchmarking_actions' => array( 'after_setup_theme', 'init', 'wp_loaded' ) ),
),
);
}
}

0 comments on commit 585911d

Please sign in to comment.