‪TYPO3CMS  11.5
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;
24 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
25 
26 class ‪BulkInsertTest extends UnitTestCase
27 {
31  protected ‪$connection;
32 
33  protected ?AbstractPlatform ‪$platform;
34  protected string ‪$testTable = 'testTable';
35 
39  protected function ‪setUp(): void
40  {
41  parent::setUp();
42 
43  $this->connection = $this->createMock(Connection::class);
44 
45  $this->connection
46  ->method('quoteIdentifier')
47  ->willReturnArgument(0);
48  $this->connection
49  ->method('getDatabasePlatform')
50  ->willReturn(new ‪MockPlatform());
51  }
52 
57  {
58  $this->expectException(\LogicException::class);
59  $this->expectExceptionMessage('You need to add at least one set of values before generating the SQL.');
60 
61  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
62 
63  $query->getSQL();
64  }
65 
69  public function ‪insertWithoutColumnAndTypeSpecification(): void
70  {
71  $query = new BulkInsertQuery($this->connection, $this->testTable);
72 
73  $query->addValues([]);
74 
75  self::assertSame("INSERT INTO {$this->testTable} VALUES ()", (string)$query);
76  self::assertSame([], $query->getParameters());
77  self::assertSame([], $query->getParameterTypes());
78  }
79 
80  public function ‪insertWithoutColumnSpecification(): void
81  {
82  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
83 
84  $query->addValues([], [‪Connection::PARAM_BOOL]);
85 
86  self::assertSame("INSERT INTO {$this->testTable} VALUES ()", (string)$query);
87  self::assertSame([], $query->getParameters());
88  self::assertSame([], $query->getParameterTypes());
89  }
90 
94  public function ‪singleInsertWithoutColumnSpecification(): void
95  {
96  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
97 
98  $query->addValues(['bar', 'baz', 'named' => 'bloo']);
99 
100  self::assertSame("INSERT INTO {$this->testTable} VALUES (?, ?, ?)", (string)$query);
101  self::assertSame(['bar', 'baz', 'bloo'], $query->getParameters());
102  self::assertSame([null, null, null], $query->getParameterTypes());
103 
104  $query = new ‪BulkInsertQuery($this->connection, $this->testTable);
105 
106  $query->addValues(
107  ['bar', 'baz', 'named' => 'bloo'],
109  );
110 
111  self::assertSame("INSERT INTO {$this->testTable} VALUES (?, ?, ?)", (string)$query);
112  self::assertSame(['bar', 'baz', 'bloo'], $query->getParameters());
113  self::assertSame([null, ‪Connection::PARAM_INT, ‪Connection::PARAM_BOOL], $query->getParameterTypes());
114  }
115 
119  public function ‪multiInsertWithoutColumnSpecification(): void
120  {
121  $query = new BulkInsertQuery($this->connection, $this->testTable);
122 
123  $query->addValues([]);
124  $query->addValues(['bar', 'baz']);
125  $query->addValues(['bar', 'baz', 'bloo']);
126  $query->addValues(['bar', 'baz', 'named' => 'bloo']);
127 
128  self::assertSame("INSERT INTO {$this->testTable} VALUES (), (?, ?), (?, ?, ?), (?, ?, ?)", (string)$query);
129  self::assertSame(['bar', 'baz', 'bar', 'baz', 'bloo', 'bar', 'baz', 'bloo'], $query->getParameters());
130  self::assertSame([null, null, null, null, null, null, null, null], $query->getParameterTypes());
131 
132  $query = new BulkInsertQuery($this->connection, $this->testTable);
133 
134  $query->addValues([], [‪Connection::PARAM_INT]);
135  $query->addValues(['bar', 'baz'], [1 => ‪Connection::PARAM_BOOL]);
136  $query->addValues(['bar', 'baz', 'bloo'], [‪Connection::PARAM_INT, null, ‪Connection::PARAM_BOOL]);
137  $query->addValues(
138  ['bar', 'baz', 'named' => 'bloo'],
140  );
141 
142  self::assertSame("INSERT INTO {$this->testTable} VALUES (), (?, ?), (?, ?, ?), (?, ?, ?)", (string)$query);
143  self::assertSame(['bar', 'baz', 'bar', 'baz', 'bloo', 'bar', 'baz', 'bloo'], $query->getParameters());
144  self::assertSame(
145  [
146  null,
149  null,
151  null,
154  ],
155  $query->getParameterTypes()
156  );
157  }
158 
163  {
164  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
165 
166  $query->addValues(['bar', 'baz']);
167 
168  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
169  self::assertSame(['bar', 'baz'], $query->getParameters());
170  self::assertSame([null, null], $query->getParameterTypes());
171 
172  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
173 
174  $query->addValues(['bar', 'baz'], [1 => ‪Connection::PARAM_BOOL]);
175 
176  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
177  self::assertSame(['bar', 'baz'], $query->getParameters());
178  self::assertSame([null, ‪Connection::PARAM_BOOL], $query->getParameterTypes());
179  }
180 
185  {
186  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
187 
188  $query->addValues(['baz' => 'baz', 'bar' => 'bar']);
189 
190  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
191  self::assertSame(['bar', 'baz'], $query->getParameters());
192  self::assertSame([null, null], $query->getParameterTypes());
193 
194  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
195 
196  $query->addValues(['baz' => 'baz', 'bar' => 'bar'], [null, ‪Connection::PARAM_INT]);
197 
198  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
199  self::assertSame(['bar', 'baz'], $query->getParameters());
200  self::assertSame([null, ‪Connection::PARAM_INT], $query->getParameterTypes());
201  }
202 
207  {
208  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
209 
210  $query->addValues([1 => 'baz', 'bar' => 'bar']);
211 
212  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
213  self::assertSame(['bar', 'baz'], $query->getParameters());
214  self::assertSame([null, null], $query->getParameterTypes());
215 
216  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
217 
218  $query->addValues([1 => 'baz', 'bar' => 'bar'], [‪Connection::PARAM_INT, ‪Connection::PARAM_BOOL]);
219 
220  self::assertSame("INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?)", (string)$query);
221  self::assertSame(['bar', 'baz'], $query->getParameters());
222  self::assertSame([‪Connection::PARAM_INT, ‪Connection::PARAM_BOOL], $query->getParameterTypes());
223  }
224 
228  public function ‪multiInsertWithColumnSpecification(): void
229  {
230  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
231 
232  $query->addValues(['bar', 'baz']);
233  $query->addValues([1 => 'baz', 'bar' => 'bar']);
234  $query->addValues(['bar', 'baz' => 'baz']);
235  $query->addValues(['bar' => 'bar', 'baz' => 'baz']);
236 
237  self::assertSame(
238  "INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?), (?, ?), (?, ?), (?, ?)",
239  (string)$query
240  );
241  self::assertSame(['bar', 'baz', 'bar', 'baz', 'bar', 'baz', 'bar', 'baz'], $query->getParameters());
242  self::assertSame([null, null, null, null, null, null, null, null], $query->getParameterTypes());
243 
244  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
245 
246  $query->addValues(['bar', 'baz'], ['baz' => ‪Connection::PARAM_BOOL, 'bar' => ‪Connection::PARAM_INT]);
247  $query->addValues([1 => 'baz', 'bar' => 'bar'], [1 => ‪Connection::PARAM_BOOL, 'bar' => ‪Connection::PARAM_INT]);
248  $query->addValues(['bar', 'baz' => 'baz'], [null, null]);
249  $query->addValues(
250  ['bar' => 'bar', 'baz' => 'baz'],
252  );
253 
254  self::assertSame(
255  "INSERT INTO {$this->testTable} (bar, baz) VALUES (?, ?), (?, ?), (?, ?), (?, ?)",
256  (string)$query
257  );
258  self::assertSame(['bar', 'baz', 'bar', 'baz', 'bar', 'baz', 'bar', 'baz'], $query->getParameters());
259  self::assertSame(
260  [
265  null,
266  null,
269  ],
270  $query->getParameterTypes()
271  );
272  }
273 
278  {
279  $this->expectException(\InvalidArgumentException::class);
280  $this->expectExceptionMessage('No value specified for column bar (index 0).');
281 
282  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
283  $query->addValues([]);
284  }
285 
290  {
291  $this->expectException(\InvalidArgumentException::class);
292  $this->expectExceptionMessage('Multiple values specified for column baz (index 1).');
293 
294  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
295  $query->addValues(['bar', 'baz', 'baz' => 666]);
296  }
297 
302  {
303  $this->expectException(\InvalidArgumentException::class);
304  $this->expectExceptionMessage('Multiple types specified for column baz (index 1).');
305 
306  $query = new BulkInsertQuery($this->connection, $this->testTable, ['bar', 'baz']);
307  $query->addValues(
308  ['bar', 'baz'],
310  );
311  }
312 
317  {
318  $this->expectException(\LogicException::class);
319  $this->expectExceptionMessage('You can only insert 10 rows in a single INSERT statement with platform "mock".');
320 
321  $subject = $this->getAccessibleMock(
322  BulkInsertQuery::class,
323  ['getInsertMaxRows'],
324  [$this->connection, $this->testTable],
325  ''
326  );
327 
328  $subject
329  ->method('getInsertMaxRows')
330  ->willReturn(10);
331 
332  for ($i = 0; $i <= 10; $i++) {
333  $subject->addValues([]);
334  }
335 
336  $subject->execute();
337  }
338 }
‪TYPO3\CMS\Core\Database\Connection\PARAM_BOOL
‪const PARAM_BOOL
Definition: Connection.php:69
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\$platform
‪AbstractPlatform $platform
Definition: BulkInsertTest.php:32
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:49
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\insertWithoutColumnAndTypeSpecification
‪insertWithoutColumnAndTypeSpecification()
Definition: BulkInsertTest.php:68
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\singleInsertWithoutColumnSpecification
‪singleInsertWithoutColumnSpecification()
Definition: BulkInsertTest.php:93
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\$connection
‪Connection $connection
Definition: BulkInsertTest.php:30
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\executeWithMaxInsertRowsPerStatementExceededThrowsException
‪executeWithMaxInsertRowsPerStatementExceededThrowsException()
Definition: BulkInsertTest.php:315
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\$testTable
‪string $testTable
Definition: BulkInsertTest.php:33
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest
Definition: BulkInsertTest.php:27
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\insertWithColumnSpecificationAndMultipleTypesForColumnThrowsException
‪insertWithColumnSpecificationAndMultipleTypesForColumnThrowsException()
Definition: BulkInsertTest.php:300
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\multiInsertWithoutColumnSpecification
‪multiInsertWithoutColumnSpecification()
Definition: BulkInsertTest.php:118
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\singleInsertWithColumnSpecificationAndMixedTypeValues
‪singleInsertWithColumnSpecificationAndMixedTypeValues()
Definition: BulkInsertTest.php:205
‪TYPO3\CMS\Core\Database\Connection\PARAM_STR
‪const PARAM_STR
Definition: Connection.php:54
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\singleInsertWithColumnSpecificationAndNamedTypeValues
‪singleInsertWithColumnSpecificationAndNamedTypeValues()
Definition: BulkInsertTest.php:183
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\setUp
‪setUp()
Definition: BulkInsertTest.php:38
‪TYPO3\CMS\Core\Tests\Unit\Database\Mocks\MockPlatform
Definition: MockPlatform.php:24
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\singleInsertWithColumnSpecificationAndPositionalTypeValues
‪singleInsertWithColumnSpecificationAndPositionalTypeValues()
Definition: BulkInsertTest.php:161
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\multiInsertWithColumnSpecification
‪multiInsertWithColumnSpecification()
Definition: BulkInsertTest.php:227
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:38
‪TYPO3\CMS\Core\Database\Query\BulkInsertQuery
Definition: BulkInsertQuery.php:35
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\insertWithoutColumnSpecification
‪insertWithoutColumnSpecification()
Definition: BulkInsertTest.php:79
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\emptyInsertWithColumnSpecificationThrowsException
‪emptyInsertWithColumnSpecificationThrowsException()
Definition: BulkInsertTest.php:276
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\getSQLWithoutSpecifiedValuesThrowsException
‪getSQLWithoutSpecifiedValuesThrowsException()
Definition: BulkInsertTest.php:55
‪TYPO3\CMS\Core\Tests\Unit\Database\Query
Definition: BulkInsertTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Database\Query\BulkInsertTest\insertWithColumnSpecificationAndMultipleValuesForColumnThrowsException
‪insertWithColumnSpecificationAndMultipleValuesForColumnThrowsException()
Definition: BulkInsertTest.php:288