From bd2843488428e9d12b10fcb98d88ec9334b57ed4 Mon Sep 17 00:00:00 2001 From: Sean Harvey Date: Tue, 4 Aug 2009 06:27:40 +0000 Subject: [PATCH] MINOR Merged in DataObjectDecorator tests from trunk git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.3@83720 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- tests/DataObjectDecoratorTest.php | 85 +++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) diff --git a/tests/DataObjectDecoratorTest.php b/tests/DataObjectDecoratorTest.php index 30d348921..2e2a3dd62 100644 --- a/tests/DataObjectDecoratorTest.php +++ b/tests/DataObjectDecoratorTest.php @@ -20,10 +20,17 @@ class DataObjectDecoratorTest extends SapphireTest { $contact->write(); $object->ContactID = $contact->ID; $object->write(); - + + $contactID = $contact->ID; unset($contact); + unset($object); - $contact = DataObject::get_one("DataObjectDecoratorTest_Member", "Website='http://www.example.com'"); + $contact = DataObject::get_one("DataObjectDecoratorTest_Member", "Website = 'http://www.example.com'"); + $object = DataObject::get_one('DataObjectDecoratorTest_RelatedObject', "ContactID = {$contactID}"); + + $this->assertNotNull($object, 'Related object not null'); + $this->assertType('DataObjectDecoratorTest_Member', $object->Contact(), 'Related contact is a member dataobject'); + $this->assertType('DataObjectDecoratorTest_Member', $object->getComponent('Contact'), 'getComponent does the same thing as Contact()'); $this->assertType('DataObjectDecoratorTest_RelatedObject', $contact->RelatedObjects()->First()); $this->assertEquals("Lorem ipsum dolor", $contact->RelatedObjects()->First()->FieldOne); @@ -31,6 +38,53 @@ class DataObjectDecoratorTest extends SapphireTest { $contact->delete(); } + function testManyManyAssociationWithDecorator() { + $parent = new DataObjectDecoratorTest_MyObject(); + $parent->Title = 'My Title'; + $parent->write(); + + $this->assertEquals(0, $parent->Faves()->Count()); + + $homepage = $this->objFromFixture('Page', 'home'); + $firstpage = $this->objFromFixture('Page', 'page1'); + + $parent->Faves()->add($homepage->ID); + $this->assertEquals(1, $parent->Faves()->Count()); + + $parent->Faves()->add($firstpage->ID); + $this->assertEquals(2, $parent->Faves()->Count()); + + $parent->Faves()->remove($firstpage->ID); + $this->assertEquals(1, $parent->Faves()->Count()); + } + + /** + * Test {@link Object::add_extension()} has loaded DataObjectDecorator statics correctly. + */ + function testAddExtensionLoadsStatics() { + // Object::add_extension() will load DOD statics directly, so let's try adding a decorator on the fly + Object::add_extension('DataObjectDecoratorTest_Player', 'DataObjectDecoratorTest_PlayerDecorator'); + + // Now that we've just added the decorator, we need to rebuild the database + $da = new DatabaseAdmin(); + $da->doBuild(true, false, true); + + // Create a test record with decorated fields, writing to the DB + $player = new DataObjectDecoratorTest_Player(); + $player->setField('Name', 'Joe'); + $player->setField('DateBirth', '1990-5-10'); + $player->Address = '123 somewhere street'; + $player->write(); + + unset($player); + + // Pull the record out of the DB and examine the decorated fields + $player = DataObject::get_one('DataObjectDecoratorTest_Player', "Name = 'Joe'"); + $this->assertEquals($player->DateBirth, '1990-05-10'); + $this->assertEquals($player->Address, '123 somewhere street'); + $this->assertEquals($player->Status, 'Goalie'); + } + /** * Test that DataObject::$api_access can be set to true via a decorator */ @@ -82,6 +136,31 @@ class DataObjectDecoratorTest_Member extends DataObject implements TestOnly { } +class DataObjectDecoratorTest_Player extends DataObject implements TestOnly { + + static $db = array( + 'Name' => 'Varchar' + ); + +} + +class DataObjectDecoratorTest_PlayerDecorator extends DataObjectDecorator implements TestOnly { + + function extraStatics() { + return array( + 'db' => array( + 'Address' => 'Text', + 'DateBirth' => 'Date', + 'Status' => "Enum('Shooter,Goalie')" + ), + 'defaults' => array( + 'Status' => 'Goalie' + ) + ); + } + +} + class DataObjectDecoratorTest_ContactRole extends DataObjectDecorator implements TestOnly { function extraStatics() { @@ -188,4 +267,4 @@ class DataObjectDecoratorTest_Faves extends DataObjectDecorator implements TestO DataObject::add_extension('DataObjectDecoratorTest_MyObject', 'DataObjectDecoratorTest_Ext1'); DataObject::add_extension('DataObjectDecoratorTest_MyObject', 'DataObjectDecoratorTest_Ext2'); DataObject::add_extension('DataObjectDecoratorTest_MyObject', 'DataObjectDecoratorTest_Faves'); -?> \ No newline at end of file +?>