Passed
Branch master (366c16)
by William
03:30
created

TableTest::testGetFields()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 4
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpMyAdmin\SqlParser\Tests\Utils;
6
7
use PhpMyAdmin\SqlParser\Parser;
8
use PhpMyAdmin\SqlParser\Tests\TestCase;
9
use PhpMyAdmin\SqlParser\Utils\Table;
10
11
class TableTest extends TestCase
12
{
13
    /**
14
     * @param mixed $query
15
     *
16
     * @dataProvider getForeignKeysProvider
17
     */
18
    public function testGetForeignKeys($query, array $expected)
19
    {
20
        $parser = new Parser($query);
21
        $this->assertEquals($expected, Table::getForeignKeys($parser->statements[0]));
22
    }
23
24
    public function getForeignKeysProvider()
25
    {
26
        return [
27
            [
28
                'CREATE USER test',
29
                [],
30
            ],
31
            [
32
                'CREATE TABLE `payment` (
33
                  `payment_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
34
                  `customer_id` smallint(5) unsigned NOT NULL,
35
                  `staff_id` tinyint(3) unsigned NOT NULL,
36
                  `rental_id` int(11) DEFAULT NULL,
37
                  `amount` decimal(5,2) NOT NULL,
38
                  `payment_date` datetime NOT NULL,
39
                  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
40
                  PRIMARY KEY (`payment_id`),
41
                  KEY `idx_fk_staff_id` (`staff_id`),
42
                  KEY `idx_fk_customer_id` (`customer_id`),
43
                  KEY `fk_payment_rental` (`rental_id`),
44
                  CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`)
45
                      REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE,
46
                  CONSTRAINT `fk_payment_rental` FOREIGN KEY (`rental_id`)
47
                      REFERENCES `rental` (`rental_id`) ON DELETE SET NULL ON UPDATE CASCADE,
48
                  CONSTRAINT `fk_payment_staff` FOREIGN KEY (`staff_id`)
49
                      REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE
50
                ) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8',
51
                [
52
                    [
53
                        'constraint' => 'fk_payment_customer',
54
                        'index_list' => ['customer_id'],
55
                        'ref_db_name' => null,
56
                        'ref_table_name' => 'customer',
57
                        'ref_index_list' => ['customer_id'],
58
                        'on_update' => 'CASCADE',
59
                    ],
60
                    [
61
                        'constraint' => 'fk_payment_rental',
62
                        'index_list' => ['rental_id'],
63
                        'ref_db_name' => null,
64
                        'ref_table_name' => 'rental',
65
                        'ref_index_list' => ['rental_id'],
66
                        'on_delete' => 'SET_NULL',
67
                        'on_update' => 'CASCADE',
68
                    ],
69
                    [
70
                        'constraint' => 'fk_payment_staff',
71
                        'index_list' => ['staff_id'],
72
                        'ref_db_name' => null,
73
                        'ref_table_name' => 'staff',
74
                        'ref_index_list' => ['staff_id'],
75
                        'on_update' => 'CASCADE',
76
                    ],
77
                ],
78
            ],
79
            [
80
                'CREATE TABLE `actor` (
81
                  `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
82
                  `first_name` varchar(45) NOT NULL,
83
                  `last_name` varchar(45) NOT NULL,
84
                  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
85
                  PRIMARY KEY (`actor_id`),
86
                  KEY `idx_actor_last_name` (`last_name`)
87
                ) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8',
88
                [],
89
            ],
90
            [
91
                'CREATE TABLE `address` (
92
                  `address_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
93
                  `address` varchar(50) NOT NULL,
94
                  `address2` varchar(50) DEFAULT NULL,
95
                  `district` varchar(20) NOT NULL,
96
                  `city_id` smallint(5) unsigned NOT NULL,
97
                  `postal_code` varchar(10) DEFAULT NULL,
98
                  `phone` varchar(20) NOT NULL,
99
                  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
100
                  PRIMARY KEY (`address_id`),
101
                  KEY `idx_fk_city_id` (`city_id`),
102
                  CONSTRAINT `fk_address_city` FOREIGN KEY (`city_id`) REFERENCES `city` (`city_id`) ON UPDATE CASCADE
103
                ) ENGINE=InnoDB AUTO_INCREMENT=606 DEFAULT CHARSET=utf8',
104
                [
105
                    [
106
                        'constraint' => 'fk_address_city',
107
                        'index_list' => ['city_id'],
108
                        'ref_db_name' => null,
109
                        'ref_table_name' => 'city',
110
                        'ref_index_list' => ['city_id'],
111
                        'on_update' => 'CASCADE',
112
                    ],
113
                ],
114
            ],
115
        ];
116
    }
117
118
    /**
119
     * @param mixed $query
120
     *
121
     * @dataProvider getFieldsProvider
122
     */
123
    public function testGetFields($query, array $expected)
124
    {
125
        $parser = new Parser($query);
126
        $this->assertEquals($expected, Table::getFields($parser->statements[0]));
127
    }
128
129
    public function getFieldsProvider()
130
    {
131
        return [
132
            [
133
                'CREATE USER test',
134
                [],
135
            ],
136
            [
137
                'CREATE TABLE `address` (
138
                  `address_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
139
                  `address` varchar(50) NOT NULL,
140
                  `address2` varchar(50) DEFAULT NULL,
141
                  `district` varchar(20) NOT NULL,
142
                  `city_id` smallint(5) unsigned NOT NULL,
143
                  `postal_code` varchar(10) DEFAULT NULL,
144
                  `phone` varchar(20) NOT NULL,
145
                  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
146
                  PRIMARY KEY (`address_id`),
147
                  KEY `idx_fk_city_id` (`city_id`),
148
                  CONSTRAINT `fk_address_city` FOREIGN KEY (`city_id`) REFERENCES `city` (`city_id`) ON UPDATE CASCADE
149
                ) ENGINE=InnoDB AUTO_INCREMENT=606 DEFAULT CHARSET=utf8',
150
                [
151
                    'address_id' => [
152
                        'type' => 'SMALLINT',
153
                        'timestamp_not_null' => false,
154
                    ],
155
                    'address' => [
156
                        'type' => 'VARCHAR',
157
                        'timestamp_not_null' => false,
158
                    ],
159
                    'address2' => [
160
                        'type' => 'VARCHAR',
161
                        'timestamp_not_null' => false,
162
                        'default_value' => 'NULL',
163
                    ],
164
                    'district' => [
165
                        'type' => 'VARCHAR',
166
                        'timestamp_not_null' => false,
167
                    ],
168
                    'city_id' => [
169
                        'type' => 'SMALLINT',
170
                        'timestamp_not_null' => false,
171
                    ],
172
                    'postal_code' => [
173
                        'type' => 'VARCHAR',
174
                        'timestamp_not_null' => false,
175
                        'default_value' => 'NULL',
176
                    ],
177
                    'phone' => [
178
                        'type' => 'VARCHAR',
179
                        'timestamp_not_null' => false,
180
                    ],
181
                    'last_update' => [
182
                        'type' => 'TIMESTAMP',
183
                        'timestamp_not_null' => true,
184
                        'default_value' => 'CURRENT_TIMESTAMP',
185
                        'default_current_timestamp' => true,
186
                        'on_update_current_timestamp' => true,
187
                    ],
188
                ],
189
            ],
190
            [
191
                'CREATE TABLE table1 (
192
                    a INT NOT NULL,
193
                    b VARCHAR(32),
194
                    c INT AS (a mod 10) VIRTUAL,
195
                    d VARCHAR(5) AS (left(b,5)) PERSISTENT
196
                )',
197
                [
198
                    'a' => [
199
                        'type' => 'INT',
200
                        'timestamp_not_null' => false,
201
                    ],
202
                    'b' => [
203
                        'type' => 'VARCHAR',
204
                        'timestamp_not_null' => false,
205
                    ],
206
                    'c' => [
207
                        'type' => 'INT',
208
                        'timestamp_not_null' => false,
209
                        'generated' => true,
210
                        'expr' => '(a mod 10)',
211
                    ],
212
                    'd' => [
213
                        'type' => 'VARCHAR',
214
                        'timestamp_not_null' => false,
215
                        'generated' => true,
216
                        'expr' => '(left(b,5))',
217
                    ],
218
                ],
219
            ],
220
        ];
221
    }
222
}
223