PageRenderTime 27ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/test/testsuite/generator/behavior/i18n/I18nBehaviorTest.php

http://github.com/propelorm/Propel
PHP | 428 lines | 352 code | 40 blank | 36 comment | 0 complexity | f34d6b54390bccfd42637f84e1ad5f24 MD5 | raw file
  1. <?php
  2. /*
  3. * $Id: VersionableBehaviorTest.php 1460 2010-01-17 22:36:48Z francois $
  4. * This file is part of the Propel package.
  5. * For the full copyright and license information, please view the LICENSE
  6. * file that was distributed with this source code.
  7. *
  8. * @license MIT License
  9. */
  10. require_once dirname(__FILE__) . '/../../../../../generator/lib/util/PropelQuickBuilder.php';
  11. require_once dirname(__FILE__) . '/../../../../../generator/lib/behavior/i18n/I18nBehavior.php';
  12. require_once dirname(__FILE__) . '/../../../../../runtime/lib/Propel.php';
  13. /**
  14. * Tests for I18nBehavior class
  15. *
  16. * @author François Zaninotto
  17. * @version $Revision$
  18. * @package generator.behavior.i18n
  19. */
  20. class I18nBehaviorTest extends PHPUnit_Framework_TestCase
  21. {
  22. public function testModifyDatabaseOverridesDefaultLocale()
  23. {
  24. $schema = <<<EOF
  25. <database name="i18n_behavior_test_0">
  26. <behavior name="i18n">
  27. <parameter name="default_locale" value="fr_FR" />
  28. </behavior>
  29. <table name="i18n_behavior_test_0">
  30. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  31. <behavior name="i18n" />
  32. </table>
  33. </database>
  34. EOF;
  35. $builder = new PropelQuickBuilder();
  36. $builder->setSchema($schema);
  37. $expected = <<<EOF
  38. -----------------------------------------------------------------------
  39. -- i18n_behavior_test_0_i18n
  40. -----------------------------------------------------------------------
  41. DROP TABLE IF EXISTS [i18n_behavior_test_0_i18n];
  42. CREATE TABLE [i18n_behavior_test_0_i18n]
  43. (
  44. [id] INTEGER NOT NULL,
  45. [locale] VARCHAR(5) DEFAULT 'fr_FR' NOT NULL,
  46. PRIMARY KEY ([id],[locale])
  47. );
  48. EOF;
  49. $this->assertContains($expected, $builder->getSQL());
  50. }
  51. public function testModifyDatabaseDoesNotOverrideTableLocale()
  52. {
  53. $schema = <<<EOF
  54. <database name="i18n_behavior_test_0">
  55. <behavior name="i18n">
  56. <parameter name="default_locale" value="fr_FR" />
  57. </behavior>
  58. <table name="i18n_behavior_test_0">
  59. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  60. <behavior name="i18n">
  61. <parameter name="default_locale" value="pt_PT" />
  62. </behavior>
  63. </table>
  64. </database>
  65. EOF;
  66. $builder = new PropelQuickBuilder();
  67. $builder->setSchema($schema);
  68. $expected = <<<EOF
  69. -----------------------------------------------------------------------
  70. -- i18n_behavior_test_0_i18n
  71. -----------------------------------------------------------------------
  72. DROP TABLE IF EXISTS [i18n_behavior_test_0_i18n];
  73. CREATE TABLE [i18n_behavior_test_0_i18n]
  74. (
  75. [id] INTEGER NOT NULL,
  76. [locale] VARCHAR(5) DEFAULT 'pt_PT' NOT NULL,
  77. PRIMARY KEY ([id],[locale])
  78. );
  79. EOF;
  80. $this->assertContains($expected, $builder->getSQL());
  81. }
  82. public function schemaDataProvider()
  83. {
  84. $schema1 = <<<EOF
  85. <database name="i18n_behavior_test_0">
  86. <table name="i18n_behavior_test_0">
  87. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  88. <column name="foo" type="INTEGER" />
  89. <column name="bar" type="VARCHAR" size="100" />
  90. <behavior name="i18n">
  91. <parameter name="i18n_columns" value="bar" />
  92. </behavior>
  93. </table>
  94. </database>
  95. EOF;
  96. $schema2 = <<<EOF
  97. <database name="i18n_behavior_test_0">
  98. <table name="i18n_behavior_test_0">
  99. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  100. <column name="foo" type="INTEGER" />
  101. <behavior name="i18n" />
  102. </table>
  103. <table name="i18n_behavior_test_0_i18n">
  104. <column name="id" primaryKey="true" type="INTEGER" />
  105. <column name="locale" primaryKey="true" type="VARCHAR" size="5" default="en_US" />
  106. <column name="bar" type="VARCHAR" size="100" />
  107. <foreign-key foreignTable="i18n_behavior_test_0">
  108. <reference local="id" foreign="id" />
  109. </foreign-key>
  110. </table>
  111. </database>
  112. EOF;
  113. return array(array($schema1), array($schema2));
  114. }
  115. /**
  116. * @dataProvider schemaDataProvider
  117. */
  118. public function testModifyTableAddsI18nTable($schema)
  119. {
  120. $builder = new PropelQuickBuilder();
  121. $builder->setSchema($schema);
  122. $expected = <<<EOF
  123. -----------------------------------------------------------------------
  124. -- i18n_behavior_test_0_i18n
  125. -----------------------------------------------------------------------
  126. DROP TABLE IF EXISTS [i18n_behavior_test_0_i18n];
  127. CREATE TABLE [i18n_behavior_test_0_i18n]
  128. EOF;
  129. $this->assertContains($expected, $builder->getSQL());
  130. }
  131. /**
  132. * @dataProvider schemaDataProvider
  133. */
  134. public function testModifyTableRelatesI18nTableToMainTable($schema)
  135. {
  136. $builder = new PropelQuickBuilder();
  137. $builder->setSchema($schema);
  138. $expected = <<<EOF
  139. -- FOREIGN KEY ([id]) REFERENCES i18n_behavior_test_0 ([id])
  140. EOF;
  141. $this->assertContains($expected, $builder->getSQL());
  142. }
  143. /**
  144. * @dataProvider schemaDataProvider
  145. */
  146. public function testModifyTableAddsLocaleColumnToI18n($schema)
  147. {
  148. $builder = new PropelQuickBuilder();
  149. $builder->setSchema($schema);
  150. $expected = <<<EOF
  151. CREATE TABLE [i18n_behavior_test_0_i18n]
  152. (
  153. [id] INTEGER NOT NULL,
  154. [locale] VARCHAR(5) DEFAULT 'en_US' NOT NULL,
  155. EOF;
  156. $this->assertContains($expected, $builder->getSQL());
  157. }
  158. /**
  159. * @dataProvider schemaDataProvider
  160. */
  161. public function testModifyTableMovesI18nColumns($schema)
  162. {
  163. $builder = new PropelQuickBuilder();
  164. $builder->setSchema($schema);
  165. $expected = <<<EOF
  166. CREATE TABLE [i18n_behavior_test_0_i18n]
  167. (
  168. [id] INTEGER NOT NULL,
  169. [locale] VARCHAR(5) DEFAULT 'en_US' NOT NULL,
  170. [bar] VARCHAR(100),
  171. PRIMARY KEY ([id],[locale])
  172. );
  173. EOF;
  174. $this->assertContains($expected, $builder->getSQL());
  175. }
  176. /**
  177. * @dataProvider schemaDataProvider
  178. */
  179. public function testModifyTableDoesNotMoveNonI18nColumns($schema)
  180. {
  181. $builder = new PropelQuickBuilder();
  182. $builder->setSchema($schema);
  183. $expected = <<<EOF
  184. CREATE TABLE [i18n_behavior_test_0]
  185. (
  186. [id] INTEGER NOT NULL PRIMARY KEY,
  187. [foo] INTEGER
  188. );
  189. EOF;
  190. $this->assertContains($expected, $builder->getSQL());
  191. }
  192. public function testModifyTableMovesValidatorsOnI18nColumns()
  193. {
  194. $schema = <<<EOF
  195. <database name="i18n_behavior_test_0">
  196. <table name="i18n_behavior_test_0">
  197. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  198. <column name="title" type="VARCHAR" />
  199. <validator column="title">
  200. <rule name="minLength" value="4" message="title must be at least 4 characters !" />
  201. </validator>
  202. <behavior name="i18n">
  203. <parameter name="i18n_columns" value="title" />
  204. </behavior>
  205. </table>
  206. </database>
  207. EOF;
  208. $builder = new PropelQuickBuilder();
  209. $builder->setSchema($schema);
  210. $table = $builder->getDatabase()->getTable('i18n_behavior_test_0');
  211. $this->assertEquals(array(), $table->getValidators());
  212. $i18nTable = $builder->getDatabase()->getTable('i18n_behavior_test_0_i18n');
  213. $validators = $i18nTable->getValidators();
  214. $this->assertEquals(1, count($validators));
  215. $this->assertEquals('title', $validators[0]->getColumnName());
  216. }
  217. public function testModiFyTableDoesNotMoveValidatorsOnNonI18nColumns()
  218. {
  219. $schema = <<<EOF
  220. <database name="i18n_behavior_test_0">
  221. <table name="i18n_behavior_test_0">
  222. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  223. <validator column="id">
  224. <rule name="minLength" value="4" message="title must be at least 4 characters !" />
  225. </validator>
  226. <column name="title" type="VARCHAR" />
  227. <behavior name="i18n">
  228. <parameter name="i18n_columns" value="title" />
  229. </behavior>
  230. </table>
  231. </database>
  232. EOF;
  233. $builder = new PropelQuickBuilder();
  234. $builder->setSchema($schema);
  235. $table = $builder->getDatabase()->getTable('i18n_behavior_test_0');
  236. $this->assertEquals(1, count($table->getValidators()));
  237. $i18nTable = $builder->getDatabase()->getTable('i18n_behavior_test_0_i18n');
  238. $this->assertEquals(array(), $i18nTable->getValidators());
  239. }
  240. public function testModifyTableUsesCustomI18nTableName()
  241. {
  242. $schema = <<<EOF
  243. <database name="i18n_behavior_test_0">
  244. <table name="i18n_behavior_test_0">
  245. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  246. <behavior name="i18n">
  247. <parameter name="i18n_table" value="foo_table" />
  248. </behavior>
  249. </table>
  250. </database>
  251. EOF;
  252. $builder = new PropelQuickBuilder();
  253. $builder->setSchema($schema);
  254. $expected = <<<EOF
  255. -----------------------------------------------------------------------
  256. -- foo_table
  257. -----------------------------------------------------------------------
  258. DROP TABLE IF EXISTS [foo_table];
  259. CREATE TABLE [foo_table]
  260. (
  261. [id] INTEGER NOT NULL,
  262. [locale] VARCHAR(5) DEFAULT 'en_US' NOT NULL,
  263. PRIMARY KEY ([id],[locale])
  264. );
  265. EOF;
  266. $this->assertContains($expected, $builder->getSQL());
  267. }
  268. public function testModiFyTableUsesCustomLocaleColumnName()
  269. {
  270. $schema = <<<EOF
  271. <database name="i18n_behavior_test_0">
  272. <table name="i18n_behavior_test_0">
  273. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  274. <behavior name="i18n">
  275. <parameter name="locale_column" value="culture" />
  276. </behavior>
  277. </table>
  278. </database>
  279. EOF;
  280. $builder = new PropelQuickBuilder();
  281. $builder->setSchema($schema);
  282. $expected = <<<EOF
  283. -----------------------------------------------------------------------
  284. -- i18n_behavior_test_0_i18n
  285. -----------------------------------------------------------------------
  286. DROP TABLE IF EXISTS [i18n_behavior_test_0_i18n];
  287. CREATE TABLE [i18n_behavior_test_0_i18n]
  288. (
  289. [id] INTEGER NOT NULL,
  290. [culture] VARCHAR(5) DEFAULT 'en_US' NOT NULL,
  291. PRIMARY KEY ([id],[culture])
  292. );
  293. EOF;
  294. $this->assertContains($expected, $builder->getSQL());
  295. }
  296. public function testModiFyTableUsesCustomLocaleDefault()
  297. {
  298. $schema = <<<EOF
  299. <database name="i18n_behavior_test_0">
  300. <table name="i18n_behavior_test_0">
  301. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  302. <behavior name="i18n">
  303. <parameter name="default_locale" value="fr_FR" />
  304. </behavior>
  305. </table>
  306. </database>
  307. EOF;
  308. $builder = new PropelQuickBuilder();
  309. $builder->setSchema($schema);
  310. $expected = <<<EOF
  311. -----------------------------------------------------------------------
  312. -- i18n_behavior_test_0_i18n
  313. -----------------------------------------------------------------------
  314. DROP TABLE IF EXISTS [i18n_behavior_test_0_i18n];
  315. CREATE TABLE [i18n_behavior_test_0_i18n]
  316. (
  317. [id] INTEGER NOT NULL,
  318. [locale] VARCHAR(5) DEFAULT 'fr_FR' NOT NULL,
  319. PRIMARY KEY ([id],[locale])
  320. );
  321. EOF;
  322. $this->assertContains($expected, $builder->getSQL());
  323. }
  324. /**
  325. * tests if i18n_pk_name options sets the right pk name in i18n table
  326. */
  327. public function testModifyTableUseCustomPkName()
  328. {
  329. $schema = <<<EOF
  330. <database name="i18n_behavior_test_0">
  331. <table name="i18n_behavior_test_0">
  332. <column name="id" primaryKey="true" type="INTEGER" autoIncrement="true" />
  333. <behavior name="i18n">
  334. <parameter name="default_locale" value="fr_FR" />
  335. <parameter name="i18n_pk_name" value="custom_id" />
  336. </behavior>
  337. </table>
  338. </database>
  339. EOF;
  340. $builder = new PropelQuickBuilder();
  341. $builder->setSchema($schema);
  342. // checks id in base table
  343. $table = $builder->getDatabase()->getTable('i18n_behavior_test_0');
  344. $this->assertTrue($table->hasColumn('id'));
  345. // checks id in i18n table
  346. $i18nTable = $builder->getDatabase()->getTable('i18n_behavior_test_0_i18n');
  347. $this->assertTrue($i18nTable->hasColumn('custom_id'));
  348. // checks foreign key
  349. $fkList = $i18nTable->getColumnForeignKeys('custom_id');
  350. $this->assertEquals(count($fkList), 1);
  351. $fk = array_pop($fkList);
  352. $this->assertEquals($fk->getForeignTableName(), 'i18n_behavior_test_0');
  353. $this->assertEquals($fk->getForeignColumnNames(), '[id]');
  354. $expected = <<<EOF
  355. -----------------------------------------------------------------------
  356. -- i18n_behavior_test_0_i18n
  357. -----------------------------------------------------------------------
  358. DROP TABLE IF EXISTS [i18n_behavior_test_0_i18n];
  359. CREATE TABLE [i18n_behavior_test_0_i18n]
  360. (
  361. [custom_id] INTEGER NOT NULL,
  362. [locale] VARCHAR(5) DEFAULT 'fr_FR' NOT NULL,
  363. PRIMARY KEY ([custom_id],[locale])
  364. );
  365. EOF;
  366. $this->assertContains($expected, $builder->getSQL());
  367. }
  368. public function testTableWithPrefix()
  369. {
  370. $schema = <<<EOF
  371. <database name="default" tablePrefix="plop_">
  372. <table name="group">
  373. <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
  374. <column name="title" type="varchar" primaryString="true" size="255" />
  375. <behavior name="i18n">
  376. <parameter name="i18n_columns" value="title" />
  377. <parameter name="locale_column" value="locale" />
  378. </behavior>
  379. </table>
  380. </database>
  381. EOF;
  382. $builder = new PropelQuickBuilder();
  383. $builder->setSchema($schema);
  384. $this->assertTrue($builder->getDatabase()->hasTable('plop_group'));
  385. $this->assertFalse($builder->getDatabase()->hasTable('plop_plop_group_i18n'));
  386. $this->assertTrue($builder->getDatabase()->hasTable('plop_group_i18n'));
  387. }
  388. }