2010-09-16 05:40:34 +02:00
|
|
|
<?php
|
|
|
|
|
2016-10-14 03:30:05 +02:00
|
|
|
namespace SilverStripe\ORM\Tests;
|
|
|
|
|
2016-06-15 06:03:16 +02:00
|
|
|
use SilverStripe\ORM\DataObject;
|
2016-08-19 00:51:35 +02:00
|
|
|
use SilverStripe\Dev\SapphireTest;
|
2016-06-15 06:03:16 +02:00
|
|
|
|
2010-09-16 05:40:34 +02:00
|
|
|
class DataObjectDuplicationTest extends SapphireTest {
|
2013-06-03 14:48:52 +02:00
|
|
|
|
|
|
|
protected $usesDatabase = true;
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2011-03-23 04:32:24 +01:00
|
|
|
protected $extraDataObjects = array(
|
2016-10-14 03:30:05 +02:00
|
|
|
DataObjectDuplicationTest\Class1::class,
|
|
|
|
DataObjectDuplicationTest\Class2::class,
|
|
|
|
DataObjectDuplicationTest\Class3::class
|
2011-03-23 04:32:24 +01:00
|
|
|
);
|
2010-09-16 05:40:34 +02:00
|
|
|
|
2013-04-30 18:45:22 +02:00
|
|
|
public function testDuplicate() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$orig = new DataObjectDuplicationTest\Class1();
|
2013-04-30 18:45:22 +02:00
|
|
|
$orig->text = 'foo';
|
|
|
|
$orig->write();
|
|
|
|
|
|
|
|
$duplicate = $orig->duplicate();
|
2016-10-14 03:30:05 +02:00
|
|
|
$this->assertInstanceOf(DataObjectDuplicationTest\Class1::class, $duplicate,
|
2013-04-30 18:45:22 +02:00
|
|
|
'Creates the correct type'
|
|
|
|
);
|
|
|
|
$this->assertNotEquals($duplicate->ID, $orig->ID,
|
|
|
|
'Creates a unique record'
|
|
|
|
);
|
|
|
|
$this->assertEquals('foo', $duplicate->text,
|
|
|
|
'Copies fields'
|
|
|
|
);
|
2016-10-14 03:30:05 +02:00
|
|
|
$this->assertEquals(2, DataObjectDuplicationTest\Class1::get()->Count(),
|
2013-04-30 18:45:22 +02:00
|
|
|
'Only creates a single duplicate'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2013-06-03 14:48:52 +02:00
|
|
|
public function testDuplicateHasOne() {
|
2016-10-14 03:30:05 +02:00
|
|
|
$relationObj = new DataObjectDuplicationTest\Class1();
|
2013-06-03 14:48:52 +02:00
|
|
|
$relationObj->text = 'class1';
|
|
|
|
$relationObj->write();
|
|
|
|
|
2016-10-14 03:30:05 +02:00
|
|
|
$orig = new DataObjectDuplicationTest\Class2();
|
2013-06-03 14:48:52 +02:00
|
|
|
$orig->text = 'class2';
|
|
|
|
$orig->oneID = $relationObj->ID;
|
|
|
|
$orig->write();
|
|
|
|
|
|
|
|
$duplicate = $orig->duplicate();
|
|
|
|
$this->assertEquals($relationObj->ID, $duplicate->oneID,
|
|
|
|
'Copies has_one relationship'
|
|
|
|
);
|
2016-10-14 03:30:05 +02:00
|
|
|
$this->assertEquals(2, DataObjectDuplicationTest\Class2::get()->Count(),
|
2013-06-03 14:48:52 +02:00
|
|
|
'Only creates a single duplicate'
|
|
|
|
);
|
2016-10-14 03:30:05 +02:00
|
|
|
$this->assertEquals(1, DataObjectDuplicationTest\Class1::get()->Count(),
|
2013-06-03 14:48:52 +02:00
|
|
|
'Does not create duplicate of has_one relationship'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function testDuplicateManyManyClasses() {
|
2010-09-16 05:40:34 +02:00
|
|
|
//create new test classes below
|
2016-10-14 03:30:05 +02:00
|
|
|
$one = new DataObjectDuplicationTest\Class1();
|
|
|
|
$two = new DataObjectDuplicationTest\Class2();
|
|
|
|
$three = new DataObjectDuplicationTest\Class3();
|
2010-09-16 05:40:34 +02:00
|
|
|
|
|
|
|
//set some simple fields
|
|
|
|
$text1 = "Test Text 1";
|
|
|
|
$text2 = "Test Text 2";
|
|
|
|
$text3 = "Test Text 3";
|
|
|
|
$one->text = $text1;
|
|
|
|
$two->text = $text2;
|
|
|
|
$three->text = $text3;
|
|
|
|
|
|
|
|
//write the to DB
|
|
|
|
$one->write();
|
|
|
|
$two->write();
|
|
|
|
$three->write();
|
|
|
|
|
|
|
|
//create relations
|
|
|
|
$one->twos()->add($two);
|
|
|
|
$one->threes()->add($three);
|
|
|
|
|
|
|
|
$one = DataObject::get_by_id("DataObjectDuplicateTestClass1", $one->ID);
|
|
|
|
$two = DataObject::get_by_id("DataObjectDuplicateTestClass2", $two->ID);
|
|
|
|
$three = DataObject::get_by_id("DataObjectDuplicateTestClass3", $three->ID);
|
|
|
|
|
|
|
|
//test duplication
|
|
|
|
$oneCopy = $one->duplicate();
|
|
|
|
$twoCopy = $two->duplicate();
|
|
|
|
$threeCopy = $three->duplicate();
|
|
|
|
|
|
|
|
$oneCopy = DataObject::get_by_id("DataObjectDuplicateTestClass1", $oneCopy->ID);
|
|
|
|
$twoCopy = DataObject::get_by_id("DataObjectDuplicateTestClass2", $twoCopy->ID);
|
|
|
|
$threeCopy = DataObject::get_by_id("DataObjectDuplicateTestClass3", $threeCopy->ID);
|
|
|
|
|
|
|
|
$this->assertNotNull($oneCopy, "Copy of 1 exists");
|
|
|
|
$this->assertNotNull($twoCopy, "Copy of 2 exists");
|
|
|
|
$this->assertNotNull($threeCopy, "Copy of 3 exists");
|
|
|
|
|
|
|
|
$this->assertEquals($text1, $oneCopy->text);
|
|
|
|
$this->assertEquals($text2, $twoCopy->text);
|
|
|
|
$this->assertEquals($text3, $threeCopy->text);
|
|
|
|
|
2012-09-26 23:34:00 +02:00
|
|
|
$this->assertNotEquals($one->twos()->Count(), $oneCopy->twos()->Count(),
|
|
|
|
"Many-to-one relation not copied (has_many)");
|
|
|
|
$this->assertEquals($one->threes()->Count(), $oneCopy->threes()->Count(),
|
|
|
|
"Object has the correct number of relations");
|
|
|
|
$this->assertEquals($three->ones()->Count(), $threeCopy->ones()->Count(),
|
|
|
|
"Object has the correct number of relations");
|
|
|
|
|
|
|
|
$this->assertEquals($one->ID, $twoCopy->one()->ID,
|
|
|
|
"Match between relation of copy and the original");
|
|
|
|
$this->assertEquals(0, $oneCopy->twos()->Count(),
|
|
|
|
"Many-to-one relation not copied (has_many)");
|
|
|
|
$this->assertEquals($three->ID, $oneCopy->threes()->First()->ID,
|
|
|
|
"Match between relation of copy and the original");
|
|
|
|
$this->assertEquals($one->ID, $threeCopy->ones()->First()->ID,
|
|
|
|
"Match between relation of copy and the original");
|
2010-09-16 05:40:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|