Files
wordpress-develop/tests/phpunit/tests/customize/selective-refresh.php
Sergey Biryukov 8be943d06e Tests: Introduce assertSameSets() and assertSameSetsWithIndex(), and use them where appropriate.
This ensures that not only the array values being compared are equal, but also that their type is the same.

These new methods replace most of the existing instances of `assertEqualSets()` and `assertEqualSetsWithIndex()`.

Going forward, stricter type checking by using `assertSameSets()` or `assertSameSetsWithIndex()` should generally be preferred, to make the tests more reliable.

Follow-up to [48937].

See #38266.

git-svn-id: https://develop.svn.wordpress.org/trunk@48939 602fd350-edb4-49c9-b593-d223f7449a82
2020-09-04 07:01:00 +00:00

280 lines
9.3 KiB
PHP

<?php
/**
* WP_Customize_Selective_Refresh tests.
*
* @package WordPress
*/
/**
* Tests for the WP_Customize_Selective_Refresh class.
*
* @group customize
*/
class Test_WP_Customize_Selective_Refresh extends WP_UnitTestCase {
/**
* Manager.
*
* @var WP_Customize_Manager
*/
public $wp_customize;
/**
* Component.
*
* @var WP_Customize_Selective_Refresh
*/
public $selective_refresh;
/**
* Set up the test fixture.
*/
function setUp() {
parent::setUp();
require_once ABSPATH . WPINC . '/class-wp-customize-manager.php';
$GLOBALS['wp_customize'] = new WP_Customize_Manager();
$this->wp_customize = $GLOBALS['wp_customize'];
if ( isset( $this->wp_customize->selective_refresh ) ) {
$this->selective_refresh = $this->wp_customize->selective_refresh;
}
}
/**
* Test WP_Customize_Selective_Refresh::__construct().
*
* @see WP_Customize_Selective_Refresh::__construct()
*/
function test_construct() {
$this->assertSame( $this->selective_refresh, $this->wp_customize->selective_refresh );
}
/**
* Test WP_Customize_Selective_Refresh::register_scripts().
*
* @see WP_Customize_Selective_Refresh::register_scripts()
*/
function test_register_scripts() {
$scripts = new WP_Scripts();
$handles = array(
'customize-selective-refresh',
'customize-preview-nav-menus',
'customize-preview-widgets',
);
foreach ( $handles as $handle ) {
$this->assertArrayHasKey( $handle, $scripts->registered );
}
}
/**
* Test WP_Customize_Selective_Refresh::partials().
*
* @see WP_Customize_Selective_Refresh::partials()
*/
function test_partials() {
$this->assertInternalType( 'array', $this->selective_refresh->partials() );
}
/**
* Test CRUD methods for partials.
*
* @see WP_Customize_Selective_Refresh::get_partial()
* @see WP_Customize_Selective_Refresh::add_partial()
* @see WP_Customize_Selective_Refresh::remove_partial()
*/
function test_crud_partial() {
$partial = $this->selective_refresh->add_partial( 'foo' );
$this->assertSame( $this->selective_refresh, $partial->component );
$this->assertInstanceOf( 'WP_Customize_Partial', $partial );
$this->assertSame( $partial, $this->selective_refresh->get_partial( $partial->id ) );
$this->assertArrayHasKey( $partial->id, $this->selective_refresh->partials() );
$this->selective_refresh->remove_partial( $partial->id );
$this->assertEmpty( $this->selective_refresh->get_partial( $partial->id ) );
$this->assertArrayNotHasKey( $partial->id, $this->selective_refresh->partials() );
$partial = new WP_Customize_Partial( $this->selective_refresh, 'bar' );
$this->assertSame( $partial, $this->selective_refresh->add_partial( $partial ) );
$this->assertSame( $partial, $this->selective_refresh->get_partial( 'bar' ) );
$this->assertSameSets( array( 'bar' ), array_keys( $this->selective_refresh->partials() ) );
add_filter( 'customize_dynamic_partial_args', array( $this, 'filter_customize_dynamic_partial_args' ), 10, 2 );
add_filter( 'customize_dynamic_partial_class', array( $this, 'filter_customize_dynamic_partial_class' ), 10, 3 );
$partial = $this->selective_refresh->add_partial( 'recognized-class' );
$this->assertInstanceOf( 'Tested_Custom_Partial', $partial );
$this->assertSame( '.recognized', $partial->selector );
}
/**
* Test WP_Customize_Selective_Refresh::init_preview().
*
* @see WP_Customize_Selective_Refresh::init_preview()
*/
function test_init_preview() {
$this->selective_refresh->init_preview();
$this->assertSame( 10, has_action( 'template_redirect', array( $this->selective_refresh, 'handle_render_partials_request' ) ) );
$this->assertSame( 10, has_action( 'wp_enqueue_scripts', array( $this->selective_refresh, 'enqueue_preview_scripts' ) ) );
}
/**
* Test WP_Customize_Selective_Refresh::enqueue_preview_scripts().
*
* @see WP_Customize_Selective_Refresh::enqueue_preview_scripts()
*/
function test_enqueue_preview_scripts() {
$scripts = wp_scripts();
$this->assertNotContains( 'customize-selective-refresh', $scripts->queue );
$this->selective_refresh->enqueue_preview_scripts();
$this->assertContains( 'customize-selective-refresh', $scripts->queue );
$this->assertSame( 1000, has_action( 'wp_footer', array( $this->selective_refresh, 'export_preview_data' ) ) );
}
/**
* Test WP_Customize_Selective_Refresh::export_preview_data().
*
* @see WP_Customize_Selective_Refresh::export_preview_data()
*/
function test_export_preview_data() {
$user_id = self::factory()->user->create( array( 'role' => 'administrator' ) );
wp_set_current_user( $user_id );
$user = new WP_User( $user_id );
do_action( 'customize_register', $this->wp_customize );
$user->remove_cap( 'top_secret_clearance' );
$this->wp_customize->add_setting(
'top_secret_message',
array(
'capability' => 'top_secret_clearance', // The administrator role lacks this.
)
);
$this->selective_refresh->add_partial(
'blogname',
array(
'selector' => '#site-title',
)
);
$this->selective_refresh->add_partial(
'top_secret_message',
array(
'settings' => array( 'top_secret_message' ),
)
);
ob_start();
$this->selective_refresh->export_preview_data();
$html = ob_get_clean();
$this->assertTrue( (bool) preg_match( '/_customizePartialRefreshExports = ({.+})/s', $html, $matches ) );
$exported_data = json_decode( $matches[1], true );
$this->assertInternalType( 'array', $exported_data );
$this->assertArrayHasKey( 'partials', $exported_data );
$this->assertInternalType( 'array', $exported_data['partials'] );
$this->assertArrayHasKey( 'blogname', $exported_data['partials'] );
$this->assertArrayNotHasKey( 'top_secret_message', $exported_data['partials'] );
$this->assertSame( '#site-title', $exported_data['partials']['blogname']['selector'] );
$this->assertArrayHasKey( 'renderQueryVar', $exported_data );
$this->assertArrayHasKey( 'l10n', $exported_data );
}
/**
* Test WP_Customize_Selective_Refresh::add_dynamic_partials().
*
* @see WP_Customize_Selective_Refresh::add_dynamic_partials()
*/
function test_add_dynamic_partials() {
$partial_ids = array( 'recognized', 'recognized-class', 'unrecognized', 'already-added' );
$partials = $this->selective_refresh->add_dynamic_partials( $partial_ids );
$this->assertEmpty( $partials );
$this->selective_refresh->add_partial( 'already-added' );
add_filter( 'customize_dynamic_partial_args', array( $this, 'filter_customize_dynamic_partial_args' ), 10, 2 );
add_filter( 'customize_dynamic_partial_class', array( $this, 'filter_customize_dynamic_partial_class' ), 10, 3 );
$partials = $this->selective_refresh->add_dynamic_partials( $partial_ids );
$this->assertSameSets( array( 'recognized', 'recognized-class' ), wp_list_pluck( $partials, 'id' ) );
$this->assertInstanceOf( 'Tested_Custom_Partial', $this->selective_refresh->get_partial( 'recognized-class' ) );
$this->assertNotInstanceOf( 'Tested_Custom_Partial', $this->selective_refresh->get_partial( 'recognized' ) );
$this->assertSame( '.recognized', $this->selective_refresh->get_partial( 'recognized' )->selector );
}
/**
* Filter customize_dynamic_partial_args.
*
* @see Test_WP_Customize_Selective_Refresh::test_add_dynamic_partials()
*
* @param false|array $partial_args The arguments to the WP_Customize_Partial constructor.
* @param string $partial_id ID for dynamic partial.
* @return false|array Dynamic partial args.
*/
function filter_customize_dynamic_partial_args( $partial_args, $partial_id ) {
$this->assertTrue( false === $partial_args || is_array( $partial_args ) );
$this->assertInternalType( 'string', $partial_id );
if ( preg_match( '/^recognized/', $partial_id ) ) {
$partial_args = array(
'selector' => '.recognized',
);
}
return $partial_args;
}
/**
* Filter customize_dynamic_partial_class.
*
* @see Test_WP_Customize_Selective_Refresh::test_add_dynamic_partials()
*
* @param string $partial_class WP_Customize_Partial or a subclass.
* @param string $partial_id ID for dynamic partial.
* @param array $partial_args The arguments to the WP_Customize_Partial constructor.
* @return string
*/
function filter_customize_dynamic_partial_class( $partial_class, $partial_id, $partial_args ) {
$this->assertInternalType( 'array', $partial_args );
$this->assertInternalType( 'string', $partial_id );
$this->assertInternalType( 'string', $partial_class );
if ( 'recognized-class' === $partial_id ) {
$partial_class = 'Tested_Custom_Partial';
}
return $partial_class;
}
/**
* Test WP_Customize_Selective_Refresh::is_render_partials_request().
*
* @see WP_Customize_Selective_Refresh::is_render_partials_request()
*/
function test_is_render_partials_request() {
$this->assertFalse( $this->selective_refresh->is_render_partials_request() );
$_POST[ WP_Customize_Selective_Refresh::RENDER_QUERY_VAR ] = '1';
$this->assertTrue( $this->selective_refresh->is_render_partials_request() );
}
/**
* Tear down.
*/
function tearDown() {
$this->wp_customize = null;
unset( $GLOBALS['wp_customize'] );
unset( $GLOBALS['wp_scripts'] );
parent::tearDown();
}
}
require_once ABSPATH . WPINC . '/customize/class-wp-customize-partial.php';
/**
* Class Tested_Custom_Partial
*/
class Tested_Custom_Partial extends WP_Customize_Partial {
/**
* Type.
*
* @var string
*/
public $type = 'custom';
}