[ Index ]

PHP Cross Reference of Limb3

title

Body

[close]

/active_record/tests/cases/ -> lmbAROneToManyCollectionTest.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/lmbAROneToManyCollection.class.php');
  10  lmb_require('limb/core/src/lmbCollectionDecorator.class.php');
  11  lmb_require('limb/dbal/src/lmbSimpleDb.class.php');
  12  require_once(dirname(__FILE__) . '/lmbAROneToManyRelationsTest.class.php');
  13  
  14  Mock :: generate('LectureForTest', 'MockLectureForTest');
  15  
  16  class lmbARTestingDSDecorator extends lmbCollectionDecorator
  17  {
  18    protected $value;
  19  
  20    function setValue($value)
  21    {
  22      $this->value = $value;
  23    }
  24  
  25    protected function _processRecord($record)
  26    {
  27      $record->set('value', $this->value);
  28    }
  29  
  30    function current()
  31    {
  32      $record = parent :: current();
  33      $this->_processRecord($record);
  34      return $record;
  35    }
  36  
  37    function at($pos)
  38    {
  39      $record = parent :: at($pos);
  40      $this->_processRecord($record);
  41      return $record;
  42    }
  43  }
  44  
  45  class LectureForTestStub extends LectureForTest
  46  {
  47    var $save_calls = 0;
  48  
  49    function save($error_list = null)
  50    {
  51      parent :: save($error_list);
  52      $this->save_calls++;
  53    }
  54  }
  55  
  56  
  57  class SpecialCourseForTest extends CourseForTest
  58  {
  59    protected $_has_many = array('lectures' => array('field' => 'course_id',
  60                                                     'class' => 'LectureForTest',
  61                                                     'sort_params' => array('id' => 'DESC')));
  62  }
  63  
  64  class VerySpecialCourseForTest extends CourseForTest
  65  {
  66    protected $_has_many = array('lectures' => array('field' => 'course_id',
  67                                                     'class' => 'SpecialLectureForTest'));
  68  }
  69  
  70  class SpecialLectureForTest extends LectureForTest
  71  {
  72    protected $_default_sort_params = array('id' => 'DESC');
  73  }
  74  
  75  class lmbAROneToManyCollectionTest extends UnitTestCase
  76  {
  77    function setUp()
  78    {
  79      $this->_dbCleanUp();
  80    }
  81  
  82    function tearDown()
  83    {
  84      $this->_dbCleanUp();
  85    }
  86  
  87    function _dbCleanUp()
  88    {
  89      lmbActiveRecord :: delete('CourseForTest');
  90      lmbActiveRecord :: delete('LectureForTest');
  91    }
  92  
  93    function testAddToWithExistingOwner()
  94    {
  95      $course = $this->_createCourseAndSave();
  96  
  97      $l1 = $this->_createLecture();
  98      $l2 = $this->_createLecture();
  99  
 100      $collection = new lmbAROneToManyCollection('lectures', $course);
 101      $collection->add($l1);
 102      $collection->add($l2);
 103  
 104      $arr = $collection->getArray();
 105  
 106      $this->assertEqual($arr[0]->getTitle(), $l1->getTitle());
 107      $this->assertEqual($arr[1]->getTitle(), $l2->getTitle());
 108      $this->assertEqual(sizeof($arr), 2);
 109  
 110      $collection2 = new lmbAROneToManyCollection('lectures', $course);
 111      $arr = $collection2->getArray();
 112  
 113      $this->assertEqual($arr[0]->getTitle(), $l1->getTitle());
 114      $this->assertEqual($arr[1]->getTitle(), $l2->getTitle());
 115      $this->assertEqual(sizeof($arr), 2);
 116    }
 117  
 118    function testResetCollectionOnAddForExistingOwner()
 119    {
 120      $course = $this->_createCourseAndSave();
 121  
 122      $lectures = $course->getLectures();
 123      $lectures->rewind();
 124      $this->assertFalse($lectures->valid());
 125  
 126      $l1 = $this->_createLecture();
 127      $l2 = $this->_createLecture();
 128  
 129      $course->addToLectures($l1);
 130      $course->addToLectures($l2);
 131  
 132      $lectures = $course->getLectures();
 133      $lectures->rewind();
 134      $lecture = $lectures->current();
 135      $this->assertEqual($lecture->getTitle(), $l1->getTitle());
 136    }
 137  
 138    function testAddToWithNonSavedOwner()
 139    {
 140      $course = $this->_createCourse();
 141  
 142      $l1 = $this->_createLecture();
 143      $l2 = $this->_createLecture();
 144  
 145      $collection = new lmbAROneToManyCollection('lectures', $course);
 146      $collection->add($l1);
 147      $collection->add($l2);
 148  
 149      $arr = $collection->getArray();
 150      $this->assertEqual(sizeof($arr), 2);
 151      $this->assertEqual($arr[0]->getTitle(), $l1->getTitle());
 152      $this->assertEqual($arr[1]->getTitle(), $l2->getTitle());
 153  
 154      $collection2 = new lmbAROneToManyCollection('lectures', $course);
 155      $arr = $collection2->getArray();
 156  
 157      $this->assertEqual(sizeof($arr), 0);
 158    }
 159  
 160    function testSaveWithExistingOwnerDoesNothing()
 161    {
 162      $l1 = new MockLectureForTest();
 163      $l2 = new MockLectureForTest();
 164  
 165      $course = $this->_createCourseAndSave();
 166  
 167      $collection = new lmbAROneToManyCollection('lectures', $course);
 168      $collection->add($l1);
 169      $collection->add($l2);
 170  
 171      $l1->expectNever('save');
 172      $l2->expectNever('save');
 173  
 174      $collection->save();
 175    }
 176  
 177    function testSaveWithNonSavedOwner()
 178    {
 179      $l1 = $this->_createLecture();
 180      $l2 = $this->_createLecture();
 181  
 182      $course = $this->_createCourse();
 183  
 184      $collection = new lmbAROneToManyCollection('lectures', $course);
 185      $collection->add($l1);
 186      $collection->add($l2);
 187  
 188      $collection2 = new lmbAROneToManyCollection('lectures', $course);
 189      $this->assertEqual(sizeof($collection2->getArray()), 0);
 190  
 191      $course->save();
 192      $collection->save();
 193  
 194      $collection3 = new lmbAROneToManyCollection('lectures', $course);
 195      $arr = $collection3->getArray();
 196      $this->assertEqual(sizeof($arr), 2);
 197      $this->assertEqual($arr[0]->getTitle(), $l1->getTitle());
 198      $this->assertEqual($arr[1]->getTitle(), $l2->getTitle());
 199    }
 200  
 201    function testSavingOwnerDoesntAffectCollection()
 202    {
 203      $l1 = new LectureForTestStub();
 204      $l1->setTitle('Physics');
 205      $l2 = new LectureForTestStub();
 206      $l2->setTitle('Math');
 207  
 208      $course = $this->_createCourse();
 209  
 210      $collection = new lmbAROneToManyCollection('lectures', $course);
 211      $collection->add($l1);
 212  
 213      $course->save();
 214  
 215      $collection->add($l2);
 216  
 217      //items in memory

 218      $arr = $collection->getArray();
 219      $this->assertEqual(sizeof($arr), 2);
 220      $this->assertEqual($arr[0]->getTitle(), $l1->getTitle());
 221      $this->assertEqual($arr[1]->getTitle(), $l2->getTitle());
 222      $this->assertEqual($l1->save_calls, 0);
 223      $this->assertEqual($l2->save_calls, 0);
 224  
 225      //...and not db yet

 226      $collection2 = new lmbAROneToManyCollection('lectures', $course);
 227      $this->assertEqual(sizeof($collection2->getArray()), 0);
 228  
 229      $collection->save();
 230  
 231      $collection3 = new lmbAROneToManyCollection('lectures', $course);
 232      $arr = $collection3->getArray();
 233      $this->assertEqual(sizeof($arr), 2);
 234      $this->assertEqual($arr[0]->getTitle(), $l1->getTitle());
 235      $this->assertEqual($arr[1]->getTitle(), $l2->getTitle());
 236  
 237      //check items not saved twice

 238      $collection->save();
 239  
 240      $this->assertEqual($l1->save_calls, 1);
 241      $this->assertEqual($l2->save_calls, 1);
 242  
 243      $collection4 = new lmbAROneToManyCollection('lectures', $course);
 244      $arr = $collection4->getArray();
 245      $this->assertEqual(sizeof($arr), 2);
 246      $this->assertEqual($arr[0]->getTitle(), $l1->getTitle());
 247      $this->assertEqual($arr[1]->getTitle(), $l2->getTitle());
 248    }
 249  
 250    function testLoadOnlyProperRecordsWithExistingOwner()
 251    {
 252      $l1 = $this->_createLecture();
 253      $l2 = $this->_createLecture();
 254  
 255      $course1 = $this->_createCourseAndSave(array($l1, $l2));
 256  
 257      $l3 = $this->_createLecture();
 258      $l4 = $this->_createLecture();
 259  
 260      $course2 = $this->_createCourseAndSave(array($l3, $l4));
 261  
 262      $collection1 = new lmbAROneToManyCollection('lectures', $course1);
 263      $this->assertEqual($collection1->count(), 2);
 264      $arr = $collection1->getArray();
 265      $this->assertEqual(sizeof($arr), 2);
 266      $this->assertEqual($arr[0]->getTitle(), $l1->getTitle());
 267      $this->assertEqual($arr[1]->getTitle(), $l2->getTitle());
 268  
 269      $collection2 = new lmbAROneToManyCollection('lectures', $course2);
 270      $this->assertEqual($collection2->count(), 2);
 271      $arr = $collection2->getArray();
 272      $this->assertEqual(sizeof($arr), 2);
 273      $this->assertEqual($arr[0]->getTitle(), $l3->getTitle());
 274      $this->assertEqual($arr[1]->getTitle(), $l4->getTitle());
 275    }
 276  
 277    function testCountWithExistingOwner()
 278    {
 279      $l1 = $this->_createLecture();
 280      $l2 = $this->_createLecture();
 281  
 282      $course = $this->_createCourseAndSave();
 283  
 284      $collection = new lmbAROneToManyCollection('lectures', $course);
 285      $collection->add($l1);
 286      $collection->add($l2);
 287  
 288      $this->assertEqual($collection->count(), 2);
 289    }
 290  
 291    function testCountWithNonSavedOwner()
 292    {
 293      $l1 = $this->_createLecture();
 294      $l2 = $this->_createLecture();
 295  
 296      $course = $this->_initCourse();
 297  
 298      $collection = new lmbAROneToManyCollection('lectures', $course);
 299      $this->assertEqual($collection->count(), 0);
 300  
 301      $collection->add($l1);
 302      $collection->add($l2);
 303  
 304      $this->assertEqual($collection->count(), 2);
 305    }
 306  
 307    function testImplementsCountable()
 308    {
 309      $l1 = $this->_createLecture();
 310      $l2 = $this->_createLecture();
 311  
 312      $course = $this->_initCourse();
 313      $collection = new lmbAROneToManyCollection('lectures', $course);
 314  
 315      $this->assertEqual(sizeof($collection), 0);
 316  
 317      $collection->add($l1);
 318      $collection->add($l2);
 319  
 320      $this->assertEqual(sizeof($collection), 2);
 321    }
 322  
 323    function testPartiallyImplementsArrayAccess()
 324    {
 325      $l1 = $this->_createLecture();
 326      $l2 = $this->_createLecture();
 327  
 328      $course = $this->_initCourse();
 329      $collection = new lmbAROneToManyCollection('lectures', $course);
 330  
 331      $collection[] = $l1;
 332      $collection[] = $l2;
 333  
 334      $this->assertEqual($collection[0]->getId(), $l1->getId());
 335      $this->assertEqual($collection[1]->getId(), $l2->getId());
 336      $this->assertNull($collection[2]);
 337  
 338      $this->assertTrue(isset($collection[0]));
 339      $this->assertTrue(isset($collection[1]));
 340      $this->assertFalse(isset($collection[2]));
 341  
 342      //we can't really implement just every php array use case

 343      $this->assertNull($collection['foo']);
 344      $this->assertFalse(isset($collection['foo']));
 345      $collection[3] = 'foo';
 346      $this->assertNull($collection[3]);
 347    }
 348  
 349    function testRemoveAllWithExistingOwner()
 350    {
 351      $l1 = $this->_createLecture();
 352      $l2 = $this->_createLecture();
 353  
 354      $course = $this->_createCourseAndSave(array($l1, $l2));
 355  
 356      $collection = new lmbAROneToManyCollection('lectures', $course);
 357      $collection->removeAll();
 358  
 359      $course2 = lmbActiveRecord :: findById('CourseForTest', $course->getId());
 360  
 361      $collection = new lmbAROneToManyCollection('lectures', $course2);
 362      $this->assertEqual(sizeof($collection->getArray()), 0);
 363    }
 364  
 365    function testRemoveAllWithNonSavedOwner()
 366    {
 367      $l1 = $this->_createLecture();
 368      $l2 = $this->_createLecture();
 369  
 370      $course = $this->_createCourse();
 371  
 372      $collection = new lmbAROneToManyCollection('lectures', $course);
 373      $collection->add($l1);
 374