PageRenderTime 42ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/libs/orm/tests/SchemaTest.php

http://arrowplatform.googlecode.com/
PHP | 350 lines | 234 code | 95 blank | 21 comment | 24 complexity | ac9da55a320d67fa6cf377f4e9b40c4f MD5 | raw file
  1. <?php
  2. require_once ('PHPUnit/Autoload.php');
  3. class ORMTest extends PHPUnit_Framework_TestCase{
  4. /**
  5. * @Datasource
  6. */
  7. private $ds = null;
  8. /**
  9. *
  10. *
  11. * @var PDO
  12. */
  13. private $conn = null;
  14. const SCHEMA_SOURCE_FILE = "./resources/test-source-file.xml";
  15. const SCHEMA_TARGET_FILE = "./resources/test-target-file.xml";
  16. const CONFIG_SOURCE_FILE = "./resources/test-configuration.xml";
  17. public function __construct(){
  18. $this->backupGlobals = false;
  19. $this->backupStaticAttributes = false;
  20. $reader = new ConfigReader();
  21. $result = $reader->readConfigFromFile(self::CONFIG_SOURCE_FILE);
  22. $this->ds = $result[0]->datasources[0];
  23. $this->ds->connect();
  24. $this->conn = $this->ds->getConnection();
  25. $this->clearDatasource();
  26. }
  27. public function __destruct(){
  28. //$this->clearDatasource();
  29. }
  30. /**
  31. *
  32. * Enter description here ...
  33. * @return Schema
  34. */
  35. private function getSchema(){
  36. $reader = new SchemaReader();
  37. return $reader->readSchemaFromFile(self::SCHEMA_SOURCE_FILE);
  38. }
  39. private function clearDatasource(){
  40. $statement = $this->conn->query("show tables");
  41. $result = $statement->fetchAll( PDO::FETCH_NUM );
  42. foreach($result as $row){
  43. $result = $this->conn->exec("DROP TABLE `{$row[0]}`");
  44. }
  45. }
  46. private function createTestDataStructure(){
  47. $this->conn->exec("CREATE TABLE `orm`.`test_table` (
  48. `test1` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  49. `test2` VARCHAR( 255 ) NULL,
  50. `test3` integer NOT NULL,
  51. INDEX `test_index` ( `test2` )
  52. ) ENGINE=InnoDB");
  53. $table1 = new Table();
  54. $table1->setClasspath( "orm.auto_path.AutoClassTest_table");
  55. $table1->setBaseClasspath( "auto.Persistent" );
  56. $table1->setTableName("test_table");
  57. $field_test1 = new Field();
  58. $field_test1->setName("test1");
  59. $field_test1->setAutoincrement(true);
  60. $field_test1->setPKey(true);
  61. $field_test1->setType("integer");
  62. $field_test1->setSize(11);
  63. $field_test2 = new Field();
  64. $field_test2->setName("test2");
  65. $field_test2->setType("varchar");
  66. $field_test2->setSize(255);
  67. $field_test3 = new Field();
  68. $field_test3->setName("test3");
  69. $field_test3->setType("integer");
  70. $field_test3->setRequired(true);
  71. $field_test3->setSize(11);
  72. $table1->addField($field_test1);
  73. $table1->addField($field_test2);
  74. $table1->addField($field_test3);
  75. $fKey = new ForeignKey();
  76. $fKey->setName("test_table_ibfk_1");
  77. $fKey->setForeignTableName("test_table2");
  78. $fKeyReferece = new ForeignKeyReference();
  79. $fKeyReferece->setLocalFieldName("test2");
  80. $fKeyReferece->setForeignFieldName("test2");
  81. $fKey->addReference($fKeyReferece);
  82. $fKey->setOnDelete(ForeignKey::MODE_CASCADE);
  83. $fKey->setOnUpdate(ForeignKey::MODE_CASCADE);
  84. $table1->addForeignKey($fKey);
  85. //$this->conn->exec("ALTER TABLE `test_table` ADD INDEX `test_index2` ( `test2` )");
  86. $index = new Index();
  87. $index->addFieldName("test2");
  88. $index->setName("test_index");
  89. $index->setType("BTREE");
  90. //test_index
  91. $table1->addIndex($index);
  92. $this->conn->exec("CREATE TABLE `orm`.`test_table2` (
  93. `test1` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  94. `test2` VARCHAR( 255 ) NOT NULL,
  95. `test3` integer NOT NULL,
  96. INDEX ( `test2` )
  97. ) ENGINE=InnoDB");
  98. $this->conn->exec("
  99. ALTER TABLE `test_table` ADD FOREIGN KEY ( `test2` ) REFERENCES `orm`.`test_table2` (
  100. `test2`
  101. ) ON DELETE CASCADE ON UPDATE CASCADE");
  102. $table2 = new Table();
  103. $table2->setClasspath( "orm.auto_path.AutoClassTest_table2");
  104. $table2->setBaseClasspath( "auto.Persistent" );
  105. $table2->setTableName("test_table2");
  106. $field_test1 = new Field();
  107. $field_test1->setName("test1");
  108. $field_test1->setAutoincrement(true);
  109. $field_test1->setPKey(true);
  110. $field_test1->setType("integer");
  111. $field_test1->setSize(11);
  112. $field_test2 = new Field();
  113. $field_test2->setName("test2");
  114. $field_test2->setType("varchar");
  115. $field_test2->setSize(255);
  116. $field_test2->setRequired(true);
  117. $field_test3 = new Field();
  118. $field_test3->setName("test3");
  119. $field_test3->setType("integer");
  120. $field_test3->setRequired(true);
  121. $field_test3->setSize(11);
  122. $table2->addField($field_test1);
  123. $table2->addField($field_test2);
  124. $table2->addField($field_test3);
  125. $index = new Index();
  126. $index->setName("test2");
  127. $index->addFieldName("test2");
  128. $index->setType("BTREE");
  129. $table2->addIndex($index);
  130. $schema = new Schema();
  131. $schema->addTable($table1);
  132. $schema->addTable($table2);
  133. return $schema;
  134. }
  135. public function testSchemaReader(){
  136. $schemaReader = new SchemaReader();
  137. $schema = $schemaReader->readSchemaFromFile(self::SCHEMA_SOURCE_FILE);
  138. $tables = $schema->getTables();
  139. $this->assertEquals(2, count($tables), "Expected tables count not match");
  140. $this->assertEquals(13, count($tables[0]->getFields()), "Expected fields count not match");
  141. }
  142. public function testCaching(){
  143. $generator = new BaseDomainClassGenerator();
  144. $dir = "./cache/";
  145. $generator->targetDir = $dir;
  146. $schemaReader = new SchemaReader();
  147. $schema = $schemaReader->readSchemaFromFile(self::SCHEMA_SOURCE_FILE);
  148. $generator->generate($schema);
  149. foreach($schema->getTables() as $table){
  150. $this->assertTrue(file_exists($dir."ORM_{$table->getClass()}.php"), "Domain clas file not generated");
  151. }
  152. }
  153. public function testConfigRead(){
  154. $reader = new ConfigReader();
  155. $result = $reader->readConfigFromFile(self::CONFIG_SOURCE_FILE);
  156. $this->assertEquals(1, count($result), "Expected group count not match");
  157. $this->assertEquals(1, count($result[0]->datasources), "Expected datasources count not match");
  158. $this->assertFalse($result[0]->datasources[0]->connectionString == "", "ConnectionString empty");
  159. $this->assertFalse($result[0]->datasources[0]->charset == "", "Charset string empty");
  160. $this->assertFalse($result[0]->datasources[0]->transactions , "Transaction is not set to true");
  161. }
  162. public function testSynchronizeTableToDs(){
  163. $this->clearDatasource();
  164. $schema = $this->getSchema();
  165. $synchronizer = new MysqlSynchronizer();
  166. $synchronizer->synchronize($schema, $this->ds );
  167. $statement = $this->conn->query("show tables");
  168. $result = $statement->fetchAll( PDO::FETCH_NUM );
  169. $this->assertEquals(2, count($result), "Expected number of tables not match");
  170. }
  171. public function testSynchronizeToSchema(){
  172. $this->clearDatasource();
  173. $testSchema = $this->createTestDataStructure();
  174. $schema = new Schema();
  175. $synchronizer = new MysqlSynchronizer();
  176. $synchronizer->synchronize($schema, $this->ds, AbstractSynchronizer::MODE_DS_TO_SCHEMA);
  177. $this->assertEquals($testSchema, $schema, "No to jazda");
  178. }
  179. public function testSynchronizeFieldsToDs(){
  180. $this->clearDatasource();
  181. $schema = $this->getSchema();
  182. $synchronizer = new MysqlSynchronizer();
  183. $synchronizer->synchronize( $schema, $this->ds, AbstractSynchronizer::MODE_SCHEMA_TO_DS);
  184. foreach($schema->getTables() as $table){
  185. $statement = $this->conn->query("SHOW COLUMNS FROM {$table->getTableName()}");
  186. $fields = $table->getFields();
  187. $i = 0;
  188. while( $row = $statement->fetch( PDO::FETCH_ASSOC ) ) {
  189. $this->assertEquals($fields[$i]->getName(), $row["Field"], "Field name not matched");
  190. if( $fields[$i]->isPKey() )
  191. $this->assertEquals("PRI", $row["Key"], "Primary key fail for field `{$row["Field"]}`");
  192. if( $fields[$i]->isAutoincrement() )
  193. $this->assertEquals("auto_increment", $row["Extra"], "Autoincrement fail for field `{$row["Field"]}`");
  194. if( $fields[$i]->getDefault() )
  195. $this->assertEquals( $table->fields[$i]->getDefault(), $row["Default"], "Default value fail for field `{$row["Field"]}`");
  196. if( $fields[$i]->isRequired() )
  197. $this->assertTrue( $row["Null"]=="NO", "Required fail for field `{$row["Field"]}`" );
  198. $tmp = explode("(",$row["Type"]);
  199. $type = $tmp[0];
  200. //print $table->fields[$i]->type."(".$table->fields[$i]->size.") => ". $row["Type"]."\n";
  201. $size = false;
  202. //longvarchar is changed for text and it not posses size
  203. if( $fields[$i]->getSize() && $fields[$i]->getType() != "LONGVARCHAR"){
  204. $size = str_replace(")", "", $tmp[1]);
  205. $this->assertEquals($fields[$i]->getSize(), $size, "Size fail for field `{$row["Field"]}`");
  206. }
  207. $types = array( "INTEGER" => "INT", "LONGVARCHAR" => "TEXT" );
  208. $testType = strtolower( str_replace(array_keys($types), $types, $fields[$i]->getType()));
  209. if($testType == "text" && $size < 65535 )
  210. $testType = "text";
  211. if($testType == "text" && $size < 16777215 )
  212. $testType = "mediumtext";
  213. if($testType == "text" && $size > 16777215 )
  214. $testType = "longtext";
  215. $this->assertEquals($testType, $type, "Type fail for field `{$row["Field"]}`");
  216. $i++;
  217. }
  218. }
  219. }
  220. public function testSynchronizeIndexToDs(){
  221. $this->clearDatasource();
  222. $schema = $this->getSchema();
  223. $synchronizer = new MysqlSynchronizer();
  224. $synchronizer->synchronize($schema, $this->ds );
  225. //$statement = $this->conn->query("show tables");
  226. //$result = $statement->fetchAll( PDO::FETCH_NUM );
  227. //$this->assertEquals(2, count($result), "Expected number of tables not match");
  228. }
  229. public function testSynchronizeForeignKeyToDs(){
  230. $this->clearDatasource();
  231. $schema = $this->getSchema();
  232. $synchronizer = new MysqlSynchronizer();
  233. $synchronizer->synchronize($schema, $this->ds );
  234. }
  235. public function _testSchemaWriter(){
  236. $reader = new ConfigReader();
  237. $result = $reader->readConfigFromFile(self::CONFIG_SOURCE_FILE);
  238. $ds = $result[0]->datasources[0];
  239. $ds->connect();
  240. $conn = $ds->getConnection();
  241. $synchro = new MysqlSynchronizer();
  242. $schema = new Schema();
  243. $synchro->datasourceToSchema( $ds, $schema );
  244. require_once '../schema/SchemaWriter.php';
  245. $writer = new SchemaWriter();
  246. $writer->writeSchemaToFile($schema, self::SCHEMA_TARGET_FILE);
  247. }
  248. }
  249. require_once '../schema/SchemaLoader.php';
  250. SchemaLoader::getInstance();
  251. $suite = new PHPUnit_Framework_TestSuite('ORMTest');
  252. print "<pre>";
  253. PHPUnit_TextUI_TestRunner::run($suite);
  254. print "</pre>";
  255. ?>