| [ Index ] |
PHP Cross Reference of Limb3 |
[Summary view] [Print] [Text view]
1 <?php 2 /* 3 * Limb PHP Framework 4 * 5 * @link http://limb-project.com 6 * @copyright Copyright © 2004-2007 BIT(http://bit-creative.com) 7 * @license LGPL http://www.gnu.org/copyleft/lesser.html 8 */ 9 lmb_require('limb/active_record/src/lmbActiveRecord.class.php'); 10 lmb_require('limb/active_record/src/lmbAROneToManyCollection.class.php'); 11 lmb_require('limb/dbal/src/lmbSimpleDb.class.php'); 12 13 class CourseForTest extends lmbActiveRecord 14 { 15 protected $_db_table_name = 'course_for_test'; 16 protected $_has_many = array('lectures' => array('field' => 'course_id', 17 'class' => 'LectureForTest'), 18 'alt_lectures' => array('field' => 'alt_course_id', 19 'class' => 'LectureForTest')); 20 21 public $save_calls = 0; 22 23 function save() 24 { 25 parent :: save(); 26 $this->save_calls++; 27 } 28 } 29 30 class LectureForTest extends lmbActiveRecord 31 { 32 protected $_db_table_name = 'lecture_for_test'; 33 protected $_many_belongs_to = array('course' => array('field' => 'course_id', 34 'class' => 'CourseForTest'), 35 'alt_course' => array('field' => 'alt_course_id', 36 'class' => 'CourseForTest', 37 'can_be_null' => true)); 38 protected $_test_validator; 39 40 function setValidator($validator) 41 { 42 $this->_test_validator = $validator; 43 } 44 45 function _createValidator() 46 { 47 if($this->_test_validator) 48 return $this->_test_validator; 49 50 return parent :: _createValidator(); 51 } 52 } 53 54 class LecturesForTestCollectionStub extends lmbAROneToManyCollection{} 55 56 class CourseForTestWithCustomCollection extends lmbActiveRecord 57 { 58 protected $_db_table_name = 'course_for_test'; 59 protected $_has_many = array('lectures' => array('field' => 'course_id', 60 'class' => 'LectureForTest', 61 'collection' => 'LecturesForTestCollectionStub')); 62 } 63 64 class CourseForTestWithNullifyRelationProperty extends lmbActiveRecord 65 { 66 protected $_db_table_name = 'course_for_test'; 67 protected $_has_many = array('lectures' => array('field' => 'course_id', 68 'class' => 'LectureForTest', 69 'nullify' => true)); 70 } 71 72 Mock :: generate('LectureForTest', 'MockLectureForTest'); 73 74 class lmbAROneToManyRelationsTest extends UnitTestCase 75 { 76 protected $db; 77 78 function setUp() 79 { 80 $this->db = new lmbSimpleDb(lmbToolkit :: instance()->getDefaultDbConnection()); 81 $this->_dbCleanUp(); 82 } 83 84 function tearDown() 85 { 86 $this->_dbCleanUp(); 87 } 88 89 function _dbCleanUp() 90 { 91 $this->db->delete('course_for_test'); 92 $this->db->delete('lecture_for_test'); 93 } 94 95 function testMapPropertyToField() 96 { 97 $course = new CourseForTest(); 98 $this->assertEqual('lectures', $course->mapFieldToProperty('course_id')); 99 $this->assertNull($course->mapFieldToProperty('blah')); 100 101 $lecture = new LectureForTest(); 102 $this->assertEqual('course', $lecture->mapFieldToProperty('course_id')); 103 $this->assertNull($lecture->mapFieldToProperty('blah')); 104 } 105 106 function testNewObjectReturnsEmptyCollection() 107 { 108 $course = new CourseForTest(); 109 $lectures = $course->getLectures(); 110 $lectures->rewind(); 111 $this->assertFalse($lectures->valid()); 112 } 113 114 function testNewObjectReturnsNullParent() 115 { 116 $lecture = new LectureForTest(); 117 $this->assertNull($lecture->getCourse()); 118 } 119 120 function testAddToCollection() 121 { 122 $course = $this->_initCourse(); 123 124 $l1 = new LectureForTest(); 125 $l1->setTitle('Physics'); 126 $l2 = new LectureForTest(); 127 $l2->setTitle('Math'); 128 129 $course->addToLectures($l1); 130 $course->addToLectures($l2); 131 132 $rs = $course->getLectures(); 133 134 $rs->rewind(); 135 $this->assertEqual($rs->current()->getTitle(), $l1->getTitle()); 136 $rs->next(); 137 $this->assertEqual($rs->current()->getTitle(), $l2->getTitle()); 138 } 139 140 function testSetingCollectionDirectlyCallsAddToMethod() 141 { 142 $course = $this->_initCourse(); 143 144 $l1 = new LectureForTest(); 145 $l1->setTitle('Physics'); 146 $l2 = new LectureForTest(); 147 $l2->setTitle('Math'); 148 149 $course->setLectures(array($l1, $l2)); 150 $lectures = $course->getLectures(); 151 $this->assertEqual(sizeof($lectures), 2); 152 $this->assertEqual($lectures[0]->getTitle(), $l1->getTitle()); 153 $this->assertEqual($lectures[1]->getTitle(), $l2->getTitle()); 154 } 155 156 function testSetFlushesPreviousCollection() 157 { 158 $course = $this->_initCourse(); 159 160 $l1 = new LectureForTest(); 161 $l1->setTitle('Physics'); 162 $l2 = new LectureForTest(); 163 $l2->setTitle('Math'); 164 165 $course->addToLectures($l1); 166 $course->addToLectures($l2); 167 168 $course->setLectures(array($l1)); 169 $lectures = $course->getLectures()->getArray(); 170 $this->assertEqual($lectures[0]->getTitle(), $l1->getTitle()); 171 $this->assertEqual(sizeof($lectures), 1); 172 } 173 174 function testSaveCollection() 175 { 176 $course = $this->_initCourse(); 177 178 $l1 = new LectureForTest(); 179 $l1->setTitle('Physics'); 180 $l2 = new LectureForTest(); 181 $l2->setTitle('Math'); 182 183 $course->addToLectures($l1); 184 $course->addToLectures($l2); 185 186 $course->save(); 187 188 $course2 = lmbActiveRecord :: findById('CourseForTest', $course->getId()); 189 $rs = $course2->getLectures(); 190 191 $rs->rewind(); 192 $this->assertEqual($rs->current()->getTitle(), $l1->getTitle()); 193 $rs->next(); 194 $this->assertEqual($rs->current()->getTitle(), $l2->getTitle()); 195 } 196 197 function testGenericGetLoadsCollection() 198 { 199 $course = $this->_initCourse(); 200 201 $l1 = new LectureForTest(); 202 $l1->setTitle('Physics'); 203 $l2 = new LectureForTest(); 204 $l2->setTitle('Math'); 205 206 $course->addToLectures($l1); 207 $course->addToLectures($l2); 208 209 $course->save(); 210 211 $course2 = lmbActiveRecord :: findById('CourseForTest', $course->getId()); 212 $rs = $course2->get('lectures'); 213 214 $rs->rewind(); 215 $this->assertEqual($rs->current()->getTitle(), $l1->getTitle()); 216 $rs->next(); 217 $this->assertEqual($rs->current()->getTitle(), $l2->getTitle()); 218 } 219 220 function testParentObjectCanBeNull() 221 { 222 $course = $this->_initCourse(); 223 224 $lecture = new LectureForTest(); 225 $lecture->setTitle('Physics'); 226 $lecture->setCourse($course); 227 $lecture->save(); 228 229 $lecture2 = lmbActiveRecord :: findById('LectureForTest', $lecture->getId()); 230 $this->assertEqual($lecture2->getCourse()->getTitle(), $course->getTitle()); 231 $this->assertNull($lecture2->getAltCourse()); 232 233 $lecture2->setAltCourse($course); 234 $lecture2->save(); 235 236 $lecture3 = lmbActiveRecord :: findById('LectureForTest', $lecture2->getId()); 237 $this->assertEqual($lecture3->getCourse()->getTitle(), $course->getTitle()); 238 $this->assertEqual($lecture3->getAltCourse()->getTitle(), $course->getTitle()); 239 } 240 241 function testSettingNullParentObject() 242 { 243 $course = $this->_initCourse(); 244 245 $lecture = new LectureForTest(); 246 $lecture->setTitle('Physics'); 247 $lecture->setAltCourse($course); 248 $lecture->save(); 249 250 $this->assertEqual($course->getAltLectures()->count(), 1); 251 252 $lecture2 = lmbActiveRecord :: findById('LectureForTest', $lecture->getId()); 253 254 $lecture2->setAltCourse(null); 255 $lecture2->save(); 256 257 $this->assertEqual($course->getAltLectures()->count(), 0); 258 259 $lecture3 = lmbActiveRecord :: findById('LectureForTest', $lecture2->getId()); 260 $this->assertNull($lecture3->getAltCourse()); 261 } 262 263 function testSavingChildForExistingParentDoesntSaveParent() 264 { 265 $course = $this->_initCourse(); 266 267 $this->assertEqual($course->save_calls, 0); 268 269 $course->save(); 270 271 $this->assertEqual($course->save_calls, 1); 272 273 $lecture = new LectureForTest(); 274 $lecture->setTitle('Physics'); 275 $lecture->setAltCourse($course); 276 $lecture->save(); 277 278 $this->assertEqual($course->save_calls, 1); 279 } 280 281 function testChangingParentIdRelationFieldDirectly() 282 { 283 $course1 = $this->_initCourse(); 284 $course1->save(); 285 286 $course2 = $this->_initCourse(); 287 $course2->save(); 288 289 $lecture = new LectureForTest(); 290 $lecture->setTitle('Physics'); 291 $lecture->setCourse($course1); 292 $lecture->save(); 293 294 $lecture2 = new LectureForTest($lecture->getId()); 295 $this->assertEqual($lecture2->getCourse()->getId(), $course1->getId()); 296 297 $lecture2->set('course_id', $course2->getId()); 298 $lecture2->save(); 299 300 $lecture3 = new LectureForTest($lecture->getId()); 301 $this->assertEqual($lecture3->getCourse()->getId(), $course2->getId()); 302 } 303 304 function testChangingParentIdRelationFieldDirectlyDoesNotWorkIfParentObjectIsDirty() 305 { 306 $course1 = $this->_initCourse(); 307 $course1->save(); 308 309 $course2 = $this->_initCourse(); 310 $course2->save(); 311 312 $lecture = new LectureForTest(); 313 $lecture->setTitle('Physics'); 314 $lecture->setCourse($course1); 315 $lecture->save(); 316 317 $lecture2 = new LectureForTest($lecture->getId()); 318 $this->assertEqual($lecture2->getCourse()->getId(), $course1->getId()); 319 320 $lecture2->set('course_id', $course2->getId()); 321 $lecture2->setCourse($course1); 322 $lecture2->save(); 323 324 $lecture3 = new LectureForTest($lecture->getId()); 325 $this->assertEqual($lecture3->getCourse()->getId(), $course1->getId()); 326 } 327 328 function testOwnerSetAutomaticallyForChildAddedToCollection() 329 { 330 $course = $this->_initCourse(); 331 332 $lecture = new LectureForTest(); 333 $lecture->setTitle('Physics'); 334 335 $course->getLectures()->add($lecture); 336 337 $this->assertReference($lecture->getCourse(), $course); 338 } 339 340 function testDeleteCollection() 341 { 342 $course = $this->_initCourse(); 343 344 $l1 = new LectureForTest(); 345 $l1->setTitle('Physics'); 346 $l2 = new LectureForTest(); 347 $l2->setTitle('Math'); 348 349 $course->addToLectures($l1); 350 $course->addToLectures($l2); 351 352 $course->save(); 353 354 $course2 = lmbActiveRecord :: findById('CourseForTest', $course->getId()); 355 $course2->destroy(); 356 357 $this->assertNull(lmbActiveRecord :: findFirst('LectureForTest', array('criteria' => 'id = ' . $l1->getId()))); 358 $this->assertNull(lmbActiveRecord :: findFirst('LectureForTest', array('criteria' => 'id = ' . $l2->getId()))); 359 } 360 361 function testNullifyOnDestroy() 362 { 363 $course = new CourseForTestWithNullifyRelationProperty(); 364 $course->setTitle('Super course'); 365 366 $l1 = new LectureForTest(); 367 $l1->setTitle('Physics'); 368 $l2 = new LectureForTest(); 369 $l2->setTitle('Math'); 370 371 $course->addToLectures($l1); 372 $course->addToLectures($l2); 373 374 $course->save(); 375 376 $course2 = new CourseForTestWithNullifyRelationProperty($course->getId()); 377 $course2->destroy(); 378 379 $lectures = lmbActiveRecord :: find('LectureForTest')->getArray(); 380 $this->assertEqual(sizeof($lectures), 2); 381 $this->assertNull($lectures[0]->getCourseId()); 382 $this->assertNull($lectures[0]->getCourseId()); 383 } 384 385 function testUseCustomCollection() 386 { 387 $course = new CourseForTestWithCustomCollection(); 388 $this->assertTrue($course->getLectures() instanceof LecturesForTestCollectionStub); 389 } 390 391 function testSetFlushesPreviousCollectionInDatabaseToo() 392 { 393 $course = $this->_initCourse(); 394 395 $l1 = new LectureForTest(); 396 $l1->setTitle('Physics'); 397 $l2 = new LectureForTest(); 398 $l2->setTitle('Math'); 399 400 $course->addToLectures($l1); 401 $course->addToLectures($l2); 402 403 $course->save(); 404 405 $course2 = lmbActiveRecord :: findById('CourseForTest', $course->getId()); 406 407 $l3 = new LectureForTest(); 408 $l3->setTitle('Math'); 409 410 $course2->setLectures(array($l3)); 411 $course2->save(); 412 413 $course3 = lmbActiveRecord :: findById('CourseForTest', $course->getId()); 414 415 $lectures = $course3->getLectures(); 416 $this->assertEqual($lectures->count(), 1); 417 $this->assertEqual($lectures->at(0)->getTitle(), $l3->getTitle()); 418 } 419 420 function testErrorListIsSharedWithCollection() 421 { 422 $course = $this->_initCourse(); 423 424 $l = new LectureForTest(); 425 $validator = new lmbValidator(); 426 <