From f5b5d0def711f970d226024fd4e6c53e3ad50842 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Fri, 8 Nov 2019 11:07:02 +0100 Subject: [PATCH] MVC: refactor CertificateField and add unit test for https://github.com/opnsense/core/issues/3252 --- .../Base/FieldTypes/CertificateField.php | 89 ++--------- .../Base/FieldTypes/CertificateFieldTest.php | 148 ++++++++++++++++++ .../CertificateFieldTest/config.xml | 19 +++ 3 files changed, 176 insertions(+), 80 deletions(-) create mode 100644 src/opnsense/mvc/tests/app/models/OPNsense/Base/FieldTypes/CertificateFieldTest.php create mode 100644 src/opnsense/mvc/tests/app/models/OPNsense/Base/FieldTypes/CertificateFieldTest/config.xml diff --git a/src/opnsense/mvc/app/models/OPNsense/Base/FieldTypes/CertificateField.php b/src/opnsense/mvc/app/models/OPNsense/Base/FieldTypes/CertificateField.php index e64a481ac..9932ec85d 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Base/FieldTypes/CertificateField.php +++ b/src/opnsense/mvc/app/models/OPNsense/Base/FieldTypes/CertificateField.php @@ -1,7 +1,7 @@ internalMultiSelect = true; - } else { - $this->internalMultiSelect = false; - } - } - /** * generate validation data (list of certificates) */ protected function actionPostLoadingEvent() { - if (!isset(self::$internalOptionList[$this->certificateType])) { - self::$internalOptionList[$this->certificateType] = array(); + if (!isset(self::$internalStaticOptionList[$this->certificateType])) { + self::$internalStaticOptionList[$this->certificateType] = array(); $configObj = Config::getInstance()->object(); foreach ($configObj->{$this->certificateType} as $cert) { - self::$internalOptionList[$this->certificateType][(string)$cert->refid] = (string)$cert->descr; + self::$internalStaticOptionList[$this->certificateType][(string)$cert->refid] = (string)$cert->descr; } - natcasesort(self::$internalOptionList[$this->certificateType]); + natcasesort(self::$internalStaticOptionList[$this->certificateType]); } + $this->internalOptionList = self::$internalStaticOptionList[$this->certificateType]; } - /** - * get valid options, descriptions and selected value - * @return array - */ - public function getNodeData() - { - $result = array (); - // if certificate is not required, add empty option - if (!$this->internalIsRequired) { - $result[""] = array("value" => gettext("none"), "selected" => 0); - } - - $certs = explode(',', $this->internalValue); - foreach (self::$internalOptionList[$this->certificateType] as $optKey => $optValue) { - if (in_array($optKey, $certs)) { - $selected = 1; - } else { - $selected = 0; - } - $result[$optKey] = array("value" => $optValue, "selected" => $selected); - } - - return $result; - } - - /** - * retrieve field validators for this field type - * @return array returns InclusionIn validator - */ - public function getValidators() - { - $validators = parent::getValidators(); - if ($this->internalValue != null) { - if ($this->internalMultiSelect) { - // field may contain more than one cert - $validators[] = new CsvListValidator(array('message' => $this->internalValidationMessage, - 'domain'=>array_keys(self::$internalOptionList[$this->certificateType]))); - } else { - // single cert selection - $validators[] = new InclusionIn(array('message' => $this->internalValidationMessage, - 'domain'=>array_keys(self::$internalOptionList[$this->certificateType]))); - } - } - return $validators; - } } diff --git a/src/opnsense/mvc/tests/app/models/OPNsense/Base/FieldTypes/CertificateFieldTest.php b/src/opnsense/mvc/tests/app/models/OPNsense/Base/FieldTypes/CertificateFieldTest.php new file mode 100644 index 000000000..18adb317c --- /dev/null +++ b/src/opnsense/mvc/tests/app/models/OPNsense/Base/FieldTypes/CertificateFieldTest.php @@ -0,0 +1,148 @@ +assertInstanceOf('\OPNsense\Base\FieldTypes\CertificateField', new CertificateField()); + // switch config to test set for this type + FactoryDefault::getDefault()->get('config')->globals->config_path = __DIR__ .'/CertificateFieldTest/'; + Config::getInstance()->forceReload(); + } + + /** + * Local database should always be there + * @depends testCanBeCreated + */ + public function testDefaultCertExists() + { + // init field + $field = new CertificateField(); + $field->eventPostLoading(); + print_r(array_keys($field->getNodeData())); + $this->assertContains('5537f364ba123', array_keys($field->getNodeData())); + } + + /** + * + * @depends testCanBeCreated + */ + public function testConfigItemsExists() + { + // init field + $field = new CertificateField(); + $field->setType("ca"); + $field->eventPostLoading(); + + $this->assertContains('1537f364ba123', array_keys($field->getNodeData())); + $this->assertContains('15c382ee6020f', array_keys($field->getNodeData())); + } + + /** + * @depends testCanBeCreated + * @expectedException \Phalcon\Validation\Exception + * @expectedExceptionMessage CsvListValidator + */ + public function testSelectSetWithUnknownValue() + { + // init field + $field = new CertificateField(); + $field->eventPostLoading(); + $field->setMultiple("Y"); + $field->setValue('testcase 1,testcase 2,testcase X'); + $this->validateThrow($field); + } + + /** + * + * @depends testCanBeCreated + */ + public function testSelectSetWithoutUnknownValue() + { + // init field + $field = new CertificateField(); + $field->eventPostLoading(); + $field->setMultiple("Y"); + $field->setValue('5537f364ba123,55c382ee6020f'); + $this->assertEmpty($this->validate($field)); + } + + /** + * @depends testCanBeCreated + * @expectedException \Phalcon\Validation\Exception + * @expectedExceptionMessage InclusionIn + */ + public function testSelectSetOnSingleValue() + { + // init field + $field = new CertificateField(); + $field->eventPostLoading(); + $field->setMultiple("N"); + $field->setValue('5537f364ba123,55c382ee6020f'); + $this->validateThrow($field); + } + + /** + * @depends testCanBeCreated + */ + public function testSelectSingleValue() + { + // init field + $field = new CertificateField(); + $field->eventPostLoading(); + $field->setMultiple("N"); + $field->setValue('5537f364ba123'); + $this->assertEmpty($this->validate($field)); + } + + + /** + * type is not a container + */ + public function testIsContainer() + { + $field = new CertificateField(); + $this->assertFalse($field->isContainer()); + } +} diff --git a/src/opnsense/mvc/tests/app/models/OPNsense/Base/FieldTypes/CertificateFieldTest/config.xml b/src/opnsense/mvc/tests/app/models/OPNsense/Base/FieldTypes/CertificateFieldTest/config.xml new file mode 100644 index 000000000..60edf4774 --- /dev/null +++ b/src/opnsense/mvc/tests/app/models/OPNsense/Base/FieldTypes/CertificateFieldTest/config.xml @@ -0,0 +1,19 @@ + + + + 5537f364ba123 + cert 1 + + + 55c382ee6020f + cert 2 + + + 1537f364ba123 + ca 1 + + + 15c382ee6020f + ca 2 + +