12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220 |
- <?php
- /**
- * Test functions and classes for widgets and sidebars.
- *
- * @group widgets
- */
- class Tests_Widgets extends WP_UnitTestCase {
- public $sidebar_index;
- public $valid_sidebar;
- function clean_up_global_scope() {
- global $wp_widget_factory, $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates;
- $wp_registered_sidebars = array();
- $wp_registered_widgets = array();
- $wp_registered_widget_controls = array();
- $wp_registered_widget_updates = array();
- $wp_widget_factory->widgets = array();
- parent::clean_up_global_scope();
- }
- function tearDown() {
- global $wp_customize;
- $wp_customize = null;
- parent::tearDown();
- }
- /**
- * @see register_widget()
- * @see unregister_widget()
- */
- function test_register_and_unregister_widget_core_widget() {
- global $wp_widget_factory;
- $widget_class = 'WP_Widget_Search';
- register_widget( $widget_class );
- $this->assertArrayHasKey( $widget_class, $wp_widget_factory->widgets );
- unregister_widget( $widget_class );
- $this->assertArrayNotHasKey( $widget_class, $wp_widget_factory->widgets );
- }
- /**
- * Test that registering a widget class and registering a widget instance work together.
- *
- * @see register_widget()
- * @see unregister_widget()
- * @ticket 28216
- */
- function test_register_and_unregister_widget_instance() {
- global $wp_widget_factory, $wp_registered_widgets;
- $this->assertEmpty( $wp_widget_factory->widgets );
- $this->assertEmpty( $wp_registered_widgets );
- update_option(
- 'widget_search',
- array(
- 2 => array( 'title' => '' ),
- '_multiwidget' => 1,
- )
- );
- update_option(
- 'widget_better_search',
- array(
- 3 => array( 'title' => '' ),
- '_multiwidget' => 1,
- )
- );
- update_option(
- 'widget_best_search',
- array(
- 4 => array( 'title' => '' ),
- '_multiwidget' => 1,
- )
- );
- register_widget( 'WP_Widget_Search' );
- $this->assertArrayHasKey( 'WP_Widget_Search', $wp_widget_factory->widgets );
- $widget_better_search = new WP_Widget_Search();
- $widget_better_search->id_base = 'better_search';
- $widget_better_search->name = 'Better Search';
- $widget_better_search->option_name = 'widget_' . $widget_better_search->id_base;
- $widget_better_search->widget_options['classname'] = 'widget_' . $widget_better_search->id_base;
- $widget_better_search->control_options['id_base'] = $widget_better_search->id_base;
- register_widget( $widget_better_search );
- $this->assertContains( $widget_better_search, $wp_widget_factory->widgets );
- $widget_best_search = new WP_Widget_Search();
- $widget_best_search->id_base = 'best_search';
- $widget_best_search->name = 'Best Search';
- $widget_best_search->option_name = 'widget_' . $widget_best_search->id_base;
- $widget_best_search->widget_options['classname'] = 'widget_' . $widget_best_search->id_base;
- $widget_best_search->control_options['id_base'] = $widget_best_search->id_base;
- register_widget( $widget_best_search );
- $this->assertContains( $widget_best_search, $wp_widget_factory->widgets );
- $this->assertCount( 3, $wp_widget_factory->widgets );
- $this->assertArrayHasKey( 'WP_Widget_Search', $wp_widget_factory->widgets );
- $this->assertContains( $widget_better_search, $wp_widget_factory->widgets );
- $this->assertContains( $widget_best_search, $wp_widget_factory->widgets );
- $wp_widget_factory->_register_widgets();
- $this->assertArrayHasKey( 'search-2', $wp_registered_widgets );
- $this->assertArrayHasKey( 'better_search-3', $wp_registered_widgets );
- $this->assertArrayHasKey( 'best_search-4', $wp_registered_widgets );
- $this->assertInstanceOf( 'WP_Widget_Search', $wp_registered_widgets['search-2']['callback'][0] );
- $this->assertSame( $widget_better_search, $wp_registered_widgets['better_search-3']['callback'][0] );
- $this->assertSame( $widget_best_search, $wp_registered_widgets['best_search-4']['callback'][0] );
- $this->assertContains( $widget_better_search, $wp_widget_factory->widgets );
- $this->assertContains( $widget_best_search, $wp_widget_factory->widgets );
- $this->assertArrayHasKey( 'WP_Widget_Search', $wp_widget_factory->widgets );
- unregister_widget( 'WP_Widget_Search' );
- unregister_widget( $widget_better_search );
- unregister_widget( $widget_best_search );
- $this->assertNotContains( $widget_better_search, $wp_widget_factory->widgets );
- $this->assertNotContains( $widget_best_search, $wp_widget_factory->widgets );
- $this->assertArrayNotHasKey( 'WP_Widget_Search', $wp_widget_factory->widgets );
- }
- /**
- * @group sidebar
- */
- function test_register_sidebars_single() {
- global $wp_registered_sidebars;
- register_sidebars( 1, array( 'id' => 'wp-unit-test' ) );
- $this->assertTrue( isset( $wp_registered_sidebars['wp-unit-test'] ) );
- }
- /**
- * @group sidebar
- */
- function test_register_sidebars_multiple() {
- global $wp_registered_sidebars;
- $result = array();
- $num = 3;
- $id_base = 'WP Unit Test';
- register_sidebars( $num, array( 'name' => $id_base . ' %d' ) );
- $names = wp_list_pluck( $wp_registered_sidebars, 'name' );
- for ( $i = 1; $i <= $num; $i++ ) {
- if ( in_array( "$id_base $i", $names, true ) ) {
- $result[] = true;
- }
- }
- $this->assertSame( $num, count( $result ) );
- }
- /**
- * @group sidebar
- */
- function test_register_sidebar_with_no_id() {
- global $wp_registered_sidebars;
- $this->setExpectedIncorrectUsage( 'register_sidebar' );
- // Incorrectly register a couple of sidebars for fun.
- register_sidebar();
- register_sidebar();
- $derived_sidebar_id = 'sidebar-2'; // Number of sidebars in the global + 1.
- $this->assertArrayHasKey( $derived_sidebar_id, $wp_registered_sidebars );
- }
- /**
- * @group sidebar
- */
- function test_unregister_sidebar_registered_with_no_id() {
- global $wp_registered_sidebars;
- $this->setExpectedIncorrectUsage( 'register_sidebar' );
- // Incorrectly register a couple of sidebars for fun.
- register_sidebar();
- register_sidebar();
- $derived_sidebar_id = 'sidebar-2'; // Number of sidebars in the global + 1.
- unregister_sidebar( $derived_sidebar_id );
- $this->assertArrayNotHasKey( $derived_sidebar_id, $wp_registered_sidebars );
- }
- /**
- * @group sidebar
- */
- function test_register_sidebar_with_string_id() {
- global $wp_registered_sidebars;
- $sidebar_id = 'wp-unit-test';
- register_sidebar( array( 'id' => $sidebar_id ) );
- $this->assertArrayHasKey( $sidebar_id, $wp_registered_sidebars );
- }
- /**
- * @group sidebar
- */
- function test_unregister_sidebar_with_string_id() {
- global $wp_registered_sidebars;
- $sidebar_id = 'wp-unit-tests';
- register_sidebar( array( 'id' => $sidebar_id ) );
- unregister_sidebar( $sidebar_id );
- $this->assertArrayNotHasKey( $sidebar_id, $wp_registered_sidebars );
- }
- /**
- * @group sidebar
- */
- function test_register_sidebar_with_numeric_id() {
- global $wp_registered_sidebars;
- $sidebar_id = 2;
- register_sidebar( array( 'id' => $sidebar_id ) );
- $this->assertArrayHasKey( $sidebar_id, $wp_registered_sidebars );
- }
- /**
- * @group sidebar
- */
- function test_unregister_sidebar_with_numeric_id() {
- global $wp_registered_sidebars;
- $sidebar_id = 2;
- register_sidebar( array( 'id' => $sidebar_id ) );
- unregister_sidebar( $sidebar_id );
- $this->assertArrayNotHasKey( $sidebar_id, $wp_registered_sidebars );
- }
- /**
- * @group sidebar
- * @ticket 19709
- */
- public function test_register_sidebar_with_after_and_before_sidebar() {
- global $wp_registered_sidebars;
- $sidebar_id = 'test-sidebar';
- register_sidebar(
- array(
- 'id' => $sidebar_id,
- 'before_sidebar' => '<div id="%1$s" class="before-sidebar %2$s">',
- 'after_sidebar' => '</div> <!-- .before-sidebar -->',
- 'class' => 'test-sidebar',
- )
- );
- $this->assertArrayHasKey( $sidebar_id, $wp_registered_sidebars );
- $this->assertContains( '<div id="%1$s" class="before-sidebar %2$s">', $wp_registered_sidebars[ $sidebar_id ]['before_sidebar'] );
- $this->assertContains( '</div> <!-- .before-sidebar -->', $wp_registered_sidebars[ $sidebar_id ]['after_sidebar'] );
- }
- /**
- * @group sidebar
- * @ticket 19709
- */
- public function test_register_sidebar_without_after_and_before_sidebar() {
- global $wp_registered_sidebars;
- $sidebar_id = 'test-sidebar-2';
- register_sidebar(
- array(
- 'id' => $sidebar_id,
- )
- );
- $this->assertArrayHasKey( $sidebar_id, $wp_registered_sidebars );
- $this->assertEmpty( $wp_registered_sidebars[ $sidebar_id ]['before_sidebar'] );
- $this->assertEmpty( $wp_registered_sidebars[ $sidebar_id ]['after_sidebar'] );
- }
- /**
- * Utility hook callback used to store a sidebar ID mid-function.
- */
- function retrieve_sidebar_id( $index, $valid_sidebar ) {
- $this->sidebar_index = $index;
- $this->valid_sidebar = $valid_sidebar;
- }
- /**
- * @group sidebar
- */
- function test_dynamic_sidebar_using_sidebar_registered_with_no_id() {
- $this->setExpectedIncorrectUsage( 'register_sidebar' );
- // Incorrectly register a couple of sidebars for fun.
- register_sidebar();
- register_sidebar();
- $derived_sidebar_id = 'sidebar-2'; // Number of sidebars in the global + 1.
- add_action( 'dynamic_sidebar_before', array( $this, 'retrieve_sidebar_id' ), 10, 2 );
- dynamic_sidebar( 2 );
- $this->assertSame( $derived_sidebar_id, $this->sidebar_index );
- }
- /**
- * @group sidebar
- */
- function test_dynamic_sidebar_using_invalid_sidebar_id() {
- register_sidebar( array( 'id' => 'wp-unit-text' ) );
- add_action( 'dynamic_sidebar_before', array( $this, 'retrieve_sidebar_id' ), 10, 2 );
- // 5 is a fake sidebar ID.
- dynamic_sidebar( 5 );
- /*
- * If the sidebar ID is invalid, the second argument passed to
- * the 'dynamic_sidebar_before' hook will be false.
- */
- $this->assertFalse( $this->valid_sidebar );
- }
- /**
- * @group sidebar
- */
- function test_dynamic_sidebar_numeric_id() {
- $sidebar_id = 2;
- register_sidebar( array( 'id' => $sidebar_id ) );
- add_action( 'dynamic_sidebar_before', array( $this, 'retrieve_sidebar_id' ), 10, 2 );
- dynamic_sidebar( $sidebar_id );
- $this->assertSame( "sidebar-{$sidebar_id}", $this->sidebar_index );
- }
- /**
- * @group sidebar
- */
- function test_dynamic_sidebar_string_id() {
- $sidebar_id = 'wp-unit-tests';
- register_sidebar( array( 'id' => $sidebar_id ) );
- add_action( 'dynamic_sidebar_before', array( $this, 'retrieve_sidebar_id' ), 10, 2 );
- dynamic_sidebar( $sidebar_id );
- $this->assertSame( $sidebar_id, $this->sidebar_index );
- }
- /**
- * @see WP_Widget_Search::form()
- */
- function test_wp_widget_search_form() {
- $widget = new WP_Widget_Search( 'foo', 'Foo' );
- ob_start();
- $args = array(
- 'before_widget' => '<section>',
- 'after_widget' => "</section>\n",
- 'before_title' => '<h2>',
- 'after_title' => "</h2>\n",
- );
- $instance = array( 'title' => 'Buscar' );
- $widget->_set( 2 );
- $widget->widget( $args, $instance );
- $output = ob_get_clean();
- $this->assertNotContains( 'no-options-widget', $output );
- $this->assertContains( '<h2>Buscar</h2>', $output );
- $this->assertContains( '<section>', $output );
- $this->assertContains( '</section>', $output );
- }
- /**
- * @see WP_Widget::form()
- */
- function test_wp_widget_form() {
- $widget = new WP_Widget( 'foo', 'Foo' );
- ob_start();
- $retval = $widget->form( array() );
- $output = ob_get_clean();
- $this->assertSame( 'noform', $retval );
- $this->assertContains( 'no-options-widget', $output );
- }
- /**
- * @see WP_Widget::__construct()
- */
- function test_wp_widget_constructor() {
- $id_base = 'foo';
- $name = 'Foo';
- $foo_widget = new WP_Widget( $id_base, $name );
- $this->assertSame( $id_base, $foo_widget->id_base );
- $this->assertSame( $name, $foo_widget->name );
- $this->assertSame( "widget_{$id_base}", $foo_widget->option_name );
- $this->assertArrayHasKey( 'classname', $foo_widget->widget_options );
- $this->assertSame( "widget_{$id_base}", $foo_widget->widget_options['classname'] );
- $this->assertArrayHasKey( 'id_base', $foo_widget->control_options );
- $this->assertSame( $id_base, $foo_widget->control_options['id_base'] );
- $id_base = 'bar';
- $name = 'Bar';
- $widget_options = array(
- 'classname' => 'bar_classname',
- );
- $control_options = array(
- 'id_base' => 'bar_id_base',
- );
- $bar_widget = new WP_Widget( $id_base, $name, $widget_options, $control_options );
- $this->assertSame( $widget_options['classname'], $bar_widget->widget_options['classname'] );
- $this->assertSame( $control_options['id_base'], $bar_widget->control_options['id_base'] );
- }
- /**
- * @see WP_Widget::get_field_name()
- * @dataProvider data_wp_widget_get_field_name
- */
- function test_wp_widget_get_field_name( $expected, $value_to_test ) {
- $widget = new WP_Widget( 'foo', 'Foo' );
- $widget->_set( 2 );
- $this->assertSame( $expected, $widget->get_field_name( $value_to_test ) );
- }
- /**
- * Data provider.
- *
- * Passes the expected field name and the value to test.
- *
- * @since 4.4.0
- *
- * @return array {
- * @type array {
- * @type string $expected The expected field id to be returned.
- * @type string $value_to_test The value being passed to the get_field_name method.
- * }
- * }
- */
- function data_wp_widget_get_field_name() {
- return array(
- array(
- 'widget-foo[2][title]',
- 'title',
- ),
- array(
- 'widget-foo[2][posttypes][]',
- 'posttypes[]',
- ),
- array(
- 'widget-foo[2][posttypes][4]',
- 'posttypes[4]',
- ),
- array(
- 'widget-foo[2][posttypes][4][]',
- 'posttypes[4][]',
- ),
- array(
- 'widget-foo[2][posttypes][4][][6]',
- 'posttypes[4][][6]',
- ),
- );
- }
- /**
- * @see WP_Widget::get_field_id()
- * @dataProvider data_wp_widget_get_field_id
- */
- function test_wp_widget_get_field_id( $expected, $value_to_test ) {
- $widget = new WP_Widget( 'foo', 'Foo' );
- $widget->_set( 2 );
- $this->assertSame( $expected, $widget->get_field_id( $value_to_test ) );
- }
- /**
- * Data provider.
- *
- * Passes the expected field id and the value to be used in the tests.
- *
- * @since 4.4.0
- *
- * @return array {
- * @type array {
- * @type string $expected The expected field id to be returned.
- * @type string $value_to_test The value being passed to the get_field_id method.
- * }
- * }
- */
- function data_wp_widget_get_field_id() {
- return array(
- array(
- 'widget-foo-2-title',
- 'title',
- ),
- array(
- 'widget-foo-2-posttypes',
- 'posttypes[]',
- ),
- array(
- 'widget-foo-2-posttypes-4',
- 'posttypes[4]',
- ),
- array(
- 'widget-foo-2-posttypes-4',
- 'posttypes[4][]',
- ),
- array(
- 'widget-foo-2-posttypes-4-6',
- 'posttypes[4][][6]',
- ),
- );
- }
- /**
- * @see WP_Widget::_register()
- */
- function test_wp_widget__register() {
- global $wp_registered_widgets;
- $settings = get_option( 'widget_search' );
- unset( $settings['_multiwidget'] );
- $this->assertArrayHasKey( 2, $settings );
- $this->assertEmpty( $wp_registered_widgets );
- wp_widgets_init();
- // Note: We cannot use array_keys() here because $settings could be an ArrayIterator.
- foreach ( $settings as $widget_number => $instance ) {
- $widget_id = "search-$widget_number";
- $this->assertArrayHasKey( $widget_id, $wp_registered_widgets );
- }
- }
- // @todo Test WP_Widget::display_callback().
- /**
- * @see WP_Widget::is_preview()
- */
- function test_wp_widget_is_preview() {
- global $wp_customize;
- $widget = new WP_Widget( 'foo', 'Foo' );
- $this->assertEmpty( $wp_customize );
- $this->assertFalse( $widget->is_preview() );
- wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
- require_once ABSPATH . WPINC . '/class-wp-customize-manager.php';
- $wp_customize = new WP_Customize_Manager();
- $wp_customize->start_previewing_theme();
- $this->assertTrue( $widget->is_preview() );
- }
- // @todo Test WP_Widget::update_callback().
- // @todo Test WP_Widget::form_callback().
- // @todo Test WP_Widget::_register_one().
- /**
- * @see WP_Widget::get_settings()
- */
- function test_wp_widget_get_settings() {
- global $wp_registered_widgets;
- $option_value = get_option( 'widget_search' );
- $this->assertArrayHasKey( '_multiwidget', $option_value );
- $this->assertSame( 1, $option_value['_multiwidget'] );
- $this->assertArrayHasKey( 2, $option_value );
- $instance = $option_value[2];
- $this->assertInternalType( 'array', $instance );
- $this->assertArrayHasKey( 'title', $instance );
- unset( $option_value['_multiwidget'] );
- // Pretend this widget is new.
- delete_option( 'widget_nav_menu' );
- $never_used = get_option( 'widget_nav_menu', array() );
- $this->assertSame( array(), (array) $never_used );
- wp_widgets_init();
- $wp_widget_search = $wp_registered_widgets['search-2']['callback'][0];
- $settings = $wp_widget_search->get_settings();
- // @todo $this->assertArrayNotHasKey( '_multiwidget', $settings ); ?
- $this->assertArrayHasKey( 2, $settings );
- foreach ( $option_value as $widget_number => $instance ) {
- $this->assertSame( $settings[ $widget_number ], $option_value[ $widget_number ] );
- }
- // After widgets_init(), get_settings() should create the widget option.
- $never_used = get_option( 'widget_nav_menu' );
- $this->assertSame( 1, $never_used['_multiwidget'] );
- $this->assertArrayNotHasKey( 0, $never_used );
- }
- /**
- * @see WP_Widget::save_settings()
- */
- function test_wp_widget_save_settings() {
- global $wp_registered_widgets;
- wp_widgets_init();
- $wp_widget_search = $wp_registered_widgets['search-2']['callback'][0];
- $settings = $wp_widget_search->get_settings();
- $overridden_title = 'Unit Tested';
- /*
- * Note that if a plugin is filtering $settings to be an ArrayIterator,
- * then doing this:
- * $settings[2]['title'] = $overridden_title;
- * Will fail with this:
- * > Indirect modification of overloaded element of X has no effect.
- * So this is why the value must be obtained.
- */
- $instance = $settings[2];
- $instance['title'] = $overridden_title;
- $settings[2] = $instance;
- $wp_widget_search->save_settings( $settings );
- $option_value = get_option( $wp_widget_search->option_name );
- $this->assertArrayHasKey( '_multiwidget', $option_value );
- $this->assertSame( $overridden_title, $option_value[2]['title'] );
- }
- /**
- * @see WP_Widget::save_settings()
- */
- function test_wp_widget_save_settings_delete() {
- global $wp_registered_widgets;
- wp_widgets_init();
- $wp_widget_search = $wp_registered_widgets['search-2']['callback'][0];
- $settings = $wp_widget_search->get_settings();
- $this->assertArrayHasKey( 2, $settings );
- unset( $settings[2] );
- $wp_widget_search->save_settings( $settings );
- $option_value = get_option( $wp_widget_search->option_name );
- $this->assertArrayNotHasKey( 2, $option_value );
- }
- /**
- * @see wp_widget_control()
- */
- function test_wp_widget_control() {
- global $wp_registered_widgets;
- wp_widgets_init();
- require_once ABSPATH . '/wp-admin/includes/widgets.php';
- $widget_id = 'search-2';
- $widget = $wp_registered_widgets[ $widget_id ];
- $params = array(
- 'widget_id' => $widget['id'],
- 'widget_name' => $widget['name'],
- );
- $control_args = array(
- 0 => $params,
- 1 => $widget['params'][0],
- );
- $sidebar_args = wp_list_widget_controls_dynamic_sidebar( $control_args );
- ob_start();
- wp_widget_control( ...$sidebar_args );
- $control = ob_get_clean();
- $this->assertNotEmpty( $control );
- $this->assertContains( '<div class="widget-top">', $control );
- $this->assertContains( '<div class="widget-title-action">', $control );
- $this->assertContains( '<div class="widget-title">', $control );
- $this->assertContains( '<form method="post">', $control );
- $this->assertContains( '<div class="widget-content">', $control );
- $this->assertContains( '<input class="widefat"', $control );
- $this->assertContains( '<input type="hidden" name="id_base" class="id_base" value="search"', $control );
- $this->assertContains( '<div class="widget-control-actions">', $control );
- $this->assertContains( '<div class="alignleft">', $control );
- $this->assertContains( 'widget-control-remove', $control );
- $this->assertContains( 'widget-control-close', $control );
- $this->assertContains( '<div class="alignright">', $control );
- $this->assertContains( '<input type="submit" name="savewidget"', $control );
- $param_overrides = array(
- 'before_form' => '<!-- before_form -->',
- 'after_form' => '<!-- after_form -->',
- 'before_widget_content' => '<!-- before_widget_content -->',
- 'after_widget_content' => '<!-- after_widget_content -->',
- );
- $params = array_merge( $params, $param_overrides );
- $control_args = array(
- 0 => $params,
- 1 => $widget['params'][0],
- );
- $sidebar_args = wp_list_widget_controls_dynamic_sidebar( $control_args );
- ob_start();
- wp_widget_control( ...$sidebar_args );
- $control = ob_get_clean();
- $this->assertNotEmpty( $control );
- $this->assertNotContains( '<form method="post">', $control );
- $this->assertNotContains( '<div class="widget-content">', $control );
- foreach ( $param_overrides as $contained ) {
- $this->assertContains( $contained, $control );
- }
- }
- function test_the_widget_custom_before_title_arg() {
- register_widget( 'WP_Widget_Text' );
- ob_start();
- the_widget(
- 'WP_Widget_Text',
- array(
- 'title' => 'Notes',
- 'text' => 'Sample text',
- ),
- array(
- 'before_widget' => '<span class="special %s">',
- 'after_widget' => '</span>',
- )
- );
- $actual = ob_get_clean();
- unregister_widget( 'WP_Widget_Text' );
- $this->assertRegExp( '/<span class="special widget_text">/', $actual );
- }
- /**
- * Tests that no 'Undefined index' exception is thrown when trying to
- * display an unregistered widget.
- *
- * @see \the_widget()
- */
- function test_the_widget_with_unregistered_widget() {
- $this->setExpectedIncorrectUsage( 'the_widget' );
- the_widget( 'Widget_Class' );
- }
- /**
- * @ticket 34226
- */
- public function test_the_widget_should_short_circuit_with_widget_display_callback() {
- add_filter( 'widget_display_callback', '__return_false' );
- register_widget( 'WP_Widget_Text' );
- ob_start();
- the_widget( 'WP_Widget_Text' );
- $widget_content = ob_get_clean();
- unregister_widget( 'WP_Widget_Text' );
- $this->assertEmpty( $widget_content );
- }
- /**
- * Register nav menu sidebars.
- *
- * @param array $sidebars Sidebar slugs.
- */
- function register_sidebars( $sidebars ) {
- foreach ( $sidebars as $sidebar ) {
- register_sidebar( array( 'id' => $sidebar ) );
- }
- }
- /**
- * Tests for when 'sidebars_widgets' theme mod is populated.
- *
- * @covers ::retrieve_widgets
- */
- function test_retrieve_widgets_with_theme_mod() {
- global $sidebars_widgets, $_wp_sidebars_widgets;
- wp_widgets_init();
- $this->register_sidebars( array( 'sidebar-1', 'sidebar-2', 'sidebar-3', 'sidebar-4', 'wp_inactive_widgets' ) );
- // Test restoring sidebars widgets when previously activated.
- set_theme_mod(
- 'sidebars_widgets',
- array(
- 'time' => time(),
- 'data' => array(
- 'sidebar-1' => array( 'tag_cloud-1' ),
- 'sidebar-2' => array(),
- 'sidebar-3' => array( 'unregistered_widget-1', 'text-1', 'media_image-1' ),
- 'sidebar-4' => null, // Should be converted to array.
- 'orphaned_widgets_1' => array( 'media_video-2' ),
- ),
- )
- );
- $sidebars_widgets = array(
- 'sidebar-1' => array( 'tag_cloud-1' ),
- 'sidebar-2' => array( 'text-1' ),
- 'fantasy' => array( 'archives-2' ),
- 'wp_inactive_widgets' => array(),
- );
- $result = retrieve_widgets( true );
- $this->assertInternalType( 'array', $result );
- $this->assertSame( $result, $sidebars_widgets );
- foreach ( $sidebars_widgets as $widgets ) {
- $this->assertInternalType( 'array', $widgets );
- }
- $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] );
- $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] );
- $this->assertContains( 'media_image-1', $sidebars_widgets['sidebar-3'] );
- $this->assertArrayNotHasKey( 'orphaned_widgets_1', $sidebars_widgets );
- // Unregistered widget should be filtered out.
- $this->assertNotContains( 'unregistered_widget-1', $sidebars_widgets['sidebar-3'] );
- // 6 default widgets - 1 active text widget + 1 orphaned widget = 6.
- $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'meta-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'search-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'archives-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'categories-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'recent-posts-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] );
- // Sidebar_widgets option was updated.
- $this->assertSame( $sidebars_widgets, wp_get_sidebars_widgets() );
- }
- /**
- * Tests for when sidebars widgets matches registered sidebars.
- *
- * @covers ::retrieve_widgets
- */
- function test_retrieve_widgets_with_sidebars_widgets_matching_registered_sidebars() {
- global $sidebars_widgets;
- wp_widgets_init();
- $this->register_sidebars( array( 'sidebar-1', 'sidebar-2', 'sidebar-3', 'wp_inactive_widgets' ) );
- $sidebars_widgets = array(
- 'sidebar-1' => array( 'tag_cloud-1' ),
- 'sidebar-2' => array( 'text-1' ),
- 'sidebar-3' => array( 'custom_widget-1' ),
- 'wp_inactive_widgets' => array(),
- );
- $result = retrieve_widgets( true );
- // $sidebars_widgets matches registered sidebars.
- $this->assertInternalType( 'array', $result );
- $this->assertSame( $result, $sidebars_widgets );
- foreach ( $sidebars_widgets as $widgets ) {
- $this->assertInternalType( 'array', $widgets );
- }
- $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] );
- $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] );
- // Invalid widget removed, even when $sidebars_widgets matches registered sidebars.
- $this->assertEmpty( $sidebars_widgets['sidebar-3'] );
- // No lost widgets when $sidebars_widgets matches registered sidebars.
- $this->assertEmpty( $sidebars_widgets['wp_inactive_widgets'] );
- }
- /**
- * Tests for when sidebars widgets doesn't match registered sidebars.
- *
- * @covers ::retrieve_widgets
- */
- function test_retrieve_widgets_with_sidebars_widgets_not_matching_registered_sidebars() {
- global $sidebars_widgets, $_wp_sidebars_widgets;
- wp_widgets_init();
- $this->register_sidebars( array( 'sidebar-1', 'sidebar-2', 'sidebar-3', 'wp_inactive_widgets' ) );
- $sidebars_widgets = array(
- 'sidebar-1' => array( 'tag_cloud-1' ),
- 'sidebar-2' => array( 'text-1' ),
- 'fantasy' => array( 'unregistered_widget-1' ),
- 'wp_inactive_widgets' => array(),
- );
- // Theme changed.
- $result = retrieve_widgets( true );
- $_wp_sidebars_widgets = array();
- $this->assertInternalType( 'array', $result );
- $this->assertSame( $result, $sidebars_widgets );
- foreach ( $sidebars_widgets as $widgets ) {
- $this->assertInternalType( 'array', $widgets );
- }
- // Current theme doesn't have a fantasy-sidebar.
- $this->assertArrayNotHasKey( 'fantasy', $sidebars_widgets );
- $this->assertArrayHasKey( 'sidebar-3', $sidebars_widgets );
- $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] );
- $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] );
- $this->assertEmpty( $sidebars_widgets['sidebar-3'] );
- // We should not have orphaned widgets, because widget was not registered.
- $this->assertArrayNotHasKey( 'orphaned_widgets_1', $sidebars_widgets );
- // 6 default widgets.
- $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'archives-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'meta-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'search-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'categories-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'recent-posts-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] );
- // Sidebar_widgets option was updated.
- $this->assertSame( $sidebars_widgets, wp_get_sidebars_widgets() );
- // Reset.
- $sidebars_widgets = array(
- 'sidebar-1' => array( 'tag_cloud-1' ),
- 'sidebar-2' => array( 'text-1' ),
- 'fantasy' => array( 'archives-2' ),
- 'wp_inactive_widgets' => array(),
- );
- // Theme did not change.
- $result = retrieve_widgets();
- $_wp_sidebars_widgets = array();
- $this->assertInternalType( 'array', $result );
- $this->assertSame( $result, $sidebars_widgets );
- foreach ( $sidebars_widgets as $widgets ) {
- $this->assertInternalType( 'array', $widgets );
- }
- // This sidebar is not registered anymore.
- $this->assertArrayNotHasKey( 'fantasy', $sidebars_widgets );
- $this->assertArrayHasKey( 'sidebar-3', $sidebars_widgets );
- $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] );
- $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] );
- // 6 default widgets - 1 active text widget = 5.
- $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'meta-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'search-2', $sidebars_widgets['wp_inactive_widgets'] );
- // archives-2 ends up as inactive because fantasy sidebar doesn't exist.
- $this->assertContains( 'archives-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'categories-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'recent-posts-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] );
- // Sidebar_widgets option was updated.
- $this->assertSame( $sidebars_widgets, wp_get_sidebars_widgets() );
- }
- /**
- * Tests for Customizer mode.
- *
- * @covers ::retrieve_widgets
- */
- function test_retrieve_widgets_for_customizer() {
- global $sidebars_widgets, $_wp_sidebars_widgets;
- wp_widgets_init();
- $this->register_sidebars( array( 'sidebar-1', 'sidebar-2', 'sidebar-3', 'wp_inactive_widgets' ) );
- $old_sidebars_widgets = array(
- 'sidebar-1' => array( 'tag_cloud-1' ),
- 'sidebar-2' => array( 'text-1' ),
- 'sidebar-3' => array( 'unregistered_widget-1' ),
- 'fantasy' => array( 'archives-2' ),
- 'wp_inactive_widgets' => array(),
- );
- set_theme_mod( 'sidebars_widgets', $old_sidebars_widgets );
- $result = retrieve_widgets( 'customize' );
- $_wp_sidebars_widgets = array();
- $this->assertInternalType( 'array', $result );
- $this->assertSame( $result, $sidebars_widgets );
- foreach ( $sidebars_widgets as $widgets ) {
- $this->assertInternalType( 'array', $widgets );
- }
- $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] );
- $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] );
- $this->assertArrayHasKey( 'sidebar-3', $sidebars_widgets );
- $this->assertEmpty( $sidebars_widgets['sidebar-3'] );
- $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'meta-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'search-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'archives-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'categories-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'recent-posts-2', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] );
- // Theme mod with previous widgets was not removed.
- $this->assertSameSets( $old_sidebars_widgets, get_theme_mod( 'sidebars_widgets' ) );
- // Sidebar_widgets option was not updated.
- $this->assertNotEquals( $sidebars_widgets, wp_get_sidebars_widgets() );
- }
- function test_retreive_widgets_with_single_widget() {
- global $sidebars_widgets;
- wp_widgets_init();
- // Register single-dimension widget.
- wp_register_sidebar_widget( 'single', 'Single', '__return_false', array(), array() );
- wp_register_widget_control( 'single', 'Single', '__return_false', array(), array() );
- $this->register_sidebars( array( 'sidebar-1', 'sidebar-2', 'wp_inactive_widgets' ) );
- $sidebars_widgets = array(
- 'sidebar-1' => array( 'tag_cloud-1' ),
- 'wp_inactive_widgets' => array(),
- );
- // Theme changed.
- $result = retrieve_widgets( true );
- $this->assertContains( 'single', $result['wp_inactive_widgets'] );
- }
- /**
- * Tests for orphaned widgets being moved into inactive widgets.
- *
- * @covers ::retrieve_widgets
- */
- function test_retrieve_widgets_move_orphaned_widgets_to_inactive() {
- global $sidebars_widgets;
- wp_widgets_init();
- $this->register_sidebars( array( 'sidebar-1', 'sidebar-2', 'sidebar-3', 'wp_inactive_widgets' ) );
- $sidebars_widgets = array(
- 'sidebar-1' => array( 'tag_cloud-1' ),
- 'sidebar-2' => array( 'text-1' ),
- 'wp_inactive_widgets' => array( 'search-2', 'archives-2' ),
- 'orphaned_widgets_1' => array( 'calendar-1' ),
- );
- retrieve_widgets();
- $this->assertInternalType( 'array', $sidebars_widgets );
- foreach ( $sidebars_widgets as $widgets ) {
- $this->assertInternalType( 'array', $widgets );
- }
- // 6 default widgets + 1 orphaned calendar widget = 7.
- $this->assertCount( 7, $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertContains( 'calendar-1', $sidebars_widgets['wp_inactive_widgets'] );
- $this->assertArrayNotHasKey( 'orphaned_widgets_1', $sidebars_widgets );
- // Sidebar_widgets option was updated.
- $this->assertSame( $sidebars_widgets, wp_get_sidebars_widgets() );
- }
- /**
- * Test _wp_remove_unregistered_widgets.
- *
- * @covers ::_wp_remove_unregistered_widgets
- */
- public function test__wp_remove_unregistered_widgets() {
- $widgets = array(
- 'sidebar-1' => array( 'tag_cloud-1' ),
- 'sidebar-2' => array( 'text-1' ),
- 'fantasy' => array( 'archives-2' ),
- 'wp_inactive_widgets' => array(),
- 'array_version' => 3,
- );
- $allowed_widgets = array( 'tag_cloud-1', 'text-1' );
- $filtered_widgets = _wp_remove_unregistered_widgets( $widgets, $allowed_widgets );
- $this->assertInternalType( 'array', $filtered_widgets );
- $this->assertArrayHasKey( 'fantasy', $filtered_widgets );
- $this->assertEmpty( $filtered_widgets['fantasy'] );
- $this->assertArrayHasKey( 'array_version', $filtered_widgets );
- $this->assertSame( 3, $filtered_widgets['array_version'] );
- $this->assertInternalType( 'integer', $filtered_widgets['array_version'] );
- }
- /**
- * wp_map_sidebars_widgets Tests.
- */
- /**
- * Two themes with one sidebar each should just map, switching to a theme not previously-active.
- *
- * @covers ::wp_map_sidebars_widgets
- */
- public function test_one_sidebar_each() {
- $this->register_sidebars( array( 'primary' ) );
- $prev_theme_sidebars = array(
- 'unique-slug' => 1,
- );
- $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars );
- $expected_sidebars = array(
- 'primary' => 1,
- 'wp_inactive_widgets' => array(),
- );
- $this->assertEquals( $expected_sidebars, $new_next_theme_sidebars );
- }
- /**
- * Sidebars with the same name should map, switching to a theme not previously-active.
- *
- * @covers ::wp_map_sidebars_widgets
- */
- public function test_sidebars_with_same_slug() {
- $this->register_sidebars( array( 'primary', 'secondary' ) );
- $prev_theme_sidebars = array(
- 'primary' => 1,
- 'secondary' => 2,
- 'wp_inactive_widgets' => array(),
- );
- $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars );
- $this->assertEquals( $prev_theme_sidebars, $new_next_theme_sidebars );
- }
- /**
- * Make educated guesses on theme sidebars.
- *
- * @covers ::wp_map_sidebars_widgets
- */
- public function test_sidebar_guessing() {
- $this->register_sidebars( array( 'primary', 'secondary' ) );
- $prev_theme_sidebars = array(
- 'header' => array(),
- 'footer' => array(),
- );
- $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars );
- $expected_sidebars = array(
- 'primary' => array(),
- 'secondary' => array(),
- 'wp_inactive_widgets' => array(),
- );
- $this->assertEquals( $expected_sidebars, $new_next_theme_sidebars );
- }
- /**
- * Make sure two sidebars that fall in the same group don't get the same menu assigned.
- *
- * @covers ::wp_map_sidebars_widgets
- */
- public function test_sidebar_guessing_one_menu_per_group() {
- $this->register_sidebars( array( 'primary' ) );
- $prev_theme_sidebars = array(
- 'top-menu' => array(),
- 'secondary' => array(),
- );
- $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars );
- $expected_sidebars = array(
- 'main' => array(),
- 'wp_inactive_widgets' => array(),
- );
- $this->assertSameSets( $expected_sidebars, $new_next_theme_sidebars );
- }
- /**
- * Make sure two sidebars that fall in the same group get menus assigned from the same group.
- *
- * @covers ::wp_map_sidebars_widgets
- */
- public function test_sidebar_guessing_one_menu_per_sidebar() {
- $this->register_sidebars( array( 'primary', 'main' ) );
- $prev_theme_sidebars = array(
- 'navigation-menu' => array(),
- 'top-menu' => array(),
- );
- $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars );
- $expected_sidebars = array(
- 'main' => array(),
- 'primary' => array(),
- 'wp_inactive_widgets' => array(),
- );
- $this->assertEquals( $expected_sidebars, $new_next_theme_sidebars );
- }
- }
|