diff --git a/src/Containers/ParsedInput.php b/src/Containers/ParsedInput.php index 32973c0..341b78f 100644 --- a/src/Containers/ParsedInput.php +++ b/src/Containers/ParsedInput.php @@ -73,7 +73,7 @@ public function validate(ValidationInterface $validator): SafeInput { } unset($key, $input); foreach ($validator->getOptionalInputs() as $key => $input) { - if (isset($data[$key])) { + if (array_key_exists($key, $data)) { try { $clean_out[$key] = $input->setValue($data[$key]) ->evaluate(); diff --git a/tests/Containers/ParsedInputTest.php b/tests/Containers/ParsedInputTest.php index 4059b82..855b9a8 100644 --- a/tests/Containers/ParsedInputTest.php +++ b/tests/Containers/ParsedInputTest.php @@ -216,6 +216,36 @@ public function testOptionalParametersWithDefaultsUseDefaults() $this->assertSame($default, $ret['short'], "'short' did not yield its default value"); } + /** + * @covers ::validate + */ + public function testOptionalParametersWithValidNullWorksWhenProvided() + { + $io = $this->getMockIO(true, null); + $io->expects($this->never()) + ->method('getDefaultValue'); + $this->addOptional('key', $io); + $parsed = new ParsedInput(['key' => null]); + $ret = $parsed->validate($this->getValidation()); + $this->assertInstanceOf(SafeInput::class, $ret); + $this->assertNull($ret['key'], 'key should have been null literal'); + } + + /** + * @covers ::validate + */ + public function testOptionalParametersWithValidNullWorksWhenNotProvided() + { + $io = $this->createMock(InputObject::class); + $io->expects($this->atLeastOnce()) + ->method('getDefaultValue') + ->willReturn(false); + $this->addOptional('key', $io); + $parsed = new ParsedInput([]); + $ret = $parsed->validate($this->getValidation()); + $this->assertInstanceOf(SafeInput::class, $ret); + $this->assertFalse($ret['key'], 'key should have been false literal'); + } // ----(Validation:Nesting)------------------------------------------------- @@ -358,17 +388,17 @@ private function getValidation() { return $validation; } // getValidation - private function addRequired($key, InputObject $type) { + private function addRequired(string $key, InputObject $type) { $this->required[$key] = $type; } // addRequired - private function addOptional($key, InputObject $type) { + private function addOptional(string $key, InputObject $type) { $this->optional[$key] = $type; } // addOptional - private function getMockIO($valid, $ret = null) { - $mock = $this->getMockBuilder('Firehed\Input\Objects\InputObject') - ->setMethods(['evaluate']) + private function getMockIO(bool $valid, $ret = null) { + $mock = $this->getMockBuilder(InputObject::class) + ->setMethods(['evaluate', 'getDefaultValue']) ->getMockForAbstractClass(); if ($valid) {