Merge pull request #291 from creative-commoners/pulls/2.0/update-travis-config

Update Travis configuration for PHP 5.6-7.1, add composer dependencies and codecov.io config
This commit is contained in:
Damian Mooyman 2017-08-29 18:18:04 +12:00 committed by GitHub
commit 5cf2d87e59
42 changed files with 470 additions and 432 deletions

1
.gitattributes vendored
View File

@ -4,3 +4,4 @@
/.gitignore export-ignore /.gitignore export-ignore
/.travis.yml export-ignore /.travis.yml export-ignore
/.scrutinizer.yml export-ignore /.scrutinizer.yml export-ignore
/codecov.yml export-ignore

View File

@ -1,36 +1,55 @@
# See https://github.com/silverstripe/silverstripe-travis-support for setup details
language: php language: php
sudo: false addons:
firefox: "31.0"
sudo: false
php:
- 5.5
env: env:
global: global:
- CORE_RELEASE=4 - COMPOSER_ROOT_VERSION="4.0.x-dev"
matrix: - DISPLAY=":99"
- DB=MYSQL - XVFBARGS=":99 -ac -screen 0 1024x768x16"
- DB=PGSQL
matrix: matrix:
include: include:
- php: 5.5 - php: 5.6
env: DB=MYSQL BEHAT_TEST=1 env: DB=MYSQL PHPCS_TEST=1 PHPUNIT_TEST=1
- php: 7.0
env: DB=PGSQL PHPUNIT_TEST=1
- php: 7.1
env: DB=MYSQL PHPUNIT_COVERAGE_TEST=1
# @todo Fix behat
# - php: 7.0
# env: DB=MYSQL BEHAT_TEST=1
before_script: before_script:
- composer self-update || true
- phpenv rehash - phpenv rehash
- git clone git://github.com/silverstripe/silverstripe-travis-support.git ~/travis-support - phpenv config-rm xdebug.ini
- "if [ \"$BEHAT_TEST\" = \"\" ]; then php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss; fi" - echo 'memory_limit = 2G' >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
- "if [ \"$BEHAT_TEST\" = \"1\" ]; then php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss --require silverstripe/behat-extension; fi"
- cd ~/builds/ss - composer install --prefer-dist
- php ~/travis-support/travis_setup_selenium.php --if-env BEHAT_TEST - composer require silverstripe/recipe-cms 1.0.x-dev --no-update --prefer-dist
- php ~/travis-support/travis_setup_php54_webserver.php --if-env BEHAT_TEST - if [[ $DB == PGSQL ]]; then composer require --prefer-dist --no-update silverstripe/postgresql:2.0.x-dev; fi
- composer update
# Bootstrap cms / mysite folder
- php ./cms/tests/bootstrap/mysite.php
# Behat bootstrapping
- if [[ $BEHAT_TEST ]]; then echo "" >> .env && echo "SS_BASE_URL=http://localhost:8080/" >> .env; fi
- if [[ $BEHAT_TEST ]]; then mkdir artifacts; fi
- if [[ $BEHAT_TEST ]]; then sh -e /etc/init.d/xvfb start; sleep 3; fi
- if [[ $BEHAT_TEST ]]; then (vendor/bin/selenium-server-standalone > artifacts/selenium.log 2>&1 &); fi
- if [[ $BEHAT_TEST ]]; then (vendor/bin/serve --bootstrap-file cms/tests/behat/serve-bootstrap.php &> artifacts/serve.log &); fi
script: script:
- "if [ \"$BEHAT_TEST\" = \"\" ]; then vendor/bin/phpunit subsites/tests; fi" - if [[ $PHPUNIT_TEST ]]; then vendor/bin/phpunit tests/php/ flush=1; fi
- "if [ \"$BEHAT_TEST\" = \"1\" ]; then vendor/bin/behat @subsites; fi" - if [[ $PHPUNIT_COVERAGE_TEST ]]; then phpdbg -qrr vendor/bin/phpunit --coverage-clover=coverage.xml; fi
- if [[ $PHPCS_TEST ]]; then vendor/bin/phpcs --standard=framework/phpcs.xml.dist code/ tests/ ; fi
- if [[ $BEHAT_TEST ]]; then vendor/bin/behat @subsites; fi
after_success:
- if [[ $PHPUNIT_COVERAGE_TEST ]]; then bash <(curl -s https://codecov.io/bash) -f coverage.xml; fi
after_failure:
- if [[ $BEHAT_TEST ]]; then php ./framework/tests/behat/travis-upload-artifacts.php --if-env BEHAT_TEST,ARTIFACTS_BUCKET,ARTIFACTS_KEY,ARTIFACTS_SECRET --target-path $TRAVIS_REPO_SLUG/$TRAVIS_BUILD_ID/$TRAVIS_JOB_ID --artifacts-base-url https://s3.amazonaws.com/$ARTIFACTS_BUCKET/ --artifacts-path ./artifacts/; fi

View File

@ -2,12 +2,10 @@
namespace SilverStripe\Subsites\Admin; namespace SilverStripe\Subsites\Admin;
use SilverStripe\Admin\ModelAdmin; use SilverStripe\Admin\ModelAdmin;
use SilverStripe\Subsites\Forms\GridFieldSubsiteDetailForm; use SilverStripe\Subsites\Forms\GridFieldSubsiteDetailForm;
use SilverStripe\Subsites\Model\Subsite; use SilverStripe\Subsites\Model\Subsite;
/** /**
* Admin interface to manage and create {@link Subsite} instances. * Admin interface to manage and create {@link Subsite} instances.
* *

View File

@ -2,12 +2,10 @@
namespace SilverStripe\Subsites\Controller; namespace SilverStripe\Subsites\Controller;
use SilverStripe\Admin\LeftAndMain; use SilverStripe\Admin\LeftAndMain;
use SilverStripe\Security\Permission; use SilverStripe\Security\Permission;
use SilverStripe\Subsites\Model\Subsite; use SilverStripe\Subsites\Model\Subsite;
/** /**
* Section-agnostic PJAX controller. * Section-agnostic PJAX controller.
*/ */
@ -69,5 +67,4 @@ class SubsiteXHRController extends LeftAndMain
{ {
return $this->renderWith('Includes/SubsiteList'); return $this->renderWith('Includes/SubsiteList');
} }
} }

View File

@ -5,6 +5,7 @@ namespace SilverStripe\Subsites\Extensions;
use SilverStripe\Core\Extension; use SilverStripe\Core\Extension;
use SilverStripe\Subsites\Model\Subsite; use SilverStripe\Subsites\Model\Subsite;
use SilverStripe\View\SSViewer; use SilverStripe\View\SSViewer;
/** /**
* @package subsites * @package subsites
*/ */

View File

@ -67,8 +67,10 @@ class FileSubsites extends DataExtension
$fields->push(new LiteralField( $fields->push(new LiteralField(
'Message', 'Message',
'<p class="message notice">' . '<p class="message notice">' .
_t('ASSETADMIN.SUBSITENOTICE', _t(
'Folders and files created in the main site are accessible by all subsites.') 'ASSETADMIN.SUBSITENOTICE',
'Folders and files created in the main site are accessible by all subsites.'
)
. '</p>' . '</p>'
)); ));
} }

View File

@ -88,7 +88,8 @@ class GroupSubsites extends DataExtension implements PermissionProvider
// Interface is different if you have the rights to modify subsite group values on // Interface is different if you have the rights to modify subsite group values on
// all subsites // all subsites
if (isset($subsiteMap[0])) { if (isset($subsiteMap[0])) {
$fields->addFieldToTab('Root.Subsites', new OptionsetField('AccessAllSubsites', $fields->addFieldToTab('Root.Subsites', new OptionsetField(
'AccessAllSubsites',
_t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'), _t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'),
[ [
1 => _t('GroupSubsites.ACCESSALL', 'All subsites'), 1 => _t('GroupSubsites.ACCESSALL', 'All subsites'),
@ -97,18 +98,24 @@ class GroupSubsites extends DataExtension implements PermissionProvider
)); ));
unset($subsiteMap[0]); unset($subsiteMap[0]);
$fields->addFieldToTab('Root.Subsites', new CheckboxSetField('Subsites', '', $fields->addFieldToTab('Root.Subsites', new CheckboxSetField(
$subsiteMap)); 'Subsites',
'',
$subsiteMap
));
} else { } else {
if (sizeof($subsiteMap) <= 1) { if (sizeof($subsiteMap) <= 1) {
$fields->addFieldToTab('Root.Subsites', new ReadonlyField('SubsitesHuman', $fields->addFieldToTab('Root.Subsites', new ReadonlyField(
'SubsitesHuman',
_t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'), _t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'),
reset($subsiteMap))); reset($subsiteMap)
));
} else { } else {
$fields->addFieldToTab('Root.Subsites', new CheckboxSetField('Subsites', $fields->addFieldToTab('Root.Subsites', new CheckboxSetField(
'Subsites',
_t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'), _t('GroupSubsites.ACCESSRADIOTITLE', 'Give this group access to'),
$subsiteMap)); $subsiteMap
));
} }
} }
} }
@ -147,7 +154,6 @@ class GroupSubsites extends DataExtension implements PermissionProvider
// If you're querying by ID, ignore the sub-site - this is a bit ugly... // If you're querying by ID, ignore the sub-site - this is a bit ugly...
if (!$query->filtersOnID()) { if (!$query->filtersOnID()) {
/*if($context = DataObject::context_obj()) $subsiteID = (int)$context->SubsiteID; /*if($context = DataObject::context_obj()) $subsiteID = (int)$context->SubsiteID;
else */ else */
@ -156,9 +162,13 @@ class GroupSubsites extends DataExtension implements PermissionProvider
// Don't filter by Group_Subsites if we've already done that // Don't filter by Group_Subsites if we've already done that
$hasGroupSubsites = false; $hasGroupSubsites = false;
foreach ($query->getFrom() as $item) { foreach ($query->getFrom() as $item) {
if ((is_array($item) && strpos($item['table'], if ((is_array($item) && strpos(
'Group_Subsites') !== false) || (!is_array($item) && strpos($item, $item['table'],
'Group_Subsites') !== false) 'Group_Subsites'
) !== false) || (!is_array($item) && strpos(
$item,
'Group_Subsites'
) !== false)
) { ) {
$hasGroupSubsites = true; $hasGroupSubsites = true;
break; break;
@ -220,8 +230,10 @@ class GroupSubsites extends DataExtension implements PermissionProvider
'SECURITY_SUBSITE_GROUP' => [ 'SECURITY_SUBSITE_GROUP' => [
'name' => _t('GroupSubsites.MANAGE_SUBSITES', 'Manage subsites for groups'), 'name' => _t('GroupSubsites.MANAGE_SUBSITES', 'Manage subsites for groups'),
'category' => _t('Permissions.PERMISSIONS_CATEGORY', 'Roles and access permissions'), 'category' => _t('Permissions.PERMISSIONS_CATEGORY', 'Roles and access permissions'),
'help' => _t('GroupSubsites.MANAGE_SUBSITES_HELP', 'help' => _t(
'Ability to limit the permissions for a group to one or more subsites.'), 'GroupSubsites.MANAGE_SUBSITES_HELP',
'Ability to limit the permissions for a group to one or more subsites.'
),
'sort' => 200 'sort' => 200
] ]
]; ];

View File

@ -340,8 +340,10 @@ class LeftAndMainSubsites extends Extension
public function onAfterSave($record) public function onAfterSave($record)
{ {
if ($record->hasMethod('NormalRelated') && ($record->NormalRelated() || $record->ReverseRelated())) { if ($record->hasMethod('NormalRelated') && ($record->NormalRelated() || $record->ReverseRelated())) {
$this->owner->response->addHeader('X-Status', $this->owner->response->addHeader(
rawurlencode(_t('LeftAndMainSubsites.Saved', 'Saved, please update related pages.'))); 'X-Status',
rawurlencode(_t('LeftAndMainSubsites.Saved', 'Saved, please update related pages.'))
);
} }
} }

View File

@ -108,13 +108,18 @@ class SiteTreeSubsites extends DataExtension
if ($isDefaultSubsite && $subsitesMap) { if ($isDefaultSubsite && $subsitesMap) {
$fields->addFieldToTab( $fields->addFieldToTab(
'Root.Main', 'Root.Main',
ToggleCompositeField::create('SubsiteOperations', ToggleCompositeField::create(
'SubsiteOperations',
_t('SiteTreeSubsites.SubsiteOperations', 'Subsite Operations'), _t('SiteTreeSubsites.SubsiteOperations', 'Subsite Operations'),
[ [
new DropdownField('CopyToSubsiteID', _t('SiteTreeSubsites.CopyToSubsite', new DropdownField('CopyToSubsiteID', _t(
'Copy page to subsite'), $subsitesMap), 'SiteTreeSubsites.CopyToSubsite',
new CheckboxField('CopyToSubsiteWithChildren', 'Copy page to subsite'
_t('SiteTreeSubsites.CopyToSubsiteWithChildren', 'Include children pages?')), ), $subsitesMap),
new CheckboxField(
'CopyToSubsiteWithChildren',
_t('SiteTreeSubsites.CopyToSubsiteWithChildren', 'Include children pages?')
),
$copyAction = new FormAction( $copyAction = new FormAction(
'copytosubsite', 'copytosubsite',
_t('SiteTreeSubsites.CopyAction', 'Copy') _t('SiteTreeSubsites.CopyAction', 'Copy')
@ -393,9 +398,11 @@ class SiteTreeSubsites extends DataExtension
$origDisableSubsiteFilter = Subsite::$disable_subsite_filter; $origDisableSubsiteFilter = Subsite::$disable_subsite_filter;
Subsite::disable_subsite_filter(true); Subsite::disable_subsite_filter(true);
$candidatePage = DataObject::get_one(SiteTree::class, $candidatePage = DataObject::get_one(
SiteTree::class,
"\"URLSegment\" = '" . Convert::raw2sql(urldecode($rest)) . "' AND \"SubsiteID\" = " . $subsiteID, "\"URLSegment\" = '" . Convert::raw2sql(urldecode($rest)) . "' AND \"SubsiteID\" = " . $subsiteID,
false); false
);
Subsite::disable_subsite_filter($origDisableSubsiteFilter); Subsite::disable_subsite_filter($origDisableSubsiteFilter);
if ($candidatePage) { if ($candidatePage) {

View File

@ -2,10 +2,8 @@
namespace SilverStripe\Subsites\Extensions; namespace SilverStripe\Subsites\Extensions;
use SilverStripe\Core\Extension; use SilverStripe\Core\Extension;
/* /*
* Simple extension to show admins in the menu of subsites. * Simple extension to show admins in the menu of subsites.
* If an admin area should be available to a subsite, you can attach * If an admin area should be available to a subsite, you can attach

View File

@ -36,8 +36,11 @@ class GridFieldSubsiteDetailForm_ItemRequest extends GridFieldDetailForm_ItemReq
$templateArray = $templates->map('ID', 'Title'); $templateArray = $templates->map('ID', 'Title');
} }
$templateDropdown = new DropdownField('TemplateID', _t('Subsite.COPYSTRUCTURE', 'Copy structure from:'), $templateDropdown = new DropdownField(
$templateArray); 'TemplateID',
_t('Subsite.COPYSTRUCTURE', 'Copy structure from:'),
$templateArray
);
$templateDropdown->setEmptyString('(' . _t('Subsite.NOTEMPLATE', 'No template') . ')'); $templateDropdown->setEmptyString('(' . _t('Subsite.NOTEMPLATE', 'No template') . ')');
$form->Fields()->addFieldToTab('Root.Configuration', $templateDropdown); $form->Fields()->addFieldToTab('Root.Configuration', $templateDropdown);
} }
@ -57,5 +60,4 @@ class GridFieldSubsiteDetailForm_ItemRequest extends GridFieldDetailForm_ItemReq
return parent::doSave($data, $form); return parent::doSave($data, $form);
} }
} }

View File

@ -2,14 +2,12 @@
namespace SilverStripe\Subsites\Forms; namespace SilverStripe\Subsites\Forms;
use SilverStripe\Control\Controller; use SilverStripe\Control\Controller;
use SilverStripe\Control\HTTPRequest; use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\Session; use SilverStripe\Control\Session;
use SilverStripe\Forms\TreeDropdownField; use SilverStripe\Forms\TreeDropdownField;
use SilverStripe\View\Requirements; use SilverStripe\View\Requirements;
/** /**
* Wraps around a TreedropdownField to add ability for temporary * Wraps around a TreedropdownField to add ability for temporary
* switching of subsite sessions. * switching of subsite sessions.

View File

@ -2,6 +2,7 @@
namespace SilverStripe\Subsites\Forms; namespace SilverStripe\Subsites\Forms;
use SilverStripe\Forms\TextField; use SilverStripe\Forms\TextField;
/** /**
* A text field that accepts only valid domain names, but allows the wildcard (*) character * A text field that accepts only valid domain names, but allows the wildcard (*) character
*/ */

View File

@ -35,7 +35,6 @@ use SilverStripe\Security\Permission;
use SilverStripe\Versioned\Versioned; use SilverStripe\Versioned\Versioned;
use UnexpectedValueException; use UnexpectedValueException;
/** /**
* A dynamically created subsite. SiteTree objects can now belong to a subsite. * A dynamically created subsite. SiteTree objects can now belong to a subsite.
* You can simulate subsite access without setting up virtual hosts by appending ?SubsiteID=<ID> to the request. * You can simulate subsite access without setting up virtual hosts by appending ?SubsiteID=<ID> to the request.
@ -231,8 +230,10 @@ class Subsite extends DataObject
SubsiteDomain::class, SubsiteDomain::class,
"'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')", "'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')",
'"IsPrimary" DESC' '"IsPrimary" DESC'
)->innerJoin('Subsite', )->innerJoin(
'"Subsite"."ID" = "SubsiteDomain"."SubsiteID" AND "Subsite"."IsPublic"=1'); 'Subsite',
'"Subsite"."ID" = "SubsiteDomain"."SubsiteID" AND "Subsite"."IsPublic"=1'
);
} }
if ($matchingDomains && $matchingDomains->count()) { if ($matchingDomains && $matchingDomains->count()) {
@ -379,8 +380,8 @@ class Subsite extends DataObject
$includeMainSite = true, $includeMainSite = true,
$mainSiteTitle = 'Main site', $mainSiteTitle = 'Main site',
$member = null $member = null
) ) {
{
// Rationalise member arguments // Rationalise member arguments
if (!$member) { if (!$member) {
$member = Member::currentUser(); $member = Member::currentUser();
@ -408,12 +409,18 @@ class Subsite extends DataObject
$subsites = DataList::create(Subsite::class) $subsites = DataList::create(Subsite::class)
->where("\"Subsite\".\"Title\" != ''") ->where("\"Subsite\".\"Title\" != ''")
->leftJoin('Group_Subsites', '"Group_Subsites"."SubsiteID" = "Subsite"."ID"') ->leftJoin('Group_Subsites', '"Group_Subsites"."SubsiteID" = "Subsite"."ID"')
->innerJoin('Group', ->innerJoin(
'"Group"."ID" = "Group_Subsites"."GroupID" OR "Group"."AccessAllSubsites" = 1') 'Group',
->innerJoin('Group_Members', '"Group"."ID" = "Group_Subsites"."GroupID" OR "Group"."AccessAllSubsites" = 1'
"\"Group_Members\".\"GroupID\"=\"Group\".\"ID\" AND \"Group_Members\".\"MemberID\" = $member->ID") )
->innerJoin('Permission', ->innerJoin(
"\"Group\".\"ID\"=\"Permission\".\"GroupID\" AND \"Permission\".\"Code\" IN ($SQL_codes, 'CMS_ACCESS_LeftAndMain', 'ADMIN')"); 'Group_Members',
"\"Group_Members\".\"GroupID\"=\"Group\".\"ID\" AND \"Group_Members\".\"MemberID\" = $member->ID"
)
->innerJoin(
'Permission',
"\"Group\".\"ID\"=\"Permission\".\"GroupID\" AND \"Permission\".\"Code\" IN ($SQL_codes, 'CMS_ACCESS_LeftAndMain', 'ADMIN')"
);
if (!$subsites) { if (!$subsites) {
$subsites = new ArrayList(); $subsites = new ArrayList();
@ -423,14 +430,20 @@ class Subsite extends DataObject
$rolesSubsites = DataList::create(Subsite::class) $rolesSubsites = DataList::create(Subsite::class)
->where("\"Subsite\".\"Title\" != ''") ->where("\"Subsite\".\"Title\" != ''")
->leftJoin('Group_Subsites', '"Group_Subsites"."SubsiteID" = "Subsite"."ID"') ->leftJoin('Group_Subsites', '"Group_Subsites"."SubsiteID" = "Subsite"."ID"')
->innerJoin('Group', ->innerJoin(
'"Group"."ID" = "Group_Subsites"."GroupID" OR "Group"."AccessAllSubsites" = 1') 'Group',
->innerJoin('Group_Members', '"Group"."ID" = "Group_Subsites"."GroupID" OR "Group"."AccessAllSubsites" = 1'
"\"Group_Members\".\"GroupID\"=\"Group\".\"ID\" AND \"Group_Members\".\"MemberID\" = $member->ID") )
->innerJoin(
'Group_Members',
"\"Group_Members\".\"GroupID\"=\"Group\".\"ID\" AND \"Group_Members\".\"MemberID\" = $member->ID"
)
->innerJoin('Group_Roles', '"Group_Roles"."GroupID"="Group"."ID"') ->innerJoin('Group_Roles', '"Group_Roles"."GroupID"="Group"."ID"')
->innerJoin('PermissionRole', '"Group_Roles"."PermissionRoleID"="PermissionRole"."ID"') ->innerJoin('PermissionRole', '"Group_Roles"."PermissionRoleID"="PermissionRole"."ID"')
->innerJoin('PermissionRoleCode', ->innerJoin(
"\"PermissionRole\".\"ID\"=\"PermissionRoleCode\".\"RoleID\" AND \"PermissionRoleCode\".\"Code\" IN ($SQL_codes, 'CMS_ACCESS_LeftAndMain', 'ADMIN')"); 'PermissionRoleCode',
"\"PermissionRole\".\"ID\"=\"PermissionRoleCode\".\"RoleID\" AND \"PermissionRoleCode\".\"Code\" IN ($SQL_codes, 'CMS_ACCESS_LeftAndMain', 'ADMIN')"
);
if (!$subsites && $rolesSubsites) { if (!$subsites && $rolesSubsites) {
return $rolesSubsites; return $rolesSubsites;
@ -655,8 +668,10 @@ class Subsite extends DataObject
} else { } else {
$domainTable = new LiteralField( $domainTable = new LiteralField(
'Domains', 'Domains',
'<p>' . _t('Subsite.DOMAINSAVEFIRST', '<p>' . _t(
'You can only add domains after saving for the first time') . '</p>' 'Subsite.DOMAINSAVEFIRST',
'You can only add domains after saving for the first time'
) . '</p>'
); );
} }
@ -674,13 +689,13 @@ class Subsite extends DataObject
asort($pageTypeMap); asort($pageTypeMap);
$fields = new FieldList( $fields = new FieldList(
$subsiteTabs = new TabSet('Root', $subsiteTabs = new TabSet(
'Root',
new Tab( new Tab(
'Configuration', 'Configuration',
_t('Subsite.TabTitleConfig', 'Configuration'), _t('Subsite.TabTitleConfig', 'Configuration'),
HeaderField::create('ConfigForSubsiteHeaderField', 'Subsite Configuration'), HeaderField::create('ConfigForSubsiteHeaderField', 'Subsite Configuration'),
TextField::create('Title', $this->fieldLabel('Title'), $this->Title), TextField::create('Title', $this->fieldLabel('Title'), $this->Title),
HeaderField::create( HeaderField::create(
'DomainsForSubsiteHeaderField', 'DomainsForSubsiteHeaderField',
_t('Subsite.DomainsHeadline', 'Domains for this subsite') _t('Subsite.DomainsHeadline', 'Domains for this subsite')
@ -690,7 +705,6 @@ class Subsite extends DataObject
// new TextField('RedirectURL', 'Redirect to URL', $this->RedirectURL), // new TextField('RedirectURL', 'Redirect to URL', $this->RedirectURL),
CheckboxField::create('DefaultSite', $this->fieldLabel('DefaultSite'), $this->DefaultSite), CheckboxField::create('DefaultSite', $this->fieldLabel('DefaultSite'), $this->DefaultSite),
CheckboxField::create('IsPublic', $this->fieldLabel('IsPublic'), $this->IsPublic), CheckboxField::create('IsPublic', $this->fieldLabel('IsPublic'), $this->IsPublic),
LiteralField::create( LiteralField::create(
'PageTypeBlacklistToggle', 'PageTypeBlacklistToggle',
sprintf( sprintf(
@ -712,9 +726,12 @@ class Subsite extends DataObject
// If there are any themes available, add the dropdown // If there are any themes available, add the dropdown
$themes = $this->allowedThemes(); $themes = $this->allowedThemes();
if (!empty($themes)) { if (!empty($themes)) {
$fields->addFieldToTab('Root.Configuration', $fields->addFieldToTab(
'Root.Configuration',
DropdownField::create('Theme', $this->fieldLabel('Theme'), $this->allowedThemes(), $this->Theme) DropdownField::create('Theme', $this->fieldLabel('Theme'), $this->allowedThemes(), $this->Theme)
->setEmptyString(_t('Subsite.ThemeFieldEmptyString', '-')), 'PageTypeBlacklistToggle'); ->setEmptyString(_t('Subsite.ThemeFieldEmptyString', '-')),
'PageTypeBlacklistToggle'
);
} }
$subsiteTabs->addExtraClass('subsite-model'); $subsiteTabs->addExtraClass('subsite-model');

View File

@ -10,7 +10,6 @@ use SilverStripe\Forms\OptionsetField;
use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DataObject;
use SilverStripe\Subsites\Forms\WildcardDomainField; use SilverStripe\Subsites\Forms\WildcardDomainField;
/** /**
* @property string $Domain domain name of this subsite. Can include wildcards. Do not include the URL scheme here * @property string $Domain domain name of this subsite. Can include wildcards. Do not include the URL scheme here
* @property string $Protocol Required protocol (http or https) if only one is supported. 'automatic' implies * @property string $Protocol Required protocol (http or https) if only one is supported. 'automatic' implies

View File

@ -2,7 +2,6 @@
namespace SilverStripe\Subsites\Pages; namespace SilverStripe\Subsites\Pages;
use SilverStripe\CMS\Model\SiteTree; use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\CMS\Model\VirtualPage; use SilverStripe\CMS\Model\VirtualPage;
use SilverStripe\Control\Controller; use SilverStripe\Control\Controller;

View File

@ -2,13 +2,11 @@
namespace SilverStripe\Subsites\Reports; namespace SilverStripe\Subsites\Reports;
use SilverStripe\Forms\FieldList; use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TreeMultiselectField; use SilverStripe\Forms\TreeMultiselectField;
use SilverStripe\Reports\ReportWrapper; use SilverStripe\Reports\ReportWrapper;
use SilverStripe\Subsites\Model\Subsite; use SilverStripe\Subsites\Model\Subsite;
/** /**
* Creates a subsite-aware version of another report. * Creates a subsite-aware version of another report.
* Pass another report (or its classname) into the constructor. * Pass another report (or its classname) into the constructor.
@ -84,5 +82,4 @@ class SubsiteReportWrapper extends ReportWrapper
// Manually manage the subsite filtering // Manually manage the subsite filtering
Subsite::$force_subsite = null; Subsite::$force_subsite = null;
} }
} }

View File

@ -2,7 +2,6 @@
namespace SilverStripe\Subsites\Tasks; namespace SilverStripe\Subsites\Tasks;
use InvalidArgumentException; use InvalidArgumentException;
use SilverStripe\CMS\Model\SiteTree; use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Dev\BuildTask; use SilverStripe\Dev\BuildTask;
@ -11,7 +10,6 @@ use SilverStripe\Subsites\Model\Subsite;
use SilverStripe\Subsites\Pages\SubsitesVirtualPage; use SilverStripe\Subsites\Pages\SubsitesVirtualPage;
use SilverStripe\Versioned\Versioned; use SilverStripe\Versioned\Versioned;
/** /**
* Handy alternative to copying pages when creating a subsite through the UI. * Handy alternative to copying pages when creating a subsite through the UI.
* *

1
codecov.yml Normal file
View File

@ -0,0 +1 @@
comment: false

View File

@ -11,12 +11,19 @@
} }
], ],
"require": { "require": {
"silverstripe/framework": "~4.0", "silverstripe/framework": "^4",
"silverstripe/cms": "~4.0", "silverstripe/cms": "^4",
"silverstripe/asset-admin": "~1.0.0" "silverstripe/admin": "^1",
"silverstripe/asset-admin": "^1",
"silverstripe/errorpage": "^1",
"silverstripe/versioned": "^1"
}, },
"require-dev": { "require-dev": {
"phpunit/PHPUnit": "~4.8@stable" "phpunit/phpunit": "^5.7",
"squizlabs/php_codesniffer": "^3.0",
"silverstripe/behat-extension": "^3",
"silverstripe/serve": "dev-master",
"se/selenium-server-standalone": "2.41.0"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@ -28,5 +35,7 @@
"branch-alias": { "branch-alias": {
"dev-master": "2.0.x-dev" "dev-master": "2.0.x-dev"
} }
} },
"minimum-stability": "dev",
"prefer-stable": true
} }

View File

@ -1,7 +1,14 @@
<phpunit bootstrap="framework/tests/bootstrap.php" colors="true"> <phpunit bootstrap="framework/tests/bootstrap.php" colors="true">
<testsuite name="Default"> <testsuite name="Default">
<directory>tests/php</directory> <directory>tests/php</directory>
</testsuite> </testsuite>
<filter>
<whitelist addUncoveredFilesFromWhitelist="true">
<directory suffix=".php">code/</directory>
<exclude>
<directory suffix=".php">tests/</directory>
</exclude>
</whitelist>
</filter>
</phpunit> </phpunit>

View File

@ -1,44 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: dmooyman
* Date: 27/05/16
* Time: 3:10 PM
*/
class SubsiteXHRControllerTest extends FunctionalTest
{
protected static $fixture_file = 'SubsiteTest.yml';
public function testCanView() {
// Test unauthenticated access
Session::clear('MemberID');
$result = $this->get('SubsiteXHRController', null, array(
'X-Pjax' => 'SubsiteList',
'X-Requested-With' => 'XMLHttpRequest'
));
$this->assertEquals(403, $result->getStatusCode());
// Login with NO permissions
$this->logInWithPermission('NOT_CMS_PERMISSION');
$result = $this->get('SubsiteXHRController', null, array(
'X-Pjax' => 'SubsiteList',
'X-Requested-With' => 'XMLHttpRequest'
));
$this->assertEquals(403, $result->getStatusCode());
// Test cms user
$this->logInWithPermission('CMS_ACCESS_CMSMain');
$result = $this->get('SubsiteXHRController', null, array(
'X-Pjax' => 'SubsiteList',
'X-Requested-With' => 'XMLHttpRequest'
));
$this->assertEquals(200, $result->getStatusCode());
$this->assertEquals('text/json', $result->getHeader('Content-Type'));
$body = $result->getBody();
$this->assertContains('Main site', $body);
$this->assertContains('Test 1', $body);
$this->assertContains('Test 2', $body);
$this->assertContains('Test 3', $body);
}
}

View File

@ -1,72 +0,0 @@
<?php
/**
* Tests {@see WildcardDomainField}
*/
class WildcardDomainFieldTest extends SapphireTest {
/**
* Check that valid domains are accepted
*
* @dataProvider validDomains
*/
public function testValidDomains($domain) {
$field = new WildcardDomainField('DomainField');
$this->assertTrue($field->checkHostname($domain), "Validate that {$domain} is a valid domain name");
}
/**
* Check that valid domains are accepted
*
* @dataProvider invalidDomains
*/
public function testInvalidDomains($domain) {
$field = new WildcardDomainField('DomainField');
$this->assertFalse($field->checkHostname($domain), "Validate that {$domain} is an invalid domain name");
}
/**
* Check that valid domains are accepted
*
* @dataProvider validWildcards
*/
public function testValidWildcards($domain) {
$field = new WildcardDomainField('DomainField');
$this->assertTrue($field->checkHostname($domain), "Validate that {$domain} is a valid domain wildcard");
}
public function validDomains() {
return array(
array('www.mysite.com'),
array('domain7'),
array('mysite.co.n-z'),
array('subdomain.my-site.com'),
array('subdomain.mysite')
);
}
public function invalidDomains() {
return array(
array('-mysite'),
array('.mysite'),
array('mys..ite'),
array('mysite-'),
array('mysite.'),
array('-mysite.*'),
array('.mysite.*'),
array('mys..ite.*'),
array('*.mysite-'),
array('*.mysite.')
);
}
public function validWildcards() {
return array(
array('*.mysite.com'),
array('mys*ite.com'),
array('*.my-site.*'),
array('*')
);
}
}

View File

View File

@ -7,8 +7,7 @@ use SilverStripe\Subsites\Model\Subsite;
class BaseSubsiteTest extends SapphireTest class BaseSubsiteTest extends SapphireTest
{ {
protected function setUp()
public function setUp()
{ {
parent::setUp(); parent::setUp();
@ -18,14 +17,14 @@ class BaseSubsiteTest extends SapphireTest
/** /**
* Avoid subsites filtering on fixture fetching. * Avoid subsites filtering on fixture fetching.
* @param string $class * @param string $className
* @param string $id * @param string $identifier
* @return \SilverStripe\ORM\DataObject * @return \SilverStripe\ORM\DataObject
*/ */
public function objFromFixture($class, $id) protected function objFromFixture($className, $identifier)
{ {
Subsite::disable_subsite_filter(true); Subsite::disable_subsite_filter(true);
$obj = parent::objFromFixture($class, $id); $obj = parent::objFromFixture($className, $identifier);
Subsite::disable_subsite_filter(false); Subsite::disable_subsite_filter(false);
return $obj; return $obj;

View File

@ -11,22 +11,15 @@ use SilverStripe\Subsites\Model\Subsite;
class FileSubsitesTest extends BaseSubsiteTest class FileSubsitesTest extends BaseSubsiteTest
{ {
protected static $fixture_file = 'SubsiteTest.yml';
public static $fixture_file = 'subsites/tests/php/SubsiteTest.yml';
/** /**
* Disable other file extensions * Disable other file extensions
* *
* @var array * @var array
*/ */
protected $illegalExtensions = [ protected static $illegal_extensions = [
'File' => [ SiteTree::class => ['Translatable'], // @todo implement namespace for Translatable
'SecureFileExtension',
'VersionedFileExtension'
],
'SiteTree' => [
'Translatable',
]
]; ];
public function testTrivialFeatures() public function testTrivialFeatures()
@ -45,7 +38,7 @@ class FileSubsitesTest extends BaseSubsiteTest
public function testWritingSubsiteID() public function testWritingSubsiteID()
{ {
$this->objFromFixture(Member::class, 'admin')->logIn(); $this->logInAs('admin');
$subsite = $this->objFromFixture(Subsite::class, 'domaintest1'); $subsite = $this->objFromFixture(Subsite::class, 'domaintest1');
FileSubsites::$default_root_folders_global = true; FileSubsites::$default_root_folders_global = true;
@ -84,7 +77,7 @@ class FileSubsitesTest extends BaseSubsiteTest
public function testSubsitesFolderDropdown() public function testSubsitesFolderDropdown()
{ {
$this->objFromFixture(Member::class, 'admin')->logIn(); $this->logInAs('admin');
$file = new Folder(); $file = new Folder();

View File

@ -9,7 +9,7 @@ use SilverStripe\Subsites\Model\Subsite;
class GroupSubsitesTest extends BaseSubsiteTest class GroupSubsitesTest extends BaseSubsiteTest
{ {
public static $fixture_file = 'subsites/tests/php/SubsiteTest.yml'; protected static $fixture_file = 'SubsiteTest.yml';
protected $requireDefaultRecordsFrom = [GroupSubsites::class]; protected $requireDefaultRecordsFrom = [GroupSubsites::class];

View File

@ -13,18 +13,18 @@ use SilverStripe\Subsites\Model\Subsite;
class LeftAndMainSubsitesTest extends FunctionalTest class LeftAndMainSubsitesTest extends FunctionalTest
{ {
public static $fixture_file = 'subsites/tests/php/SubsiteTest.yml'; protected static $fixture_file = 'SubsiteTest.yml';
/** /**
* Avoid subsites filtering on fixture fetching. * Avoid subsites filtering on fixture fetching.
* @param string $class * @param string $className
* @param string $id * @param string $identifier
* @return \SilverStripe\ORM\DataObject * @return \SilverStripe\ORM\DataObject
*/ */
public function objFromFixture($class, $id) protected function objFromFixture($className, $identifier)
{ {
Subsite::disable_subsite_filter(true); Subsite::disable_subsite_filter(true);
$obj = parent::objFromFixture($class, $id); $obj = parent::objFromFixture($classname, $identifier);
Subsite::disable_subsite_filter(false); Subsite::disable_subsite_filter(false);
return $obj; return $obj;
@ -55,8 +55,7 @@ class LeftAndMainSubsitesTest extends FunctionalTest
public function testAccessChecksDontChangeCurrentSubsite() public function testAccessChecksDontChangeCurrentSubsite()
{ {
$admin = $this->objFromFixture(Member::class, 'admin'); $this->logInAs('admin');
$this->logInAs($admin);
$ids = []; $ids = [];
$subsite1 = $this->objFromFixture(Subsite::class, 'domaintest1'); $subsite1 = $this->objFromFixture(Subsite::class, 'domaintest1');
@ -76,10 +75,12 @@ class LeftAndMainSubsitesTest extends FunctionalTest
$left = new LeftAndMain(); $left = new LeftAndMain();
$this->assertTrue($left->canView(), "Admin user can view subsites LeftAndMain with id = '$id'"); $this->assertTrue($left->canView(), "Admin user can view subsites LeftAndMain with id = '$id'");
$this->assertEquals($id, Subsite::currentSubsiteID(), $this->assertEquals(
'The current subsite has not been changed in the process of checking permissions for admin user.'); $id,
Subsite::currentSubsiteID(),
'The current subsite has not been changed in the process of checking permissions for admin user.'
);
} }
} }
public function testShouldChangeSubsite() public function testShouldChangeSubsite()

View File

@ -8,7 +8,7 @@ use SilverStripe\Subsites\Model\Subsite;
class SiteConfigSubsitesTest extends BaseSubsiteTest class SiteConfigSubsitesTest extends BaseSubsiteTest
{ {
public static $fixture_file = 'subsites/tests/php/SubsiteTest.yml'; protected static $fixture_file = 'SubsiteTest.yml';
public function testEachSubsiteHasAUniqueSiteConfig() public function testEachSubsiteHasAUniqueSiteConfig()
{ {
@ -40,6 +40,6 @@ class SiteConfigSubsitesTest extends BaseSubsiteTest
$this->assertEquals('Subsite2', SiteConfig::current_site_config()->Title); $this->assertEquals('Subsite2', SiteConfig::current_site_config()->Title);
$keys = SiteConfig::current_site_config()->extend('cacheKeyComponent'); $keys = SiteConfig::current_site_config()->extend('cacheKeyComponent');
static::assertContains('subsite-' . $subsite2->ID, $keys); $this->assertContains('subsite-' . $subsite2->ID, $keys);
} }
} }

View File

@ -5,35 +5,36 @@ namespace SilverStripe\Subsites\Tests;
use Page; use Page;
use SilverStripe\CMS\Controllers\CMSMain; use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\CMS\Controllers\ModelAsController; use SilverStripe\CMS\Controllers\ModelAsController;
use SilverStripe\CMS\Model\ErrorPage; use SilverStripe\ErrorPage\ErrorPage;
use SilverStripe\CMS\Model\SiteTree; use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Control\Director; use SilverStripe\Control\Director;
use SilverStripe\Control\Session; use SilverStripe\Control\Session;
use SilverStripe\Core\Config\Config; use SilverStripe\Core\Config\Config;
use SilverStripe\Core\Convert; use SilverStripe\Core\Convert;
use SilverStripe\Dev\TestOnly;
use SilverStripe\Forms\FieldList; use SilverStripe\Forms\FieldList;
use SilverStripe\Security\Member; use SilverStripe\Security\Member;
use SilverStripe\SiteConfig\SiteConfig; use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Subsites\Extensions\SiteTreeSubsites; use SilverStripe\Subsites\Extensions\SiteTreeSubsites;
use SilverStripe\Subsites\Model\Subsite; use SilverStripe\Subsites\Model\Subsite;
use SilverStripe\Subsites\Pages\SubsitesVirtualPage; use SilverStripe\Subsites\Pages\SubsitesVirtualPage;
use SilverStripe\Subsites\Tests\SiteTreeSubsitesTest\TestClassA;
use SilverStripe\Subsites\Tests\SiteTreeSubsitesTest\TestClassB;
use SilverStripe\Subsites\Tests\SiteTreeSubsitesTest\TestErrorPage;
use SilverStripe\Versioned\Versioned; use SilverStripe\Versioned\Versioned;
use SilverStripe\View\SSViewer; use SilverStripe\View\SSViewer;
class SiteTreeSubsitesTest extends BaseSubsiteTest class SiteTreeSubsitesTest extends BaseSubsiteTest
{ {
protected static $fixture_file = 'SubsiteTest.yml';
public static $fixture_file = 'subsites/tests/php/SubsiteTest.yml'; protected static $extra_dataobjects = [
TestClassA::class,
protected $extraDataObjects = [ TestClassB::class,
'SiteTreeSubsitesTest_ClassA', TestErrorPage::class
'SiteTreeSubsitesTest_ClassB',
'SiteTreeSubsitesTest_ErrorPage'
]; ];
protected $illegalExtensions = [ protected static $illegal_extensions = [
SiteTree::class => ['Translatable'] SiteTree::class => ['Translatable'] // @todo implement Translatable namespace
]; ];
public function testPagesInDifferentSubsitesCanShareURLSegment() public function testPagesInDifferentSubsitesCanShareURLSegment()
@ -51,7 +52,9 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest
$pageMainOther->write(); $pageMainOther->write();
$pageMainOther->copyVersionToStage('Stage', 'Live'); $pageMainOther->copyVersionToStage('Stage', 'Live');
$this->assertNotEquals($pageMain->URLSegment, $pageMainOther->URLSegment, $this->assertNotEquals(
$pageMain->URLSegment,
$pageMainOther->URLSegment,
'Pages in same subsite cant share the same URL' 'Pages in same subsite cant share the same URL'
); );
@ -62,7 +65,9 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest
$pageSubsite1->write(); $pageSubsite1->write();
$pageSubsite1->copyVersionToStage('Stage', 'Live'); $pageSubsite1->copyVersionToStage('Stage', 'Live');
$this->assertEquals($pageMain->URLSegment, $pageSubsite1->URLSegment, $this->assertEquals(
$pageMain->URLSegment,
$pageSubsite1->URLSegment,
'Pages in different subsites can share the same URL' 'Pages in different subsites can share the same URL'
); );
} }
@ -171,31 +176,37 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest
$s2 = $this->objFromFixture(Subsite::class, 'domaintest2'); $s2 = $this->objFromFixture(Subsite::class, 'domaintest2');
$page = singleton(SiteTree::class); $page = singleton(SiteTree::class);
$s1->PageTypeBlacklist = implode(',', [SiteTreeSubsitesTest_ClassA::class, ErrorPage::class]); $s1->PageTypeBlacklist = implode(',', [TestClassA::class, ErrorPage::class]);
$s1->write(); $s1->write();
Subsite::changeSubsite($s1); Subsite::changeSubsite($s1);
$settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource(); $settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource();
$this->assertArrayNotHasKey(ErrorPage::class, $this->assertArrayNotHasKey(
ErrorPage::class,
$settingsFields $settingsFields
); );
$this->assertArrayNotHasKey(SiteTreeSubsitesTest_ClassA::class, $this->assertArrayNotHasKey(
TestClassA::class,
$settingsFields $settingsFields
); );
$this->assertArrayHasKey(SiteTreeSubsitesTest_ClassB::class, $this->assertArrayHasKey(
TestClassB::class,
$settingsFields $settingsFields
); );
Subsite::changeSubsite($s2); Subsite::changeSubsite($s2);
$settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource(); $settingsFields = $page->getSettingsFields()->dataFieldByName('ClassName')->getSource();
$this->assertArrayHasKey(ErrorPage::class, $this->assertArrayHasKey(
ErrorPage::class,
$settingsFields $settingsFields
); );
$this->assertArrayHasKey(SiteTreeSubsitesTest_ClassA::class, $this->assertArrayHasKey(
TestClassA::class,
$settingsFields $settingsFields
); );
$this->assertArrayHasKey(SiteTreeSubsitesTest_ClassB::class, $this->assertArrayHasKey(
TestClassB::class,
$settingsFields $settingsFields
); );
} }
@ -238,22 +249,22 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest
$s1 = $this->objFromFixture(Subsite::class, 'domaintest1'); $s1 = $this->objFromFixture(Subsite::class, 'domaintest1');
$s2 = $this->objFromFixture(Subsite::class, 'domaintest2'); $s2 = $this->objFromFixture(Subsite::class, 'domaintest2');
$s1->PageTypeBlacklist = implode(',', [SiteTreeSubsitesTest_ClassA::class, ErrorPage::class]); $s1->PageTypeBlacklist = implode(',', [TestClassA::class, ErrorPage::class]);
$s1->write(); $s1->write();
Subsite::changeSubsite($s1); Subsite::changeSubsite($s1);
$hints = Convert::json2array($cmsmain->SiteTreeHints()); $hints = Convert::json2array($cmsmain->SiteTreeHints());
$classes = $hints['Root']['disallowedChildren']; $classes = $hints['Root']['disallowedChildren'];
static::assertContains(ErrorPage::class, $classes); $this->assertContains(ErrorPage::class, $classes);
static::assertContains(SiteTreeSubsitesTest_ClassA::class, $classes); $this->assertContains(TestClassA::class, $classes);
static::assertNotContains(SiteTreeSubsitesTest_ClassB::class, $classes); $this->assertNotContains(TestClassB::class, $classes);
Subsite::changeSubsite($s2); Subsite::changeSubsite($s2);
$hints = Convert::json2array($cmsmain->SiteTreeHints()); $hints = Convert::json2array($cmsmain->SiteTreeHints());
$classes = $hints['Root']['disallowedChildren']; $classes = $hints['Root']['disallowedChildren'];
static::assertNotContains(ErrorPage::class, $classes); $this->assertNotContains(ErrorPage::class, $classes);
static::assertNotContains(SiteTreeSubsitesTest_ClassA::class, $classes); $this->assertNotContains(TestClassA::class, $classes);
static::assertNotContains(SiteTreeSubsitesTest_ClassB::class, $classes); $this->assertNotContains(TestClassB::class, $classes);
} }
/** /**
@ -280,8 +291,11 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest
$subsite1Home->write(); $subsite1Home->write();
$this->assertEquals('home', $subsite1Home->URLSegment); $this->assertEquals('home', $subsite1Home->URLSegment);
$subsite1Home->doPublish(); $subsite1Home->doPublish();
$subsite1HomeLive = Versioned::get_one_by_stage('Page', 'Live', $subsite1HomeLive = Versioned::get_one_by_stage(
sprintf('"SiteTree"."ID" = \'%d\'', $subsite1Home->ID)); 'Page',
'Live',
sprintf('"SiteTree"."ID" = \'%d\'', $subsite1Home->ID)
);
$this->assertEquals('home', $subsite1HomeLive->URLSegment); $this->assertEquals('home', $subsite1HomeLive->URLSegment);
// Creating a new page in a subsite doesn't conflict with urls in other subsites // Creating a new page in a subsite doesn't conflict with urls in other subsites
@ -294,8 +308,11 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest
$subsite1NewPage->write(); $subsite1NewPage->write();
$this->assertEquals('important-page', $subsite1NewPage->URLSegment); $this->assertEquals('important-page', $subsite1NewPage->URLSegment);
$subsite1NewPage->doPublish(); $subsite1NewPage->doPublish();
$subsite1NewPageLive = Versioned::get_one_by_stage('Page', 'Live', $subsite1NewPageLive = Versioned::get_one_by_stage(
sprintf('"SiteTree"."ID" = \'%d\'', $subsite1NewPage->ID)); 'Page',
'Live',
sprintf('"SiteTree"."ID" = \'%d\'', $subsite1NewPage->ID)
);
$this->assertEquals('important-page', $subsite1NewPageLive->URLSegment); $this->assertEquals('important-page', $subsite1NewPageLive->URLSegment);
// Creating a new page in a subsite DOES conflict with urls in the same subsite // Creating a new page in a subsite DOES conflict with urls in the same subsite
@ -306,8 +323,11 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest
$subsite1NewPage2->write(); $subsite1NewPage2->write();
$this->assertEquals('important-page-2', $subsite1NewPage2->URLSegment); $this->assertEquals('important-page-2', $subsite1NewPage2->URLSegment);
$subsite1NewPage2->doPublish(); $subsite1NewPage2->doPublish();
$subsite1NewPage2Live = Versioned::get_one_by_stage('Page', 'Live', $subsite1NewPage2Live = Versioned::get_one_by_stage(
sprintf('"SiteTree"."ID" = \'%d\'', $subsite1NewPage2->ID)); 'Page',
'Live',
sprintf('"SiteTree"."ID" = \'%d\'', $subsite1NewPage2->ID)
);
$this->assertEquals('important-page-2', $subsite1NewPage2Live->URLSegment); $this->assertEquals('important-page-2', $subsite1NewPage2Live->URLSegment);
// Original page is left un-modified // Original page is left un-modified
@ -326,8 +346,11 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest
$moved = $page->duplicateToSubsite($newSubsite->ID, true); $moved = $page->duplicateToSubsite($newSubsite->ID, true);
$this->assertEquals($moved->SubsiteID, $newSubsite->ID, 'Ensure returned records are on new subsite'); $this->assertEquals($moved->SubsiteID, $newSubsite->ID, 'Ensure returned records are on new subsite');
$this->assertEquals($moved->AllChildren()->count(), $page->AllChildren()->count(), $this->assertEquals(
'All pages are copied across'); $moved->AllChildren()->count(),
$page->AllChildren()->count(),
'All pages are copied across'
);
} }
public function testCopySubsiteWithoutChildren() public function testCopySubsiteWithoutChildren()
@ -353,39 +376,21 @@ class SiteTreeSubsitesTest extends BaseSubsiteTest
$controller = ModelAsController::controller_for($subsitePage); $controller = ModelAsController::controller_for($subsitePage);
SiteTree::singleton()->extend('contentcontrollerInit', $controller); SiteTree::singleton()->extend('contentcontrollerInit', $controller);
$this->assertEquals(SSViewer::get_themes(), $defaultThemes, $this->assertEquals(
'Themes should not be modified when Subsite has no theme defined'); SSViewer::get_themes(),
$defaultThemes,
'Themes should not be modified when Subsite has no theme defined'
);
$pageWithTheme = $this->objFromFixture(Page::class, 'subsite1_home'); $pageWithTheme = $this->objFromFixture(Page::class, 'subsite1_home');
Subsite::changeSubsite($pageWithTheme->SubsiteID); Subsite::changeSubsite($pageWithTheme->SubsiteID);
$controller = ModelAsController::controller_for($pageWithTheme); $controller = ModelAsController::controller_for($pageWithTheme);
SiteTree::singleton()->extend('contentcontrollerInit', $controller); SiteTree::singleton()->extend('contentcontrollerInit', $controller);
$subsiteTheme = $pageWithTheme->Subsite()->Theme; $subsiteTheme = $pageWithTheme->Subsite()->Theme;
$this->assertEquals(SSViewer::get_themes(), array_merge([$subsiteTheme], $defaultThemes), $this->assertEquals(
'Themes should be modified when Subsite has theme defined'); SSViewer::get_themes(),
array_merge([$subsiteTheme], $defaultThemes),
} 'Themes should be modified when Subsite has theme defined'
} );
class SiteTreeSubsitesTest_ClassA extends SiteTree implements TestOnly
{
}
class SiteTreeSubsitesTest_ClassB extends SiteTree implements TestOnly
{
}
class SiteTreeSubsitesTest_ErrorPage extends ErrorPage implements TestOnly
{
/**
* Helper method to call protected members
*
* @param int $statusCode
* @return string
*/
public static function get_error_filename_spy($statusCode)
{
return self::get_error_filename($statusCode);
} }
} }

View File

@ -0,0 +1,10 @@
<?php
namespace SilverStripe\Subsites\Tests\SiteTreeSubsitesTest;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Dev\TestOnly;
class TestClassA extends SiteTree implements TestOnly
{
}

View File

@ -0,0 +1,10 @@
<?php
namespace SilverStripe\Subsites\Tests\SiteTreeSubsitesTest;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Dev\TestOnly;
class TestClassB extends SiteTree implements TestOnly
{
}

View File

@ -0,0 +1,20 @@
<?php
namespace SilverStripe\Subsites\Tests\SiteTreeSubsitesTest;
use SilverStripe\Dev\TestOnly;
use SilverStripe\ErrorPage\ErrorPage;
class TestErrorPage extends ErrorPage implements TestOnly
{
/**
* Helper method to call protected members
*
* @param int $statusCode
* @return string
*/
public static function get_error_filename_spy($statusCode)
{
return self::get_error_filename($statusCode);
}
}

View File

@ -12,14 +12,14 @@ use SilverStripe\Subsites\Model\Subsite;
class SubsiteAdminFunctionalTest extends FunctionalTest class SubsiteAdminFunctionalTest extends FunctionalTest
{ {
public static $fixture_file = 'subsites/tests/php/SubsiteTest.yml'; protected static $fixture_file = 'SubsiteTest.yml';
public static $use_draft_site = true; protected static $use_draft_site = true;
protected $autoFollowRedirection = false; protected $autoFollowRedirection = false;
/** /**
* Helper: FunctionalTest is only able to follow redirection once, we want to go all the way. * Helper: FunctionalTest is only able to follow redirection once, we want to go all the way.
* @param $url * @param string $url
* @return \SilverStripe\Control\HTTPResponse * @return \SilverStripe\Control\HTTPResponse
*/ */
public function getAndFollowAll($url) public function getAndFollowAll($url)
@ -46,8 +46,11 @@ class SubsiteAdminFunctionalTest extends FunctionalTest
$this->assertRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), 'Admin is disallowed'); $this->assertRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), 'Admin is disallowed');
$response = $this->getAndFollowAll('SubsiteXHRController'); $response = $this->getAndFollowAll('SubsiteXHRController');
$this->assertRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), $this->assertRegExp(
'SubsiteXHRController is disallowed'); '#^Security/login.*#',
$this->mainSession->lastUrl(),
'SubsiteXHRController is disallowed'
);
} }
/** /**
@ -55,8 +58,7 @@ class SubsiteAdminFunctionalTest extends FunctionalTest
*/ */
public function testAdminCanAccessAllSubsites() public function testAdminCanAccessAllSubsites()
{ {
$member = $this->objFromFixture(Member::class, 'admin'); $this->logInAs('admin');
Session::set('loggedInAs', $member->ID);
$this->getAndFollowAll('admin/pages/?SubsiteID=0'); $this->getAndFollowAll('admin/pages/?SubsiteID=0');
$this->assertEquals(Subsite::currentSubsiteID(), '0', 'Can access main site.'); $this->assertEquals(Subsite::currentSubsiteID(), '0', 'Can access main site.');
@ -68,14 +70,16 @@ class SubsiteAdminFunctionalTest extends FunctionalTest
$this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section');
$response = $this->getAndFollowAll(SubsiteXHRController::class); $response = $this->getAndFollowAll(SubsiteXHRController::class);
$this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), $this->assertNotRegExp(
'SubsiteXHRController is reachable'); '#^Security/login.*#',
$this->mainSession->lastUrl(),
'SubsiteXHRController is reachable'
);
} }
public function testAdminIsRedirectedToObjectsSubsite() public function testAdminIsRedirectedToObjectsSubsite()
{ {
$member = $this->objFromFixture(Member::class, 'admin'); $this->logInAs('admin');
Session::set('loggedInAs', $member->ID);
$mainSubsitePage = $this->objFromFixture('Page', 'mainSubsitePage'); $mainSubsitePage = $this->objFromFixture('Page', 'mainSubsitePage');
$subsite1Home = $this->objFromFixture('Page', 'subsite1_home'); $subsite1Home = $this->objFromFixture('Page', 'subsite1_home');
@ -85,20 +89,29 @@ class SubsiteAdminFunctionalTest extends FunctionalTest
Config::modify()->set(CMSPageEditController::class, 'treats_subsite_0_as_global', false); Config::modify()->set(CMSPageEditController::class, 'treats_subsite_0_as_global', false);
Subsite::changeSubsite(0); Subsite::changeSubsite(0);
$this->getAndFollowAll("admin/pages/edit/show/$subsite1Home->ID"); $this->getAndFollowAll("admin/pages/edit/show/$subsite1Home->ID");
$this->assertEquals(Subsite::currentSubsiteID(), $subsite1Home->SubsiteID, $this->assertEquals(
'Loading an object switches the subsite'); Subsite::currentSubsiteID(),
$subsite1Home->SubsiteID,
'Loading an object switches the subsite'
);
$this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section');
Config::modify()->set(CMSPageEditController::class, 'treats_subsite_0_as_global', true); Config::modify()->set(CMSPageEditController::class, 'treats_subsite_0_as_global', true);
Subsite::changeSubsite(0); Subsite::changeSubsite(0);
$this->getAndFollowAll("admin/pages/edit/show/$subsite1Home->ID"); $this->getAndFollowAll("admin/pages/edit/show/$subsite1Home->ID");
$this->assertEquals(Subsite::currentSubsiteID(), $subsite1Home->SubsiteID, $this->assertEquals(
'Loading a non-main-site object still switches the subsite if configured with treats_subsite_0_as_global'); Subsite::currentSubsiteID(),
$subsite1Home->SubsiteID,
'Loading a non-main-site object still switches the subsite if configured with treats_subsite_0_as_global'
);
$this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section');
$this->getAndFollowAll("admin/pages/edit/show/$mainSubsitePage->ID"); $this->getAndFollowAll("admin/pages/edit/show/$mainSubsitePage->ID");
$this->assertNotEquals(Subsite::currentSubsiteID(), $mainSubsitePage->SubsiteID, $this->assertNotEquals(
'Loading a main-site object does not change the subsite if configured with treats_subsite_0_as_global'); Subsite::currentSubsiteID(),
$mainSubsitePage->SubsiteID,
'Loading a main-site object does not change the subsite if configured with treats_subsite_0_as_global'
);
$this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section');
Config::unnest(); Config::unnest();
@ -110,8 +123,7 @@ class SubsiteAdminFunctionalTest extends FunctionalTest
*/ */
public function testEditorCanAccessAllSubsites() public function testEditorCanAccessAllSubsites()
{ {
$member = $this->objFromFixture(Member::class, 'editor'); $this->logInAs('editor');
Session::set('loggedInAs', $member->ID);
$this->getAndFollowAll('admin/pages/?SubsiteID=0'); $this->getAndFollowAll('admin/pages/?SubsiteID=0');
$this->assertEquals(Subsite::currentSubsiteID(), '0', 'Can access main site.'); $this->assertEquals(Subsite::currentSubsiteID(), '0', 'Can access main site.');
@ -123,8 +135,11 @@ class SubsiteAdminFunctionalTest extends FunctionalTest
$this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section'); $this->assertRegExp('#^admin/pages.*#', $this->mainSession->lastUrl(), 'Lands on the correct section');
$response = $this->getAndFollowAll('SubsiteXHRController'); $response = $this->getAndFollowAll('SubsiteXHRController');
$this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), $this->assertNotRegExp(
'SubsiteXHRController is reachable'); '#^Security/login.*#',
$this->mainSession->lastUrl(),
'SubsiteXHRController is reachable'
);
} }
/** /**
@ -145,8 +160,11 @@ class SubsiteAdminFunctionalTest extends FunctionalTest
// Check forbidden section in allowed subsite. // Check forbidden section in allowed subsite.
$this->getAndFollowAll("admin/assets/?SubsiteID={$subsite1->ID}"); $this->getAndFollowAll("admin/assets/?SubsiteID={$subsite1->ID}");
$this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Is redirected within subsite.'); $this->assertEquals(Subsite::currentSubsiteID(), $subsite1->ID, 'Is redirected within subsite.');
$this->assertNotRegExp('#^admin/assets/.*#', $this->mainSession->lastUrl(), $this->assertNotRegExp(
'Is redirected away from forbidden section'); '#^admin/assets/.*#',
$this->mainSession->lastUrl(),
'Is redirected away from forbidden section'
);
// Check forbidden site, on a section that's allowed on another subsite // Check forbidden site, on a section that's allowed on another subsite
$this->getAndFollowAll('admin/pages/?SubsiteID=0'); $this->getAndFollowAll('admin/pages/?SubsiteID=0');
@ -159,7 +177,10 @@ class SubsiteAdminFunctionalTest extends FunctionalTest
// Check the standalone XHR controller. // Check the standalone XHR controller.
$response = $this->getAndFollowAll(SubsiteXHRController::class); $response = $this->getAndFollowAll(SubsiteXHRController::class);
$this->assertNotRegExp('#^Security/login.*#', $this->mainSession->lastUrl(), $this->assertNotRegExp(
'SubsiteXHRController is reachable'); '#^Security/login.*#',
$this->mainSession->lastUrl(),
'SubsiteXHRController is reachable'
);
} }
} }

View File

@ -10,9 +10,9 @@ use SilverStripe\Subsites\Model\Subsite;
class SubsiteAdminTest extends BaseSubsiteTest class SubsiteAdminTest extends BaseSubsiteTest
{ {
public static $fixture_file = 'subsites/tests/php/SubsiteTest.yml'; protected static $fixture_file = 'SubsiteTest.yml';
public function adminLoggedInSession() protected function adminLoggedInSession()
{ {
return new Session([ return new Session([
'loggedInAs' => $this->idFromFixture(Member::class, 'admin') 'loggedInAs' => $this->idFromFixture(Member::class, 'admin')
@ -31,11 +31,15 @@ class SubsiteAdminTest extends BaseSubsiteTest
$response1 = Director::test('admin/subsites/', null, $this->adminLoggedInSession()); $response1 = Director::test('admin/subsites/', null, $this->adminLoggedInSession());
// Confirm that this URL gets you the entire page, with the edit form loaded // Confirm that this URL gets you the entire page, with the edit form loaded
$response2 = Director::test("admin/subsites/SilverStripe-Subsites-Model-Subsite/EditForm/field/SilverStripe-Subsites-Model-Subsite/item/$subsite1ID/edit", $response2 = Director::test(
"admin/subsites/SilverStripe-Subsites-Model-Subsite/EditForm/field/SilverStripe-Subsites-Model-Subsite/item/$subsite1ID/edit",
null, null,
$this->adminLoggedInSession()); $this->adminLoggedInSession()
$this->assertTrue(strpos($response2->getBody(), 'id="Form_ItemEditForm_ID"') !== false, );
'Testing Form_ItemEditForm_ID exists'); $this->assertTrue(
strpos($response2->getBody(), 'id="Form_ItemEditForm_ID"') !== false,
'Testing Form_ItemEditForm_ID exists'
);
$this->assertTrue(strpos($response2->getBody(), '<head') !== false, 'Testing <head> exists'); $this->assertTrue(strpos($response2->getBody(), '<head') !== false, 'Testing <head> exists');
} }
@ -46,8 +50,7 @@ class SubsiteAdminTest extends BaseSubsiteTest
*/ */
public function testMainsiteAdminCanAccessAllSubsites() public function testMainsiteAdminCanAccessAllSubsites()
{ {
$member = $this->objFromFixture(Member::class, 'admin'); $this->logInAs('admin');
Session::set('loggedInAs', $member->ID);
$cmsMain = new CMSMain(); $cmsMain = new CMSMain();
foreach ($cmsMain->Subsites() as $subsite) { foreach ($cmsMain->Subsites() as $subsite) {
@ -56,12 +59,15 @@ class SubsiteAdminTest extends BaseSubsiteTest
$this->assertArrayHasKey(0, $ids, 'Main site accessible'); $this->assertArrayHasKey(0, $ids, 'Main site accessible');
$this->assertArrayHasKey($this->idFromFixture(Subsite::class, 'main'), $ids, 'Site with no groups inaccesible'); $this->assertArrayHasKey($this->idFromFixture(Subsite::class, 'main'), $ids, 'Site with no groups inaccesible');
$this->assertArrayHasKey($this->idFromFixture(Subsite::class, 'subsite1'), $ids, $this->assertArrayHasKey(
'Subsite1 Template inaccessible'); $this->idFromFixture(Subsite::class, 'subsite1'),
$this->assertArrayHasKey($this->idFromFixture(Subsite::class, 'subsite2'), $ids, $ids,
'Subsite2 Template inaccessible'); 'Subsite1 Template inaccessible'
);
$this->assertArrayHasKey(
$this->idFromFixture(Subsite::class, 'subsite2'),
$ids,
'Subsite2 Template inaccessible'
);
} }
} }

View File

@ -2,7 +2,6 @@
namespace subsites\tests\php; namespace subsites\tests\php;
use Page; use Page;
use SilverStripe\Dev\FunctionalTest; use SilverStripe\Dev\FunctionalTest;
use SilverStripe\Subsites\Model\Subsite; use SilverStripe\Subsites\Model\Subsite;
@ -10,7 +9,7 @@ use SilverStripe\View\SSViewer;
class SubsiteFunctionalTest extends FunctionalTest class SubsiteFunctionalTest extends FunctionalTest
{ {
public static $fixture_file = 'subsites/tests/php/SubsiteTest.yml'; protected static $fixture_file = 'SubsiteTest.yml';
/** /**
* @todo: remove test from SiteTreeSubsitesTest when this one works. Seems domain lookup is broken atm * @todo: remove test from SiteTreeSubsitesTest when this one works. Seems domain lookup is broken atm
@ -24,15 +23,20 @@ class SubsiteFunctionalTest extends FunctionalTest
$subsitePage = $this->objFromFixture(Page::class, 'contact'); $subsitePage = $this->objFromFixture(Page::class, 'contact');
$this->get($subsitePage->AbsoluteLink()); $this->get($subsitePage->AbsoluteLink());
$this->assertEquals($subsitePage->SubsiteID, Subsite::currentSubsiteID(), 'Subsite should be changed'); $this->assertEquals($subsitePage->SubsiteID, Subsite::currentSubsiteID(), 'Subsite should be changed');
$this->assertEquals(SSViewer::get_themes(), $defaultThemes, $this->assertEquals(
'Themes should not be modified when Subsite has no theme defined'); SSViewer::get_themes(),
$defaultThemes,
'Themes should not be modified when Subsite has no theme defined'
);
$pageWithTheme = $this->objFromFixture(Page::class, 'subsite1_contactus'); $pageWithTheme = $this->objFromFixture(Page::class, 'subsite1_contactus');
$this->get($pageWithTheme->AbsoluteLink()); $this->get($pageWithTheme->AbsoluteLink());
$subsiteTheme = $pageWithTheme->Subsite()->Theme; $subsiteTheme = $pageWithTheme->Subsite()->Theme;
$this->assertEquals($pageWithTheme->SubsiteID, Subsite::currentSubsiteID(), 'Subsite should be changed'); $this->assertEquals($pageWithTheme->SubsiteID, Subsite::currentSubsiteID(), 'Subsite should be changed');
$this->assertEquals(SSViewer::get_themes(), array_merge([$subsiteTheme], $defaultThemes), $this->assertEquals(
'Themes should be modified when Subsite has theme defined'); SSViewer::get_themes(),
array_merge([$subsiteTheme], $defaultThemes),
'Themes should be modified when Subsite has theme defined'
);
} }
} }

View File

@ -13,7 +13,7 @@ use SilverStripe\Subsites\Model\SubsiteDomain;
class SubsiteTest extends BaseSubsiteTest class SubsiteTest extends BaseSubsiteTest
{ {
public static $fixture_file = 'subsites/tests/php/SubsiteTest.yml'; protected static $fixture_file = 'SubsiteTest.yml';
/** /**
* Original value of {@see SubSite::$strict_subdomain_matching} * Original value of {@see SubSite::$strict_subdomain_matching}
@ -29,7 +29,7 @@ class SubsiteTest extends BaseSubsiteTest
*/ */
protected $origServer = []; protected $origServer = [];
public function setUp() protected function setUp()
{ {
parent::setUp(); parent::setUp();
@ -39,7 +39,7 @@ class SubsiteTest extends BaseSubsiteTest
Subsite::$strict_subdomain_matching = false; Subsite::$strict_subdomain_matching = false;
} }
public function tearDown() protected function tearDown()
{ {
$_SERVER = $this->origServer; $_SERVER = $this->origServer;
Subsite::$strict_subdomain_matching = $this->origStrictSubdomainMatching; Subsite::$strict_subdomain_matching = $this->origStrictSubdomainMatching;
@ -82,7 +82,9 @@ class SubsiteTest extends BaseSubsiteTest
$siteHome = DataObject::get_one('Page', "\"URLSegment\" = 'home'"); $siteHome = DataObject::get_one('Page', "\"URLSegment\" = 'home'");
$this->assertNotEquals($siteHome, false, 'Home Page for subsite not found'); $this->assertNotEquals($siteHome, false, 'Home Page for subsite not found');
$this->assertEquals($subsite->ID, $siteHome->SubsiteID, $this->assertEquals(
$subsite->ID,
$siteHome->SubsiteID,
'createInstance() copies existing pages retaining the same URLSegment' 'createInstance() copies existing pages retaining the same URLSegment'
); );
@ -262,23 +264,33 @@ class SubsiteTest extends BaseSubsiteTest
*/ */
public function testDefaultDomain() public function testDefaultDomain()
{ {
$this->assertEquals('one.example.org', $this->assertEquals(
$this->objFromFixture(Subsite::class, 'domaintest1')->domain()); 'one.example.org',
$this->objFromFixture(Subsite::class, 'domaintest1')->domain()
);
$this->assertEquals('two.mysite.com', $this->assertEquals(
$this->objFromFixture(Subsite::class, 'domaintest2')->domain()); 'two.mysite.com',
$this->objFromFixture(Subsite::class, 'domaintest2')->domain()
);
$_SERVER['HTTP_HOST'] = 'www.example.org'; $_SERVER['HTTP_HOST'] = 'www.example.org';
$this->assertEquals('three.example.org', $this->assertEquals(
$this->objFromFixture(Subsite::class, 'domaintest3')->domain()); 'three.example.org',
$this->objFromFixture(Subsite::class, 'domaintest3')->domain()
);
$_SERVER['HTTP_HOST'] = 'mysite.example.org'; $_SERVER['HTTP_HOST'] = 'mysite.example.org';
$this->assertEquals('three.mysite.example.org', $this->assertEquals(
$this->objFromFixture(Subsite::class, 'domaintest3')->domain()); 'three.mysite.example.org',
$this->objFromFixture(Subsite::class, 'domaintest3')->domain()
);
$this->assertEquals($_SERVER['HTTP_HOST'], singleton(Subsite::class)->PrimaryDomain); $this->assertEquals($_SERVER['HTTP_HOST'], singleton(Subsite::class)->PrimaryDomain);
$this->assertEquals('http://' . $_SERVER['HTTP_HOST'] . Director::baseURL(), $this->assertEquals(
singleton(Subsite::class)->absoluteBaseURL()); 'http://' . $_SERVER['HTTP_HOST'] . Director::baseURL(),
singleton(Subsite::class)->absoluteBaseURL()
);
} }
/** /**
@ -358,14 +370,22 @@ class SubsiteTest extends BaseSubsiteTest
*/ */
public function testAccessibleSites() public function testAccessibleSites()
{ {
$member1Sites = Subsite::accessible_sites('CMS_ACCESS_CMSMain', false, null, $member1Sites = Subsite::accessible_sites(
$this->objFromFixture(Member::class, 'subsite1member')); 'CMS_ACCESS_CMSMain',
false,
null,
$this->objFromFixture(Member::class, 'subsite1member')
);
$member1SiteTitles = $member1Sites->column('Title'); $member1SiteTitles = $member1Sites->column('Title');
sort($member1SiteTitles); sort($member1SiteTitles);
$this->assertEquals('Subsite1 Template', $member1SiteTitles[0], 'Member can get to a subsite via a group'); $this->assertEquals('Subsite1 Template', $member1SiteTitles[0], 'Member can get to a subsite via a group');
$adminSites = Subsite::accessible_sites('CMS_ACCESS_CMSMain', false, null, $adminSites = Subsite::accessible_sites(
$this->objFromFixture(Member::class, 'admin')); 'CMS_ACCESS_CMSMain',
false,
null,
$this->objFromFixture(Member::class, 'admin')
);
$adminSiteTitles = $adminSites->column('Title'); $adminSiteTitles = $adminSites->column('Title');
sort($adminSiteTitles); sort($adminSiteTitles);
$this->assertEquals([ $this->assertEquals([
@ -380,7 +400,9 @@ class SubsiteTest extends BaseSubsiteTest
], array_values($adminSiteTitles)); ], array_values($adminSiteTitles));
$member2Sites = Subsite::accessible_sites( $member2Sites = Subsite::accessible_sites(
'CMS_ACCESS_CMSMain', false, null, 'CMS_ACCESS_CMSMain',
false,
null,
$this->objFromFixture(Member::class, 'subsite1member2') $this->objFromFixture(Member::class, 'subsite1member2')
); );
$member2SiteTitles = $member2Sites->column('Title'); $member2SiteTitles = $member2Sites->column('Title');

View File

@ -112,14 +112,14 @@ Page:
SubsiteID: =>SilverStripe\Subsites\Model\Subsite.subsite2 SubsiteID: =>SilverStripe\Subsites\Model\Subsite.subsite2
URLSegment: contact-us URLSegment: contact-us
PermissionRoleCode: SilverStripe\Security\PermissionRoleCode:
roleCode1: roleCode1:
Code: CMS_ACCESS_CMSMain Code: CMS_ACCESS_CMSMain
PermissionRole: SilverStripe\Security\PermissionRole:
role1: role1:
Title: role1 Title: role1
Codes: =>PermissionRoleCode.roleCode1 Codes: =>SilverStripe\Security\PermissionRoleCode.roleCode1
Group: SilverStripe\Security\Group:
admin: admin:
Title: Admin Title: Admin
Code: admin Code: admin
@ -151,71 +151,71 @@ Group:
Title: subsite1_group_via_role Title: subsite1_group_via_role
Code: subsite1_group_via_role Code: subsite1_group_via_role
AccessAllSubsites: 1 AccessAllSubsites: 1
Roles: =>PermissionRole.role1 Roles: =>SilverStripe\Security\PermissionRole.role1
Permission: SilverStripe\Security\Permission:
admin: admin:
Code: ADMIN Code: ADMIN
GroupID: =>Group.admin GroupID: =>SilverStripe\Security\Group.admin
editor1: editor1:
Code: CMS_ACCESS_CMSMain Code: CMS_ACCESS_CMSMain
GroupID: =>Group.editor GroupID: =>SilverStripe\Security\Group.editor
editor2: editor2:
Code: SITETREE_VIEW_ALL Code: SITETREE_VIEW_ALL
GroupID: =>Group.editor GroupID: =>SilverStripe\Security\Group.editor
editor3: editor3:
Code: VIEW_DRAFT_CONTENT Code: VIEW_DRAFT_CONTENT
GroupID: =>Group.editor GroupID: =>SilverStripe\Security\Group.editor
accesscmsmain1: accesscmsmain1:
Code: CMS_ACCESS_CMSMain Code: CMS_ACCESS_CMSMain
GroupID: =>Group.subsite1_group GroupID: =>SilverStripe\Security\Group.subsite1_group
accesscmsmain2: accesscmsmain2:
Code: CMS_ACCESS_CMSMain Code: CMS_ACCESS_CMSMain
GroupID: =>Group.subsite2_group GroupID: =>SilverStripe\Security\Group.subsite2_group
accesscmsmain3: accesscmsmain3:
Code: CMS_ACCESS_CMSMain Code: CMS_ACCESS_CMSMain
GroupID: =>Group.subsite1admins GroupID: =>SilverStripe\Security\Group.subsite1admins
accesscmsmain4: accesscmsmain4:
Code: CMS_ACCESS_CMSMain Code: CMS_ACCESS_CMSMain
GroupID: =>Group.allsubsitesauthors GroupID: =>SilverStripe\Security\Group.allsubsitesauthors
securityaccess1: securityaccess1:
Code: CMS_ACCESS_SecurityAdmin Code: CMS_ACCESS_SecurityAdmin
GroupID: =>Group.subsite1_group GroupID: =>SilverStripe\Security\Group.subsite1_group
securityaccess2: securityaccess2:
Code: CMS_ACCESS_SecurityAdmin Code: CMS_ACCESS_SecurityAdmin
GroupID: =>Group.subsite2_group GroupID: =>SilverStripe\Security\Group.subsite2_group
adminsubsite1: adminsubsite1:
Code: ADMIN Code: ADMIN
GroupID: =>Group.subsite1admins GroupID: =>SilverStripe\Security\Group.subsite1admins
Member: SilverStripe\Security\Member:
admin: admin:
FirstName: Admin FirstName: Admin
Surname: User Surname: User
Email: admin@test.com Email: admin@test.com
Password: rangi Password: rangi
Groups: =>Group.admin Groups: =>SilverStripe\Security\Group.admin
editor: editor:
FirstName: Editor FirstName: Editor
Surname: User Surname: User
Email: editor@test.com Email: editor@test.com
Password: rangi Password: rangi
Groups: =>Group.editor Groups: =>SilverStripe\Security\Group.editor
subsite1member: subsite1member:
Email: subsite1member@test.com Email: subsite1member@test.com
Groups: =>Group.subsite1_group Groups: =>SilverStripe\Security\Group.subsite1_group
subsite2member: subsite2member:
Email: subsite2member@test.com Email: subsite2member@test.com
Groups: =>Group.subsite2_group Groups: =>SilverStripe\Security\Group.subsite2_group
subsite1admin: subsite1admin:
Email: subsite1admin@test.com Email: subsite1admin@test.com
Groups: =>Group.subsite1admins Groups: =>SilverStripe\Security\Group.subsite1admins
allsubsitesauthor: allsubsitesauthor:
Email: allsubsitesauthor@test.com Email: allsubsitesauthor@test.com
Groups: =>Group.allsubsitesauthors Groups: =>SilverStripe\Security\Group.allsubsitesauthors
subsite1member2: subsite1member2:
Email: subsite1member2@test.com Email: subsite1member2@test.com
Groups: =>Group.subsite1_group_via_role Groups: =>SilverStripe\Security\Group.subsite1_group_via_role
SiteConfig: SilverStripe\SiteConfig\SiteConfig:
config: config:
CanCreateTopLevelType: LoggedInUsers CanCreateTopLevelType: LoggedInUsers

View File

@ -5,12 +5,6 @@ namespace SilverStripe\Subsites\Tests;
use SilverStripe\Control\Session; use SilverStripe\Control\Session;
use SilverStripe\Dev\FunctionalTest; use SilverStripe\Dev\FunctionalTest;
/**
* Created by PhpStorm.
* User: dmooyman
* Date: 27/05/16
* Time: 3:10 PM
*/
class SubsiteXHRControllerTest extends FunctionalTest class SubsiteXHRControllerTest extends FunctionalTest
{ {
protected static $fixture_file = 'SubsiteTest.yml'; protected static $fixture_file = 'SubsiteTest.yml';
@ -18,7 +12,8 @@ class SubsiteXHRControllerTest extends FunctionalTest
public function testCanView() public function testCanView()
{ {
// Test unauthenticated access // Test unauthenticated access
Session::clear('MemberID'); $this->logOut();
$result = $this->get('SubsiteXHRController', null, [ $result = $this->get('SubsiteXHRController', null, [
'X-Pjax' => 'SubsiteList', 'X-Pjax' => 'SubsiteList',
'X-Requested-With' => 'XMLHttpRequest' 'X-Requested-With' => 'XMLHttpRequest'
@ -42,9 +37,9 @@ class SubsiteXHRControllerTest extends FunctionalTest
$this->assertEquals(200, $result->getStatusCode()); $this->assertEquals(200, $result->getStatusCode());
$this->assertEquals('text/json', $result->getHeader('Content-Type')); $this->assertEquals('text/json', $result->getHeader('Content-Type'));
$body = $result->getBody(); $body = $result->getBody();
static::assertContains('Main site', $body); $this->assertContains('Main site', $body);
static::assertContains('Test 1', $body); $this->assertContains('Test 1', $body);
static::assertContains('Test 2', $body); $this->assertContains('Test 2', $body);
static::assertContains('Test 3', $body); $this->assertContains('Test 3', $body);
} }
} }

View File

@ -16,16 +16,16 @@ use SilverStripe\Versioned\Versioned;
class SubsitesVirtualPageTest extends BaseSubsiteTest class SubsitesVirtualPageTest extends BaseSubsiteTest
{ {
public static $fixture_file = [ protected static $fixture_file = [
'subsites/tests/php/SubsiteTest.yml', 'SubsiteTest.yml',
'subsites/tests/php/SubsitesVirtualPageTest.yml', 'SubsitesVirtualPageTest.yml',
]; ];
protected $illegalExtensions = [ protected static $illegal_extensions = [
'SiteTree' => ['Translatable'] SiteTree::class => ['Translatable'] // @todo implement Translatable namespace
]; ];
public function setUp() protected function setUp()
{ {
parent::setUp(); parent::setUp();
@ -61,7 +61,7 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest
Subsite::changeSubsite($subsite->ID); Subsite::changeSubsite($subsite->ID);
Subsite::$disable_subsite_filter = false; Subsite::$disable_subsite_filter = false;
$linky = $this->objFromFixture('Page', 'linky'); $linky = $this->objFromFixture(Page::class, 'linky');
$svp = new SubsitesVirtualPage(); $svp = new SubsitesVirtualPage();
$svp->CopyContentFromID = $linky->ID; $svp->CopyContentFromID = $linky->ID;
@ -97,10 +97,14 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest
$file->write(); $file->write();
// Verify that the draft and publish virtual pages both have the corrected link // Verify that the draft and publish virtual pages both have the corrected link
static::assertContains('<img src="/assets/SubsitesVirtualPageTest/464dedb70a/renamed-test-file.pdf"', $this->assertContains(
DB::query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = $svp->ID")->value()); '<img src="/assets/SubsitesVirtualPageTest/464dedb70a/renamed-test-file.pdf"',
static::assertContains('<img src="/assets/SubsitesVirtualPageTest/464dedb70a/renamed-test-file.pdf"', DB::query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = $svp->ID")->value()
DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $svp->ID")->value()); );
$this->assertContains(
'<img src="/assets/SubsitesVirtualPageTest/464dedb70a/renamed-test-file.pdf"',
DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $svp->ID")->value()
);
} }
public function testSubsiteVirtualPagesArentInappropriatelyPublished() public function testSubsiteVirtualPagesArentInappropriatelyPublished()
@ -299,7 +303,7 @@ class SubsitesVirtualPageTest extends BaseSubsiteTest
); );
} }
public function fixVersionNumberCache($page) protected function fixVersionNumberCache($page)
{ {
$pages = func_get_args(); $pages = func_get_args();
foreach ($pages as $p) { foreach ($pages as $p) {

View File

@ -1,11 +1,11 @@
# These need to come first so that SiteTree has the link meta-data written. # These need to come first so that SiteTree has the link meta-data written.
File: SilverStripe\Assets\File:
file1: file1:
FileFilename: testscript-test-file.pdf FileFilename: testscript-test-file.pdf
FileHash: 464dedb70af0dc7f8f3360e7f3ae43cbbf1cdf4e FileHash: 464dedb70af0dc7f8f3360e7f3ae43cbbf1cdf4e
Name: testscript-test-file.pdf Name: testscript-test-file.pdf
SiteTree: SilverStripe\CMS\Model\SiteTree:
page1: page1:
Title: page1 Title: page1
URLSegment: page1 URLSegment: page1

View File

@ -83,5 +83,4 @@ class WildcardDomainFieldTest extends SapphireTest
['*'] ['*']
]; ];
} }
} }