| [ 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/dbal/src/lmbSimpleDb.class.php'); 11 lmb_require('limb/core/src/lmbSet.class.php'); 12 require_once(dirname(__FILE__) . '/lmbActiveRecordTest.class.php'); 13 require_once(dirname(__FILE__) . '/lmbAROneToManyRelationsTest.class.php'); 14 require_once(dirname(__FILE__) . '/lmbAROneToOneRelationsTest.class.php'); 15 require_once(dirname(__FILE__) . '/lmbARManyToManyRelationsTest.class.php'); 16 require_once(dirname(__FILE__) . '/lmbARValueObjectTest.class.php'); 17 require_once(dirname(__FILE__) . '/lmbARAttributesLazyLoadingTest.class.php'); 18 19 class lmbARImportTest extends UnitTestCase 20 { 21 protected $db; 22 23 function setUp() 24 { 25 $this->db = new lmbSimpleDb(lmbToolkit :: instance()->getDefaultDbConnection()); 26 $this->_dbCleanUp(); 27 } 28 29 function tearDown() 30 { 31 $this->_dbCleanUp(); 32 } 33 34 function _dbCleanUp() 35 { 36 lmbActiveRecord :: delete('TestOneTableObject'); 37 lmbActiveRecord :: delete('CourseForTest'); 38 lmbActiveRecord :: delete('LectureForTest'); 39 lmbActiveRecord :: delete('GroupForTest'); 40 lmbActiveRecord :: delete('UserForTest'); 41 lmbActiveRecord :: delete('LessonForTest'); 42 lmbActiveRecord :: delete('PersonForTest'); 43 lmbActiveRecord :: delete('SocialSecurityForTest'); 44 } 45 46 function testImportingObjectCallsItsExportMethod() 47 { 48 $object = new TestOneTableObject(); 49 $object->import(new lmbSet(array('annotation' => 'Some annotation'))); 50 $this->assertEqual($object->getAnnotation(), 'Some annotation'); 51 } 52 53 function testImportNewActiveRecord() 54 { 55 $object1 = new TestOneTableObject(); 56 $object1->setId(100); //note this 57 $object1->setAnnotation($annotation = 'Some annotation'); 58 59 $object2 = new TestOneTableObject(); 60 $object2->import($object1); 61 $this->assertEqual($object2->getId(), $object1->getId()); 62 $this->assertEqual($object2->getAnnotation(), $annotation); 63 $this->assertTrue($object2->isNew()); 64 $this->assertTrue($object2->isDirty()); 65 } 66 67 function testImportExistingActiveRecord() 68 { 69 $object1 = new TestOneTableObject(); 70 $object1->setAnnotation($annotation = 'Some annotation'); 71 $object1->save(); 72 73 $object2 = new TestOneTableObject(); 74 $object2->import($object1); 75 $this->assertEqual($object2->getId(), $object1->getId()); 76 $this->assertEqual($object2->getAnnotation(), $annotation); 77 $this->assertFalse($object2->isNew()); 78 $this->assertTrue($object2->isDirty()); 79 } 80 81 function testPassingActiveRecordToConstructorCallsImport() 82 { 83 $object1 = new TestOneTableObject(); 84 $object1->setAnnotation($annotation = 'Some annotation'); 85 $object1->save(); 86 87 $object2 = new TestOneTableObject($object1); 88 $this->assertEqual($object2->getId(), $object1->getId()); 89 $this->assertEqual($object2->getAnnotation(), $annotation); 90 $this->assertFalse($object2->isNew()); 91 $this->assertTrue($object2->isDirty()); 92 } 93 94 function testImportActiveRecordWithLazyAttributes() 95 { 96 $object = new LazyTestOneTableObject(); 97 $object->setContent($content = 'Some content'); 98 $object->setAnnotation($annotation = 'Some annotation'); 99 $object->save(); 100 101 $object1 = new LazyTestOneTableObject(); 102 $object2 = new LazyTestOneTableObject($object->getId()); 103 104 $object1->import($object2); 105 $this->assertFalse($object1->hasAttribute('annotation')); 106 $this->assertEqual($object1->getAnnotation(), $annotation); 107 $this->assertFalse($object1->hasAttribute('content')); 108 $this->assertEqual($object1->getContent(), $content); 109 } 110 111 function testImportOverwritesIdOfNewObject() 112 { 113 $object = new TestOneTableObject(); 114 $object->setId(1); 115 116 $source = array('id' => 1000, 117 'annotation' => 'Some annotation', 118 'content' => 'Some content', 119 ); 120 121 $object->import($source); 122 $this->assertEqual($object->getId(), 1000); 123 $this->assertEqual($object->getAnnotation(), 'Some annotation'); 124 $this->assertEqual($object->getContent(), 'Some content'); 125 $this->assertNull($object->getJunk()); 126 } 127 128 function testImportPreservesIdOfExistingObject() 129 { 130 $object = new TestOneTableObject(); 131 $object->setAnnotation('Initial annotation'); 132 $object->save(); 133 $id = $object->getId(); 134 135 $source = array('id' => 10000, 136 'annotation' => 'Some annotation', 137 'content' => 'Some content', 138 ); 139 140 $object->import($source); 141 $this->assertEqual($object->getId(), $id); 142 $this->assertNotEqual($object->getId(), 1000);// just one extra check 143 $this->assertEqual($object->getAnnotation(), 'Some annotation'); 144 $this->assertEqual($object->getContent(), 'Some content'); 145 } 146 147 function testPassingArrayToConstructorCallsImport() 148 { 149 $source = array('id' => 1000, 150 'annotation' => 'Some annotation', 151 'content' => 'Some content', 152 ); 153 154 $object = new TestOneTableObject($source); 155 $this->assertEqual($object->getId(), 1000); 156 $this->assertEqual($object->getAnnotation(), 'Some annotation'); 157 $this->assertEqual($object->getContent(), 'Some content'); 158 } 159 160 function testImportWhereOne2ManyCollectionIsArrayOfIds() 161 { 162 $course = new CourseForTest(); 163 $course->setTitle('Some course'); 164 165 $l1 = new LectureForTest(); 166 $l1->setTitle('Physics'); 167 $l2 = new LectureForTest(); 168 $l2->setTitle('Math'); 169 170 $course->addToLectures($l1); 171 $course->addToLectures($l2); 172 173 $course->save(); 174 175 $source = array('title' => $course->getTitle(), 176 'lectures' => array($l1->getId(), $l2->getId())); 177 178 $course2 = new CourseForTest(); 179 $course2->import($source); 180 $this->assertEqual($course2->getTitle(), $course->getTitle()); 181 $this->assertEqual($course2->getLectures()->count(), 2); 182 $this->assertEqual($course2->getLectures()->at(0)->getTitle(), $l1->getTitle()); 183 $this->assertEqual($course2->getLectures()->at(1)->getTitle(), $l2->getTitle()); 184 } 185 186 function testImportWhereOne2ManyCollectionIsMixedArray() 187 { 188 $course = new CourseForTest(); 189 $course->setTitle('Some course'); 190 191 $l1 = new LectureForTest(); 192 $l1->setTitle('Physics'); 193 $l2 = new LectureForTest(); 194 $l2->setTitle('Math'); 195 196 $course->addToLectures($l1); 197 $course->addToLectures($l2); 198 199 $course->save(); 200 201 $source = array('title' => $course->getTitle(), 202 'lectures' => array($l1->getId(), $l2)); 203 204 $course2 = new CourseForTest(); 205 $course2->import($source); 206 $this->assertEqual($course2->getTitle(), $course->getTitle()); 207 $this->assertEqual($course2->getLectures()->count(), 2); 208 $this->assertEqual($course2->getLectures()->at(0)->getTitle(), $l1->getTitle()); 209 $this->assertEqual($course2->getLectures()->at(1)->getTitle(), $l2->getTitle()); 210 } 211 212 function testImportResetsExistingOne2ManyCollection() 213 { 214 $course = new CourseForTest(); 215 $course->setTitle('Some course'); 216 217 $l1 = new LectureForTest(); 218 $l1->setTitle('Physics'); 219 $l2 = new LectureForTest(); 220 $l2->setTitle('Math'); 221 222 $course->addToLectures($l1); 223 $course->addToLectures($l2); 224 225 $course->save(); 226 227 $source = array('title' => $course->getTitle(), 228 'lectures' => array($l2->getId())); 229 230 $course2 = new CourseForTest($course->getId()); 231 232 $course2->import($source); 233 $this->assertEqual($course2->getTitle(), $course->getTitle()); 234 $this->assertEqual($course2->getLectures()->count(), 1); 235 $this->assertEqual($course2->getLectures()->at(0)->getTitle(), $l2->getTitle()); 236 } 237 238 function testImportResetsExistingMany2ManyCollection() 239 { 240 $group = new GroupForTest(); 241 $group->setTitle('Some group'); 242 243 $u1 = new UserForTest(); 244 $u1->setFirstName('Bob'); 245 $u2 = new UserForTest(); 246 $u2->setFirstName('John'); 247 248 $group->addToUsers($u1); 249 $group->addToUsers($u2); 250 251 $group->save(); 252 253 $source = array('title' => $group->getTitle(), 254 'users' => array($u2->getId())); 255 256 $group2 = new GroupForTest($group->getId()); 257 $group2->import($source); 258 $this->assertEqual($group2->getTitle(), $group->getTitle()); 259 $this->assertEqual($group2->getUsers()->count(), 1); 260 $this->assertEqual($group2->getUsers()->at(0)->getFirstName(), $u2->getFirstName()); 261 } 262 263 function testImportWhereOne2ManyParentIsNumericId() 264 { 265 $course = new CourseForTest(); 266 $course->setTitle('Some course'); 267 268 $l = new LectureForTest(); 269 $l->setTitle('Physics'); 270 $l->setCourse($course); 271 272 $l->save(); 273 274 $source = array('title' => $l->getTitle(), 275 'course' => $course->getId()); 276 277 $l2 = new LectureForTest(); 278 $l2->import($source); 279 280 $this->assertEqual($l2->getTitle(), $l->getTitle()); 281 $this->assertEqual($l2->getCourse()->getTitle(), $course->getTitle()); 282 } 283 284 function testImportWhereOne2ManyParentIsObject() 285 { 286 $course = new CourseForTest(); 287 $course->setTitle('Some course'); 288 289 $l = new LectureForTest(); 290 $l->setTitle('Physics'); 291 $l->setCourse($course); 292 293 $l->save(); 294 295 $source = array('title' => $l->getTitle(), 296 'course' => $course); 297 298 $l2 = new LectureForTest(); 299 $l2->import($source); 300 $this->assertEqual($l2->getTitle(), $l->getTitle()); 301 $this->assertEqual($l2->getCourse()->getTitle(), $course->getTitle()); 302 } 303 304 function testImportWhereMany2ManyCollectionIsArrayOfIds() 305 { 306 $user1 = new UserForTest(); 307 $user1->setFirstName('Bob'); 308 309 $g1 = new GroupForTest(); 310 $g1->setTitle('vp1'); 311 $g2 = new GroupForTest(); 312 $g2->setTitle('vp1'); 313 314 $user1->addToGroups($g1); 315 $user1->addToGroups($g2); 316 $user1->save(); 317 318 $source = array('first_name' => $user1->getFirstName(), 319 'groups' => array($g1->getId(), $g2->getId())); 320 321 $user2 = new UserForTest(); 322 $user2->import($source); 323 $this->assertEqual($user2->getFirstName(), $user1->getFirstName()); 324 $this->assertEqual($user2->getGroups()->count(), 2); 325 $this->assertEqual($user2->getGroups()->at(0)->getTitle(), $g1->getTitle()); 326 $this->assertEqual($user2->getGroups()->at(1)->getTitle(), $g2->getTitle()); 327 } 328 329 function testImportWhereMany2ManyCollectionIsMixedArray() 330 { 331 $user1 = new UserForTest(); 332 $user1->setFirstName('Bob'); 333 334 $g1 = new GroupForTest(); 335 $g1->setTitle('vp1'); 336 $g2 = new GroupForTest(); 337 $g2->setTitle('vp1'); 338 339 $user1->addToGroups($g1); 340 $user1->addToGroups($g2); 341 $user1->save(); 342 343 $source = array('first_name' => $user1->getFirstName(), 344 'groups' => array($g1->getId(), $g2)); 345 346 $user2 = new UserForTest(); 347 $user2->import($source); 348 $this->assertEqual($user2->getFirstName(), $user1->getFirstName()); 349 $this->assertEqual($user2->getGroups()->count(), 2); 350 $this->assertEqual($user2->getGroups()->at(0)->getTitle(), $g1->getTitle()); 351 $this->assertEqual($user2->getGroups()->at(1)->getTitle(), $g2->getTitle()); 352 } 353 354 function testImportOne2OneWhereParentIsNumericId() 355 { 356 $person = new PersonForTest(); 357 $person->setName('Jim'); 358 $number = new SocialSecurityForTest(); 359 $number->setCode('099123'); 360 $person->setSocialSecurity($number); 361 $person->save(); 362 363 $source = array('code' => $number->getCode(), 364 'person' => $person->getId()); 365 366 $number2 = new SocialSecurityForTest(); 367 $number2->import($source); 368 $this->assertEqual($number2->getCode(), $number->getCode()); 369 $this->assertEqual($number2->getPerson()->getName(), $person->getName()); 370 } 371 372 function testImportOne2OneWhereParentIsObject() 373 { 374 $person = new PersonForTest(); 375 $person->setName('Jim'); 376