diff --git a/tests/Utils/IO/Excel/ExcelDatabaseMapperTest.php b/tests/Utils/IO/Excel/ExcelDatabaseMapperTest.php index a57ae8b24..0626eb1ab 100644 --- a/tests/Utils/IO/Excel/ExcelDatabaseMapperTest.php +++ b/tests/Utils/IO/Excel/ExcelDatabaseMapperTest.php @@ -14,13 +14,505 @@ declare(strict_types=1); namespace phpOMS\tests\Utils\IO\Excel; +use phpOMS\DataStorage\Database\Connection\SQLiteConnection; +use phpOMS\DataStorage\Database\Query\Builder; +use phpOMS\Utils\IO\Excel\ExcelDatabaseMapper; +use tests\Autoloader; +use phpOMS\Utils\StringUtils; + /** * @internal */ class ExcelDatabaseMapperTest extends \PHPUnit\Framework\TestCase { - public function testPlaceholder() : void + protected $sqlite; + + protected function setUp() : void { - self::markTestIncomplete(); + if (!\extension_loaded('pdo_sqlite')) { + $this->markTestSkipped( + 'The SQLite extension is not available.' + ); + + return; + } + + if (\file_exists(__DIR__ . '/spreadsheet.db')) { + \unlink(__DIR__ . '/spreadsheet.db'); + } + + \copy(__DIR__ . '/backup.db', __DIR__ . '/spreadsheet.db'); + + $this->sqlite = new SQLiteConnection(['db' => 'sqlite', 'database' => __DIR__ . '/spreadsheet.db']); + } + + protected function tearDown(): void + { + if (\file_exists(__DIR__ . '/spreadsheet.db')) { + \unlink(__DIR__ . '/spreadsheet.db'); + } + } + + public function testInsertOds() : void + { + Autoloader::addPath(__DIR__ . '/../../../../../Resources/'); + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/insert.ods'); + $mapper->insert(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + } + + public function testInsertXls() : void + { + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/insert.xls'); + $mapper->insert(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + } + + public function testInsertXlsx() : void + { + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/insert.xlsx'); + $mapper->insert(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + } + + public function testUpdateOds() : void + { + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/insert.ods'); + $mapper->insert(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/update.ods'); + $mapper->update(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '9.1', 'bool' => '1', 'varchar' => 'Line 2 updated', 'datetime' => '43831'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '9.123', 'bool' => '0', 'varchar' => 'Line 4 updated', 'datetime' => '43831'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '9.1', 'bool' => '1', 'varchar' => 'Line 2 updated', 'datetime' => '43831'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '9.123', 'bool' => '0', 'varchar' => 'Line 4 updated', 'datetime' => '43831'], + ], + $data + ); + } + + public function testUpdateXls() : void + { + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/insert.xls'); + $mapper->insert(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/update.xls'); + $mapper->update(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '9.1', 'bool' => '1', 'varchar' => 'Line 2 updated', 'datetime' => '43831'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '9.123', 'bool' => '0', 'varchar' => 'Line 4 updated', 'datetime' => '43831'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '9.1', 'bool' => '1', 'varchar' => 'Line 2 updated', 'datetime' => '43831'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '9.123', 'bool' => '0', 'varchar' => 'Line 4 updated', 'datetime' => '43831'], + ], + $data + ); + } + + public function testUpdateXlsx() : void + { + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/insert.xlsx'); + $mapper->insert(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/update.xlsx'); + $mapper->update(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '9.1', 'bool' => '1', 'varchar' => 'Line 2 updated', 'datetime' => '43831'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '9.123', 'bool' => '0', 'varchar' => 'Line 4 updated', 'datetime' => '43831'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '9.1', 'bool' => '1', 'varchar' => 'Line 2 updated', 'datetime' => '43831'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '9.123', 'bool' => '0', 'varchar' => 'Line 4 updated', 'datetime' => '43831'], + ], + $data + ); + } + + public function testSelectOds() : void + { + if (\file_exists(__DIR__ . '/select.ods')) { + \unlink(__DIR__ . '/select.ods'); + } + + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/insert.ods'); + $mapper->insert(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/select.ods'); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('int', 'decimal', 'bool', 'varchar', 'datetime')->from('insert_1'); + + $mapper->select([$builder]); + + self::assertTrue($this->compareSelectInsertSheet(__DIR__ . '/select.ods', __DIR__ . '/insert.ods')); + + if (\file_exists(__DIR__ . '/select.ods')) { + \unlink(__DIR__ . '/select.ods'); + } + } + + public function testSelectXls() : void + { + if (\file_exists(__DIR__ . '/select.xls')) { + \unlink(__DIR__ . '/select.xls'); + } + + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/insert.xls'); + $mapper->insert(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/select.xls'); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('int', 'decimal', 'bool', 'varchar', 'datetime')->from('insert_1'); + + $mapper->select([$builder]); + + self::assertTrue($this->compareSelectInsertSheet(__DIR__ . '/select.xls', __DIR__ . '/insert.xls')); + + if (\file_exists(__DIR__ . '/select.xls')) { + \unlink(__DIR__ . '/select.xls'); + } + } + + public function testSelectXlsx() : void + { + if (\file_exists(__DIR__ . '/select.xlsx')) { + \unlink(__DIR__ . '/select.xlsx'); + } + + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/insert.xlsx'); + $mapper->insert(); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_1.*')->from('insert_1')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('insert_2.*')->from('insert_2')->execute()->fetchAll(\PDO::FETCH_ASSOC); + self::assertEquals( + [ + ['id' => '1', 'int' => '2', 'decimal' => '2.0', 'bool' => '1', 'varchar' => 'Line 1', 'datetime' => '43631'], + ['id' => '2', 'int' => '4', 'decimal' => '2.1', 'bool' => '0', 'varchar' => 'Line 2', 'datetime' => '42170'], + ['id' => '3', 'int' => '6', 'decimal' => '2.12', 'bool' => '1', 'varchar' => 'Line 3', 'datetime' => '40426'], + ['id' => '4', 'int' => '8', 'decimal' => '2.123', 'bool' => '0', 'varchar' => 'Line 4', 'datetime' => '40428'], + ], + $data + ); + + $mapper = new ExcelDatabaseMapper($this->sqlite, __DIR__ . '/select.xlsx'); + + $builder = new Builder($this->sqlite, true); + $data = $builder->select('int', 'decimal', 'bool', 'varchar', 'datetime')->from('insert_1'); + + $mapper->select([$builder]); + + self::assertTrue($this->compareSelectInsertSheet(__DIR__ . '/select.xlsx', __DIR__ . '/insert.xlsx')); + + if (\file_exists(__DIR__ . '/select.xlsx')) { + \unlink(__DIR__ . '/select.xlsx'); + } + } + + private function compareSelectInsertSheet(string $pathSelect, string $pathInsert) : bool + { + $reader1 = null; + if (StringUtils::endsWith($pathSelect, '.xlsx')) { + $reader1 = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); + } elseif (StringUtils::endsWith($pathSelect, '.ods')) { + $reader1 = new \PhpOffice\PhpSpreadsheet\Reader\Ods(); + } else { + $reader1 = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); + } + + $reader2 = null; + if (StringUtils::endsWith($pathInsert, '.xlsx')) { + $reader2 = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); + } elseif (StringUtils::endsWith($pathInsert, '.ods')) { + $reader2 = new \PhpOffice\PhpSpreadsheet\Reader\Ods(); + } else { + $reader2 = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); + } + + $reader1->setReadDataOnly(true); + $reader2->setReadDataOnly(true); + + $sheet1 = $reader1->load($pathSelect); + $sheet2 = $reader2->load($pathInsert); + + $tables = $sheet1->getSheetCount(); + for ($i = 0; $i < $tables; ++$i) { + $sheet1->setActiveSheetIndex($i); + $sheet2->setActiveSheetIndex($i); + + $workSheet1 = $sheet1->getSheet($i); + $workSheet2 = $sheet2->getSheet($i); + + $titles = []; + + // get column titles + $column = 1; + while (!empty($value = $workSheet1->getCellByColumnAndRow($column, 1)->getCalculatedValue())) { + $titles[] = $value; + ++$column; + } + + $columns = \count($titles); + + $line = 1; + while (!empty($row = $workSheet1->getCellByColumnAndRow(1, $line)->getCalculatedValue())) { + for ($j = 1; $j <= $columns; ++$j) { + if (($v1 = $workSheet1->getCellByColumnAndRow($j, $line)->getCalculatedValue()) != ($v2 = $workSheet2->getCellByColumnAndRow($j, $line)->getCalculatedValue())) { + return false; + } + } + + ++$line; + } + } + + return true; } } diff --git a/tests/Utils/IO/Excel/backup.db b/tests/Utils/IO/Excel/backup.db new file mode 100644 index 000000000..4625a2677 Binary files /dev/null and b/tests/Utils/IO/Excel/backup.db differ diff --git a/tests/Utils/IO/Excel/insert.ods b/tests/Utils/IO/Excel/insert.ods new file mode 100644 index 000000000..c7edeb5fd Binary files /dev/null and b/tests/Utils/IO/Excel/insert.ods differ diff --git a/tests/Utils/IO/Excel/insert.xls b/tests/Utils/IO/Excel/insert.xls new file mode 100644 index 000000000..873b71534 Binary files /dev/null and b/tests/Utils/IO/Excel/insert.xls differ diff --git a/tests/Utils/IO/Excel/insert.xlsx b/tests/Utils/IO/Excel/insert.xlsx new file mode 100644 index 000000000..03e0087f0 Binary files /dev/null and b/tests/Utils/IO/Excel/insert.xlsx differ diff --git a/tests/Utils/IO/Excel/update.ods b/tests/Utils/IO/Excel/update.ods new file mode 100644 index 000000000..1f9c0b6a0 Binary files /dev/null and b/tests/Utils/IO/Excel/update.ods differ diff --git a/tests/Utils/IO/Excel/update.xls b/tests/Utils/IO/Excel/update.xls new file mode 100644 index 000000000..248409fb2 Binary files /dev/null and b/tests/Utils/IO/Excel/update.xls differ diff --git a/tests/Utils/IO/Excel/update.xlsx b/tests/Utils/IO/Excel/update.xlsx new file mode 100644 index 000000000..7247507b5 Binary files /dev/null and b/tests/Utils/IO/Excel/update.xlsx differ