Browse Source

Fix Validation::compareFields() to work with null values.

Fixes #13834
Mark Story 6 years ago
parent
commit
abe14231c7
2 changed files with 11 additions and 7 deletions
  1. 1 1
      src/Validation/Validation.php
  2. 10 6
      tests/TestCase/Validation/ValidationTest.php

+ 1 - 1
src/Validation/Validation.php

@@ -435,7 +435,7 @@ class Validation
      */
     public static function compareFields($check, $field, $operator, $context)
     {
-        if (!isset($context['data'][$field])) {
+        if (!isset($context['data']) || !array_key_exists($field, $context['data'])) {
             return false;
         }
 

+ 10 - 6
tests/TestCase/Validation/ValidationTest.php

@@ -2863,21 +2863,25 @@ class ValidationTest extends TestCase
     public function testCompareFieldsEqualTo()
     {
         $context = [
-            'data' => [
-                'other' => 'a value'
-            ]
+            'data' => ['other' => 'a value'],
         ];
         $this->assertTrue(Validation::compareFields('a value', 'other', Validation::COMPARE_EQUAL, $context));
 
         $context = [
-            'data' => [
-                'other' => 'different'
-            ]
+            'data' => ['other' => 'different'],
         ];
         $this->assertFalse(Validation::compareFields('a value', 'other', Validation::COMPARE_EQUAL, $context));
 
         $context = [];
         $this->assertFalse(Validation::compareFields('a value', 'other', Validation::COMPARE_EQUAL, $context));
+
+        $context = [
+            'data' => ['other' => null],
+        ];
+        $this->assertFalse(Validation::compareFields('a value', 'other', Validation::COMPARE_EQUAL, $context));
+        $this->assertFalse(Validation::compareFields(false, 'other', Validation::COMPARE_SAME, $context));
+        $this->assertTrue(Validation::compareFields(false, 'other', Validation::COMPARE_EQUAL, $context));
+        $this->assertTrue(Validation::compareFields(null, 'other', Validation::COMPARE_SAME, $context));
     }
 
     /**