Make WordPress Core

Changeset 31002


Ignore:
Timestamp:
12/30/2014 07:23:49 PM (12 years ago)
Author:
boonebgorges
Message:

Improved tests for wp-admin/includes/plugin.php.

  • Improved cleanup for existing tests, by ensuring that plugins are deactivated.
  • New tests for get_plugin_files(), get_mu_plugins(), _sort_uname_callback(), get_dropins(), is_network_only_plugin(), activate_plugins(), validate_active_plugins(), and is_uninstallable_plugin().

Props sgrant.
See #30860.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/admin/includesPlugin.php

    r30557 r31002  
    6262                $test = is_plugin_active( 'hello.php' );
    6363                $this->assertTrue( $test );
     64
     65                deactivate_plugins( 'hello.php' );
    6466        }
    6567
    … …  
    8082                $test = is_plugin_inactive( 'hello.php' );
    8183                $this->assertFalse( $test );
     84
     85                deactivate_plugins( 'hello.php' );
     86        }
     87
     88        /**
     89         * @covers ::get_plugin_files
     90         */
     91        public function test_get_plugin_files_single() {
     92                $name = 'hello.php';
     93                $this->assertEquals( array( $name ), get_plugin_files( $name ) );
     94        }
     95
     96        /**
     97         * @covers ::get_mu_plugins
     98         */
     99        public function test_get_mu_plugins_when_mu_plugins_exists_but_is_empty() {
     100                if ( is_dir( WPMU_PLUGIN_DIR ) ) {
     101                        $exists = true;
     102                        $this->_back_up_mu_plugins();
     103                } else {
     104                        $exists = false;
     105                        mkdir( WPMU_PLUGIN_DIR );
     106                }
     107
     108                $this->assertEquals( array(), get_mu_plugins() );
     109
     110                // Clean up.
     111                if ( $exists ) {
     112                        $this->_restore_mu_plugins();
     113                } else {
     114                        rmdir( WPMU_PLUGIN_DIR );
     115                }
     116        }
     117
     118        /**
     119         * @covers ::get_mu_plugins
     120         */
     121        public function test_get_mu_plugins_when_mu_plugins_directory_does_not_exist() {
     122                $exists = false;
     123                if ( is_dir( WPMU_PLUGIN_DIR ) ) {
     124                        $exists = true;
     125                        $this->_back_up_mu_plugins();
     126                        rmdir( WPMU_PLUGIN_DIR );
     127                }
     128
     129                $this->assertEquals( array(), get_mu_plugins() );
     130
     131                // Clean up.
     132                if ( $exists ) {
     133                        mkdir( WPMU_PLUGIN_DIR );
     134                        $this->_restore_mu_plugins();
     135                }
     136        }
     137
     138        /**
     139         * @covers ::get_mu_plugins
     140         */
     141        public function test_get_mu_plugins_should_ignore_index_php_containing_silence_is_golden() {
     142                if ( is_dir( WPMU_PLUGIN_DIR ) ) {
     143                        $exists = true;
     144                        $this->_back_up_mu_plugins();
     145                } else {
     146                        $exists = false;
     147                        mkdir( WPMU_PLUGIN_DIR );
     148                }
     149
     150                $this->_create_plugin( '<?php\n//Silence is golden.', 'index.php', WPMU_PLUGIN_DIR );
     151                $this->assertEquals( array(), get_mu_plugins() );
     152
     153                // Clean up.
     154                unlink( WPMU_PLUGIN_DIR . '/index.php' );
     155                if ( $exists ) {
     156                        $this->_restore_mu_plugins();
     157                } else {
     158                        rmdir( WPMU_PLUGIN_DIR );
     159                }
     160        }
     161
     162        /**
     163         * @covers ::get_mu_plugins
     164         */
     165        public function test_get_mu_plugins_should_not_ignore_index_php_containing_something_other_than_silence_is_golden() {
     166                if ( is_dir( WPMU_PLUGIN_DIR ) ) {
     167                        $exists = true;
     168                        $this->_back_up_mu_plugins();
     169                } else {
     170                        $exists = false;
     171                        mkdir( WPMU_PLUGIN_DIR );
     172                }
     173
     174                $this->_create_plugin( '<?php\n//Silence is not golden.', 'index.php', WPMU_PLUGIN_DIR );
     175                $found = get_mu_plugins();
     176                $this->assertEquals( array( 'index.php' ), array_keys( $found ) );
     177
     178                // Clean up.
     179                unlink( WPMU_PLUGIN_DIR . '/index.php' );
     180                if ( $exists ) {
     181                        $this->_restore_mu_plugins();
     182                } else {
     183                        rmdir( WPMU_PLUGIN_DIR );
     184                }
     185        }
     186
     187        /**
     188         * @covers ::get_mu_plugins
     189         */
     190        public function test_get_mu_plugins_should_ignore_files_without_php_extensions() {
     191                if ( is_dir( WPMU_PLUGIN_DIR ) ) {
     192                        $exists = true;
     193                        $this->_back_up_mu_plugins();
     194                } else {
     195                        $exists = false;
     196                        mkdir( WPMU_PLUGIN_DIR );
     197                }
     198
     199                $this->_create_plugin( '<?php\n//Test', 'foo.php', WPMU_PLUGIN_DIR );
     200                $this->_create_plugin( '<?php\n//Test 2', 'bar.txt', WPMU_PLUGIN_DIR );
     201                $found = get_mu_plugins();
     202                $this->assertEquals( array( 'foo.php' ), array_keys( $found ) );
     203
     204                // Clean up.
     205                unlink( WPMU_PLUGIN_DIR . '/foo.php' );
     206                unlink( WPMU_PLUGIN_DIR . '/bar.txt' );
     207                if ( $exists ) {
     208                        $this->_restore_mu_plugins();
     209                } else {
     210                        rmdir( WPMU_PLUGIN_DIR );
     211                }
     212        }
     213
     214        /**
     215         * @covers ::_sort_uname_callback
     216         */
     217        public function test__sort_uname_callback() {
     218                $this->assertLessThan( 0, _sort_uname_callback( array( 'Name' => 'a' ), array( 'Name' => 'b' ) ) );
     219                $this->assertGreaterThan( 0, _sort_uname_callback( array( 'Name' => 'c' ), array( 'Name' => 'b' ) ) );
     220                $this->assertEquals( 0, _sort_uname_callback( array( 'Name' => 'a' ), array( 'Name' => 'a' ) ) );
     221        }
     222
     223        /**
     224         * @covers ::get_dropins
     225         */
     226        public function test_get_dropins_empty() {
     227                $this->assertEquals( array(), get_dropins() );
     228        }
     229
     230        /**
     231         * @covers ::get_dropins
     232         */
     233        public function test_get_dropins_not_empty() {
     234                $p1 = $this->_create_plugin( "<?php\n//Test", 'advanced-cache.php', WP_CONTENT_DIR );
     235                $p2 = $this->_create_plugin( "<?php\n//Test", 'not-a-dropin.php', WP_CONTENT_DIR );
     236
     237                $dropins = get_dropins();
     238                $this->assertEquals( array( 'advanced-cache.php' ), array_keys( $dropins ) );
     239
     240                unlink( $p1[1] );
     241                unlink( $p2[1] );
     242        }
     243
     244        /**
     245         * @covers ::is_network_only_plugin
     246         */
     247        public function test_is_network_only_plugin_hello() {
     248                $this->assertFalse( is_network_only_plugin( 'hello.php' ) );
     249        }
     250
     251        /**
     252         * @covers ::is_network_only_plugin
     253         */
     254        public function test_is_network_only_plugin() {
     255                $p = $this->_create_plugin( "<?php\n/*\nPlugin Name: test\nNetwork: true" );
     256
     257                $this->assertTrue( is_network_only_plugin( $p[0] ) );
     258
     259                unlink( $p[1] );
     260        }
     261
     262        /**
     263         * @covers ::activate_plugins
     264         */
     265        public function test_activate_plugins_single_no_array() {
     266                $name = 'hello.php';
     267                activate_plugins( $name );
     268                $this->assertTrue( is_plugin_active( $name ) );
     269                deactivate_plugins( $name );
     270        }
     271
     272        /**
     273         * @covers ::activate_plugins
     274         */
     275        public function test_activate_plugins_single_array() {
     276                $name = 'hello.php';
     277                activate_plugins( array( $name ) );
     278                $this->assertTrue( is_plugin_active( $name ) );
     279                deactivate_plugins( $name );
     280        }
     281
     282        /**
     283         * @covers ::validate_active_plugins
     284         */
     285        public function test_validate_active_plugins_remove_invalid() {
     286                $plugin = $this->_create_plugin();
     287
     288                activate_plugin( $plugin[ 0 ] );
     289                unlink( $plugin[ 1 ] );
     290
     291                $result = validate_active_plugins();
     292                $this->assertTrue( isset( $result[ $plugin[ 0 ] ] ) );
     293        }
     294
     295        /**
     296         * @covers ::is_uninstallable_plugin
     297         */
     298        public function test_is_uninstallable_plugin() {
     299                $this->assertFalse( is_uninstallable_plugin( 'hello' ) );
     300        }
     301
     302        /**
     303         * @covers ::is_uninstallable_plugin
     304         */
     305        public function test_is_uninstallable_plugin_true() {
     306                $plugin = $this->_create_plugin();
     307
     308                $uninstallable_plugins = (array) get_option( 'uninstall_plugins' );
     309                $uninstallable_plugins[ $plugin[0] ] = true;
     310                update_option( 'uninstall_plugins', $uninstallable_plugins );
     311
     312                $this->assertTrue( is_uninstallable_plugin( $plugin[0] ) );
     313
     314                unset( $uninstallable_plugins[ $plugin[0] ] );
     315                update_option( 'uninstall_plugins', $uninstallable_plugins );
     316
     317                unlink( $plugin[1] );
     318        }
     319
     320        /**
     321         * Generate a plugin.
     322         *
     323         * This creates a single-file plugin.
     324         *
     325         * @since 4.2.0
     326         *
     327         * @access private
     328         *
     329         * @param string $data     Optional. Data for the plugin file. Default is a dummy plugin header.
     330         * @param string $filename Optional. Filename for the plugin file. Default is a random string.
     331         * @param string $dir_path Optional. Path for directory where the plugin should live.
     332         * @return array Two-membered array of filename and full plugin path.
     333         */
     334        private function _create_plugin( $data = "<?php\n/*\nPlugin Name: Test\n*/", $filename = false, $dir_path = false ) {
     335                if ( false === $filename ) {
     336                        $filename = rand_str() . '.php';
     337                }
     338
     339                if ( false === $dir_path ) {
     340                        $dir_path = WP_PLUGIN_DIR;
     341                }
     342
     343                $full_name = $dir_path . '/' . wp_unique_filename( $dir_path, $filename );
     344
     345                $file = fopen( $full_name, 'w' );
     346                fwrite( $file, $data );
     347                fclose( $file );
     348
     349                return array( $filename, $full_name );
     350        }
     351
     352        /**
     353         * Move existing mu-plugins to wp-content/mu-plugin/backup.
     354         *
     355         * @since 4.2.0
     356         *
     357         * @access private
     358         */
     359        private function _back_up_mu_plugins() {
     360                if ( is_dir( WPMU_PLUGIN_DIR ) ) {
     361                        $mu_bu_dir = WP_CONTENT_DIR . '/mu-plugin-backup';
     362                        if ( ! is_dir( $mu_bu_dir ) ) {
     363                                mkdir( $mu_bu_dir );
     364                        }
     365
     366                        $files_to_move = array();
     367                        if ( $mu_plugins = opendir( WPMU_PLUGIN_DIR ) ) {
     368                                while ( false !== $plugin = readdir( $mu_plugins ) ) {
     369                                        if ( 0 !== strpos( $plugin, '.' ) ) {
     370                                                $files_to_move[] = $plugin;
     371                                        }
     372                                }
     373                        }
     374
     375                        @closedir( $mu_plugins );
     376
     377                        foreach ( $files_to_move as $file_to_move ) {
     378                                $f = rename( WPMU_PLUGIN_DIR . '/' . $file_to_move, $mu_bu_dir . '/' . $file_to_move );
     379                        }
     380                }
     381        }
     382
     383        /**
     384         * Restore backed-up mu-plugins.
     385         *
     386         * @since 4.2.0
     387         *
     388         * @access private
     389         */
     390        private function _restore_mu_plugins() {
     391                $mu_bu_dir = WP_CONTENT_DIR . '/mu-plugin-backup';
     392                $files_to_move = array();
     393                if ( is_dir( $mu_bu_dir ) && $mu_plugins = opendir( $mu_bu_dir ) ) {
     394                        while ( false !== $plugin = readdir( $mu_plugins ) ) {
     395                                if ( 0 !== strpos( $plugin, '.' ) ) {
     396                                        $files_to_move[] = $plugin;
     397                                }
     398                        }
     399                }
     400
     401                @closedir( $mu_plugins );
     402
     403                foreach ( $files_to_move as $file_to_move ) {
     404                        rename( $mu_bu_dir . '/' . $file_to_move, WPMU_PLUGIN_DIR . '/' . $file_to_move );
     405                }
     406
     407                if ( is_dir( $mu_bu_dir ) ) {
     408                        rmdir( $mu_bu_dir );
     409                }
    82410        }
    83411}
Note: See TracChangeset for help on using the changeset viewer.