getConnection()->schema; $tables = $schema->getTableNames(); $this->assertTrue(in_array('customer', $tables)); $this->assertTrue(in_array('category', $tables)); $this->assertTrue(in_array('item', $tables)); $this->assertTrue(in_array('order', $tables)); $this->assertTrue(in_array('order_item', $tables)); $this->assertTrue(in_array('type', $tables)); $this->assertTrue(in_array('animal', $tables)); $this->assertTrue(in_array('animal_view', $tables)); } public function testGetTableSchemas() { /* @var $schema Schema */ $schema = $this->getConnection()->schema; $tables = $schema->getTableSchemas(); $this->assertEquals(count($schema->getTableNames()), count($tables)); foreach ($tables as $table) { $this->assertInstanceOf('yii\db\TableSchema', $table); } } public function testGetTableSchemasWithAttrCase() { $db = $this->getConnection(false); $db->slavePdo->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_LOWER); $this->assertEquals(count($db->schema->getTableNames()), count($db->schema->getTableSchemas())); $db->slavePdo->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_UPPER); $this->assertEquals(count($db->schema->getTableNames()), count($db->schema->getTableSchemas())); } public function testGetNonExistingTableSchema() { $this->assertNull($this->getConnection()->schema->getTableSchema('nonexisting_table')); } public function testSchemaCache() { /* @var $schema Schema */ $schema = $this->getConnection()->schema; $schema->db->enableSchemaCache = true; $schema->db->schemaCache = new FileCache(); $noCacheTable = $schema->getTableSchema('type', true); $cachedTable = $schema->getTableSchema('type', false); $this->assertEquals($noCacheTable, $cachedTable); } public function testCompositeFk() { /* @var $schema Schema */ $schema = $this->getConnection()->schema; $table = $schema->getTableSchema('composite_fk'); $this->assertCount(1, $table->foreignKeys); $this->assertTrue(isset($table->foreignKeys[0])); $this->assertEquals('order_item', $table->foreignKeys[0][0]); $this->assertEquals('order_id', $table->foreignKeys[0]['order_id']); $this->assertEquals('item_id', $table->foreignKeys[0]['item_id']); } public function testGetPDOType() { $values = [ [null, \PDO::PARAM_NULL], ['', \PDO::PARAM_STR], ['hello', \PDO::PARAM_STR], [0, \PDO::PARAM_INT], [1, \PDO::PARAM_INT], [1337, \PDO::PARAM_INT], [true, \PDO::PARAM_BOOL], [false, \PDO::PARAM_BOOL], [$fp = fopen(__FILE__, 'rb'), \PDO::PARAM_LOB], ]; /* @var $schema Schema */ $schema = $this->getConnection()->schema; foreach ($values as $value) { $this->assertEquals($value[1], $schema->getPdoType($value[0]), 'type for value ' . print_r($value[0], true) . ' does not match.'); } fclose($fp); } public function getExpectedColumns() { return [ 'int_col' => [ 'type' => 'integer', 'dbType' => 'int(11)', 'phpType' => 'integer', 'allowNull' => false, 'autoIncrement' => false, 'enumValues' => null, 'size' => 11, 'precision' => 11, 'scale' => null, 'defaultValue' => null, ], 'int_col2' => [ 'type' => 'integer', 'dbType' => 'int(11)', 'phpType' => 'integer', 'allowNull' => true, 'autoIncrement' => false, 'enumValues' => null, 'size' => 11, 'precision' => 11, 'scale' => null, 'defaultValue' => 1, ], 'smallint_col' => [ 'type' => 'smallint', 'dbType' => 'smallint(1)', 'phpType' => 'integer', 'allowNull' => true, 'autoIncrement' => false, 'enumValues' => null, 'size' => 1, 'precision' => 1, 'scale' => null, 'defaultValue' => 1, ], 'char_col' => [ 'type' => 'string', 'dbType' => 'char(100)', 'phpType' => 'string', 'allowNull' => false, 'autoIncrement' => false, 'enumValues' => null, 'size' => 100, 'precision' => 100, 'scale' => null, 'defaultValue' => null, ], 'char_col2' => [ 'type' => 'string', 'dbType' => 'varchar(100)', 'phpType' => 'string', 'allowNull' => true, 'autoIncrement' => false, 'enumValues' => null, 'size' => 100, 'precision' => 100, 'scale' => null, 'defaultValue' => 'something', ], 'char_col3' => [ 'type' => 'text', 'dbType' => 'text', 'phpType' => 'string', 'allowNull' => true, 'autoIncrement' => false, 'enumValues' => null, 'size' => null, 'precision' => null, 'scale' => null, 'defaultValue' => null, ], 'enum_col' => [ 'type' => 'string', 'dbType' => "enum('a','B')", 'phpType' => 'string', 'allowNull' => true, 'autoIncrement' => false, 'enumValues' => ['a', 'B'], 'size' => null, 'precision' => null, 'scale' => null, 'defaultValue' => null, ], 'float_col' => [ 'type' => 'double', 'dbType' => 'double(4,3)', 'phpType' => 'double', 'allowNull' => false, 'autoIncrement' => false, 'enumValues' => null, 'size' => 4, 'precision' => 4, 'scale' => 3, 'defaultValue' => null, ], 'float_col2' => [ 'type' => 'double', 'dbType' => 'double', 'phpType' => 'double', 'allowNull' => true, 'autoIncrement' => false, 'enumValues' => null, 'size' => null, 'precision' => null, 'scale' => null, 'defaultValue' => 1.23, ], 'blob_col' => [ 'type' => 'binary', 'dbType' => 'blob', 'phpType' => 'resource', 'allowNull' => true, 'autoIncrement' => false, 'enumValues' => null, 'size' => null, 'precision' => null, 'scale' => null, 'defaultValue' => null, ], 'numeric_col' => [ 'type' => 'decimal', 'dbType' => 'decimal(5,2)', 'phpType' => 'string', 'allowNull' => true, 'autoIncrement' => false, 'enumValues' => null, 'size' => 5, 'precision' => 5, 'scale' => 2, 'defaultValue' => '33.22', ], 'time' => [ 'type' => 'timestamp', 'dbType' => 'timestamp', 'phpType' => 'string', 'allowNull' => false, 'autoIncrement' => false, 'enumValues' => null, 'size' => null, 'precision' => null, 'scale' => null, 'defaultValue' => '2002-01-01 00:00:00', ], 'bool_col' => [ 'type' => 'smallint', 'dbType' => 'tinyint(1)', 'phpType' => 'integer', 'allowNull' => false, 'autoIncrement' => false, 'enumValues' => null, 'size' => 1, 'precision' => 1, 'scale' => null, 'defaultValue' => null, ], 'bool_col2' => [ 'type' => 'smallint', 'dbType' => 'tinyint(1)', 'phpType' => 'integer', 'allowNull' => true, 'autoIncrement' => false, 'enumValues' => null, 'size' => 1, 'precision' => 1, 'scale' => null, 'defaultValue' => 1, ], 'ts_default' => [ 'type' => 'timestamp', 'dbType' => 'timestamp', 'phpType' => 'string', 'allowNull' => false, 'autoIncrement' => false, 'enumValues' => null, 'size' => null, 'precision' => null, 'scale' => null, 'defaultValue' => new Expression('CURRENT_TIMESTAMP'), ], 'bit_col' => [ 'type' => 'integer', 'dbType' => 'bit(8)', 'phpType' => 'integer', 'allowNull' => false, 'autoIncrement' => false, 'enumValues' => null, 'size' => 8, 'precision' => 8, 'scale' => null, 'defaultValue' => 130, // b'10000010' ], ]; } public function testColumnSchema() { $columns = $this->getExpectedColumns(); $table = $this->getConnection(false)->schema->getTableSchema('type', true); $expectedColNames = array_keys($columns); sort($expectedColNames); $colNames = $table->columnNames; sort($colNames); $this->assertEquals($expectedColNames, $colNames); foreach($table->columns as $name => $column) { $expected = $columns[$name]; $this->assertSame($expected['dbType'], $column->dbType, "dbType of colum $name does not match. type is $column->type, dbType is $column->dbType."); $this->assertSame($expected['phpType'], $column->phpType, "phpType of colum $name does not match. type is $column->type, dbType is $column->dbType."); $this->assertSame($expected['type'], $column->type, "type of colum $name does not match."); $this->assertSame($expected['allowNull'], $column->allowNull, "allowNull of colum $name does not match."); $this->assertSame($expected['autoIncrement'], $column->autoIncrement, "autoIncrement of colum $name does not match."); $this->assertSame($expected['enumValues'], $column->enumValues, "enumValues of colum $name does not match."); $this->assertSame($expected['size'], $column->size, "size of colum $name does not match."); $this->assertSame($expected['precision'], $column->precision, "precision of colum $name does not match."); $this->assertSame($expected['scale'], $column->scale, "scale of colum $name does not match."); if (is_object($expected['defaultValue'])) { $this->assertTrue(is_object($column->defaultValue), "defaultValue of colum $name is expected to be an object but it is not."); $this->assertEquals((string) $expected['defaultValue'], (string) $column->defaultValue, "defaultValue of colum $name does not match."); } else { $this->assertSame($expected['defaultValue'], $column->defaultValue, "defaultValue of colum $name does not match."); } } } }