[ Index ]

PHP Cross Reference of Limb3

title

Body

[close]

/active_record/tests/cases/ -> lmbAROneToManyRelationsTest.class.php (source)

   1  <?php
   2  /*

   3   * Limb PHP Framework

   4   *

   5   * @link http://limb-project.com

   6   * @copyright  Copyright &copy; 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      <