Source of file EmbargoExpiryExtensionTest.php
Size: 20,761 Bytes - Last Modified: 2021-12-23T10:27:04+00:00
/var/www/docs.ssmods.com/process/src/tests/php/Extension/EmbargoExpiryExtensionTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618 | <?php namespace Terraformers\EmbargoExpiry\Tests\Extension; use Exception; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Core\Config\Config; use SilverStripe\Dev\SapphireTest; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\FormAction; use SilverStripe\Forms\LiteralField; use SilverStripe\Forms\TabSet; use SilverStripe\ORM\FieldType\DBDatetime; use SilverStripe\ORM\ValidationException; use SilverStripe\ORM\ValidationResult; use Symbiote\QueuedJobs\Services\QueuedJobService; use Terraformers\EmbargoExpiry\Extension\EmbargoExpiryExtension; use Terraformers\EmbargoExpiry\Tests\Fake\TestQueuedJobService; use DateTimeImmutable; /** * Class EmbargoExpiryExtensionTest * * @package Terraformers\EmbargoExpiry\Tests\Extension */ class EmbargoExpiryExtensionTest extends SapphireTest { /** * @var string */ protected static $fixture_file = 'EmbargoExpiryExtensionTest.yml'; /** * @var array */ protected static $required_extensions = [ SiteTree::class => [ EmbargoExpiryExtension::class, ], ]; /** * @throws Exception */ protected function setUp(): void { parent::setUp(); DBDatetime::set_mock_now('2014-01-05 12:00:00'); // This doesn't play nicely with PHPUnit Config::modify()->set(QueuedJobService::class, 'use_shutdown_function', false); } protected function tearDown(): void { DBDatetime::clear_mock_now(); parent::tearDown(); } /** * @return TestQueuedJobService */ protected function getService(): TestQueuedJobService { return singleton(TestQueuedJobService::class); } public function testGetIsPublishScheduled(): void { /** @var SiteTree|EmbargoExpiryExtension $page1 */ $page1 = $this->objFromFixture(SiteTree::class, 'scheduledPublish1'); /** @var SiteTree|EmbargoExpiryExtension $page2 */ $page2 = $this->objFromFixture(SiteTree::class, 'scheduledPublish2'); $this->assertTrue($page1->getIsPublishScheduled()); $this->assertTrue($page2->getIsPublishScheduled()); } public function testGetIsUnPublishScheduled(): void { /** @var SiteTree|EmbargoExpiryExtension $page1 */ $page1 = $this->objFromFixture(SiteTree::class, 'scheduledUnPublish1'); /** @var SiteTree|EmbargoExpiryExtension $page2 */ $page2 = $this->objFromFixture(SiteTree::class, 'scheduledUnPublish2'); $this->assertTrue($page1->getIsUnPublishScheduled()); $this->assertTrue($page2->getIsUnPublishScheduled()); } /** * @throws ValidationException */ public function testJobCreation(): void { /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'home'); $page->DesiredPublishDate = '2014-02-05 12:00:00'; $page->DesiredUnPublishDate = '2014-03-05 12:00:00'; $page->write(); $this->assertNotEquals(0, $page->PublishJobID); $this->assertNotEquals(0, $page->UnPublishJobID); } /** * @throws ValidationException */ public function testIsEditableNoEmbargo(): void { /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'home'); $page->write(); $this->assertNull($page->isEditable()); } /** * @throws ValidationException */ public function testIsEditableWithEmbargo(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', true); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'home'); $page->DesiredPublishDate = '2014-02-05 12:00:00'; $page->write(); $this->assertNull($page->isEditable()); } /** * @throws ValidationException */ public function testIsNotEditableWithEmbargo(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', false); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'home'); $page->DesiredPublishDate = '2014-02-05 12:00:00'; $page->write(); $this->assertFalse($page->isEditable()); } /** * @throws ValidationException * @throws Exception */ public function testPublishJobProcesses(): void { $service = $this->getService(); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'embargo1'); // PublishDate is in the past, so it should be run immediately when we initialise it. $page->DesiredPublishDate = '2014-01-01 12:00:00'; $page->write(); // Make sure we're not published before the Job runs. $this->assertFalse((bool) $page->isPublished()); $this->assertNotEquals(0, $page->PublishJobID); $job = $service->testInit($page->PublishJob()); $id = $service->queueJob($job); $service->runJob($id); // We should now be published. $this->assertTrue((bool) $page->isPublished()); } /** * @throws ValidationException * @throws Exception */ public function testUnPublishJobProcesses(): void { $service = $this->getService(); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'expiryEmpty'); // UnPublishDate is in the past, so it should be run immediately when we initialise it. $page->DesiredUnPublishDate = '2014-01-01 12:00:00'; $page->write(); $page->publishSingle(); // Make sure we're published before the Job runs. $this->assertTrue((bool) $page->isPublished()); $this->assertNotEquals(0, $page->UnPublishJobID); $job = $service->testInit($page->UnPublishJob()); $id = $service->queueJob($job); $service->runJob($id); // We should now be un-published. $this->assertFalse((bool) $page->isPublished()); } public function testUpdateCMSFields(): void { /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'idfields'); $fields = $page->getCMSFields(); $this->assertNull($fields->dataFieldByName('PublishJobID')); $this->assertNull($fields->dataFieldByName('UnPublishJobID')); } public function testMessageConditionsCanEdit(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', true); $this->logOut(); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'messages1'); $fields = new FieldList(); $page->addNoticeOrWarningFields($fields); $fieldsArray = $fields->toArray(); $this->assertCount(1, $fieldsArray); /** @var LiteralField $literalField */ $literalField = $fieldsArray[0]; $content = $literalField->getContent(); $time = new DateTimeImmutable(); $expectedEmbargoMessage = sprintf('Embargo</strong>: 2014-01-07 12:00 %s', $time->getTimezone()->getName()); $expectedExpiryMessage = sprintf('Embargo</strong>: 2014-01-07 12:00 %s', $time->getTimezone()->getName()); $this->assertNotContains('cannot currently be edited', $content); $this->assertContains($expectedEmbargoMessage, $content); $this->assertContains($expectedExpiryMessage, $content); } public function testMessageConditionsCannotEditGuest(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', false); $this->logOut(); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'messages1'); $fields = new FieldList(); $page->addNoticeOrWarningFields($fields); $fieldsArray = $fields->toArray(); $this->assertCount(1, $fieldsArray); /** @var LiteralField $literalField */ $literalField = $fieldsArray[0]; $content = $literalField->getContent(); $time = new DateTimeImmutable(); $expectedEmbargoMessage = sprintf('Embargo</strong>: 2014-01-07 12:00 %s', $time->getTimezone()->getName()); $expectedExpiryMessage = sprintf('Embargo</strong>: 2014-01-07 12:00 %s', $time->getTimezone()->getName()); $this->assertContains('cannot currently be edited', $content); $this->assertContains('An administrator will need', $content); $this->assertContains($expectedEmbargoMessage, $content); $this->assertContains($expectedExpiryMessage, $content); } public function testMessageConditionsCannotEditAdmin(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', false); $this->logInWithPermission('ADMIN'); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'messages1'); $fields = new FieldList(); $page->addNoticeOrWarningFields($fields); $fieldsArray = $fields->toArray(); $this->assertCount(1, $fieldsArray); /** @var LiteralField $literalField */ $literalField = $fieldsArray[0]; $content = $literalField->getContent(); $now = new DateTimeImmutable(); $expectedEmbargoMessage = sprintf('Embargo</strong>: 2014-01-07 12:00 %s', $now->getTimezone()->getName()); $expectedExpiryMessage = sprintf('Embargo</strong>: 2014-01-07 12:00 %s', $now->getTimezone()->getName()); $this->assertContains('cannot currently be edited', $content); $this->assertContains('You will need to remove', $content); $this->assertContains($expectedEmbargoMessage, $content); $this->assertContains($expectedExpiryMessage, $content); } public function testMessageConditionsWarning(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', false); $this->logInWithPermission('ADMIN'); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'messages2'); $fields = new FieldList(); $page->addNoticeOrWarningFields($fields); $fieldsArray = $fields->toArray(); $this->assertCount(1, $fieldsArray); /** @var LiteralField $literalField */ $literalField = $fieldsArray[0]; $content = $literalField->getContent(); $time = new DateTimeImmutable(); $expectedEmbargoMessage = sprintf( 'Embargo</strong>: 2014-01-03 12:00 %s<strong> (this date is in the', $time->getTimezone()->getName() ); $expectedExpiryMessage = sprintf( 'Expiry</strong>: 2014-01-04 12:00 %s<strong> (this date is in the', $time->getTimezone()->getName() ); // Test that the two warning messages were added. $this->assertContains($expectedEmbargoMessage, $content); $this->assertContains($expectedExpiryMessage, $content); } public function testEmbargoExpiryFieldNoticeMessageNotEditable(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', false); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'scheduledPublish1'); $this->assertNull($page->getEmbargoExpiryFieldNoticeMessage()); } public function testEmbargoExpiryFieldNoticeMessageWithPermission(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', true); $this->logInWithPermission('ADMIN'); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'scheduledPublish1'); $message = $page->getEmbargoExpiryFieldNoticeMessage(); $this->assertNotNull($message); $this->assertContains('Enter a date and/or time', $message); } public function testEmbargoExpiryFieldNoticeMessageWithoutPermission(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', true); $this->logOut(); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'scheduledPublish1'); $message = $page->getEmbargoExpiryFieldNoticeMessage(); $this->assertNotNull($message); $this->assertContains('Please contact an administrator', $message); } public function testAddDesiredDateFieldsWithoutPermission(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', false); $this->logOut(); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'fields1'); $fields = new FieldList([TabSet::create('Root')]); $page->addDesiredDateFields($fields); $publishField = $fields->dataFieldByName('DesiredPublishDate'); $unPublishField = $fields->dataFieldByName('DesiredUnPublishDate'); $this->assertNotNull($publishField); $this->assertTrue($publishField->isReadonly()); $this->assertNotNull($unPublishField); $this->assertTrue($unPublishField->isReadonly()); } public function testAddScheduledDateFieldsWithoutPermission(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', false); $this->logOut(); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'fields1'); $fields = new FieldList([TabSet::create('Root')]); $page->addScheduledDateFields($fields); $this->assertNotNull($fields->dataFieldByName('PublishOnDate')); $this->assertNotNull($fields->dataFieldByName('UnPublishOnDate')); } public function testAddDesiredDateFieldsWithPermission(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', false); $this->logInWithPermission('ADMIN'); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'fields1'); $fields = new FieldList([TabSet::create('Root')]); $page->addDesiredDateFields($fields); $publishField = $fields->dataFieldByName('DesiredPublishDate'); $unPublishField = $fields->dataFieldByName('DesiredUnPublishDate'); $this->assertNotNull($publishField); $this->assertFalse($publishField->isReadonly()); $this->assertNotNull($unPublishField); $this->assertFalse($unPublishField->isReadonly()); } public function testAddScheduledDateFieldsWithPermission(): void { Config::modify()->set(SiteTree::class, 'allow_embargoed_editing', false); $this->logInWithPermission('ADMIN'); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'fields1'); $fields = new FieldList([TabSet::create('Root')]); $page->addScheduledDateFields($fields); $this->assertNotNull($fields->dataFieldByName('PublishOnDate')); $this->assertNotNull($fields->dataFieldByName('UnPublishOnDate')); } public function testUpdateCMSActionsWithoutPermission(): void { $this->logOut(); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'fields1'); $actions = $page->getCMSActions(); $this->assertNull($actions->fieldByName('action_removeEmbargoAction')); $this->assertNull($actions->fieldByName('action_removeExpiryAction')); } public function testUpdateCMSActionsWithPermission(): void { $this->logInWithPermission('ADMIN'); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'fields1'); $actions = $page->getCMSActions(); $this->assertNotNull($actions->fieldByName('action_removeEmbargoAction')); $this->assertNotNull($actions->fieldByName('action_removeExpiryAction')); } public function testValidatePass(): void { Config::modify()->set(SiteTree::class, 'enforce_sequential_dates', true); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'validatePass'); $validationResult = new ValidationResult(); $page->extend('validate', $validationResult); $this->assertTrue($validationResult->isValid()); } public function testValidateFailDesired(): void { Config::modify()->set(SiteTree::class, 'enforce_sequential_dates', true); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'validateFail1'); $validationResult = new ValidationResult(); $page->extend('validate', $validationResult); $this->assertFalse($validationResult->isValid()); } public function testValidateFailSetDate(): void { Config::modify()->set(SiteTree::class, 'enforce_sequential_dates', true); /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'validateFail2'); $validationResult = new ValidationResult(); $page->extend('validate', $validationResult); $this->assertFalse($validationResult->isValid()); } public function testEmbargoMessagePassed(): void { /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'embargo1'); $time = new DateTimeImmutable(); $expectedConditions = []; $expectedConditions['embargo'] = [ 'date' => sprintf('2014-01-03 12:00 %s', $time->getTimezone()->getName()), 'warning' => true, 'name' => 'embargo', ]; $this->assertEquals( $expectedConditions, $page->getEmbargoExpiryNoticeFieldConditions(), '', // default value 0.0, // default value 10, // default value true // sort both arrays so that the order of items doesn't matter ); } public function testEmbargoMessageFuture(): void { /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'embargo2'); $time = new DateTimeImmutable(); $expectedConditions = []; $expectedConditions['embargo'] = [ 'date' => sprintf('2014-01-08 12:00 %s', $time->getTimezone()->getName()), 'warning' => false, 'name' => 'embargo', ]; $this->assertEquals( $expectedConditions, $page->getEmbargoExpiryNoticeFieldConditions(), '', // default value 0.0, // default value 10, // default value true // sort both arrays so that the order of items doesn't matter ); } public function testExpiryMessagePassed(): void { /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'expiry1'); $time = new DateTimeImmutable(); $expectedConditions = []; $expectedConditions['expiry'] = [ 'date' => sprintf('2014-01-03 12:00 %s', $time->getTimezone()->getName()), 'warning' => true, 'name' => 'expiry', ]; $this->assertEquals( $expectedConditions, $page->getEmbargoExpiryNoticeFieldConditions(), '', // default value 0.0, // default value 10, // default value true // sort both arrays so that the order of items doesn't matter ); } public function testExpiryMessageFuture(): void { /** @var SiteTree|EmbargoExpiryExtension $page */ $page = $this->objFromFixture(SiteTree::class, 'expiry2'); $time = new DateTimeImmutable(); $expectedConditions = []; $expectedConditions['expiry'] = [ 'date' => sprintf('2014-01-08 12:00 %s', $time->getTimezone()->getName()), 'warning' => false, 'name' => 'expiry', ]; $this->assertEquals( $expectedConditions, $page->getEmbargoExpiryNoticeFieldConditions(), '', // default value 0.0, // default value 10, // default value true // sort both arrays so that the order of items doesn't matter ); } } |