From 3e71cf784080d1acfc982399fe8501159bad539a Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Fri, 23 Mar 2018 11:43:50 +1300 Subject: [PATCH 1/3] Add tests for duplicating multiple option fields, which should duplicate the options too --- .../EditableMultipleOptionField.php | 1 + .../EditableDropdownTest.php | 10 +++++++ tests/Model/UserDefinedFormTest.php | 26 +++++++++++++++++++ tests/UserFormsTest.yml | 5 ++++ 4 files changed, 42 insertions(+) diff --git a/code/Model/EditableFormField/EditableMultipleOptionField.php b/code/Model/EditableFormField/EditableMultipleOptionField.php index 48e3ad9..e77252f 100644 --- a/code/Model/EditableFormField/EditableMultipleOptionField.php +++ b/code/Model/EditableFormField/EditableMultipleOptionField.php @@ -126,6 +126,7 @@ class EditableMultipleOptionField extends EditableFormField $clonedNode = parent::duplicate($doWrite, $manyMany); foreach ($this->Options() as $field) { + /** @var EditableOption $newField */ $newField = $field->duplicate(false); $newField->ParentID = $clonedNode->ID; $newField->Version = 0; diff --git a/tests/Model/EditableFormField/EditableDropdownTest.php b/tests/Model/EditableFormField/EditableDropdownTest.php index 3545ed7..e4f36e2 100644 --- a/tests/Model/EditableFormField/EditableDropdownTest.php +++ b/tests/Model/EditableFormField/EditableDropdownTest.php @@ -44,4 +44,14 @@ class EditableDropdownTest extends SapphireTest $field->Name = 'EditableFormField_123456'; $this->assertEmpty($field->getFormField()->Title()); } + + public function testDuplicate() + { + /** @var EditableDropdown $dropdown */ + $dropdown = $this->objFromFixture(EditableDropdown::class, 'basic-dropdown'); + $this->assertCount(2, $dropdown->Options()); + + $duplicatedDropdown = $dropdown->duplicate(); + $this->assertSame($dropdown->Options()->count(), $duplicatedDropdown->Options()->count()); + } } diff --git a/tests/Model/UserDefinedFormTest.php b/tests/Model/UserDefinedFormTest.php index 0658071..d315471 100644 --- a/tests/Model/UserDefinedFormTest.php +++ b/tests/Model/UserDefinedFormTest.php @@ -375,6 +375,32 @@ class UserDefinedFormTest extends FunctionalTest $this->assertNotEquals($form2GroupEnd->ID, $form3GroupStart->EndID); } + public function testDuplicateFormDuplicatesRecursively() + { + $this->logInWithPermission('ADMIN'); + /** @var UserDefinedForm $form */ + $form = $this->objFromFixture(UserDefinedForm::class, 'form-with-multioptions'); + + $this->assertCount(2, $form->Fields(), 'Fixtured page has one field plus one form step'); + $this->assertCount( + 2, + $form->Fields()->Last()->Options(), + 'Fixtured multiple option field has two options' + ); + + $newForm = $form->duplicate(); + $this->assertEquals( + $form->Fields()->count(), + $newForm->Fields()->count(), + 'Duplicated page has same number of fields' + ); + $this->assertEquals( + $form->Fields()->Last()->Options()->count(), + $newForm->Fields()->Last()->Options()->count(), + 'Duplicated dropdown field from duplicated form has duplicated options' + ); + } + public function testFormOptions() { $this->logInWithPermission('ADMIN'); diff --git a/tests/UserFormsTest.yml b/tests/UserFormsTest.yml index f5b2542..dcb4f7b 100644 --- a/tests/UserFormsTest.yml +++ b/tests/UserFormsTest.yml @@ -344,3 +344,8 @@ SilverStripe\UserForms\Model\UserDefinedForm: Fields: - =>SilverStripe\UserForms\Model\EditableFormField\EditableEmailField.another-email-field - =>SilverStripe\UserForms\Model\EditableFormField\EditableTextField.another-required + + form-with-multioptions: + Title: Form with MultipleOption fields + Fields: + - =>SilverStripe\UserForms\Model\EditableFormField\EditableDropdown.basic-dropdown From 453a35e114cae6d1e1ab5f55a9b6764a74a09d90 Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Fri, 23 Mar 2018 11:53:43 +1300 Subject: [PATCH 2/3] FIX Ensure duplicated multiple option field is written (has an ID) before duplicating options --- code/Extension/UserFormFieldEditorExtension.php | 1 + code/Model/EditableFormField/EditableMultipleOptionField.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/Extension/UserFormFieldEditorExtension.php b/code/Extension/UserFormFieldEditorExtension.php index 7f26cd7..38132d0 100644 --- a/code/Extension/UserFormFieldEditorExtension.php +++ b/code/Extension/UserFormFieldEditorExtension.php @@ -225,6 +225,7 @@ class UserFormFieldEditorExtension extends DataExtension // List of EditableFieldGroups, where the key of the array is the ID of the old end group $fieldGroups = []; foreach ($oldPage->Fields() as $field) { + /** @var EditableFormField $newField */ $newField = $field->duplicate(false); $newField->ParentID = $this->owner->ID; $newField->ParentClass = $this->owner->ClassName; diff --git a/code/Model/EditableFormField/EditableMultipleOptionField.php b/code/Model/EditableFormField/EditableMultipleOptionField.php index e77252f..4cb3ebc 100644 --- a/code/Model/EditableFormField/EditableMultipleOptionField.php +++ b/code/Model/EditableFormField/EditableMultipleOptionField.php @@ -123,7 +123,7 @@ class EditableMultipleOptionField extends EditableFormField $manyMany = null; } - $clonedNode = parent::duplicate($doWrite, $manyMany); + $clonedNode = parent::duplicate(true, $manyMany); foreach ($this->Options() as $field) { /** @var EditableOption $newField */ From 8ae3e4a04108142531ea105028c1adebedced62c Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Fri, 23 Mar 2018 13:31:38 +1300 Subject: [PATCH 3/3] Adjust assertion to handle environmental influence, e.g. CWP default records --- tests/Model/UserDefinedFormTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Model/UserDefinedFormTest.php b/tests/Model/UserDefinedFormTest.php index d315471..24a0ee4 100644 --- a/tests/Model/UserDefinedFormTest.php +++ b/tests/Model/UserDefinedFormTest.php @@ -381,7 +381,7 @@ class UserDefinedFormTest extends FunctionalTest /** @var UserDefinedForm $form */ $form = $this->objFromFixture(UserDefinedForm::class, 'form-with-multioptions'); - $this->assertCount(2, $form->Fields(), 'Fixtured page has one field plus one form step'); + $this->assertGreaterThanOrEqual(1, $form->Fields()->count(), 'Fixtured page has a field'); $this->assertCount( 2, $form->Fields()->Last()->Options(),