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:
|
||||
- php: 5.4
|
||||
env: DB=MYSQL CORE_RELEASE=master
|
||||
- php: 5.4
|
||||
env: DB=MYSQL CORE_RELEASE=3.1 BEHAT_TEST=1
|
||||
|
||||
before_script:
|
||||
- composer self-update
|
||||
- phpenv rehash
|
||||
- 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
|
||||
- php ~/travis-support/travis_setup_selenium.php --if-env BEHAT_TEST
|
||||
- php ~/travis-support/travis_setup_php54_webserver.php --if-env BEHAT_TEST
|
||||
|
||||
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
|
||||
*/
|
||||
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);
|
||||
|
||||
$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\",'*','%')",
|
||||
"\"IsPrimary\" DESC"
|
||||
)->innerJoin('Subsite', "\"Subsite\".\"ID\" = \"SubsiteDomain\".\"SubsiteID\" AND \"Subsite\".\"IsPublic\"=1");
|
||||
}
|
||||
|
||||
if($matchingDomains && $matchingDomains->Count()) {
|
||||
$subsiteIDs = array_unique($matchingDomains->column('SubsiteID'));
|
||||
@ -187,7 +193,9 @@ class Subsite extends DataObject implements PermissionProvider {
|
||||
$subsiteID = 0;
|
||||
}
|
||||
|
||||
if ($cacheKey) {
|
||||
self::$_cache_subsite_for_domain[$cacheKey] = $subsiteID;
|
||||
}
|
||||
|
||||
return $subsiteID;
|
||||
}
|
||||
|
@ -181,7 +181,7 @@
|
||||
$(doc).find('a').each(function() {
|
||||
var href = $(this).attr('href');
|
||||
|
||||
if (!href.match(/^http:\/\//)) {
|
||||
if (typeof href!=='undefined' && !href.match(/^http:\/\//)) {
|
||||
|
||||
$(this).attr('href', $.path.addSearchParams(href, {
|
||||
'SubsiteID': subsiteId
|
||||
@ -192,9 +192,10 @@
|
||||
|
||||
// Inject the SubsiteID as a hidden input into all forms submitting to the local site.
|
||||
$(doc).find('form').each(function() {
|
||||
var action = $(this).attr('action');
|
||||
|
||||
if (!$(this).attr('action').match(/^http:\/\//)) {
|
||||
$(doc).find('form').append('<input type=hidden name="SubsiteID" value="' + subsiteId + '" >');
|
||||
if (typeof action!=='undefined' && !action.match(/^http:\/\//)) {
|
||||
$(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