2009-06-02 05:45:38 +02:00
|
|
|
<?php
|
|
|
|
/**
|
2012-04-12 08:02:46 +02:00
|
|
|
* @package framework
|
2009-06-02 05:45:38 +02:00
|
|
|
* @subpackage tests
|
|
|
|
*/
|
|
|
|
class CompositeDBFieldTest extends SapphireTest {
|
2010-04-12 04:03:16 +02:00
|
|
|
|
|
|
|
protected $extraDataObjects = array(
|
|
|
|
'CompositeDBFieldTest_DataObject',
|
|
|
|
'SubclassedDBFieldObject',
|
|
|
|
);
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testHasDatabaseFieldOnDataObject() {
|
2009-06-02 05:45:38 +02:00
|
|
|
$obj = singleton('CompositeDBFieldTest_DataObject');
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2009-06-02 05:45:38 +02:00
|
|
|
$this->assertTrue($obj->hasDatabaseField('MyMoneyAmount'));
|
|
|
|
$this->assertTrue($obj->hasDatabaseField('MyMoneyCurrency'));
|
|
|
|
$this->assertFalse($obj->hasDatabaseField('MyMoney'));
|
2015-09-04 05:49:22 +02:00
|
|
|
|
|
|
|
// Check that nested fields are exposed properly
|
|
|
|
$this->assertTrue($obj->dbObject('MyMoney')->hasField('Amount'));
|
|
|
|
$this->assertTrue($obj->dbObject('MyMoney')->hasField('Currency'));
|
|
|
|
|
2015-09-10 05:46:23 +02:00
|
|
|
// Test getField accessor
|
|
|
|
$this->assertTrue($obj->MyMoney instanceof Money);
|
|
|
|
$this->assertTrue($obj->MyMoney->hasField('Amount'));
|
|
|
|
$obj->MyMoney->Amount = 100.00;
|
|
|
|
$this->assertEquals(100.00, $obj->MyMoney->Amount);
|
|
|
|
$this->assertEquals(100.00, $obj->MyMoneyAmount);
|
|
|
|
|
2015-09-04 05:49:22 +02:00
|
|
|
// Not strictly correct
|
|
|
|
$this->assertFalse($obj->dbObject('MyMoney')->hasField('MyMoneyAmount'));
|
|
|
|
$this->assertFalse($obj->dbObject('MyMoney')->hasField('MyMoneyCurrency'));
|
|
|
|
$this->assertFalse($obj->dbObject('MyMoney')->hasField('MyMoney'));
|
2009-06-02 05:45:38 +02:00
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2009-08-11 10:49:52 +02:00
|
|
|
/**
|
|
|
|
* Test DataObject::composite_fields() and DataObject::is_composite_field()
|
|
|
|
*/
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testCompositeFieldMetaDataFunctions() {
|
2009-08-11 10:49:52 +02:00
|
|
|
$this->assertEquals('Money', DataObject::is_composite_field('CompositeDBFieldTest_DataObject', 'MyMoney'));
|
2015-09-10 05:46:23 +02:00
|
|
|
$this->assertFalse(DataObject::is_composite_field('CompositeDBFieldTest_DataObject', 'Title'));
|
2015-09-04 05:49:22 +02:00
|
|
|
$this->assertEquals(
|
|
|
|
array(
|
|
|
|
'MyMoney' => 'Money',
|
|
|
|
'OverriddenMoney' => 'Money'
|
|
|
|
),
|
|
|
|
DataObject::composite_fields('CompositeDBFieldTest_DataObject')
|
|
|
|
);
|
2009-08-11 10:49:52 +02:00
|
|
|
|
|
|
|
|
|
|
|
$this->assertEquals('Money', DataObject::is_composite_field('SubclassedDBFieldObject', 'MyMoney'));
|
|
|
|
$this->assertEquals('Money', DataObject::is_composite_field('SubclassedDBFieldObject', 'OtherMoney'));
|
2015-09-10 05:46:23 +02:00
|
|
|
$this->assertFalse(DataObject::is_composite_field('SubclassedDBFieldObject', 'Title'));
|
|
|
|
$this->assertFalse(DataObject::is_composite_field('SubclassedDBFieldObject', 'OtherField'));
|
2015-09-04 05:49:22 +02:00
|
|
|
$this->assertEquals(
|
|
|
|
array(
|
|
|
|
'MyMoney' => 'Money',
|
|
|
|
'OtherMoney' => 'Money',
|
|
|
|
'OverriddenMoney' => 'Money',
|
|
|
|
),
|
|
|
|
DataObject::composite_fields('SubclassedDBFieldObject')
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Tests that changes to the fields affect the underlying dataobject, and vice versa
|
|
|
|
*/
|
|
|
|
public function testFieldBinding() {
|
|
|
|
$object = new CompositeDBFieldTest_DataObject();
|
|
|
|
$object->MyMoney->Currency = 'NZD';
|
|
|
|
$object->MyMoney->Amount = 100.0;
|
|
|
|
$this->assertEquals('NZD', $object->MyMoneyCurrency);
|
|
|
|
$this->assertEquals(100.0, $object->MyMoneyAmount);
|
|
|
|
$object->write();
|
|
|
|
|
|
|
|
$object2 = CompositeDBFieldTest_DataObject::get()->byID($object->ID);
|
|
|
|
$this->assertEquals('NZD', $object2->MyMoney->Currency);
|
|
|
|
$this->assertEquals(100.0, $object2->MyMoney->Amount);
|
|
|
|
|
|
|
|
$object2->MyMoneyCurrency = 'USD';
|
|
|
|
$this->assertEquals('USD', $object2->MyMoney->Currency);
|
|
|
|
|
|
|
|
$object2->MyMoney->setValue(array('Currency' => 'EUR', 'Amount' => 200.0));
|
|
|
|
$this->assertEquals('EUR', $object2->MyMoneyCurrency);
|
|
|
|
$this->assertEquals(200.0, $object2->MyMoneyAmount);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Ensures that composite fields are assigned to the correct tables
|
|
|
|
*/
|
|
|
|
public function testInheritedTables() {
|
|
|
|
$object1 = new CompositeDBFieldTest_DataObject();
|
|
|
|
$object2 = new SubclassedDBFieldObject();
|
|
|
|
|
|
|
|
$this->assertEquals('CompositeDBFieldTest_DataObject', $object1->dbObject('MyMoney')->getTable());
|
|
|
|
$this->assertEquals('CompositeDBFieldTest_DataObject', $object1->dbObject('OverriddenMoney')->getTable());
|
|
|
|
$this->assertEquals('CompositeDBFieldTest_DataObject', $object2->dbObject('MyMoney')->getTable());
|
|
|
|
$this->assertEquals('SubclassedDBFieldObject', $object2->dbObject('OtherMoney')->getTable());
|
|
|
|
$this->assertEquals('SubclassedDBFieldObject', $object2->dbObject('OverriddenMoney')->getTable());
|
2009-08-11 10:49:52 +02:00
|
|
|
}
|
2009-06-02 05:45:38 +02:00
|
|
|
}
|
|
|
|
|
2015-02-12 14:15:32 +01:00
|
|
|
class CompositeDBFieldTest_DataObject extends DataObject implements TestOnly {
|
2013-03-21 19:48:54 +01:00
|
|
|
private static $db = array(
|
2014-08-15 08:53:05 +02:00
|
|
|
'Title' => 'Text',
|
|
|
|
'MyMoney' => 'Money',
|
2015-09-04 05:49:22 +02:00
|
|
|
'OverriddenMoney' => 'Money'
|
2009-06-02 05:45:38 +02:00
|
|
|
);
|
|
|
|
}
|
2009-08-11 10:49:52 +02:00
|
|
|
|
|
|
|
class SubclassedDBFieldObject extends CompositeDBFieldTest_DataObject {
|
2013-03-21 19:48:54 +01:00
|
|
|
private static $db = array(
|
2014-08-15 08:53:05 +02:00
|
|
|
'OtherField' => 'Text',
|
|
|
|
'OtherMoney' => 'Money',
|
2015-09-04 05:49:22 +02:00
|
|
|
'OverriddenMoney' => 'Money'
|
2009-08-11 10:49:52 +02:00
|
|
|
);
|
|
|
|
}
|