WordPress.org

Make WordPress Core

Ticket #40357: test.php

File test.php, 4.7 KB (added by stuporglue, 3 years ago)

A file that tests the changes in this ticket.

Line 
1<?php
2
3/**
4 These changes fix the following issues with dbDelta:
5
6 -  Can't add an AUTO_INCREMENT column to a table that already exists
7 -  Can't change which column is the primary key
8 -  Can't change key definitions
9 */
10
11require_once( __DIR__ . '/wp-load.php' );
12require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
13global $wpdb;
14
15$tables = array();
16
17
18$tables[ "col1(PK), col2" ] = "CREATE TABLE dbdelta_tests (
19        col1 varchar(100),
20        col2 varchar(100),
21        PRIMARY KEY  (col1)
22)";
23
24$tables[ "col1, col2(PK)" ] = "CREATE TABLE dbdelta_tests (
25        col1 varchar(100),
26        col2 varchar(100),
27        PRIMARY KEY  (col2)
28)";
29
30$tables[ "col1, col2, col3(AI/PK)" ] = "CREATE TABLE dbdelta_tests (
31        col1 varchar(100),
32        col2 varchar(100),
33        col3 int(255) NOT NULL AUTO_INCREMENT,
34        PRIMARY KEY  (col3)
35)";
36
37$tables[ "col1(PK), col2, col3(AI)" ] = "CREATE TABLE dbdelta_tests (
38        col1 varchar(100),
39        col2 varchar(100),
40        col3 int(100) NOT NULL AUTO_INCREMENT,
41        UNIQUE KEY thename (col3),
42        PRIMARY KEY  (col1)
43)";
44
45$tables[ "col1(PK(50)), col2" ] = "CREATE TABLE dbdelta_tests (
46        col1 varchar(100),
47        col2 varchar(100),
48        PRIMARY KEY  (col1(50))
49)";
50
51$tables[ "col1(PK(75), col2" ] = "CREATE TABLE dbdelta_tests (
52        col1 varchar(100),
53        col2 varchar(100),
54        PRIMARY KEY  (col1(75))
55)";
56
57$tables[ "col1, col2, col3(PK)" ] = "CREATE TABLE dbdelta_tests (
58        col1 varchar(100),
59        col2 varchar(100),
60        col3 int(255) NOT NULL,
61        PRIMARY KEY  (col3)
62)";
63
64$tables[ "col1(PK), col2(FULLTEXT)" ] = "CREATE TABLE dbdelta_tests (
65        col1 varchar(100),
66        col2 varchar(100),
67        PRIMARY KEY  (col1),
68        FULLTEXT KEY myidx (col2)
69)";
70
71$tables[ "col1(PK), col2(BTREE)" ] = "CREATE TABLE dbdelta_tests (
72        col1 varchar(100),
73        col2 varchar(100),
74        PRIMARY KEY  (col1),
75        KEY myidx (col2)
76)";
77
78$tables[ "col1(PK), col2(UNIQUE)" ] = "CREATE TABLE dbdelta_tests (
79        col1 varchar(100),
80        col2 varchar(100),
81        PRIMARY KEY  (col1),
82        UNIQUE KEY myidx (col2)
83)";
84
85$tables[ "col1(PK), col2, Index(col2,col1)" ] = "CREATE TABLE dbdelta_tests (
86        col1 varchar(100),
87        col2 varchar(100),
88        PRIMARY KEY  (col1),
89        KEY myidx (col2,col1)
90)";
91
92$tables[ "col1(PK), col2, Index(col1,col2)" ] = "CREATE TABLE dbdelta_tests (
93        col1 varchar(100),
94        col2 varchar(100),
95        PRIMARY KEY  (col1),
96        INDEX myidx (col1,col2)
97)";
98
99$tables[ "col1(PK), col2, PK(col1,col2)" ] = "CREATE TABLE dbdelta_tests (
100        col1 varchar(100),
101        col2 varchar(100),
102        PRIMARY KEY  (col1,col2)
103)";
104
105
106
107
108/**
109 * Test dbDelta.
110 *
111 * 1) Delete the table
112 * 2) Create the table (and make sure it worked)
113 * 3) dbDelta the table (and make sure nothing happens)
114 * 4) dbDelta the new table def (and make sure something happens)
115 * 4) dbDelta the new table def (and make sure nothing happens)
116 */
117function dbDelta_test( $test_name, $table1, $table2 ) {
118        global $wpdb;
119        $wpdb->query("DROP TABLE IF EXISTS dbdelta_tests");
120
121        $res1 = dbDelta( $table1 );
122
123        if ( empty( $res1 ) ) {
124                return -1; // "Couldn't create table 1\n";
125        }
126
127        $res2 = dbDelta( $table1 );
128
129        if ( !empty( $res2 ) ) {
130                error_log(print_r($res2,true));
131                return -2; // "Table 1 changes were incomplete\n";
132        }
133
134        $res3 = dbDelta( $table2 );
135
136        if ( empty( $res3 ) && $table1 !== $table2 ) {
137                return -3; // "Couldn't apply table 2 changes\n";
138        }
139
140        $res4 = dbDelta( $table2 );
141
142        if ( !empty( $res4 ) ) {
143                error_log(print_r($res4,true));
144                return -4; // "Table 2 changes were incomplete\n";
145        }
146
147        return 0; // "OK!\n";
148}
149
150
151/**
152 * Command line handling / run tests.
153 */
154
155$testId = 0;
156$keys = array_keys( $tables );
157$colwidth = 25;
158
159/**
160 * These are test numbers where the second table is a subset of the first, so there are no changes to be made.
161 *
162 * Unfortunately, adding additional tests breaks these numbers.
163 */
164$non_zero_expected_results = array(
165        4 => -3,
166        5 => -3,
167        39 => -3,
168        43 => -3,
169        44 => -3,
170        52 => -3,
171        57 => -3,
172        65 => -3,
173        69 => -3,
174        91 => -3,
175        95 => -3,
176        96 => -3,
177        104 => -3,
178        108 => -3,
179        109 => -3,
180        117 => -3,
181        121 => -3,
182        122 => -3,
183        130 => -3,
184        134 => -3,
185        135 => -3,
186        143 => -3,
187        147 => -3,
188        148 => -3,
189);
190
191$results_map = array(
192        -1 => "Couldn't create table 1",
193        -2 => "Table 1 changes were incomplete",
194        -3 => "Couldn't apply table 2 changes",
195        -4 => "Table 2 changes were incomplete",
196        'OK' => 'OK',
197);
198
199print "Usage: php ./test.php [test number]\n";
200print "Results meanings:\n";
201
202foreach( $results_map as $k => $res ) {
203        print "$k : $res\n";
204}
205
206print "\n";
207
208foreach( $keys as $from) {
209        foreach( $keys as $to) {
210                if ( !isset( $argv[1] ) || $argv[1] == $testId ) {
211
212                        print str_pad( $testId,3,' ', STR_PAD_RIGHT);
213                        print ': ';
214                        print str_pad( "$from => $to", 80, ' ', STR_PAD_RIGHT);
215
216
217                        print ': ';
218                        $res = dbDelta_test( '', $tables[$from], $tables[$to] );
219                        $res = ( $res === 0 || (isset($non_zero_expected_results[ $testId ]) &&  $res === $non_zero_expected_results[ $testId ] ) ) ? 'OK' : $res;
220                        print $res;
221                        print "\n";
222                }
223
224                $testId++;
225        }
226}
227
228print "\n";