From 4dece01c341c540a46a462f85abc4ca1291a3fad Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sun, 15 Feb 2015 12:07:06 +1300 Subject: [PATCH 1/3] Allow "given ... has data" notation for fixtures Makes more sense in english when the fixture has already been created beforehand --- src/SilverStripe/BehatExtension/Context/FixtureContext.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SilverStripe/BehatExtension/Context/FixtureContext.php b/src/SilverStripe/BehatExtension/Context/FixtureContext.php index e5da1fe..476860f 100644 --- a/src/SilverStripe/BehatExtension/Context/FixtureContext.php +++ b/src/SilverStripe/BehatExtension/Context/FixtureContext.php @@ -144,8 +144,9 @@ class FixtureContext extends BehatContext /** * Example: Given a "page" "Page 1" with "URL"="page-1" and "Content"="my page 1" + * Example: Given the "page" "Page 1" has "URL"="page-1" and "Content"="my page 1" * - * @Given /^(?:(an|a|the) )"(?[^"]+)" "(?[^"]+)" with (?.*)$/ + * @Given /^(?:(an|a|the) )"(?[^"]+)" "(?[^"]+)" (?:(with|has)) (?".*)$/ */ public function stepCreateRecordWithData($type, $id, $data) { $class = $this->convertTypeToClass($type); From 7e8eaae73ac069ec2cc41587b6109361a727e224 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sun, 15 Feb 2015 12:07:41 +1300 Subject: [PATCH 2/3] Save ParentID alongside first record write to avoid validation errors --- .../BehatExtension/Context/FixtureContext.php | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/SilverStripe/BehatExtension/Context/FixtureContext.php b/src/SilverStripe/BehatExtension/Context/FixtureContext.php index 476860f..36d574e 100644 --- a/src/SilverStripe/BehatExtension/Context/FixtureContext.php +++ b/src/SilverStripe/BehatExtension/Context/FixtureContext.php @@ -197,22 +197,31 @@ class FixtureContext extends BehatContext */ public function stepUpdateRecordRelation($type, $id, $relation, $relationType, $relationId) { $class = $this->convertTypeToClass($type); + $relationClass = $this->convertTypeToClass($relationType); - - $obj = $this->fixtureFactory->get($class, $id); - if(!$obj) $obj = $this->fixtureFactory->createObject($class, $id); - $relationObj = $this->fixtureFactory->get($relationClass, $relationId); if(!$relationObj) $relationObj = $this->fixtureFactory->createObject($relationClass, $relationId); - + + $data = array(); + if($relation == 'child') { + $data['ParentID'] = $relationObj->ID; + } + + $obj = $this->fixtureFactory->get($class, $id); + if($obj) { + $obj->update($data); + $obj->write(); + } else { + $obj = $this->fixtureFactory->createObject($class, $id, $data); + } + switch($relation) { case 'parent': $relationObj->ParentID = $obj->ID; $relationObj->write(); break; case 'child': - $obj->ParentID = $relationObj->ID; - $obj->write(); + // already written through $data above break; default: throw new \InvalidArgumentException(sprintf( From 4297e3676271e5f4fb781d97898bc3e8a9c5fbfd Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sun, 15 Feb 2015 12:08:05 +1300 Subject: [PATCH 3/3] Allow updating of fixtures in creation steps if they already exist --- .../BehatExtension/Context/FixtureContext.php | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/SilverStripe/BehatExtension/Context/FixtureContext.php b/src/SilverStripe/BehatExtension/Context/FixtureContext.php index 36d574e..3584e44 100644 --- a/src/SilverStripe/BehatExtension/Context/FixtureContext.php +++ b/src/SilverStripe/BehatExtension/Context/FixtureContext.php @@ -139,7 +139,16 @@ class FixtureContext extends BehatContext $class, array($field => $value) ); - $this->fixtureFactory->createObject($class, $id, $fields); + // We should check if this fixture object already exists - if it does, we update it. If not, we create it + if($existingFixture = $this->fixtureFactory->get($class, $id)) { + // Merge existing data with new data, and create new object to replace existing object + foreach($fields as $k => $v) { + $existingFixture->$k = $v; + } + $existingFixture->write(); + } else { + $this->fixtureFactory->createObject($class, $id, $fields); + } } /** @@ -160,7 +169,16 @@ class FixtureContext extends BehatContext array_combine($matches['key'], $matches['value']) ); $fields = $this->prepareFixture($class, $id, $fields); - $this->fixtureFactory->createObject($class, $id, $fields); + // We should check if this fixture object already exists - if it does, we update it. If not, we create it + if($existingFixture = $this->fixtureFactory->get($class, $id)) { + // Merge existing data with new data, and create new object to replace existing object + foreach($fields as $k => $v) { + $existingFixture->$k = $v; + } + $existingFixture->write(); + } else { + $this->fixtureFactory->createObject($class, $id, $fields); + } } /**