Browse Source

Merge branch 'master' into 4.next

Mark Story 5 years ago
parent
commit
88e1b396bf

+ 24 - 18
.travis.yml

@@ -13,11 +13,10 @@ cache:
     - $HOME/.composer/cache
 
 php:
-  - 7.3
+  - 7.4
+  - 'nightly'
 
 env:
-  global:
-    - CODECOVERAGE=1
   matrix:
     - DB=mysql DB_DSN='mysql://root@127.0.0.1/cakephp_test?init[]=SET sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"'
     - DB=pgsql DB_DSN='postgres://postgres@127.0.0.1/cakephp_test'
@@ -28,7 +27,10 @@ matrix:
 
   include:
     - php: 7.2
-      env: PREFER_LOWEST=1 CODECOVERAGE=0
+      env: PREFER_LOWEST=1
+
+  allow_failures:
+    - php: 'nightly'
 
 before_install:
   - echo cakephp version && tail -1 VERSION.txt
@@ -37,39 +39,43 @@ before_install:
   - if [[ $DB == 'pgsql' ]]; then psql -c 'CREATE DATABASE cakephp_test;' -U postgres; fi
 
   - |
-      if [[ $CODECOVERAGE == 1 ]]; then
+      if [[ $TRAVIS_PHP_VERSION == '7.4' ]]; then
         pecl channel-update pecl.php.net
         pecl install pcov
       fi
 
-  - phpenv config-rm xdebug.ini
-
-  - echo 'extension = memcached.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini;
-  - echo 'extension = redis.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
-  - echo 'extension = apcu.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
-  - echo 'apc.enable_cli = 1' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
+  - |
+      if [[ $TRAVIS_PHP_VERSION != 'nightly' ]]; then
+        phpenv config-rm xdebug.ini
+        echo 'extension = memcached.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
+        echo 'extension = redis.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
+        echo 'extension = apcu.so' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
+        echo 'apc.enable_cli = 1' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
+      fi
 
   - sudo locale-gen da_DK.UTF-8
 
 install:
   - |
-      if [[ $CODECOVERAGE == 1 ]]; then
-        composer install --prefer-dist --no-interaction
-      else
+      if [[ $PREFER_LOWEST == 1 ]]; then
         composer update --prefer-lowest --prefer-stable --no-interaction
+      elif [[ $TRAVIS_PHP_VERSION == 'nightly' ]]; then
+        composer install --no-interaction --ignore-platform-reqs
+      else
+        composer install --no-interaction
       fi
 
 script:
   - |
-      if [[ $CODECOVERAGE == 1 ]]; then
-        vendor/bin/phpunit --verbose --coverage-clover=clover.xml
+      if [[ $TRAVIS_PHP_VERSION == '7.4' ]]; then
+        export CODECOVERAGE=1 && vendor/bin/phpunit --verbose --coverage-clover=clover.xml
       else
-        vendor/bin/phpunit --verbose
+        vendor/bin/phpunit
       fi
 
 after_success:
   - |
-      if [[ $CODECOVERAGE == 1 ]]; then
+      if [[ $TRAVIS_PHP_VERSION == '7.4' ]]; then
         wget https://github.com/php-coveralls/php-coveralls/releases/download/v2.1.0/php-coveralls.phar
         chmod +x php-coveralls.phar
         ./php-coveralls.phar

+ 6 - 4
src/Utility/Hash.php

@@ -798,16 +798,18 @@ class Hash
         while (!empty($stack)) {
             foreach ($stack as $curKey => &$curMerge) {
                 foreach ($curMerge[0] as $key => &$val) {
-                    $isArray = is_array($curMerge[1]);
+                    if (!is_array($curMerge[1])) {
+                        continue;
+                    }
+
                     if (
-                        $isArray
-                        && !empty($curMerge[1][$key])
+                        !empty($curMerge[1][$key])
                         && (array)$curMerge[1][$key] === $curMerge[1][$key]
                         && (array)$val === $val
                     ) {
                         // Recurse into the current merge data as it is an array.
                         $stack[] = [&$val, &$curMerge[1][$key]];
-                    } elseif ((int)$key === $key && $isArray && isset($curMerge[1][$key])) {
+                    } elseif ((int)$key === $key && isset($curMerge[1][$key])) {
                         $curMerge[1][] = $val;
                     } else {
                         $curMerge[1][$key] = $val;

+ 2 - 6
tests/TestCase/Controller/ControllerTest.php

@@ -22,7 +22,6 @@ use Cake\Event\Event;
 use Cake\Event\EventInterface;
 use Cake\Http\Response;
 use Cake\Http\ServerRequest;
-use Cake\ORM\Table;
 use Cake\Routing\Router;
 use Cake\TestSuite\TestCase;
 use Laminas\Diactoros\Uri;
@@ -709,11 +708,8 @@ class ControllerTest extends TestCase
         $closure = $controller->getAction();
         $args = (new ReflectionFunction($closure))->getParameters();
 
-        $this->assertNull($args[0]->getClass());
-        $this->assertSame('passed', $args[0]->getName());
-
-        $this->assertSame(Table::class, $args[1]->getClass()->getName());
-        $this->assertSame('table', $args[1]->getName());
+        $this->assertSame('Parameter #0 [ <required> $passed ]', (string)$args[0]);
+        $this->assertSame('Parameter #1 [ <required> Cake\ORM\Table $table ]', (string)$args[1]);
     }
 
     /**

+ 1 - 1
tests/TestCase/Database/QueryTest.php

@@ -3643,7 +3643,7 @@ class QueryTest extends TestCase
             ->select(['d' => $query->func()->dateDiff(['2012-01-05', '2012-01-02'])])
             ->execute()
             ->fetchAll('assoc');
-        $this->assertEquals(3, abs($result[0]['d']));
+        $this->assertEquals(3, abs((int)$result[0]['d']));
 
         $query = new Query($this->connection);
         $result = $query

+ 35 - 13
tests/TestCase/Error/ErrorHandlerTest.php

@@ -130,10 +130,15 @@ class ErrorHandlerTest extends TestCase
         $result = ob_get_clean();
 
         $this->assertRegExp('/<pre class="cake-error">/', $result);
-        $this->assertRegExp('/<b>Notice<\/b>/', $result);
-        $this->assertRegExp('/variable:\s+wrong/', $result);
+        if (version_compare(PHP_VERSION, '8.0.0-dev', '<')) {
+            $this->assertRegExp('/<b>Notice<\/b>/', $result);
+            $this->assertRegExp('/variable:\s+wrong/', $result);
+        } else {
+            $this->assertRegExp('/<b>Warning<\/b>/', $result);
+            $this->assertRegExp('/variable \$wrong/', $result);
+        }
         $this->assertStringContainsString(
-            'ErrorHandlerTest.php, line ' . (__LINE__ - 7),
+            'ErrorHandlerTest.php, line ' . (__LINE__ - 12),
             $result,
             'Should contain file and line reference'
         );
@@ -205,6 +210,8 @@ class ErrorHandlerTest extends TestCase
      */
     public function testErrorSuppressed()
     {
+        $this->skipIf(version_compare(PHP_VERSION, '8.0.0-dev', '>='));
+
         $errorHandler = new ErrorHandler();
         $errorHandler->register();
         $this->_restoreError = true;
@@ -232,11 +239,19 @@ class ErrorHandlerTest extends TestCase
         $out = $out + 1;
 
         $messages = $this->logger->read();
-        $this->assertRegExp('/^(notice|debug)/', $messages[0]);
-        $this->assertStringContainsString(
-            'Notice (8): Undefined variable: out in [' . __FILE__ . ', line ' . (__LINE__ - 5) . ']',
-            $messages[0]
-        );
+        $this->assertRegExp('/^(notice|debug|warning)/', $messages[0]);
+
+        if (version_compare(PHP_VERSION, '8.0.0-dev', '<')) {
+            $this->assertStringContainsString(
+                'Notice (8): Undefined variable: out in [' . __FILE__ . ', line ' . (__LINE__ - 7) . ']' . "\n\n",
+                $messages[0]
+            );
+        } else {
+            $this->assertStringContainsString(
+                'Warning (2): Undefined variable $out in [' . __FILE__ . ', line ' . (__LINE__ - 12) . ']' . "\n\n",
+                $messages[0]
+            );
+        }
     }
 
     /**
@@ -254,11 +269,18 @@ class ErrorHandlerTest extends TestCase
         $out = $out + 1;
 
         $messages = $this->logger->read();
-        $this->assertRegExp('/^(notice|debug)/', $messages[0]);
-        $this->assertStringContainsString(
-            'Notice (8): Undefined variable: out in [' . __FILE__ . ', line ' . (__LINE__ - 5) . ']',
-            $messages[0]
-        );
+        $this->assertRegExp('/^(notice|debug|warning)/', $messages[0]);
+        if (version_compare(PHP_VERSION, '8.0.0-dev', '<')) {
+            $this->assertStringContainsString(
+                'Notice (8): Undefined variable: out in [' . __FILE__ . ', line ' . (__LINE__ - 6) . ']',
+                $messages[0]
+            );
+        } else {
+            $this->assertStringContainsString(
+                'Warning (2): Undefined variable $out in [' . __FILE__ . ', line ' . (__LINE__ - 11) . ']',
+                $messages[0]
+            );
+        }
         $this->assertStringContainsString('Trace:', $messages[0]);
         $this->assertStringContainsString(__NAMESPACE__ . '\ErrorHandlerTest::testHandleErrorLoggingTrace()', $messages[0]);
         $this->assertStringContainsString('Request URL:', $messages[0]);

+ 0 - 16
tests/TestCase/View/Helper/FormHelperTest.php

@@ -361,22 +361,6 @@ class FormHelperTest extends TestCase
     }
 
     /**
-     * Test adding an invalid context class.
-     *
-     * @return void
-     */
-    public function testAddContextProviderInvalid()
-    {
-        $this->expectException(\TypeError::class);
-        $this->expectExceptionMessage('Return value of Cake\View\Form\ContextFactory::get() must implement interface Cake\View\Form\ContextInterface, instance of stdClass returned');
-        $context = 'My data';
-        $this->Form->addContextProvider('test', function ($request, $data) {
-            return new \stdClass();
-        });
-        $this->Form->create($context);
-    }
-
-    /**
      * Provides context options for create().
      *
      * @return array