2007-08-16 08:38:29 +02:00
< ? php
2015-11-23 04:53:45 +01:00
class SubsiteTest extends BaseSubsiteTest
{
public static $fixture_file = 'subsites/tests/SubsiteTest.yml' ;
2015-11-24 05:15:08 +01:00
/**
* Original value of { @ see SubSite :: $strict_subdomain_matching }
*
* @ var bool
*/
protected $origStrictSubdomainMatching = null ;
/**
* Original value of $_REQUEST
*
* @ var array
*/
protected $origServer = array ();
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
public function setUp ()
{
parent :: setUp ();
2016-05-23 00:41:51 +02:00
2015-11-24 05:15:08 +01:00
Config :: inst () -> update ( 'Director' , 'alternate_base_url' , '/' );
2015-11-23 04:53:45 +01:00
$this -> origStrictSubdomainMatching = Subsite :: $strict_subdomain_matching ;
2015-11-24 05:15:08 +01:00
$this -> origServer = $_SERVER ;
2015-11-23 04:53:45 +01:00
Subsite :: $strict_subdomain_matching = false ;
}
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
public function tearDown ()
{
2015-11-24 05:15:08 +01:00
$_SERVER = $this -> origServer ;
2015-11-23 04:53:45 +01:00
Subsite :: $strict_subdomain_matching = $this -> origStrictSubdomainMatching ;
2015-11-24 05:15:08 +01:00
parent :: tearDown ();
2015-11-23 04:53:45 +01:00
}
2011-09-09 11:59:46 +02:00
2015-11-23 04:53:45 +01:00
/**
* Create a new subsite from the template and verify that all the template ' s pages are copied
*/
public function testSubsiteCreation ()
{
Subsite :: $write_hostmap = false ;
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
// Create the instance
$template = $this -> objFromFixture ( 'Subsite' , 'main' );
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
// Test that changeSubsite is working
Subsite :: changeSubsite ( $template -> ID );
2016-05-23 00:41:51 +02:00
$this -> assertEquals ( $template -> ID , Subsite :: currentSubsiteID ());
2015-11-23 04:53:45 +01:00
$tmplStaff = $this -> objFromFixture ( 'Page' , 'staff' );
$tmplHome = DataObject :: get_one ( 'Page' , " \" URLSegment \" = 'home' " );
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
// Publish all the pages in the template, testing that DataObject::get only returns pages from the chosen subsite
$pages = DataObject :: get ( " SiteTree " );
$totalPages = $pages -> Count ();
foreach ( $pages as $page ) {
$this -> assertEquals ( $template -> ID , $page -> SubsiteID );
$page -> publish ( 'Stage' , 'Live' );
}
2007-08-21 00:37:43 +02:00
2015-11-23 04:53:45 +01:00
// Create a new site
$subsite = $template -> duplicate ();
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
// Check title
$this -> assertEquals ( $subsite -> Title , $template -> Title );
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
// Another test that changeSubsite is working
$subsite -> activate ();
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
$siteHome = DataObject :: get_one ( 'Page' , " \" URLSegment \" = 'home' " );
$this -> assertNotEquals ( $siteHome , false , 'Home Page for subsite not found' );
$this -> assertEquals ( $subsite -> ID , $siteHome -> SubsiteID ,
'createInstance() copies existing pages retaining the same URLSegment'
);
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
Subsite :: changeSubsite ( 0 );
}
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
/**
* Confirm that domain lookup is working
*/
public function testDomainLookup ()
{
// Clear existing fixtures
foreach ( DataObject :: get ( 'Subsite' ) as $subsite ) {
$subsite -> delete ();
}
foreach ( DataObject :: get ( 'SubsiteDomain' ) as $domain ) {
$domain -> delete ();
}
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
// Much more expressive than YML in this case
$subsite1 = $this -> createSubsiteWithDomains ( array (
'one.example.org' => true ,
'one.*' => false ,
));
$subsite2 = $this -> createSubsiteWithDomains ( array (
'two.mysite.com' => true ,
'*.mysite.com' => false ,
'subdomain.onmultiplesubsites.com' => false ,
));
$subsite3 = $this -> createSubsiteWithDomains ( array (
'three.*' => true , // wildcards in primary domain are not recommended
'subdomain.unique.com' => false ,
'*.onmultiplesubsites.com' => false ,
));
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
$this -> assertEquals (
$subsite3 -> ID ,
Subsite :: getSubsiteIDForDomain ( 'subdomain.unique.com' ),
'Full unique match'
);
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
$this -> assertEquals (
$subsite1 -> ID ,
Subsite :: getSubsiteIDForDomain ( 'one.example.org' ),
'Full match, doesn\'t complain about multiple matches within a single subsite'
);
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
$failed = false ;
try {
Subsite :: getSubsiteIDForDomain ( 'subdomain.onmultiplesubsites.com' );
} catch ( UnexpectedValueException $e ) {
$failed = true ;
}
$this -> assertTrue (
$failed ,
'Fails on multiple matches with wildcard vs. www across multiple subsites'
);
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
$this -> assertEquals (
$subsite1 -> ID ,
Subsite :: getSubsiteIDForDomain ( 'one.unique.com' ),
'Fuzzy match suffixed with wildcard (rule "one.*")'
);
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
$this -> assertEquals (
$subsite2 -> ID ,
Subsite :: getSubsiteIDForDomain ( 'two.mysite.com' ),
'Matches correct subsite for rule'
);
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
$this -> assertEquals (
$subsite2 -> ID ,
Subsite :: getSubsiteIDForDomain ( 'other.mysite.com' ),
'Fuzzy match prefixed with wildcard (rule "*.mysite.com")'
);
2012-08-07 17:37:44 +02:00
2015-11-23 04:53:45 +01:00
$this -> assertEquals (
0 ,
Subsite :: getSubsiteIDForDomain ( 'unknown.madeup.com' ),
" Doesn't match unknown subsite "
);
}
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
public function testStrictSubdomainMatching ()
{
// Clear existing fixtures
foreach ( DataObject :: get ( 'Subsite' ) as $subsite ) {
$subsite -> delete ();
}
foreach ( DataObject :: get ( 'SubsiteDomain' ) as $domain ) {
$domain -> delete ();
}
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
// Much more expressive than YML in this case
$subsite1 = $this -> createSubsiteWithDomains ( array (
'example.org' => true ,
'example.com' => false ,
'*.wildcard.com' => false ,
));
$subsite2 = $this -> createSubsiteWithDomains ( array (
'www.example.org' => true ,
'www.wildcard.com' => false ,
));
2010-03-01 03:48:45 +01:00
2015-11-23 04:53:45 +01:00
Subsite :: $strict_subdomain_matching = false ;
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
$this -> assertEquals (
$subsite1 -> ID ,
Subsite :: getSubsiteIDForDomain ( 'example.org' ),
'Exact matches without strict checking when not using www prefix'
);
$this -> assertEquals (
$subsite1 -> ID ,
Subsite :: getSubsiteIDForDomain ( 'www.example.org' ),
'Matches without strict checking when using www prefix, still matching first domain regardless of www prefix (falling back to subsite primary key ordering)'
);
$this -> assertEquals (
$subsite1 -> ID ,
Subsite :: getSubsiteIDForDomain ( 'www.example.com' ),
'Fuzzy matches without strict checking with www prefix'
);
$this -> assertEquals (
0 ,
Subsite :: getSubsiteIDForDomain ( 'www.wildcard.com' ),
'Doesn\'t match www prefix without strict check, even if a wildcard subdomain is in place'
);
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
Subsite :: $strict_subdomain_matching = true ;
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
$this -> assertEquals (
$subsite1 -> ID ,
Subsite :: getSubsiteIDForDomain ( 'example.org' ),
'Matches with strict checking when not using www prefix'
);
$this -> assertEquals (
$subsite2 -> ID , // not 1
Subsite :: getSubsiteIDForDomain ( 'www.example.org' ),
'Matches with strict checking when using www prefix'
);
$this -> assertEquals (
0 ,
Subsite :: getSubsiteIDForDomain ( 'www.example.com' ),
'Doesn\'t fuzzy match with strict checking when using www prefix'
);
$failed = false ;
try {
Subsite :: getSubsiteIDForDomain ( 'www.wildcard.com' );
} catch ( UnexpectedValueException $e ) {
$failed = true ;
}
$this -> assertTrue (
$failed ,
'Fails on multiple matches with strict checking and wildcard vs. www'
);
}
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
protected function createSubsiteWithDomains ( $domains )
{
$subsite = new Subsite ( array (
'Title' => 'My Subsite'
));
$subsite -> write ();
foreach ( $domains as $domainStr => $isPrimary ) {
$domain = new SubsiteDomain ( array (
'Domain' => $domainStr ,
'IsPrimary' => $isPrimary ,
'SubsiteID' => $subsite -> ID
));
$domain -> write ();
}
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
return $subsite ;
}
2011-09-09 11:59:46 +02:00
2015-11-23 04:53:45 +01:00
/**
* Test the Subsite -> domain () method
*/
public function testDefaultDomain ()
{
$this -> assertEquals ( 'one.example.org' ,
$this -> objFromFixture ( 'Subsite' , 'domaintest1' ) -> domain ());
2010-03-01 03:48:45 +01:00
2015-11-23 04:53:45 +01:00
$this -> assertEquals ( 'two.mysite.com' ,
$this -> objFromFixture ( 'Subsite' , 'domaintest2' ) -> domain ());
2015-11-24 05:15:08 +01:00
2015-11-23 04:53:45 +01:00
$_SERVER [ 'HTTP_HOST' ] = " www.example.org " ;
$this -> assertEquals ( 'three.example.org' ,
$this -> objFromFixture ( 'Subsite' , 'domaintest3' ) -> domain ());
2010-03-01 03:48:45 +01:00
2015-11-23 04:53:45 +01:00
$_SERVER [ 'HTTP_HOST' ] = " mysite.example.org " ;
$this -> assertEquals ( 'three.mysite.example.org' ,
$this -> objFromFixture ( 'Subsite' , 'domaintest3' ) -> domain ());
2010-03-01 03:48:45 +01:00
2015-11-23 04:53:45 +01:00
$this -> assertEquals ( $_SERVER [ 'HTTP_HOST' ], singleton ( 'Subsite' ) -> PrimaryDomain );
$this -> assertEquals ( 'http://' . $_SERVER [ 'HTTP_HOST' ] . Director :: baseURL (), singleton ( 'Subsite' ) -> absoluteBaseURL ());
2015-11-24 05:15:08 +01:00
}
2016-05-23 00:41:51 +02:00
2015-11-24 05:15:08 +01:00
/**
* Tests that Subsite and SubsiteDomain both respect http protocol correctly
*/
public function testDomainProtocol () {
// domaintest2 has 'protocol'
$subsite2 = $this -> objFromFixture ( 'Subsite' , 'domaintest2' );
$domain2a = $this -> objFromFixture ( 'SubsiteDomain' , 'dt2a' );
$domain2b = $this -> objFromFixture ( 'SubsiteDomain' , 'dt2b' );
2016-05-23 00:41:51 +02:00
2015-11-24 05:15:08 +01:00
// domaintest4 is 'https' (primary only)
$subsite4 = $this -> objFromFixture ( 'Subsite' , 'domaintest4' );
$domain4a = $this -> objFromFixture ( 'SubsiteDomain' , 'dt4a' );
$domain4b = $this -> objFromFixture ( 'SubsiteDomain' , 'dt4b' ); // secondary domain is http only though
2016-05-23 00:41:51 +02:00
2015-11-24 05:15:08 +01:00
// domaintest5 is 'http'
$subsite5 = $this -> objFromFixture ( 'Subsite' , 'domaintest5' );
$domain5a = $this -> objFromFixture ( 'SubsiteDomain' , 'dt5' );
2016-05-23 00:41:51 +02:00
2015-11-24 05:15:08 +01:00
// Check protocol when current protocol is http://
$_SERVER [ 'HTTP_HOST' ] = 'www.mysite.com' ;
$_SERVER [ 'HTTPS' ] = '' ;
2016-05-23 00:41:51 +02:00
2015-11-24 05:15:08 +01:00
$this -> assertEquals ( 'http://two.mysite.com/' , $subsite2 -> absoluteBaseURL ());
$this -> assertEquals ( 'http://two.mysite.com/' , $domain2a -> absoluteBaseURL ());
$this -> assertEquals ( 'http://subsite.mysite.com/' , $domain2b -> absoluteBaseURL ());
$this -> assertEquals ( 'https://www.primary.com/' , $subsite4 -> absoluteBaseURL ());
$this -> assertEquals ( 'https://www.primary.com/' , $domain4a -> absoluteBaseURL ());
$this -> assertEquals ( 'http://www.secondary.com/' , $domain4b -> absoluteBaseURL ());
$this -> assertEquals ( 'http://www.tertiary.com/' , $subsite5 -> absoluteBaseURL ());
$this -> assertEquals ( 'http://www.tertiary.com/' , $domain5a -> absoluteBaseURL ());
2016-05-23 00:41:51 +02:00
2015-11-24 05:15:08 +01:00
// Check protocol when current protocol is https://
$_SERVER [ 'HTTP_HOST' ] = 'www.mysite.com' ;
$_SERVER [ 'HTTPS' ] = 'ON' ;
2016-05-23 00:41:51 +02:00
2015-11-24 05:15:08 +01:00
$this -> assertEquals ( 'https://two.mysite.com/' , $subsite2 -> absoluteBaseURL ());
$this -> assertEquals ( 'https://two.mysite.com/' , $domain2a -> absoluteBaseURL ());
$this -> assertEquals ( 'https://subsite.mysite.com/' , $domain2b -> absoluteBaseURL ());
$this -> assertEquals ( 'https://www.primary.com/' , $subsite4 -> absoluteBaseURL ());
$this -> assertEquals ( 'https://www.primary.com/' , $domain4a -> absoluteBaseURL ());
$this -> assertEquals ( 'http://www.secondary.com/' , $domain4b -> absoluteBaseURL ());
$this -> assertEquals ( 'http://www.tertiary.com/' , $subsite5 -> absoluteBaseURL ());
$this -> assertEquals ( 'http://www.tertiary.com/' , $domain5a -> absoluteBaseURL ());
2015-11-23 04:53:45 +01:00
}
2010-03-01 03:48:45 +01:00
2015-11-23 04:53:45 +01:00
public function testAllSites ()
{
$subsites = Subsite :: all_sites ();
$this -> assertDOSEquals ( array (
array ( 'Title' => 'Main site' ),
array ( 'Title' => 'Template' ),
array ( 'Title' => 'Subsite1 Template' ),
array ( 'Title' => 'Subsite2 Template' ),
array ( 'Title' => 'Test 1' ),
array ( 'Title' => 'Test 2' ),
2015-11-24 05:15:08 +01:00
array ( 'Title' => 'Test 3' ),
array ( 'Title' => 'Test Non-SSL' ),
array ( 'Title' => 'Test SSL' )
2015-11-23 04:53:45 +01:00
), $subsites , 'Lists all subsites' );
}
2013-10-16 05:24:01 +02:00
2015-11-23 04:53:45 +01:00
public function testAllAccessibleSites ()
{
$member = $this -> objFromFixture ( 'Member' , 'subsite1member' );
2013-10-16 05:24:01 +02:00
2015-11-23 04:53:45 +01:00
$subsites = Subsite :: all_accessible_sites ( true , 'Main site' , $member );
$this -> assertDOSEquals ( array (
array ( 'Title' => 'Subsite1 Template' )
), $subsites , 'Lists member-accessible sites.' );
}
2013-10-16 05:24:01 +02:00
2015-11-23 04:53:45 +01:00
/**
* Test Subsite :: accessible_sites ()
*/
public function testAccessibleSites ()
{
$member1Sites = Subsite :: accessible_sites ( " CMS_ACCESS_CMSMain " , false , null ,
$this -> objFromFixture ( 'Member' , 'subsite1member' ));
$member1SiteTitles = $member1Sites -> column ( " Title " );
sort ( $member1SiteTitles );
$this -> assertEquals ( 'Subsite1 Template' , $member1SiteTitles [ 0 ], 'Member can get to a subsite via a group' );
2013-10-16 05:24:01 +02:00
2015-11-23 04:53:45 +01:00
$adminSites = Subsite :: accessible_sites ( " CMS_ACCESS_CMSMain " , false , null ,
$this -> objFromFixture ( 'Member' , 'admin' ));
$adminSiteTitles = $adminSites -> column ( " Title " );
sort ( $adminSiteTitles );
$this -> assertEquals ( array (
'Subsite1 Template' ,
'Subsite2 Template' ,
'Template' ,
'Test 1' ,
'Test 2' ,
'Test 3' ,
2015-11-24 05:15:08 +01:00
'Test Non-SSL' ,
'Test SSL'
), array_values ( $adminSiteTitles ));
2010-03-01 22:37:56 +01:00
2015-11-24 05:15:08 +01:00
$member2Sites = Subsite :: accessible_sites (
" CMS_ACCESS_CMSMain " , false , null ,
$this -> objFromFixture ( 'Member' , 'subsite1member2' )
);
2015-11-23 04:53:45 +01:00
$member2SiteTitles = $member2Sites -> column ( " Title " );
sort ( $member2SiteTitles );
$this -> assertEquals ( 'Subsite1 Template' , $member2SiteTitles [ 0 ], 'Member can get to subsite via a group role' );
}
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
public function testhasMainSitePermission ()
{
$admin = $this -> objFromFixture ( 'Member' , 'admin' );
$subsite1member = $this -> objFromFixture ( 'Member' , 'subsite1member' );
$subsite1admin = $this -> objFromFixture ( 'Member' , 'subsite1admin' );
$allsubsitesauthor = $this -> objFromFixture ( 'Member' , 'allsubsitesauthor' );
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
$this -> assertTrue (
Subsite :: hasMainSitePermission ( $admin ),
'Default permissions granted for super-admin'
);
$this -> assertTrue (
Subsite :: hasMainSitePermission ( $admin , array ( " ADMIN " )),
'ADMIN permissions granted for super-admin'
);
$this -> assertFalse (
Subsite :: hasMainSitePermission ( $subsite1admin , array ( " ADMIN " )),
'ADMIN permissions (on main site) denied for subsite1 admin'
);
$this -> assertFalse (
Subsite :: hasMainSitePermission ( $subsite1admin , array ( " CMS_ACCESS_CMSMain " )),
'CMS_ACCESS_CMSMain (on main site) denied for subsite1 admin'
);
$this -> assertFalse (
Subsite :: hasMainSitePermission ( $allsubsitesauthor , array ( " ADMIN " )),
'ADMIN permissions (on main site) denied for CMS author with edit rights on all subsites'
);
$this -> assertTrue (
Subsite :: hasMainSitePermission ( $allsubsitesauthor , array ( " CMS_ACCESS_CMSMain " )),
'CMS_ACCESS_CMSMain (on main site) granted for CMS author with edit rights on all subsites'
);
$this -> assertFalse (
Subsite :: hasMainSitePermission ( $subsite1member , array ( " ADMIN " )),
'ADMIN (on main site) denied for subsite1 subsite1 cms author'
);
$this -> assertFalse (
Subsite :: hasMainSitePermission ( $subsite1member , array ( " CMS_ACCESS_CMSMain " )),
'CMS_ACCESS_CMSMain (on main site) denied for subsite1 cms author'
);
}
2011-10-05 04:02:57 +02:00
2015-11-23 04:53:45 +01:00
public function testDuplicateSubsite ()
{
// get subsite1 & create page
$subsite1 = $this -> objFromFixture ( 'Subsite' , 'domaintest1' );
$subsite1 -> activate ();
$page1 = new Page ();
$page1 -> Title = 'MyAwesomePage' ;
$page1 -> write ();
$page1 -> doPublish ();
$this -> assertEquals ( $page1 -> SubsiteID , $subsite1 -> ID );
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
// duplicate
$subsite2 = $subsite1 -> duplicate ();
$subsite2 -> activate ();
// change content on dupe
$page2 = DataObject :: get_one ( 'Page' , " \" Title \" = 'MyAwesomePage' " );
$page2 -> Title = 'MyNewAwesomePage' ;
$page2 -> write ();
$page2 -> doPublish ();
2016-05-23 00:41:51 +02:00
2015-11-23 04:53:45 +01:00
// check change & check change has not affected subiste1
$subsite1 -> activate ();
$this -> assertEquals ( 'MyAwesomePage' , DataObject :: get_by_id ( 'Page' , $page1 -> ID ) -> Title );
$subsite2 -> activate ();
$this -> assertEquals ( 'MyNewAwesomePage' , DataObject :: get_by_id ( 'Page' , $page2 -> ID ) -> Title );
}
2018-04-20 05:19:50 +02:00
public function testDefaultPageCreatedWhenCreatingSubsite ()
{
$subsite = new Subsite ();
$subsite -> Title = 'New Subsite' ;
$subsite -> write ();
$subsite -> activate ();
$pages = SiteTree :: get ();
$this -> assertGreaterThanOrEqual ( 1 , $pages -> count ());
}
2013-05-01 07:01:56 +02:00
}