‪TYPO3CMS  ‪main
BulkInsertTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Doctrine\DBAL\Platforms\AbstractPlatform;
21 use PHPUnit\Framework\Attributes\Test;
22 use PHPUnit\Framework\MockObject\MockObject;
26 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
27 
28 final class ‪BulkInsertTest extends UnitTestCase
29 {
30  protected ‪Connection&MockObject ‪$connection;
31  protected ?AbstractPlatform ‪$platform;
32  protected string ‪$testTable = 'testTable';
33 
37  protected function ‪setUp(): void
38  {
39  parent::setUp();
40 
41  $this->connection = $this->createMock(Connection::class);
42 
43  $this->connection
44  ->method('quoteIdentifier')
45  ->willReturnArgument(0);
46  $this->connection
47  ->method('getDatabasePlatform')
48  ->willReturn(new ‪MockMySQLPlatform());
49  }
50 
51  #[Test]
53  {
54  $this->expectException(\LogicException::class);
55  $this->expectExceptionMessage('You need to add at least one set of values before generating the SQL.');
56 
57  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
58 
59  $query->getSQL();
60  }
61 
62  #[Test]
64  {
65  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
66 
67  $query->addValues([]);
68 
69  self::assertSame("INSERT INTO {$this->testTable} VALUES ()", (string)$query);
70  self::assertSame([], $query->getParameters());
71  self::assertSame([], $query->getParameterTypes());
72  }
73 
74  public function ‪insertWithoutColumnSpecification(): void
75  {
76  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
77 
78  $query->addValues([], [‪Connection::PARAM_BOOL]);
79 
80  self::assertSame("INSERT INTO {$this->testTable} VALUES ()", (string)$query);
81  self::assertSame([], $query->getParameters());
82  self::assertSame([], $query->getParameterTypes());
83  }
84 
85  #[Test]
87  {
88  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
89 
90  $query->addValues(['bar', 'baz', 'named' => 'bloo']);
91 
92  self::assertSame("INSERT INTO {$this->testTable} VALUES (?, ?, ?)", (string)$query);
93  self::assertSame(['bar', 'baz', 'bloo'], $query->getParameters());
94  self::assertSame([null, null, null], $query->getParameterTypes());
95 
96  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
97 
98  $query->addValues(
99  ['bar', 'baz', 'named' => 'bloo'],
101  );
102 
103  self::assertSame("INSERT INTO {$this->testTable} VALUES (?, ?, ?)", (string)$query);
104  self::assertSame(['bar', 'baz', 'bloo'], $query->getParameters());
105  self::assertSame([null, ‪Connection::PARAM_INT, ‪Connection::PARAM_BOOL], $query->getParameterTypes());
106  }
107 
108  #[Test]
110  {
111  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
112 
113  $query->addValues([]);
114  $query->addValues(['bar', 'baz']);
115  $query->addValues(['bar', 'baz', 'bloo']);
116  $query->addValues(['bar', 'baz', 'named' => 'bloo']);
117 
118  self::assertSame("INSERT INTO {$this->testTable} VALUES (), (?, ?), (?, ?, ?), (?, ?, ?)", (string)$query);
119  self::assertSame(['bar', 'baz', 'bar', 'baz', 'bloo', 'bar', 'baz', 'bloo'], $query->getParameters());
120  self::assertSame([null, null, null, null, null, null, null, null], $query->getParameterTypes());
121 
122  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
123 
124  $query->addValues([], [‪Connection::PARAM_INT]);
125  $query->addValues(['bar', 'baz'], [1 => ‪Connection::PARAM_BOOL]);
126  $query->addValues(['bar', 'baz', 'bloo'], [‪Connection::PARAM_INT, null, ‪Connection::PARAM_BOOL]);
127  $query->addValues(
128  ['bar', 'baz', 'named' => 'bloo'],
130  );
131 
132  self::assertSame("INSERT INTO {$this->testTable} VALUES (), (?, ?), (?, ?, ?), (?, ?, ?)", (string)$query);
133  self::assertSame(['bar', 'baz', 'bar', 'baz', 'bloo', 'bar', 'baz', 'bloo'], $query->getParameters());
134  self::assertSame(
135  [
136  null,
139  null,
141  null,
144  ],
145  $query->getParameterTypes()
146  );
147  }
148 
149  #[Test]
151  {
152  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
153 
154  $query->addValues(['bar', 'baz']);
155 
156  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
157  self::assertSame(['bar', 'baz'], $query->getParameters());
158  self::assertSame([‪Connection::PARAM_STR, ‪Connection::PARAM_STR], $query->getParameterTypes());
159 
160  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
161 
162  $query->addValues(['bar', 'baz'], [1 => ‪Connection::PARAM_BOOL]);
163 
164  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
165  self::assertSame(['bar', 'baz'], $query->getParameters());
166  self::assertSame([‪Connection::PARAM_STR, ‪Connection::PARAM_BOOL], $query->getParameterTypes());
167  }
168 
169  #[Test]
171  {
172  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
173 
174  $query->addValues(['baz' => 'baz', 'bar' => 'bar']);
175 
176  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
177  self::assertSame(['bar', 'baz'], $query->getParameters());
178  self::assertSame([‪Connection::PARAM_STR, ‪Connection::PARAM_STR], $query->getParameterTypes());
179 
180  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
181 
182  $query->addValues(['baz' => 'baz', 'bar' => 'bar'], [null, ‪Connection::PARAM_INT]);
183 
184  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
185  self::assertSame(['bar', 'baz'], $query->getParameters());
186  self::assertSame([‪Connection::PARAM_STR, ‪Connection::PARAM_INT], $query->getParameterTypes());
187  }
188 
189  #[Test]
191  {
192  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
193 
194  $query->addValues([1 => 'baz', 'bar' => 'bar']);
195 
196  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
197  self::assertSame(['bar', 'baz'], $query->getParameters());
198  self::assertSame([‪Connection::PARAM_STR, ‪Connection::PARAM_STR], $query->getParameterTypes());
199 
200  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
201 
202  $query->addValues([1 => 'baz', 'bar' => 'bar'], [‪Connection::PARAM_INT, ‪Connection::PARAM_BOOL]);
203 
204  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
205  self::assertSame(['bar', 'baz'], $query->getParameters());
206  self::assertSame([‪Connection::PARAM_INT, ‪Connection::PARAM_BOOL], $query->getParameterTypes());
207  }
208 
209  #[Test]
211  {
212  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
213 
214  $query->addValues(['bar', 'baz']);
215  $query->addValues([1 => 'baz', 'bar' => 'bar']);
216  $query->addValues(['bar', 'baz' => 'baz']);
217  $query->addValues(['bar' => 'bar', 'baz' => 'baz']);
218 
219  self::assertSame(
220  "INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?), (?, ?), (?, ?), (?, ?)",
221  (string)$query
222  );
223  self::assertSame(['bar', 'baz', 'bar', 'baz', 'bar', 'baz', 'bar', 'baz'], $query->getParameters());
225 
226  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
227 
228  $query->addValues(['bar', 'baz'], ['baz' => ‪Connection::PARAM_BOOL, 'bar' => ‪Connection::PARAM_INT]);
229  $query->addValues([1 => 'baz', 'bar' => 'bar'], [1 => ‪Connection::PARAM_BOOL, 'bar' => ‪Connection::PARAM_INT]);
230  $query->addValues(['bar', 'baz' => 'baz'], [null, null]);
231  $query->addValues(
232  ['bar' => 'bar', 'baz' => 'baz'],
234  );
235 
236  self::assertSame(
237  "INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?), (?, ?), (?, ?), (?, ?)",
238  (string)$query
239  );
240  self::assertSame(['bar', 'baz', 'bar', 'baz', 'bar', 'baz', 'bar', 'baz'], $query->getParameters());
241  self::assertSame(
242  [
251  ],
252  $query->getParameterTypes()
253  );
254  }
255 
256  #[Test]
258  {
259  $this->expectException(\InvalidArgumentException::class);
260  $this->expectExceptionMessage('No value specified for column bar (index 0).');
261 
262  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
263  $query->addValues([]);
264  }
265 
266  #[Test]
268  {
269  $this->expectException(\InvalidArgumentException::class);
270  $this->expectExceptionMessage('Multiple values specified for column baz (index 1).');
271 
272  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
273  $query->addValues(['bar', 'baz', 'baz' => 666]);
274  }
275 
276  #[Test]
278  {
279  $this->expectException(\InvalidArgumentException::class);
280  $this->expectExceptionMessage('Multiple types specified for column baz (index 1).');
281 
282  $query = new ‪BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
283  $query->addValues(
284  ['bar', 'baz'],
286  );
287  }
288 }
‪TYPO3\CMS\Core\Database\Connection\PARAM_BOOL
‪const PARAM_BOOL
Definition: Connection.php:67
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\$platform
‪AbstractPlatform $platform
Definition: BulkInsertTest.php:31
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:52
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\insertWithoutColumnAndTypeSpecification
‪insertWithoutColumnAndTypeSpecification()
Definition: BulkInsertTest.php:63
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\singleInsertWithoutColumnSpecification
‪singleInsertWithoutColumnSpecification()
Definition: BulkInsertTest.php:86
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\$testTable
‪string $testTable
Definition: BulkInsertTest.php:32
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest
Definition: BulkInsertTest.php:29
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\insertWithColumnSpecificationAndMultipleTypesForColumnThrowsException
‪insertWithColumnSpecificationAndMultipleTypesForColumnThrowsException()
Definition: BulkInsertTest.php:277
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\multiInsertWithoutColumnSpecification
‪multiInsertWithoutColumnSpecification()
Definition: BulkInsertTest.php:109
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\singleInsertWithColumnSpecificationAndMixedTypeValues
‪singleInsertWithColumnSpecificationAndMixedTypeValues()
Definition: BulkInsertTest.php:190
‪TYPO3\CMS\Core\Database\Connection\PARAM_STR
‪const PARAM_STR
Definition: Connection.php:57
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\singleInsertWithColumnSpecificationAndNamedTypeValues
‪singleInsertWithColumnSpecificationAndNamedTypeValues()
Definition: BulkInsertTest.php:170
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\$connection
‪Connection &MockObject $connection
Definition: BulkInsertTest.php:30
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\setUp
‪setUp()
Definition: BulkInsertTest.php:37
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\singleInsertWithColumnSpecificationAndPositionalTypeValues
‪singleInsertWithColumnSpecificationAndPositionalTypeValues()
Definition: BulkInsertTest.php:150
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\multiInsertWithColumnSpecification
‪multiInsertWithColumnSpecification()
Definition: BulkInsertTest.php:210
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery
Definition: BulkInsertQuery.php:36
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\insertWithoutColumnSpecification
‪insertWithoutColumnSpecification()
Definition: BulkInsertTest.php:74
‪TYPO3\CMS\Core\Tests\Unit\Database\Mocks\MockPlatform\MockMySQLPlatform
Definition: MockMySQLPlatform.php:24
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\emptyInsertWithColumnSpecificationThrowsException
‪emptyInsertWithColumnSpecificationThrowsException()
Definition: BulkInsertTest.php:257
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\getSQLWithoutSpecifiedValuesThrowsException
‪getSQLWithoutSpecifiedValuesThrowsException()
Definition: BulkInsertTest.php:52
‪TYPO3\CMS\Core\Tests\Unit\Database\Query
Definition: BulkInsertTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\insertWithColumnSpecificationAndMultipleValuesForColumnThrowsException
‪insertWithColumnSpecificationAndMultipleValuesForColumnThrowsException()
Definition: BulkInsertTest.php:267