Make WordPress Core

Changeset 32770


Ignore:
Timestamp:
06/14/2015 07:22:20 PM (9 years ago)
Author:
jorbin
Message:

Improve dbDelta unit tests

Add new tests for more parts of dbDelta. This was cleaned up and prepared for commit at #wcphilly contributor day.

Props jdgrimes, tryon, jtsternberg, ebinnion, JPry, avnarun, kevkoeh, jorbin, salcode.
Fixes #29020.

File:
1 edited

Legend:

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

    r32108 r32770  
    99class Tests_dbDelta extends WP_UnitTestCase {
    1010
    11     function test_create_new_table() {
    12         include_once( ABSPATH . 'wp-admin/includes/upgrade.php');
    13         $table_name = 'test_new_table';
    14 
    15         $create = "CREATE TABLE $table_name (\n a varchar(255)\n)";
    16         $expected = array( $table_name => "Created table $table_name" );
    17 
    18         $actual = dbDelta( $create, false );
    19 
    20         $this->assertSame( $expected, $actual );
     11    /**
     12     * Make sure the upgrade code is loaded before the tests are run.
     13     */
     14    public static function setUpBeforeClass() {
     15
     16        parent::setUpBeforeClass();
     17
     18        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
     19    }
     20
     21    /**
     22     * Create a custom table to be used in each test.
     23     */
     24    public function setUp() {
     25
     26        global $wpdb;
     27
     28        $wpdb->query(
     29            "
     30            CREATE TABLE {$wpdb->prefix}dbdelta_test (
     31                id bigint(20) NOT NULL AUTO_INCREMENT,
     32                column_1 varchar(255) NOT NULL,
     33                PRIMARY KEY  (id),
     34                KEY key_1 (column_1),
     35                KEY compoud_key (id,column_1)
     36            )
     37            "
     38        );
     39
     40        parent::setUp();
     41    }
     42
     43    /**
     44     * Delete the custom table on teardown.
     45     */
     46    public function tearDown() {
     47
     48        global $wpdb;
     49
     50        parent::tearDown();
     51
     52        $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}dbdelta_test" );
     53    }
     54
     55    /**
     56     * Test table creation.
     57     */
     58    public function test_creating_a_table() {
     59
     60        remove_filter( 'query', array( $this, '_create_temporary_tables' ) );
     61        remove_filter( 'query', array( $this, '_drop_temporary_tables' ) );
     62
     63        global $wpdb;
     64
     65        $updates = dbDelta(
     66            "CREATE TABLE {$wpdb->prefix}dbdelta_create_test (
     67                id bigint(20) NOT NULL AUTO_INCREMENT,
     68                column_1 varchar(255) NOT NULL,
     69                PRIMARY KEY  (id)
     70            );"
     71        );
     72
     73        $expected = array(
     74            "{$wpdb->prefix}dbdelta_create_test" => "Created table {$wpdb->prefix}dbdelta_create_test"
     75        );
     76
     77        $this->assertEquals( $expected, $updates );
     78
     79        $this->assertEquals(
     80            "{$wpdb->prefix}dbdelta_create_test"
     81            , $wpdb->get_var(
     82                $wpdb->prepare(
     83                    'SHOW TABLES LIKE %s'
     84                    , $wpdb->esc_like( "{$wpdb->prefix}dbdelta_create_test" )
     85                )
     86            )
     87        );
     88
     89        $wpdb->query( "DROP TABLE {$wpdb->prefix}dbdelta_create_test" );
     90    }
     91
     92    /**
     93     * Test that it does nothing for an existing table.
     94     */
     95    public function test_existing_table() {
     96
     97        global $wpdb;
     98
     99        $updates = dbDelta(
     100            "
     101            CREATE TABLE {$wpdb->prefix}dbdelta_test (
     102                id bigint(20) NOT NULL AUTO_INCREMENT,
     103                column_1 varchar(255) NOT NULL,
     104                PRIMARY KEY  (id),
     105                KEY key_1 (column_1),
     106                KEY compoud_key (id,column_1)
     107            )
     108            "
     109        );
     110
     111        $this->assertEquals( array(), $updates );
     112    }
     113
     114    /**
     115     * Test the column type is updated.
     116     */
     117    public function test_column_type_change() {
     118
     119        global $wpdb;
     120
     121        // id: bigint(20) => int(11)
     122        $updates = dbDelta(
     123            "
     124            CREATE TABLE {$wpdb->prefix}dbdelta_test (
     125                id int(11) NOT NULL AUTO_INCREMENT,
     126                column_1 varchar(255) NOT NULL,
     127                PRIMARY KEY  (id),
     128                KEY key_1 (column_1),
     129                KEY compoud_key (id,column_1)
     130            )
     131            "
     132        );
     133
     134        $this->assertEquals(
     135            array(
     136                "{$wpdb->prefix}dbdelta_test.id"
     137                    => "Changed type of {$wpdb->prefix}dbdelta_test.id from bigint(20) to int(11)"
     138            )
     139            , $updates
     140        );
     141    }
     142
     143    /**
     144     * Test new column added.
     145     */
     146    public function test_column_added() {
     147
     148        global $wpdb;
     149
     150        $updates = dbDelta(
     151            "
     152            CREATE TABLE {$wpdb->prefix}dbdelta_test (
     153                id bigint(20) NOT NULL AUTO_INCREMENT,
     154                column_1 varchar(255) NOT NULL,
     155                extra_col longtext,
     156                PRIMARY KEY  (id),
     157                KEY key_1 (column_1),
     158                KEY compoud_key (id,column_1)
     159            )
     160            "
     161        );
     162
     163        $this->assertEquals(
     164            array(
     165                "{$wpdb->prefix}dbdelta_test.extra_col"
     166                    => "Added column {$wpdb->prefix}dbdelta_test.extra_col"
     167            )
     168            , $updates
     169        );
     170
     171        $this->assertTableHasColumn( 'column_1', $wpdb->prefix . 'dbdelta_test' );
     172    }
     173
     174    /**
     175     * Test that it does nothing when a column is removed.
     176     *
     177     * @ticket 26801
     178     */
     179    public function test_columns_arent_removed() {
     180
     181        global $wpdb;
     182
     183        // No column column_1
     184        $updates = dbDelta(
     185            "
     186            CREATE TABLE {$wpdb->prefix}dbdelta_test (
     187                id bigint(20) NOT NULL AUTO_INCREMENT,
     188                PRIMARY KEY  (id),
     189                KEY key_1 (column_1),
     190                KEY compoud_key (id,column_1)
     191            )
     192            "
     193        );
     194
     195        $this->assertEquals( array(), $updates );
     196
     197        $this->assertTableHasColumn( 'column_1', $wpdb->prefix . 'dbdelta_test' );
     198    }
     199
     200    /**
     201     * Test that nothing happens with $execute is false.
     202     */
     203    public function test_no_execution() {
     204
     205        global $wpdb;
     206
     207        // Added column extra_col
     208        $updates = dbDelta(
     209            "
     210            CREATE TABLE {$wpdb->prefix}dbdelta_test (
     211                id bigint(20) NOT NULL AUTO_INCREMENT,
     212                column_1 varchar(255) NOT NULL,
     213                extra_col longtext,
     214                PRIMARY KEY  (id),
     215                KEY key_1 (column_1),
     216                KEY compoud_key (id,column_1)
     217            )
     218            "
     219            , false // Don't execute.
     220        );
     221
     222        $this->assertEquals(
     223            array(
     224                "{$wpdb->prefix}dbdelta_test.extra_col"
     225                    => "Added column {$wpdb->prefix}dbdelta_test.extra_col"
     226            )
     227            , $updates
     228        );
     229
     230        $this->assertTableHasNotColumn( 'extra_col', $wpdb->prefix . 'dbdelta_test' );
     231    }
     232
     233    //
     234    // Assertions.
     235    //
     236
     237    /**
     238     * Assert that a table has a column.
     239     *
     240     * @param string $column The field name.
     241     * @param string $table  The database table name.
     242     */
     243    protected function assertTableHasColumn( $column, $table ) {
     244
     245        global $wpdb;
     246
     247        $table_fields = $wpdb->get_results( "DESCRIBE {$table}" );
     248
     249        $this->assertCount( 1, wp_list_filter( $table_fields, array( 'Field' => $column ) ) );
     250    }
     251
     252    /**
     253     * Assert that a table doesn't have a column.
     254     *
     255     * @param string $column The field name.
     256     * @param string $table  The database table name.
     257     */
     258    protected function assertTableHasNotColumn( $column, $table ) {
     259
     260        global $wpdb;
     261
     262        $table_fields = $wpdb->get_results( "DESCRIBE {$table}" );
     263
     264        $this->assertCount( 0, wp_list_filter( $table_fields, array( 'Field' => $column ) ) );
    21265    }
    22266
     
    31275        }
    32276
    33         include_once( ABSPATH . 'wp-admin/includes/upgrade.php');
    34277        $table_name = 'test_truncated_index';
    35278
Note: See TracChangeset for help on using the changeset viewer.