From d2eb2fcc91050ee1db2bcb41d8cf7bfebc80e7fa Mon Sep 17 00:00:00 2001 From: Stephan de Wit Date: Fri, 22 Sep 2023 10:12:21 +0200 Subject: [PATCH] UniqueConstraint: add test cases (#6875) Since UniqueConstraint was worked on recently, some test cases to accomodate all scenarios --- .../Base/Constraints/UniqueConstraintTest.php | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 src/opnsense/mvc/tests/app/models/OPNsense/Base/Constraints/UniqueConstraintTest.php diff --git a/src/opnsense/mvc/tests/app/models/OPNsense/Base/Constraints/UniqueConstraintTest.php b/src/opnsense/mvc/tests/app/models/OPNsense/Base/Constraints/UniqueConstraintTest.php new file mode 100644 index 000000000..b0da996c0 --- /dev/null +++ b/src/opnsense/mvc/tests/app/models/OPNsense/Base/Constraints/UniqueConstraintTest.php @@ -0,0 +1,182 @@ +addChildNode('UniqueTest', $container); + $addFields = []; + $fields_added = false; + foreach ($nodes as $name => $value) { + $node = new TextField(null, $name); + $node->setRequired($this->valuesRequired ? "Y" : "N"); + if ($name === array_key_first($nodes)) { + $constraint->setOption('node', $node); + $constraint->setOption('name', $name); + $constraint->setOption('ValidationMessage', 'Validation Failed'); + } else { + $addFields[] = $name; + $fields_added = true; + } + $node->setValue($value); + $container->addChildNode($name, $node); + $this->internalNodes[] = $node; + } + + if ($fields_added) { + $constraint->setOption('addFields', $addFields); + } + + $this->uniqueConstraints[] = $constraint; + } + + public function setRequired($required) + { + $this->valuesRequired = $required; + + foreach ($this->internalNodes as $node) { + /* cover earlier set nodes */ + $node->setRequired($this->valuesRequired ? "Y" : "N"); + } + } + + public function validate() + { + $validator = new \OPNsense\Base\Validation(); + foreach ($this->uniqueConstraints as $idx => $constraint) { + $validator->add($idx, $constraint); + } + $msgs = $validator->validate([]); + + return $msgs; + } +} + +class UniqueConstraintTest extends \PHPUnit\Framework\Testcase +{ + public function testNonEqualAndEqualValues() + { + $container = new UniqueTestContainer(); + $container->addNode(['unique_test' => 'value1']); + $container->addNode(['unique_test' => 'value2']); + + $msgs = $container->validate(); + $this->assertEquals(0, $msgs->count()); + + $container->addNode(['unique_test' => 'value1']); + + $msgs = $container->validate(); + $this->assertEquals(1, $msgs->count()); + } + + public function testMultipleNonEqualAndEqualValues() + { + $container = new UniqueTestContainer(); + $container->addNode(['unique_test' => 'value1', 'unique_test2' => 'value2']); + $container->addNode(['unique_test' => 'value1', 'unique_test2' => 'value3']); + + $msgs = $container->validate(); + $this->assertEquals(0, $msgs->count()); + + $container->addNode(['unique_test' => 'value1', 'unique_test2' => 'value2']); + + $msgs = $container->validate(); + $this->assertEquals(1, $msgs->count()); + } + + public function testEmptyValuesNotRequiredAndRequired() + { + $container = new UniqueTestContainer(); + $container->addNode(['unique_test' => '']); + $container->addNode(['unique_test' => '']); + + $msgs = $container->validate(); + + $this->assertEquals(0, $msgs->count()); + + $container->setRequired(true); + + $msgs = $container->validate(); + + $this->assertEquals(1, $msgs->count()); + } + + public function testMultipleEmptyValuesNotRequiredAndRequired() + { + $container = new UniqueTestContainer(); + $container->addNode(['unique_test' => '', 'unique_test2' => '']); + $container->addNode(['unique_test' => '', 'unique_test2' => '']); + + $msgs = $container->validate(); + + $this->assertEquals(0, $msgs->count()); + + $container->setRequired(true); + + $msgs = $container->validate(); + + $this->assertEquals(1, $msgs->count()); + } + + public function testFirstValueEmptyPassAll() + { + $container = new UniqueTestContainer(); + $container->addNode(['unique_test1' => '', 'unique_test2' => 'value1']); + $container->addNode(['unique_test1' => '', 'unique_test2' => 'value1']); + + $msgs = $container->validate(); + + $this->assertEquals(0, $msgs->count()); + + $container->setRequired(true); + + $msgs = $container->validate(); + + $this->assertEquals(1, $msgs->count()); + } +}