From dee4efb3adb4ad0f3fe0b6c04f458f4d17e0b2f1 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Mon, 22 Aug 2016 18:34:08 +0200 Subject: [PATCH] (model) add AllOrNoneConstraint + unittests --- .../Base/Constraints/AllOrNoneConstraint.php | 67 +++++++++++++++++++ .../OPNsense/Base/BaseModel/TestModel.xml | 35 ++++++++++ .../models/OPNsense/Base/BaseModelTest.php | 35 ++++++++++ 3 files changed, 137 insertions(+) create mode 100644 src/opnsense/mvc/app/models/OPNsense/Base/Constraints/AllOrNoneConstraint.php diff --git a/src/opnsense/mvc/app/models/OPNsense/Base/Constraints/AllOrNoneConstraint.php b/src/opnsense/mvc/app/models/OPNsense/Base/Constraints/AllOrNoneConstraint.php new file mode 100644 index 000000000..0b4352539 --- /dev/null +++ b/src/opnsense/mvc/app/models/OPNsense/Base/Constraints/AllOrNoneConstraint.php @@ -0,0 +1,67 @@ +getOption('node'); + if ($node) { + $nodeName = $node->getInternalXMLTagName(); + $parentNode = $node->getParentNode(); + $Fields = array_unique(array_merge(array($nodeName), $this->getOptionValueList('addFields'))); + $countEmpty = 0; + $countNotEmpty = 0; + foreach ($Fields as $fieldname) { + if (empty((string)$parentNode->$fieldname)) { + $countEmpty++; + } else { + $countNotEmpty++; + } + } + if ($countEmpty != 0 && $countNotEmpty != 0) { + $this->appendMessage($validator, $attribute); + return false; + } + } + return true; + } +} diff --git a/src/opnsense/mvc/tests/app/models/OPNsense/Base/BaseModel/TestModel.xml b/src/opnsense/mvc/tests/app/models/OPNsense/Base/BaseModel/TestModel.xml index 2aab7bb3d..74d7fea8b 100644 --- a/src/opnsense/mvc/tests/app/models/OPNsense/Base/BaseModel/TestModel.xml +++ b/src/opnsense/mvc/tests/app/models/OPNsense/Base/BaseModel/TestModel.xml @@ -34,5 +34,40 @@ + + + + + All fields should contain data or none of them + OPNsense\Base\Constraints\AllOrNoneConstraint + + value2 + value3 + + + + + + + + value1.check001 + + + + + + + value1.check001 + + + + + + + value1.check001 + + + + diff --git a/src/opnsense/mvc/tests/app/models/OPNsense/Base/BaseModelTest.php b/src/opnsense/mvc/tests/app/models/OPNsense/Base/BaseModelTest.php index 8fce926b4..b16b31fbc 100644 --- a/src/opnsense/mvc/tests/app/models/OPNsense/Base/BaseModelTest.php +++ b/src/opnsense/mvc/tests/app/models/OPNsense/Base/BaseModelTest.php @@ -264,4 +264,39 @@ class BaseModelTest extends \PHPUnit_Framework_TestCase } BaseModelTest::$model->serializeToConfig(); } + + /** + * @depends testRunMigrations + */ + public function testAllOrNoneInitial() + { + BaseModelTest::$model->AllOrNone->value1 = ""; + BaseModelTest::$model->AllOrNone->value2 = ""; + BaseModelTest::$model->AllOrNone->value3 = ""; + BaseModelTest::$model->serializeToConfig(); + } + + /** + * @expectedException Exception + * @expectedExceptionMessage All fields should contain data or none of them + * @depends testAllOrNoneInitial + */ + public function testAllOrNoneNok() + { + BaseModelTest::$model->AllOrNone->value1 = ""; + BaseModelTest::$model->AllOrNone->value2 = "X"; + BaseModelTest::$model->AllOrNone->value3 = ""; + BaseModelTest::$model->serializeToConfig(); + } + + /** + * @depends testAllOrNoneNok + */ + public function testAllOrNoneOk() + { + BaseModelTest::$model->AllOrNone->value1 = "X1"; + BaseModelTest::$model->AllOrNone->value2 = "X2"; + BaseModelTest::$model->AllOrNone->value3 = "X3"; + BaseModelTest::$model->serializeToConfig(); + } }