Step transformations rather than special case step overrides

This commit is contained in:
Ingo Schommer 2013-06-04 16:43:53 +02:00
parent fd9e84006f
commit 8418bea0f8
2 changed files with 23 additions and 50 deletions

View File

@ -132,7 +132,6 @@ class FixtureContext extends BehatContext
$class = $this->convertTypeToClass($type);
if(is_a($class, 'File', true)) {
$fields = $this->prepareAsset($class, $id);
var_dump($fields);
} else {
$fields = array();
}
@ -263,6 +262,29 @@ class FixtureContext extends BehatContext
$yamlFixture->writeInto($this->getFixtureFactory());
}
/**
* Replaces fixture references in values with their respective database IDs,
* with the notation "=><class>.<identifier>". Example: "=>Page.My Page".
*
* @Transform /^([^"]+)$/
*/
public function lookupFixtureReference($string)
{
if(preg_match('/^=>/', $string)) {
list($className, $identifier) = explode('.', preg_replace('/^=>/', '', $string), 2);
$id = $this->fixtureFactory->getId($className, $identifier);
if(!$id) {
throw new \InvalidArgumentException(sprintf(
'Cannot resolve reference "%s", no matching fixture found',
$string
));
}
return $id;
} else {
return $string;
}
}
protected function prepareAsset($class, $identifier, $data = null) {
if(!$data) $data = array();
$relativeTargetPath = (isset($data['Filename'])) ? $data['Filename'] : $identifier;

View File

@ -263,53 +263,4 @@ class SilverStripeContext extends MinkContext implements SilverStripeAwareContex
return new Step\Given($step);
}
/**
* @Given /^((?:I )fill in =>(.+?) for "([^"]*)")$/
*/
public function iFillInFor($step, $reference, $field)
{
if (false === strpos($reference, '.')) {
throw new \Exception('Fixture reference should be in following format: =>ClassName.identifier');
}
list($className, $identifier) = explode('.', $reference);
$id = $this->idFromFixture($className, $identifier);
//$step = preg_replace('#=>(.+?) for "([^"]*)"#', '"'.$id.'" for "'.$field.'"', $step);
// below is not working, because Selenium can't interact with hidden inputs
// return new Step\Given($step);
// TODO: investigate how to simplify this and make universal
$javascript = <<<JAVASCRIPT
if ('undefined' !== typeof window.jQuery) {
window.jQuery('input[name="$field"]').val($id);
}
JAVASCRIPT;
$this->getSession()->executeScript($javascript);
}
/**
* @Given /^((?:I )fill in "([^"]*)" with =>(.+))$/
*/
public function iFillInWith($step, $field, $reference)
{
if (false === strpos($reference, '.')) {
throw new \Exception('Fixture reference should be in following format: =>ClassName.identifier');
}
list($className, $identifier) = explode('.', $reference);
$id = $this->idFromFixture($className, $identifier);
//$step = preg_replace('#"([^"]*)" with =>(.+)#', '"'.$field.'" with "'.$id.'"', $step);
// below is not working, because Selenium can't interact with hidden inputs
// return new Step\Given($step);
// TODO: investigate how to simplify this and make universal
$javascript = <<<JAVASCRIPT
if ('undefined' !== typeof window.jQuery) {
window.jQuery('input[name="$field"]').val($id);
}
JAVASCRIPT;
$this->getSession()->executeScript($javascript);
}
}