mirror of
https://github.com/silverstripe/silverstripe-subsites
synced 2024-10-22 11:05:55 +02:00
BUG Fixes to link rewriting when previewing subsites.
* JS error with href-less links. * All forms get injected hidden fields, even though the loop attempts to check for only the ones that submit locally. * Also check for action-less forms. Requires https://github.com/silverstripe/silverstripe-framework/pull/3000 to be merged for the Framework. https://github.com/silverstripe-labs/silverstripe-testsession/pull/11
This commit is contained in:
parent
83d52806d7
commit
9cf7a1453f
12
.travis.yml
12
.travis.yml
@ -13,11 +13,19 @@ matrix:
|
|||||||
include:
|
include:
|
||||||
- php: 5.4
|
- php: 5.4
|
||||||
env: DB=MYSQL CORE_RELEASE=master
|
env: DB=MYSQL CORE_RELEASE=master
|
||||||
|
- php: 5.4
|
||||||
|
env: DB=MYSQL CORE_RELEASE=3.1 BEHAT_TEST=1
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
|
- composer self-update
|
||||||
|
- phpenv rehash
|
||||||
- git clone git://github.com/silverstripe-labs/silverstripe-travis-support.git ~/travis-support
|
- git clone git://github.com/silverstripe-labs/silverstripe-travis-support.git ~/travis-support
|
||||||
- php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss
|
- "if [ \"$BEHAT_TEST\" = \"\" ]; then php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss; fi"
|
||||||
|
- "if [ \"$BEHAT_TEST\" = \"1\" ]; then php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss --require silverstripe/behat-extension; fi"
|
||||||
- cd ~/builds/ss
|
- cd ~/builds/ss
|
||||||
|
- php ~/travis-support/travis_setup_selenium.php --if-env BEHAT_TEST
|
||||||
|
- php ~/travis-support/travis_setup_php54_webserver.php --if-env BEHAT_TEST
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- phpunit subsites/tests/
|
- "if [ \"$BEHAT_TEST\" = \"\" ]; then phpunit subsites/tests; fi"
|
||||||
|
- "if [ \"$BEHAT_TEST\" = \"1\" ]; then vendor/bin/behat @subsites; fi"
|
||||||
|
@ -153,8 +153,13 @@ class Subsite extends DataObject implements PermissionProvider {
|
|||||||
* @return int Subsite ID
|
* @return int Subsite ID
|
||||||
*/
|
*/
|
||||||
public static function getSubsiteIDForDomain($host = null, $checkPermissions = true) {
|
public static function getSubsiteIDForDomain($host = null, $checkPermissions = true) {
|
||||||
if($host == null) $host = $_SERVER['HTTP_HOST'];
|
if($host == null && isset($_SERVER['HTTP_HOST'])) {
|
||||||
|
$host = $_SERVER['HTTP_HOST'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$matchingDomains = null;
|
||||||
|
$cacheKey = null;
|
||||||
|
if ($host) {
|
||||||
if(!self::$strict_subdomain_matching) $host = preg_replace('/^www\./', '', $host);
|
if(!self::$strict_subdomain_matching) $host = preg_replace('/^www\./', '', $host);
|
||||||
|
|
||||||
$cacheKey = implode('_', array($host, Member::currentUserID(), self::$check_is_public));
|
$cacheKey = implode('_', array($host, Member::currentUserID(), self::$check_is_public));
|
||||||
@ -166,6 +171,7 @@ class Subsite extends DataObject implements PermissionProvider {
|
|||||||
"'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')",
|
"'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')",
|
||||||
"\"IsPrimary\" DESC"
|
"\"IsPrimary\" DESC"
|
||||||
)->innerJoin('Subsite', "\"Subsite\".\"ID\" = \"SubsiteDomain\".\"SubsiteID\" AND \"Subsite\".\"IsPublic\"=1");
|
)->innerJoin('Subsite', "\"Subsite\".\"ID\" = \"SubsiteDomain\".\"SubsiteID\" AND \"Subsite\".\"IsPublic\"=1");
|
||||||
|
}
|
||||||
|
|
||||||
if($matchingDomains && $matchingDomains->Count()) {
|
if($matchingDomains && $matchingDomains->Count()) {
|
||||||
$subsiteIDs = array_unique($matchingDomains->column('SubsiteID'));
|
$subsiteIDs = array_unique($matchingDomains->column('SubsiteID'));
|
||||||
@ -187,7 +193,9 @@ class Subsite extends DataObject implements PermissionProvider {
|
|||||||
$subsiteID = 0;
|
$subsiteID = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($cacheKey) {
|
||||||
self::$_cache_subsite_for_domain[$cacheKey] = $subsiteID;
|
self::$_cache_subsite_for_domain[$cacheKey] = $subsiteID;
|
||||||
|
}
|
||||||
|
|
||||||
return $subsiteID;
|
return $subsiteID;
|
||||||
}
|
}
|
||||||
|
@ -181,7 +181,7 @@
|
|||||||
$(doc).find('a').each(function() {
|
$(doc).find('a').each(function() {
|
||||||
var href = $(this).attr('href');
|
var href = $(this).attr('href');
|
||||||
|
|
||||||
if (!href.match(/^http:\/\//)) {
|
if (typeof href!=='undefined' && !href.match(/^http:\/\//)) {
|
||||||
|
|
||||||
$(this).attr('href', $.path.addSearchParams(href, {
|
$(this).attr('href', $.path.addSearchParams(href, {
|
||||||
'SubsiteID': subsiteId
|
'SubsiteID': subsiteId
|
||||||
@ -192,9 +192,10 @@
|
|||||||
|
|
||||||
// Inject the SubsiteID as a hidden input into all forms submitting to the local site.
|
// Inject the SubsiteID as a hidden input into all forms submitting to the local site.
|
||||||
$(doc).find('form').each(function() {
|
$(doc).find('form').each(function() {
|
||||||
|
var action = $(this).attr('action');
|
||||||
|
|
||||||
if (!$(this).attr('action').match(/^http:\/\//)) {
|
if (typeof action!=='undefined' && !action.match(/^http:\/\//)) {
|
||||||
$(doc).find('form').append('<input type=hidden name="SubsiteID" value="' + subsiteId + '" >');
|
$(this).append('<input type=hidden name="SubsiteID" value="' + subsiteId + '" >');
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
100
tests/behat/features/bootstrap/Context/FeatureContext.php
Normal file
100
tests/behat/features/bootstrap/Context/FeatureContext.php
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Subsites\Test\Behaviour;
|
||||||
|
|
||||||
|
use SilverStripe\BehatExtension\Context\SilverStripeContext,
|
||||||
|
SilverStripe\BehatExtension\Context\BasicContext,
|
||||||
|
SilverStripe\BehatExtension\Context\LoginContext,
|
||||||
|
SilverStripe\BehatExtension\Context\FixtureContext,
|
||||||
|
SilverStripe\Framework\Test\Behaviour\CmsFormsContext,
|
||||||
|
SilverStripe\Framework\Test\Behaviour\CmsUiContext,
|
||||||
|
SilverStripe\Cms\Test\Behaviour;
|
||||||
|
|
||||||
|
// PHPUnit
|
||||||
|
require_once 'PHPUnit/Autoload.php';
|
||||||
|
require_once 'PHPUnit/Framework/Assert/Functions.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Features context
|
||||||
|
*
|
||||||
|
* Context automatically loaded by Behat.
|
||||||
|
* Uses subcontexts to extend functionality.
|
||||||
|
*/
|
||||||
|
class FeatureContext extends SilverStripeContext {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var FixtureFactory
|
||||||
|
*/
|
||||||
|
protected $fixtureFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes context.
|
||||||
|
* Every scenario gets it's own context object.
|
||||||
|
*
|
||||||
|
* @param array $parameters context parameters (set them up through behat.yml)
|
||||||
|
*/
|
||||||
|
public function __construct(array $parameters) {
|
||||||
|
parent::__construct($parameters);
|
||||||
|
|
||||||
|
$this->useContext('BasicContext', new BasicContext($parameters));
|
||||||
|
$this->useContext('LoginContext', new LoginContext($parameters));
|
||||||
|
$this->useContext('CmsFormsContext', new CmsFormsContext($parameters));
|
||||||
|
$this->useContext('CmsUiContext', new CmsUiContext($parameters));
|
||||||
|
|
||||||
|
$fixtureContext = new FixtureContext($parameters);
|
||||||
|
$fixtureContext->setFixtureFactory($this->getFixtureFactory());
|
||||||
|
$this->useContext('FixtureContext', $fixtureContext);
|
||||||
|
|
||||||
|
// Use blueprints to set user name from identifier
|
||||||
|
$factory = $fixtureContext->getFixtureFactory();
|
||||||
|
$blueprint = \Injector::inst()->create('FixtureBlueprint', 'Member');
|
||||||
|
$blueprint->addCallback('beforeCreate', function($identifier, &$data, &$fixtures) {
|
||||||
|
if(!isset($data['FirstName'])) $data['FirstName'] = $identifier;
|
||||||
|
});
|
||||||
|
$factory->define('Member', $blueprint);
|
||||||
|
|
||||||
|
// Auto-publish pages
|
||||||
|
foreach(\ClassInfo::subclassesFor('SiteTree') as $id => $class) {
|
||||||
|
$blueprint = \Injector::inst()->create('FixtureBlueprint', $class);
|
||||||
|
$blueprint->addCallback('afterCreate', function($obj, $identifier, &$data, &$fixtures) {
|
||||||
|
$obj->publish('Stage', 'Live');
|
||||||
|
});
|
||||||
|
$factory->define($class, $blueprint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setMinkParameters(array $parameters) {
|
||||||
|
parent::setMinkParameters($parameters);
|
||||||
|
|
||||||
|
if(isset($parameters['files_path'])) {
|
||||||
|
$this->getSubcontext('FixtureContext')->setFilesPath($parameters['files_path']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return FixtureFactory
|
||||||
|
*/
|
||||||
|
public function getFixtureFactory() {
|
||||||
|
if(!$this->fixtureFactory) {
|
||||||
|
$this->fixtureFactory = \Injector::inst()->create('BehatFixtureFactory');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fixtureFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setFixtureFactory(FixtureFactory $factory) {
|
||||||
|
$this->fixtureFactory = $factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Place your definition and hook methods here:
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * @Given /^I have done something with "([^"]*)"$/
|
||||||
|
// */
|
||||||
|
// public function iHaveDoneSomethingWith($argument) {
|
||||||
|
// $container = $this->kernel->getContainer();
|
||||||
|
// $container->get('some_service')->doSomethingWith($argument);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
}
|
26
tests/behat/features/preview-navigation.feature
Normal file
26
tests/behat/features/preview-navigation.feature
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
Feature: Preview navigation
|
||||||
|
As a CMS user
|
||||||
|
I can navigate a subsite in the preview pane
|
||||||
|
In order to preview my content
|
||||||
|
|
||||||
|
Background:
|
||||||
|
Given a "subsite" "My subsite"
|
||||||
|
And a "page" "My page" with "URLSegment"="my-page", "Content"="My page content <a name='aname'>aname</a><a href='other-page'>ahref</a>" and "Subsite"="=>Subsite.My subsite"
|
||||||
|
And a "page" "Other page" with "URLSegment"="other-page", "Content"="Other page content <form action='my-page'><input type='submit' value='Submit my form'></form>" and "Subsite"="=>Subsite.My subsite"
|
||||||
|
Given a "member" "Joe" belonging to "Admin Group" with "Email"="joe@test.com" and "Password"="Password1"
|
||||||
|
And the "group" "Admin Group" has permissions "Full administrative rights"
|
||||||
|
And I log in with "joe@test.com" and "Password1"
|
||||||
|
|
||||||
|
Scenario: I can navigate the subsite preview
|
||||||
|
When I go to "admin"
|
||||||
|
And I select "My subsite" from "SubsitesSelect"
|
||||||
|
And I go to "admin/pages"
|
||||||
|
And I click on "My page" in the tree
|
||||||
|
And I wait for 3 seconds
|
||||||
|
And I set the CMS mode to "Preview mode"
|
||||||
|
And I follow "ahref" in preview
|
||||||
|
Then the preview contains "Other page content"
|
||||||
|
# We are already on the second page, submit the form to return to first one.
|
||||||
|
When I wait for 3 seconds
|
||||||
|
And I press "Submit my form" in preview
|
||||||
|
Then the preview contains "My page content"
|
Loading…
Reference in New Issue
Block a user