Source of file FluentSiteTreeExtensionTest.php
Size: 17,928 Bytes - Last Modified: 2021-12-23T10:53:31+00:00
/var/www/docs.ssmods.com/process/src/tests/php/Extension/FluentSiteTreeExtensionTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 | <?php namespace TractorCow\Fluent\Tests\Extension; use Page; use SilverStripe\CMS\Forms\SiteTreeURLSegmentField; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Control\Director; use SilverStripe\Core\Config\Config; use SilverStripe\Dev\SapphireTest; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\LiteralField; use SilverStripe\ORM\ArrayList; use SilverStripe\ORM\DataObject; use TractorCow\Fluent\Extension\FluentDirectorExtension; use TractorCow\Fluent\Extension\FluentSiteTreeExtension; use TractorCow\Fluent\Extension\FluentVersionedExtension; use TractorCow\Fluent\Model\Domain; use TractorCow\Fluent\Model\Locale; use TractorCow\Fluent\Model\RecordLocale; use TractorCow\Fluent\State\FluentState; // Skip if pages module not installed if (!class_exists(SiteTree::class)) { return; } class FluentSiteTreeExtensionTest extends SapphireTest { protected static $fixture_file = 'FluentSiteTreeExtensionTest.yml'; protected static $required_extensions = [ SiteTree::class => [ FluentSiteTreeExtension::class, ], ]; protected function setUp() { parent::setUp(); Config::modify() ->set(Director::class, 'alternate_base_url', 'http://mocked') ->set(FluentDirectorExtension::class, 'disable_default_prefix', false); // Clear cache Locale::clearCached(); Domain::clearCached(); (new FluentVersionedExtension)->flushCache(); FluentState::singleton() ->setLocale('de_DE') ->setIsDomainMode(false); } public function testGetLocaleInformation() { FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('de_DE') ->setIsDomainMode(false); /** @var Page|FluentSiteTreeExtension $page */ $page = $this->objFromFixture(Page::class, 'nz-page'); $result = $page->LocaleInformation('en_NZ'); $this->assertInstanceOf(RecordLocale::class, $result); $this->assertEquals('en_NZ', $result->getLocale()); $this->assertEquals('en-nz', $result->getLocaleRFC1766()); $this->assertEquals('en-nz', $result->getHrefLang()); $this->assertEquals('English (New Zealand)', $result->getTitle()); $this->assertEquals('English', $result->getLanguageNative()); $this->assertEquals('en', $result->getLanguage()); $this->assertEquals('/newzealand/a-page/', $result->getLink()); $this->assertEquals('http://mocked/newzealand/a-page/', $result->getAbsoluteLink()); $this->assertEquals('link', $result->getLinkingMode()); $this->assertEquals('newzealand', $result->getURLSegment()); }); } public function testGetLocales() { FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('de_DE') ->setIsDomainMode(false); /** @var Page|FluentSiteTreeExtension $page */ $page = $this->objFromFixture(Page::class, 'nz-page'); $result = $page->Locales(); $this->assertInstanceOf(ArrayList::class, $result); $this->assertCount(5, $result); $this->assertListEquals([ ['Locale' => 'en_NZ'], ['Locale' => 'de_DE'], ['Locale' => 'en_US'], ['Locale' => 'es_ES'], ['Locale' => 'zh_CN'], ], $result); }); } /** * Tests for url generation * * @return array list of tests with values: * - domain (or false for non-domain mode) * - locale * - disable_default_prefix flag * - page id * - expected link */ public function provideURLTests() { return [ // Non-domain tests [null, 'de_DE', false, 'home', '/german/'], [null, 'de_DE', false, 'about', '/german/about-us/'], [null, 'de_DE', false, 'staff', '/german/about-us/my-staff/'], // Since de_DE is the only locale on the www.example.de domain, ensure that the locale // isn't unnecessarily added to the link. // In this case disable_default_prefix is ignored // See https://github.com/tractorcow/silverstripe-fluent/issues/75 ['www.example.de', 'de_DE', false, 'home', '/'], ['www.example.de', 'de_DE', false, 'about', '/about-us/'], ['www.example.de', 'de_DE', false, 'staff', '/about-us/my-staff/'], // Test domains with multiple locales // - es_ES non default locale ['www.example.com', 'es_ES', false, 'home', '/es_ES/'], ['www.example.com', 'es_ES', false, 'about', '/es_ES/about-us/'], ['www.example.com', 'es_ES', false, 'staff', '/es_ES/about-us/my-staff/'], // - en_US default locale ['www.example.com', 'en_US', false, 'home', '/usa/'], ['www.example.com', 'en_US', false, 'about', '/usa/about-us/'], ['www.example.com', 'en_US', false, 'staff', '/usa/about-us/my-staff/'], // - en_US default locale, but with disable_default_prefix on ['www.example.com', 'en_US', true, 'home', '/'], ['www.example.com', 'en_US', true, 'about', '/about-us/'], ['www.example.com', 'en_US', true, 'staff', '/about-us/my-staff/'], // Test cross-domain links include the opposing domain // - to default locale ['www.example.de', 'en_US', true, 'home', 'http://www.example.com/'], ['www.example.de', 'en_US', true, 'staff', 'http://www.example.com/about-us/my-staff/'], // - to non defalut locale ['www.example.de', 'es_ES', true, 'home', 'http://www.example.com/es_ES/'], ['www.example.de', 'es_ES', true, 'staff', 'http://www.example.com/es_ES/about-us/my-staff/'], ]; } /** * Test that URLS for pages are generated correctly * * @dataProvider provideURLTests * @param string $domain * @param string $locale * @param bool $prefixDisabled * @param string $pageName * @param string $url */ public function testFluentURLs($domain, $locale, $prefixDisabled, $pageName, $url) { FluentState::singleton()->withState( function (FluentState $newState) use ($domain, $locale, $prefixDisabled, $pageName, $url) { $newState ->setLocale($locale) ->setDomain($domain) ->setIsDomainMode(!empty($domain)); // Set url generation option Config::modify() ->set(FluentDirectorExtension::class, 'disable_default_prefix', $prefixDisabled); /** @var Page|FluentSiteTreeExtension $page */ $page = $this->objFromFixture(Page::class, $pageName); $this->assertEquals($url, $page->Link()); } ); } public function testUpdateStatusFlagsFluentInvisible() { /** @var Page|FluentSiteTreeExtension $page */ $page = $this->objFromFixture(Page::class, 'home'); $flags = $page->getStatusFlags(); $this->assertArrayHasKey('fluentinvisible', $flags); } public function testStatusMessageNotVisible() { FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('en_NZ') ->setIsDomainMode(false); /** @var Page|FluentSiteTreeExtension $page */ $page = $this->objFromFixture(Page::class, 'staff'); $page->config() ->set('locale_published_status_message', true) ->set('frontend_publish_required', true); $fields = $page->getCMSFields(); /** @var LiteralField $statusMessage */ $statusMessage = $fields->fieldByName('LocaleStatusMessage'); $this->assertNotNull($statusMessage, 'Locale message was not added'); $this->assertContains('This page will not be visible', $statusMessage->getContent()); }); } public function testStatusMessageUnknown() { FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('en_NZ') ->setIsDomainMode(false); /** @var Page|FluentSiteTreeExtension $page */ $page = $this->objFromFixture(Page::class, 'home'); $page->config() ->set('locale_published_status_message', true) ->set('frontend_publish_required', false); $fields = $page->getCMSFields(); /** @var LiteralField $statusMessage */ $statusMessage = $fields->fieldByName('LocaleStatusMessage'); $this->assertNotNull($fields->fieldByName('LocaleStatusMessage')); $this->assertContains('No content is available for this page', $statusMessage->getContent()); }); } public function testStatusMessageDrafted() { FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('en_NZ') ->setIsDomainMode(false); /** @var Page|FluentSiteTreeExtension $page */ $page = $this->objFromFixture(Page::class, 'home'); $page->config() ->set('locale_published_status_message', true) ->set('frontend_publish_required', false); $page->write(); $fields = $page->getCMSFields(); /** @var LiteralField $statusMessage */ $statusMessage = $fields->fieldByName('LocaleStatusMessage'); $this->assertNotNull($fields->fieldByName('LocaleStatusMessage')); $this->assertContains('A draft has been created for this locale', $statusMessage->getContent()); }); } public function testUpdateCMSActionsInherited() { /** @var Page|FluentSiteTreeExtension $page */ $page = $this->objFromFixture(Page::class, 'home'); $actions = $page->getCMSActions(); /** @var \SilverStripe\Forms\CompositeField $majorActions */ $majorActions = $actions->fieldByName('MajorActions'); $this->assertNotNull($majorActions); $actionSave = $majorActions->getChildren()->fieldByName('action_save'); $actionPublish = $majorActions->getChildren()->fieldByName('action_publish'); $this->assertNotNull($actionSave); $this->assertNotNull($actionPublish); $this->assertEquals('Copy to draft', $actionSave->Title()); $this->assertEquals('Copy & publish', $actionPublish->Title()); } public function testUpdateCMSActionsDrafted() { /** @var Page|FluentSiteTreeExtension $page */ $page = $this->objFromFixture(Page::class, 'about'); $actions = $page->getCMSActions(); /** @var \SilverStripe\Forms\CompositeField $majorActions */ $majorActions = $actions->fieldByName('MajorActions'); $this->assertNotNull($majorActions); $actionSave = $majorActions->getChildren()->fieldByName('action_save'); $actionPublish = $majorActions->getChildren()->fieldByName('action_publish'); $this->assertNotNull($actionSave); $this->assertNotNull($actionPublish); $this->assertEquals('Saved', $actionSave->Title()); // The default value changed between SS 4.0 and 4.1 - assert it contains Publish instead of exact matching $this->assertContains('publish', strtolower($actionPublish->Title())); } /** * @param string $localeCode * @param string $fixture * @param string $expected * @dataProvider localePrefixUrlProvider */ public function testAddLocalePrefixToUrlSegment($localeCode, $fixture, $expected) { FluentState::singleton()->withState( function (FluentState $newState) use ($localeCode, $fixture, $expected) { $newState ->setLocale($localeCode) ->setIsDomainMode(true); /** @var FieldList $fields */ $fields = $this->objFromFixture(Page::class, $fixture)->getCMSFields(); /** @var SiteTreeURLSegmentField $segmentField */ $segmentField = $fields->fieldByName('Root.Main.URLSegment'); $this->assertInstanceOf(SiteTreeURLSegmentField::class, $segmentField); $this->assertSame($expected, $segmentField->getURLPrefix()); } ); } public function testHomeVisibleOnFrontendBothConfigFalse() { Config::modify()->set(DataObject::class, 'cms_localisation_required', false); Config::modify()->set(DataObject::class, 'frontend_publish_required', false); FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('de_DE') ->setIsDomainMode(false) ->setIsFrontend(true); $page = Page::get()->filter('URLSegment', 'home')->first(); $this->assertNotNull($page); }); } public function testHomeVisibleOnFrontendOneConfigFalse() { Config::modify()->set(DataObject::class, 'cms_localisation_required', true); Config::modify()->set(DataObject::class, 'frontend_publish_required', false); FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('de_DE') ->setIsDomainMode(false) ->setIsFrontend(true); $page = Page::get()->filter('URLSegment', 'home')->first(); $this->assertNotNull($page); }); } public function testHomeNotVisibleOnFrontendBothConfigTrue() { Config::modify()->set(DataObject::class, 'cms_localisation_required', true); Config::modify()->set(DataObject::class, 'frontend_publish_required', true); FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('de_DE') ->setIsDomainMode(false) ->setIsFrontend(true); $page = Page::get()->filter('URLSegment', 'home')->first(); $this->assertNull($page); }); } public function testHomeNotVisibleOnFrontendOneConfigTrue() { Config::modify()->set(DataObject::class, 'cms_localisation_required', false); Config::modify()->set(DataObject::class, 'frontend_publish_required', true); FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('de_DE') ->setIsDomainMode(false) ->setIsFrontend(true); $page = Page::get()->filter('URLSegment', 'home')->first(); $this->assertNull($page); }); } public function testHomeVisibleInCMSBothConfigFalse() { Config::modify()->set(DataObject::class, 'cms_localisation_required', false); Config::modify()->set(DataObject::class, 'frontend_publish_required', false); FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('de_DE') ->setIsDomainMode(false) ->setIsFrontend(false); $page = Page::get()->filter('URLSegment', 'home')->first(); $this->assertNotNull($page); }); } public function testHomeVisibleInCMSOneConfigFalse() { Config::modify()->set(DataObject::class, 'cms_localisation_required', false); Config::modify()->set(DataObject::class, 'frontend_publish_required', true); FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('de_DE') ->setIsDomainMode(false) ->setIsFrontend(false); $page = Page::get()->filter('URLSegment', 'home')->first(); $this->assertNotNull($page); }); } public function testHomeNotVisibleInCMSBothConfigTrue() { Config::modify()->set(DataObject::class, 'cms_localisation_required', true); Config::modify()->set(DataObject::class, 'frontend_publish_required', true); FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('de_DE') ->setIsDomainMode(false) ->setIsFrontend(false); $page = Page::get()->filter('URLSegment', 'home')->first(); $this->assertNull($page); }); } public function testHomeNotVisibleInCMSOneConfigTrue() { Config::modify()->set(DataObject::class, 'cms_localisation_required', true); Config::modify()->set(DataObject::class, 'frontend_publish_required', false); FluentState::singleton()->withState(function (FluentState $newState) { $newState ->setLocale('de_DE') ->setIsDomainMode(false) ->setIsFrontend(false); $page = Page::get()->filter('URLSegment', 'home')->first(); $this->assertNull($page); }); } /** * @return array[] */ public function localePrefixUrlProvider() { return [ 'locale_with_domain' => ['en_US', 'about', 'http://www.example.com/usa/'], 'locale_without_domain' => ['zh_CN', 'about', 'http://mocked/zh_CN/'], 'locale_alone_on_domain_nested' => ['de_DE', 'staff', 'http://www.example.de/about-us/'], ]; } } |