Add unit tests for DBTableParser

This commit is contained in:
Kijin Sung 2020-07-06 13:43:56 +09:00
parent d2f24dcd12
commit 8bb01edf86
2 changed files with 67 additions and 0 deletions

View file

@ -0,0 +1,14 @@
<table name="example">
<column name="example_srl" type="bignumber" size="11" notnull="notnull" primary_key="primary_key" />
<column name="module_srl" type="number" notnull="notnull" index="idx_module_srl" />
<column name="document_srl" type="number" notnull="notnull" index="idx_document_srl" />
<column name="comment_srl" type="number" notnull="notnull" index="idx_comment_srl" />
<column name="description" type="bigtext" />
<column name="status" type="varchar" size="20" default="PUBLIC" />
<column name="list_order" type="number" notnull="notnull" />
<index name="idx_module_document_srl" columns="module_srl,document_srl" />
<index name="idx_status" columns="status(6)" />
<index name="unique_list_order" columns="list_order" unique="unique" />
<constraint type="foreign key" column="module_srl" references="module.module_srl" ondelete="CASCADE" />
<constraint type="check" condition="list_order &lt; 0" />
</table>

View file

@ -0,0 +1,53 @@
<?php
class DBTableParserTest extends \Codeception\TestCase\Test
{
public function testLoadXML()
{
$table = Rhymix\Framework\Parsers\DBTableParser::loadXML(\RX_BASEDIR . 'tests/_data/dbtable/example.xml');
$this->assertTrue($table instanceof Rhymix\Framework\Parsers\DBTable\Table);
$this->assertEquals('example', $table->name);
$this->assertTrue($table->columns['example_srl'] instanceof Rhymix\Framework\Parsers\DBTable\Column);
$this->assertEquals('bigint', $table->columns['example_srl']->type);
$this->assertEquals('bignumber', $table->columns['example_srl']->xetype);
$this->assertNull($table->columns['example_srl']->size);
$this->assertTrue($table->columns['example_srl']->not_null);
$this->assertTrue($table->columns['example_srl']->is_primary_key);
$this->assertEquals('bigint', $table->columns['module_srl']->type);
$this->assertEquals('number', $table->columns['module_srl']->xetype);
$this->assertTrue($table->columns['module_srl']->is_indexed);
$this->assertTrue($table->columns['list_order']->is_unique);
$this->assertEquals(6, count($table->indexes));
$this->assertEquals(['module_srl' => 0, 'document_srl' => 0], $table->indexes['idx_module_document_srl']->columns);
$this->assertEquals(['status' => 6], $table->indexes['idx_status']->columns);
$this->assertTrue($table->indexes['unique_list_order']->is_unique);
$this->assertEquals(2, count($table->constraints));
$this->assertEquals('FOREIGN KEY', $table->constraints[0]->type);
$this->assertEquals('module_srl', $table->constraints[0]->column);
$this->assertEquals('module.module_srl', $table->constraints[0]->references);
$this->assertEquals('CASCADE', $table->constraints[0]->on_delete);
$this->assertEquals('RESTRICT', $table->constraints[0]->on_update);
$this->assertEquals('CHECK', $table->constraints[1]->type);
$this->assertEquals('list_order < 0', $table->constraints[1]->condition);
}
public function testGetCreateQuery()
{
$table = Rhymix\Framework\Parsers\DBTableParser::loadXML(\RX_BASEDIR . 'tests/_data/dbtable/example.xml');
$sql = $table->getCreateQuery('rx_');
$this->assertContains('CREATE TABLE `rx_example` (', $sql);
$this->assertContains('`comment_srl` BIGINT NOT NULL,', $sql);
$this->assertContains('`status` VARCHAR(20) DEFAULT \'PUBLIC\',', $sql);
$this->assertContains('PRIMARY KEY (`example_srl`),', $sql);
$this->assertContains('INDEX `idx_document_srl` (`document_srl`),', $sql);
$this->assertContains('INDEX `idx_module_document_srl` (`module_srl`, `document_srl`),', $sql);
$this->assertContains('INDEX `idx_status` (`status`(6)),', $sql);
$this->assertContains('UNIQUE `unique_list_order` (`list_order`),', $sql);
$this->assertContains('FOREIGN KEY (`module_srl`) REFERENCES `rx_module` (`module_srl`) ON DELETE CASCADE ON UPDATE RESTRICT', $sql);
$this->assertContains('CHECK (list_order < 0)', $sql);
$this->assertContains('CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci', $sql);
$this->assertContains('ENGINE = InnoDB', $sql);
}
}