silverstripe-subsites/tests/php/SubsiteAdminFunctionalTest.php

202 lines
7.9 KiB
PHP
Raw Permalink Normal View History

<?php
namespace SilverStripe\Subsites\Tests;
use Page;
2017-06-01 15:57:53 +02:00
use SilverStripe\CMS\Controllers\CMSPageEditController;
2016-09-22 16:38:29 +02:00
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\FunctionalTest;
2017-05-24 15:26:28 +02:00
use SilverStripe\Subsites\Model\Subsite;
2017-05-24 15:25:34 +02:00
2017-05-24 15:26:28 +02:00
class SubsiteAdminFunctionalTest extends FunctionalTest
{
protected static $fixture_file = 'SubsiteTest.yml';
2017-05-24 15:26:28 +02:00
2017-06-01 15:57:53 +02:00
protected $autoFollowRedirection = false;
2017-05-24 15:26:28 +02:00
2021-10-27 07:24:03 +02:00
protected function setUp(): void
2018-03-26 14:51:20 +02:00
{
parent::setUp();
// Ensure all pages are published
/** @var Page $page */
foreach (Page::get() as $page) {
$page->publishSingle();
}
}
2017-05-24 15:26:28 +02:00
/**
* Helper: FunctionalTest is only able to follow redirection once, we want to go all the way.
* @param string $url
2017-06-01 15:10:07 +02:00
* @return \SilverStripe\Control\HTTPResponse
2017-05-24 15:26:28 +02:00
*/
2017-05-29 13:42:42 +02:00
public function getAndFollowAll($url)
2017-05-24 15:26:28 +02:00
{
$response = $this->get($url);
while ($location = $response->getHeader('Location')) {
$response = $this->mainSession->followRedirection();
}
echo $response->getHeader('Location');
2017-06-01 15:57:53 +02:00
return $response;
}
2017-05-24 15:26:28 +02:00
/**
* Anonymous user cannot access anything.
*/
2017-05-29 13:42:42 +02:00
public function testAnonymousIsForbiddenAdminAccess()
2017-05-24 15:26:28 +02:00
{
$this->logOut();
2017-05-24 15:26:28 +02:00
$response = $this->getAndFollowAll('admin/pages/?SubsiteID=0');
2021-10-27 07:24:03 +02:00
$this->assertStringContainsString('Security/login', $this->mainSession->lastUrl(), 'Admin is disallowed');
2017-05-24 15:26:28 +02:00
$subsite1 = $this->objFromFixture(Subsite::class, 'subsite1');
$response = $this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}");
2021-10-27 07:24:03 +02:00
$this->assertStringContainsString('Security/login', $this->mainSession->lastUrl(), 'Admin is disallowed');
2017-05-24 15:26:28 +02:00
$response = $this->getAndFollowAll('admin/subsite_xhr');
2021-10-27 07:24:03 +02:00
$this->assertStringContainsString(
'Security/login',
$this->mainSession->lastUrl(),
'SubsiteXHRController is disallowed'
);
2017-05-24 15:26:28 +02:00
}
/**
* Admin should be able to access all subsites and the main site
*/
2017-05-29 13:42:42 +02:00
public function testAdminCanAccessAllSubsites()
2017-05-24 15:26:28 +02:00
{
$this->logInAs('admin');
2017-05-24 15:26:28 +02:00
$this->getAndFollowAll('admin/pages/?SubsiteID=0');
$this->assertEquals(0, $this->session()->get('SubsiteID'), 'Can access main site.');
2021-10-27 07:24:03 +02:00
$this->assertStringContainsString('admin/pages', $this->mainSession->lastUrl(), 'Lands on the correct section');
2017-05-24 15:26:28 +02:00
$subsite1 = $this->objFromFixture(Subsite::class, 'subsite1');
$this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}");
// Check the session manually, since the state is unique to the request, not this test
$this->assertEquals($subsite1->ID, $this->session()->get('SubsiteID'), 'Can access other subsite.');
2021-10-27 07:24:03 +02:00
$this->assertStringContainsString('admin/pages', $this->mainSession->lastUrl(), 'Lands on the correct section');
$response = $this->getAndFollowAll('admin/subsite_xhr');
2021-10-27 07:24:03 +02:00
$this->assertStringNotContainsString(
'Security/login',
$this->mainSession->lastUrl(),
'SubsiteXHRController is reachable'
);
2017-05-24 15:26:28 +02:00
}
2017-05-29 13:42:42 +02:00
public function testAdminIsRedirectedToObjectsSubsite()
2017-05-24 15:26:28 +02:00
{
$this->logInAs('admin');
2017-05-24 15:26:28 +02:00
$mainSubsitePage = $this->objFromFixture(Page::class, 'mainSubsitePage');
$subsite1Home = $this->objFromFixture(Page::class, 'subsite1_home');
2017-05-24 15:26:28 +02:00
// Requesting a page from another subsite will redirect to that subsite
Config::modify()->set(CMSPageEditController::class, 'treats_subsite_0_as_global', false);
$response = $this->get("admin/pages/edit/show/$subsite1Home->ID");
$this->assertEquals(302, $response->getStatusCode());
2021-10-27 07:24:03 +02:00
$this->assertStringContainsString(
'admin/pages/edit/show/' . $subsite1Home->ID . '?SubsiteID=' . $subsite1Home->SubsiteID,
$response->getHeader('Location')
);
2017-05-24 15:26:28 +02:00
// Loading a non-main-site object still switches the subsite if configured with treats_subsite_0_as_global
Config::modify()->set(CMSPageEditController::class, 'treats_subsite_0_as_global', true);
$response = $this->get("admin/pages/edit/show/$subsite1Home->ID");
$this->assertEquals(302, $response->getStatusCode());
2021-10-27 07:24:03 +02:00
$this->assertStringContainsString(
'admin/pages/edit/show/' . $subsite1Home->ID . '?SubsiteID=' . $subsite1Home->SubsiteID,
$response->getHeader('Location')
);
2017-05-24 15:26:28 +02:00
// Loading a main-site object does not change the subsite if configured with treats_subsite_0_as_global
$response = $this->get("admin/pages/edit/show/$mainSubsitePage->ID");
$this->assertEquals(200, $response->getStatusCode());
2017-06-01 15:57:53 +02:00
}
2017-05-24 15:26:28 +02:00
/**
* User which has AccessAllSubsites set to 1 should be able to access all subsites and main site,
* even though he does not have the ADMIN permission.
*/
2017-05-29 13:42:42 +02:00
public function testEditorCanAccessAllSubsites()
2017-05-24 15:26:28 +02:00
{
$this->logInAs('editor');
2017-05-24 15:26:28 +02:00
$this->get('admin/pages/?SubsiteID=0');
$this->assertEquals(0, $this->session()->get('SubsiteID'), 'Can access main site.');
2021-10-27 07:24:03 +02:00
$this->assertStringContainsString('admin/pages', $this->mainSession->lastUrl(), 'Lands on the correct section');
2017-05-24 15:26:28 +02:00
$subsite1 = $this->objFromFixture(Subsite::class, 'subsite1');
$this->get("admin/pages/?SubsiteID={$subsite1->ID}");
$this->assertEquals($subsite1->ID, $this->session()->get('SubsiteID'), 'Can access other subsite.');
2021-10-27 07:24:03 +02:00
$this->assertStringContainsString('admin/pages', $this->mainSession->lastUrl(), 'Lands on the correct section');
2017-05-24 15:26:28 +02:00
$response = $this->get('admin/subsite_xhr');
2021-10-27 07:24:03 +02:00
$this->assertStringNotContainsString(
'Security/login',
$this->mainSession->lastUrl(),
'SubsiteXHRController is reachable'
);
2017-05-24 15:26:28 +02:00
}
/**
* Test a member who only has access to one subsite (subsite1) and only some sections (pages and security).
*/
2017-05-29 13:42:42 +02:00
public function testSubsiteAdmin()
2017-05-24 15:26:28 +02:00
{
$this->markTestSkipped('wip');
$this->logInAs('subsite1member');
2017-05-24 15:26:28 +02:00
$subsite1 = $this->objFromFixture(Subsite::class, 'subsite1');
2017-06-01 15:57:53 +02:00
// Check allowed URL.
$this->getAndFollowAll("admin/pages/?SubsiteID={$subsite1->ID}");
$this->assertEquals($subsite1->ID, $this->session()->get('SubsiteID'), 'Can access own subsite.');
2021-10-27 07:24:03 +02:00
$this->assertStringContainsString(
'admin/pages',
$this->mainSession->lastUrl(),
'Can access permitted section.'
);
2017-06-01 15:57:53 +02:00
// Check forbidden section in allowed subsite.
$this->getAndFollowAll("admin/assets/?SubsiteID={$subsite1->ID}");
$this->assertEquals($subsite1->ID, $this->session()->get('SubsiteID'), 'Is redirected within subsite.');
$this->assertNotContains(
'admin/assets',
$this->mainSession->lastUrl(),
'Is redirected away from forbidden section'
);
2017-06-01 15:57:53 +02:00
// Check forbidden site, on a section that's allowed on another subsite
$this->getAndFollowAll('admin/pages/?SubsiteID=0');
$this->assertEquals(
$this->session()->get('SubsiteID'),
$subsite1->ID,
'Is redirected to permitted subsite.'
);
2017-06-01 15:57:53 +02:00
// Check forbidden site, on a section that's not allowed on any other subsite
$this->getAndFollowAll('admin/assets/?SubsiteID=0');
$this->assertEquals(
$this->session()->get('SubsiteID'),
$subsite1->ID,
'Is redirected to first permitted subsite.'
);
2021-10-27 07:24:03 +02:00
$this->assertStringNotContainsString('Security/login', $this->mainSession->lastUrl(), 'Is not denied access');
2017-05-24 15:26:28 +02:00
// Check the standalone XHR controller.
$response = $this->getAndFollowAll('admin/subsite_xhr');
2021-10-27 07:24:03 +02:00
$this->assertStringNotContainsString(
'Security/login',
$this->mainSession->lastUrl(),
'SubsiteXHRController is reachable'
);
2017-05-24 15:26:28 +02:00
}
}