WordPress.org

Make WordPress Core

Changeset 41266


Ignore:
Timestamp:
08/18/17 15:03:43 (5 months ago)
Author:
obenland
Message:

Widgets: Add tests for retrieve_widgets().

Helps with maintaining back compat when making changes in the future.

See #39693.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/widgets.php

    r37648 r41266  
    679679    } 
    680680 
     681    /** 
     682     * Register nav menu sidebars. 
     683     * 
     684     * @param array $sidebars Sidebar slugs. 
     685     */ 
     686    function register_sidebars( $sidebars ) { 
     687        foreach ( $sidebars as $sidebar ) { 
     688            register_sidebar( array( 'id' => $sidebar ) ); 
     689        } 
     690    } 
     691 
     692    /** 
     693     * Tests for when 'sidebars_widgets' theme mod is populated. 
     694     * 
     695     * @covers retrieve_widgets() 
     696     */ 
     697    function test_retrieve_widgets_with_theme_mod() { 
     698        global $sidebars_widgets, $_wp_sidebars_widgets; 
     699 
     700        wp_widgets_init(); 
     701        $this->register_sidebars( array( 'sidebar-1', 'sidebar-2','sidebar-3', 'wp_inactive_widgets' ) ); 
     702 
     703        set_theme_mod( 'sidebars_widgets', array( 
     704            'time' => time(), 
     705            'data' => array( 
     706                'sidebar-1' => array( 'tag_cloud-1' ), 
     707                'sidebar-2' => array( 'text-1' ), 
     708                'sidebar-3' => array( 'unregistered_widget-1' ), 
     709                'fantasy'   => array( 'archives-2' ), 
     710                'wp_inactive_widgets' => array(), 
     711            ), 
     712        ) ); 
     713 
     714        $result = retrieve_widgets( true ); 
     715 
     716        $_wp_sidebars_widgets = array(); 
     717        $this->assertInternalType( 'array', $result ); 
     718        $this->assertNotEmpty( $result ); 
     719 
     720        foreach ( $sidebars_widgets as $widgets ) { 
     721            $this->assertInternalType( 'array', $widgets ); 
     722        } 
     723 
     724        $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] ); 
     725        $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] ); 
     726        $this->assertContains( 'archives-2', $sidebars_widgets['orphaned_widgets_1'] ); 
     727 
     728        // Unregistered widget should be filtered out. 
     729        $this->assertEmpty( $sidebars_widgets['sidebar-3'] ); 
     730 
     731        // 6 default widgets - 1 active text widget = 5. 
     732        $this->assertCount( 5, $sidebars_widgets['wp_inactive_widgets'] ); 
     733        $this->assertContains( 'meta-2',            $sidebars_widgets['wp_inactive_widgets'] ); 
     734        $this->assertContains( 'search-2',          $sidebars_widgets['wp_inactive_widgets'] ); 
     735        $this->assertContains( 'categories-2',      $sidebars_widgets['wp_inactive_widgets'] ); 
     736        $this->assertContains( 'recent-posts-2',    $sidebars_widgets['wp_inactive_widgets'] ); 
     737        $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] ); 
     738 
     739        // Theme mode with previous widgets was removed. 
     740        $this->assertFalse( get_theme_mod( 'sidebars_widgets' ) ); 
     741 
     742        // Sidebar_widgets option was updated. 
     743        $this->assertEquals( $sidebars_widgets, wp_get_sidebars_widgets() ); 
     744    } 
     745 
     746    /** 
     747     * Tests for when sidebars widgets matches registered sidebars. 
     748     * 
     749     * @covers retrieve_widgets() 
     750     */ 
     751    function test_retrieve_widgets_with_sidebars_widgets_matching_registered_sidebars() { 
     752        global $sidebars_widgets; 
     753 
     754        wp_widgets_init(); 
     755        $this->register_sidebars( array( 'sidebar-1', 'sidebar-2','sidebar-3', 'wp_inactive_widgets' ) ); 
     756 
     757        $sidebars_widgets = array( 
     758            'sidebar-1' => array( 'tag_cloud-1' ), 
     759            'sidebar-2' => array( 'text-1' ), 
     760            'sidebar-3' => array( 'custom_widget-1' ), 
     761            'wp_inactive_widgets' => array(), 
     762        ); 
     763 
     764        $result = retrieve_widgets( true ); 
     765 
     766        // $sidebars_widgets matches registered sidebars. 
     767        $this->assertNull( $result ); 
     768 
     769        foreach ( $sidebars_widgets as $widgets ) { 
     770            $this->assertInternalType( 'array', $widgets ); 
     771        } 
     772 
     773        $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] ); 
     774        $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] ); 
     775 
     776        // No widget validity check when $sidebars_widgets matches registered sidebars. 
     777        $this->assertContains( 'custom_widget-1', $sidebars_widgets['sidebar-3'] ); 
     778 
     779        // No lost widgets when $sidebars_widgets matches registered sidebars. 
     780        $this->assertEmpty( $sidebars_widgets['wp_inactive_widgets'] ); 
     781    } 
     782 
     783    /** 
     784     * Tests for when sidebars widgets doesn't match registered sidebars. 
     785     * 
     786     * @covers retrieve_widgets() 
     787     */ 
     788    function test_retrieve_widgets_with_sidebars_widgets_not_matching_registered_sidebars() { 
     789        global $sidebars_widgets, $_wp_sidebars_widgets; 
     790 
     791        wp_widgets_init(); 
     792        $this->register_sidebars( array( 'sidebar-1', 'sidebar-2','sidebar-3', 'wp_inactive_widgets' ) ); 
     793 
     794        $sidebars_widgets = array( 
     795            'sidebar-1' => array( 'tag_cloud-1' ), 
     796            'sidebar-2' => array( 'text-1' ), 
     797            'fantasy'   => array( 'unregistered_widget-1' ), 
     798            'wp_inactive_widgets' => array(), 
     799        ); 
     800 
     801        // Theme changed. 
     802        $result = retrieve_widgets( true ); 
     803 
     804        $_wp_sidebars_widgets = array(); 
     805        $this->assertInternalType( 'array', $result ); 
     806        $this->assertNotEmpty( $result ); 
     807 
     808        foreach ( $sidebars_widgets as $widgets ) { 
     809            $this->assertInternalType( 'array', $widgets ); 
     810        } 
     811 
     812        // Current theme doesn't have a fantasy-sidebar. 
     813        $this->assertArrayNotHasKey( 'fantasy', $sidebars_widgets ); 
     814        $this->assertArrayHasKey( 'sidebar-3', $sidebars_widgets ); 
     815 
     816        $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] ); 
     817        $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] ); 
     818        $this->assertEmpty( $sidebars_widgets['sidebar-3'] ); 
     819 
     820        // We should not have orphaned widgets, because widget was not registered. 
     821        $this->assertArrayNotHasKey( 'orphaned_widgets_1', $sidebars_widgets ); 
     822 
     823        // 6 default widgets. 
     824        $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] ); 
     825 
     826        $this->assertContains( 'archives-2',        $sidebars_widgets['wp_inactive_widgets'] ); 
     827        $this->assertContains( 'meta-2',            $sidebars_widgets['wp_inactive_widgets'] ); 
     828        $this->assertContains( 'search-2',          $sidebars_widgets['wp_inactive_widgets'] ); 
     829        $this->assertContains( 'categories-2',      $sidebars_widgets['wp_inactive_widgets'] ); 
     830        $this->assertContains( 'recent-posts-2',    $sidebars_widgets['wp_inactive_widgets'] ); 
     831        $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] ); 
     832 
     833        // Sidebar_widgets option was updated. 
     834        $this->assertEquals( $sidebars_widgets, wp_get_sidebars_widgets() ); 
     835 
     836        // Reset. 
     837        $sidebars_widgets = array( 
     838            'sidebar-1' => array( 'tag_cloud-1' ), 
     839            'sidebar-2' => array( 'text-1' ), 
     840            'fantasy'   => array( 'archives-2' ), 
     841            'wp_inactive_widgets' => array(), 
     842        ); 
     843 
     844        // Theme did not change. 
     845        $result = retrieve_widgets(); 
     846 
     847        $_wp_sidebars_widgets = array(); 
     848        $this->assertInternalType( 'array', $result ); 
     849        $this->assertNotEmpty( $result ); 
     850 
     851        foreach ( $sidebars_widgets as $widgets ) { 
     852            $this->assertInternalType( 'array', $widgets ); 
     853        } 
     854 
     855        /* 
     856         * Only returns intersection of registered sidebars and saved sidebars, 
     857         * so neither fantasy-sidebar nor sidebar-3 will make the cut. 
     858         */ 
     859        $this->assertArrayNotHasKey( 'fantasy', $sidebars_widgets ); 
     860        $this->assertArrayNotHasKey( 'sidebar-3', $sidebars_widgets ); 
     861 
     862        // archives-2 ends up as an orphan because of the above behavior. 
     863        $this->assertContains( 'archives-2', $sidebars_widgets['orphaned_widgets_1'] ); 
     864        $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] ); 
     865        $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] ); 
     866 
     867        // 6 default widgets - 1 active text widget = 5. 
     868        $this->assertCount( 5, $sidebars_widgets['wp_inactive_widgets'] ); 
     869 
     870        $this->assertContains( 'meta-2',            $sidebars_widgets['wp_inactive_widgets'] ); 
     871        $this->assertContains( 'search-2',          $sidebars_widgets['wp_inactive_widgets'] ); 
     872        $this->assertContains( 'categories-2',      $sidebars_widgets['wp_inactive_widgets'] ); 
     873        $this->assertContains( 'recent-posts-2',    $sidebars_widgets['wp_inactive_widgets'] ); 
     874        $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] ); 
     875 
     876        // Sidebar_widgets option was updated. 
     877        $this->assertEquals( $sidebars_widgets, wp_get_sidebars_widgets() ); 
     878    } 
     879 
     880    /** 
     881     * Tests for Customizer mode. 
     882     * 
     883     * @covers retrieve_widgets() 
     884     */ 
     885    function test_retrieve_widgets_for_customizer() { 
     886        global $sidebars_widgets, $_wp_sidebars_widgets; 
     887 
     888        wp_widgets_init(); 
     889        $this->register_sidebars( array( 'sidebar-1', 'sidebar-2','sidebar-3', 'wp_inactive_widgets' ) ); 
     890 
     891        $old_sidebars_widgets = array( 
     892            'time' => time(), 
     893            'data' => array( 
     894                'sidebar-1' => array( 'tag_cloud-1' ), 
     895                'sidebar-2' => array( 'text-1' ), 
     896                'sidebar-3' => array( 'unregistered_widget-1' ), 
     897                'fantasy'   => array( 'archives-2' ), 
     898                'wp_inactive_widgets' => array(), 
     899            ), 
     900        ); 
     901        set_theme_mod( 'sidebars_widgets', $old_sidebars_widgets ); 
     902 
     903        $result = retrieve_widgets( 'customize' ); 
     904 
     905        $_wp_sidebars_widgets = array(); 
     906        $this->assertInternalType( 'array', $result ); 
     907        $this->assertNotEmpty( $result ); 
     908 
     909        foreach ( $sidebars_widgets as $widgets ) { 
     910            $this->assertInternalType( 'array', $widgets ); 
     911        } 
     912 
     913        $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] ); 
     914        $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] ); 
     915        $this->assertContains( 'archives-2', $sidebars_widgets['orphaned_widgets_1'] ); 
     916        $this->assertArrayHasKey( 'sidebar-3', $sidebars_widgets ); 
     917        $this->assertEmpty( $sidebars_widgets['sidebar-3'] ); 
     918        $this->assertCount( 5, $sidebars_widgets['wp_inactive_widgets'] ); 
     919 
     920        $this->assertContains( 'meta-2',            $sidebars_widgets['wp_inactive_widgets'] ); 
     921        $this->assertContains( 'search-2',          $sidebars_widgets['wp_inactive_widgets'] ); 
     922        $this->assertContains( 'categories-2',      $sidebars_widgets['wp_inactive_widgets'] ); 
     923        $this->assertContains( 'recent-posts-2',    $sidebars_widgets['wp_inactive_widgets'] ); 
     924        $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] ); 
     925 
     926        // Theme mod with previous widgets was not removed. 
     927        $this->assertEqualSets( $old_sidebars_widgets, get_theme_mod( 'sidebars_widgets' ) ); 
     928 
     929        // Sidebar_widgets option was not updated. 
     930        $this->assertNotEquals( $sidebars_widgets, wp_get_sidebars_widgets() ); 
     931    } 
    681932} 
Note: See TracChangeset for help on using the changeset viewer.