Source of file DuplicationTest.php
Size: 8,360 Bytes - Last Modified: 2021-12-23T10:53:31+00:00
/var/www/docs.ssmods.com/process/src/tests/php/Extension/LocalisedCopyTest/DuplicationTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 | <?php namespace TractorCow\Fluent\Tests\Extension\LocalisedCopyTest; use SilverStripe\Dev\SapphireTest; use TractorCow\Fluent\Extension\FluentExtension; use TractorCow\Fluent\State\FluentState; class DuplicationTest extends SapphireTest { /** * @var string */ protected static $fixture_file = 'DuplicationTest.yml'; /** * @var array */ protected static $extra_dataobjects = [ Animal::class, Horse::class, Steed::class, Tail::class, Saddle::class, ]; /** * @var array */ protected static $required_extensions = [ Animal::class => [ FluentExtension::class, ], ]; protected function setUp(): void { FluentState::singleton()->withState(function (FluentState $state): void { $state->setLocale('en_NZ'); parent::setUp(); }); } /** * case: new object with defined relation is created * desired outcome: no additional changes * * @param bool $active * @dataProvider copyStateProvider */ public function testCreateWithDefinedRelation(bool $active): void { FluentState::singleton()->withState(function (FluentState $state) use ($active): void { $state->setLocale('en_NZ'); $tail = Tail::create(); $tail->Title = 'New Tail'; $tail->write(); $tails = Tail::get()->sort('ID', 'DESC'); $tailsCount = (int) $tails->count(); $horse = Horse::create(); $horse->Title = 'New Horse'; $horse->TailID = $tail->ID; $horse->withLocalisedCopyState(function () use ($horse, $active) { $horse->setLocalisedCopyActive($active); $horse->write(); }); $this->assertCount($tailsCount, $tails); $this->assertGreaterThan(0, $horse->TailID); $this->assertEquals((int) $tail->ID, (int) $horse->TailID); }); } /** * case: existing object with defined relation is localised into a new / existing locale * desired outcome: * * if localised copy is active * a new duplicted related object is created for the target locale * * if localised copy is inactive * desired outcome: no additional changes * * @param string $locale * @param bool $duplicated * @param bool $active * @dataProvider localesProvider */ public function testEditWithDefinedRelation(string $locale, bool $duplicated, bool $active): void { FluentState::singleton()->withState(function (FluentState $state) use ($locale, $duplicated, $active): void { $state->setLocale($locale); $tails = Tail::get()->sort('ID', 'DESC'); $tailsCount = (int) $tails->count(); /** @var Horse|FluentExtension $horse */ $horse = $this->objFromFixture(Horse::class, 'horse1'); $horse->Title = 'Edited Title'; $horse->withLocalisedCopyState(function () use ($horse, $active) { $horse->setLocalisedCopyActive($active); $horse->write(); }); /** @var Tail $oldTail */ $oldTail = $this->objFromFixture(Tail::class, 'tail1'); $this->assertGreaterThan(0, $horse->TailID); if ($duplicated) { $this->assertCount($tailsCount + 1, $tails); $newTail = $tails->first(); $this->assertNotEquals((int) $oldTail->ID, (int) $horse->TailID); $this->assertEquals((int) $newTail->ID, (int) $horse->TailID); return; } $this->assertCount($tailsCount, $tails); $this->assertEquals((int) $oldTail->ID, (int) $horse->TailID); }); } /** * case: new object with inherited relation is created * desired outcome: no additional changes * * @param bool $active * @dataProvider copyStateProvider */ public function testCreateWithInheritedRelation(bool $active): void { FluentState::singleton()->withState(function (FluentState $state) use ($active): void { $state->setLocale('en_NZ'); $tail = Tail::create(); $tail->Title = 'New Tail'; $tail->write(); $saddle = Saddle::create(); $saddle->Title = 'New Saddle'; $saddle->write(); $tails = Tail::get()->sort('ID', 'DESC'); $tailsCount = (int) $tails->count(); $saddles = Saddle::get()->sort('ID', 'DESC'); $saddlesCount = (int) $saddles->count(); $steed = Steed::create(); $steed->Title = 'New Steed'; $steed->TailID = $tail->ID; $steed->SaddleID = $saddle->ID; $steed->withLocalisedCopyState(function () use ($steed, $active) { $steed->setLocalisedCopyActive($active); $steed->write(); }); $this->assertCount($tailsCount, $tails); $this->assertCount($saddlesCount, $saddles); $this->assertGreaterThan(0, $steed->TailID); $this->assertGreaterThan(0, $steed->SaddleID); $this->assertEquals((int) $tail->ID, (int) $steed->TailID); $this->assertEquals((int) $saddle->ID, (int) $steed->SaddleID); }); } /** * case: existing object with inherited relation is localised into a new / existing locale * desired outcome: * * if localised copy is active * a new duplicted related object is created for the target locale * * if localised copy is inactive * desired outcome: no additional changes * * @param string $locale * @param bool $duplicated * @param bool $active * @dataProvider localesProvider */ public function testEditWithInheritedRelation(string $locale, bool $duplicated, bool $active): void { FluentState::singleton()->withState(function (FluentState $state) use ($locale, $duplicated, $active): void { $state->setLocale($locale); $tails = Tail::get()->sort('ID', 'DESC'); $tailsCount = (int) $tails->count(); $saddles = Saddle::get()->sort('ID', 'DESC'); $saddlesCount = (int) $saddles->count(); /** @var Steed|FluentExtension $steed */ $steed = $this->objFromFixture(Steed::class, 'steed1'); $steed->Title = 'Edited Title'; $steed->withLocalisedCopyState(function () use ($steed, $active) { $steed->setLocalisedCopyActive($active); $steed->write(); }); /** @var Tail $tail */ $oldTail = $this->objFromFixture(Tail::class, 'tail2'); /** @var Saddle $tail */ $oldSaddle = $this->objFromFixture(Saddle::class, 'saddle1'); $this->assertGreaterThan(0, $steed->TailID); $this->assertGreaterThan(0, $steed->SaddleID); if ($duplicated) { $this->assertCount($tailsCount + 1, $tails); $this->assertCount($saddlesCount + 1, $saddles); $newTail = $tails->first(); $newSaddle = $saddles->first(); $this->assertNotEquals((int) $oldTail->ID, (int) $steed->TailID); $this->assertNotEquals((int) $oldSaddle->ID, (int) $steed->SaddleID); $this->assertEquals((int) $newTail->ID, (int) $steed->TailID); $this->assertEquals((int) $newSaddle->ID, (int) $steed->SaddleID); return; } $this->assertCount($tailsCount, $tails); $this->assertCount($saddlesCount, $saddles); $this->assertEquals((int) $oldTail->ID, (int) $steed->TailID); $this->assertEquals((int) $oldSaddle->ID, (int) $steed->SaddleID); }); } public function localesProvider(): array { return [ ['en_NZ', false, true], ['en_NZ', false, false], ['ja_JP', false, false], ['ja_JP', true, true], ]; } public function copyStateProvider(): array { return [ [false], [true], ]; } } |