diff options
| author | Daniel Weipert <git@mail.dweipert.de> | 2025-08-12 18:02:39 +0200 | 
|---|---|---|
| committer | Daniel Weipert <git@mail.dweipert.de> | 2025-08-12 18:02:45 +0200 | 
| commit | 5ab89da146929734a39c7a55619b8bf8298ab832 (patch) | |
| tree | 48746c1320b274f3c00f7c45aa7e512743e1ef75 | |
| parent | 1fc29c6029cfa8c7dce5535ff9cfb2daaa6427e0 (diff) | |
implement phpunit integration tests
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | composer.json | 22 | ||||
| -rw-r--r-- | composer.lock | 2160 | ||||
| -rw-r--r-- | phpunit.xml | 32 | ||||
| -rw-r--r-- | src/Router.php | 7 | ||||
| -rw-r--r-- | tests/PHPUnit/Extensions/ServerExtension/PostRunSubscriber.php | 19 | ||||
| -rw-r--r-- | tests/PHPUnit/Extensions/ServerExtension/PreRunSubscriber.php | 18 | ||||
| -rw-r--r-- | tests/PHPUnit/Extensions/ServerExtension/ServerExtension.php | 19 | ||||
| -rw-r--r-- | tests/PHPUnit/TestCases/HttpResponseTestCase.php | 37 | ||||
| -rw-r--r-- | tests/ServerImplementationTest.php | 36 | 
10 files changed, 2343 insertions, 9 deletions
| @@ -1,4 +1,6 @@  /vendor/ +/.phpunit.cache/ +  .env  credentials.json diff --git a/composer.json b/composer.json index d27bea8..ab896e9 100644 --- a/composer.json +++ b/composer.json @@ -1,11 +1,6 @@  {      "name": "matrix-php/matrix-php",      "type": "project", -    "autoload": { -        "psr-4": { -            "App\\": "src/" -        } -    },      "authors": [          {              "name": "Daniel Weipert", @@ -13,8 +8,21 @@          }      ],      "require": { -        "symfony/routing": "^7.3", +        "symfony/dotenv": "^7.3",          "symfony/http-foundation": "^7.3", -        "symfony/dotenv": "^7.3" +        "symfony/routing": "^7.3" +    }, +    "require-dev": { +        "guzzlehttp/guzzle": "^7.9", +        "phpunit/phpunit": "^12.3" +    }, +    "autoload": { +        "psr-4": { +            "App\\": "src/", +            "Tests\\": "tests/" +        } +    }, +    "scripts": { +        "test": "phpunit --testdox tests"      }  } diff --git a/composer.lock b/composer.lock index 192fd6b..774a7d5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@          "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",          "This file is @generated automatically"      ], -    "content-hash": "7733486e3e144bf785bda75acdd2ca46", +    "content-hash": "5257909e0eb2132c25ac43ca35aefbb1",      "packages": [          {              "name": "symfony/deprecation-contracts", @@ -477,7 +477,2163 @@              "time": "2025-07-15T11:36:08+00:00"          }      ], -    "packages-dev": [], +    "packages-dev": [ +        { +            "name": "guzzlehttp/guzzle", +            "version": "7.9.3", +            "source": { +                "type": "git", +                "url": "https://github.com/guzzle/guzzle.git", +                "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", +                "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", +                "shasum": "" +            }, +            "require": { +                "ext-json": "*", +                "guzzlehttp/promises": "^1.5.3 || ^2.0.3", +                "guzzlehttp/psr7": "^2.7.0", +                "php": "^7.2.5 || ^8.0", +                "psr/http-client": "^1.0", +                "symfony/deprecation-contracts": "^2.2 || ^3.0" +            }, +            "provide": { +                "psr/http-client-implementation": "1.0" +            }, +            "require-dev": { +                "bamarni/composer-bin-plugin": "^1.8.2", +                "ext-curl": "*", +                "guzzle/client-integration-tests": "3.0.2", +                "php-http/message-factory": "^1.1", +                "phpunit/phpunit": "^8.5.39 || ^9.6.20", +                "psr/log": "^1.1 || ^2.0 || ^3.0" +            }, +            "suggest": { +                "ext-curl": "Required for CURL handler support", +                "ext-intl": "Required for Internationalized Domain Name (IDN) support", +                "psr/log": "Required for using the Log middleware" +            }, +            "type": "library", +            "extra": { +                "bamarni-bin": { +                    "bin-links": true, +                    "forward-command": false +                } +            }, +            "autoload": { +                "files": [ +                    "src/functions_include.php" +                ], +                "psr-4": { +                    "GuzzleHttp\\": "src/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Graham Campbell", +                    "email": "hello@gjcampbell.co.uk", +                    "homepage": "https://github.com/GrahamCampbell" +                }, +                { +                    "name": "Michael Dowling", +                    "email": "mtdowling@gmail.com", +                    "homepage": "https://github.com/mtdowling" +                }, +                { +                    "name": "Jeremy Lindblom", +                    "email": "jeremeamia@gmail.com", +                    "homepage": "https://github.com/jeremeamia" +                }, +                { +                    "name": "George Mponos", +                    "email": "gmponos@gmail.com", +                    "homepage": "https://github.com/gmponos" +                }, +                { +                    "name": "Tobias Nyholm", +                    "email": "tobias.nyholm@gmail.com", +                    "homepage": "https://github.com/Nyholm" +                }, +                { +                    "name": "Márk Sági-Kazár", +                    "email": "mark.sagikazar@gmail.com", +                    "homepage": "https://github.com/sagikazarmark" +                }, +                { +                    "name": "Tobias Schultze", +                    "email": "webmaster@tubo-world.de", +                    "homepage": "https://github.com/Tobion" +                } +            ], +            "description": "Guzzle is a PHP HTTP client library", +            "keywords": [ +                "client", +                "curl", +                "framework", +                "http", +                "http client", +                "psr-18", +                "psr-7", +                "rest", +                "web service" +            ], +            "support": { +                "issues": "https://github.com/guzzle/guzzle/issues", +                "source": "https://github.com/guzzle/guzzle/tree/7.9.3" +            }, +            "funding": [ +                { +                    "url": "https://github.com/GrahamCampbell", +                    "type": "github" +                }, +                { +                    "url": "https://github.com/Nyholm", +                    "type": "github" +                }, +                { +                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", +                    "type": "tidelift" +                } +            ], +            "time": "2025-03-27T13:37:11+00:00" +        }, +        { +            "name": "guzzlehttp/promises", +            "version": "2.2.0", +            "source": { +                "type": "git", +                "url": "https://github.com/guzzle/promises.git", +                "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", +                "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", +                "shasum": "" +            }, +            "require": { +                "php": "^7.2.5 || ^8.0" +            }, +            "require-dev": { +                "bamarni/composer-bin-plugin": "^1.8.2", +                "phpunit/phpunit": "^8.5.39 || ^9.6.20" +            }, +            "type": "library", +            "extra": { +                "bamarni-bin": { +                    "bin-links": true, +                    "forward-command": false +                } +            }, +            "autoload": { +                "psr-4": { +                    "GuzzleHttp\\Promise\\": "src/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Graham Campbell", +                    "email": "hello@gjcampbell.co.uk", +                    "homepage": "https://github.com/GrahamCampbell" +                }, +                { +                    "name": "Michael Dowling", +                    "email": "mtdowling@gmail.com", +                    "homepage": "https://github.com/mtdowling" +                }, +                { +                    "name": "Tobias Nyholm", +                    "email": "tobias.nyholm@gmail.com", +                    "homepage": "https://github.com/Nyholm" +                }, +                { +                    "name": "Tobias Schultze", +                    "email": "webmaster@tubo-world.de", +                    "homepage": "https://github.com/Tobion" +                } +            ], +            "description": "Guzzle promises library", +            "keywords": [ +                "promise" +            ], +            "support": { +                "issues": "https://github.com/guzzle/promises/issues", +                "source": "https://github.com/guzzle/promises/tree/2.2.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/GrahamCampbell", +                    "type": "github" +                }, +                { +                    "url": "https://github.com/Nyholm", +                    "type": "github" +                }, +                { +                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", +                    "type": "tidelift" +                } +            ], +            "time": "2025-03-27T13:27:01+00:00" +        }, +        { +            "name": "guzzlehttp/psr7", +            "version": "2.7.1", +            "source": { +                "type": "git", +                "url": "https://github.com/guzzle/psr7.git", +                "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", +                "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", +                "shasum": "" +            }, +            "require": { +                "php": "^7.2.5 || ^8.0", +                "psr/http-factory": "^1.0", +                "psr/http-message": "^1.1 || ^2.0", +                "ralouphie/getallheaders": "^3.0" +            }, +            "provide": { +                "psr/http-factory-implementation": "1.0", +                "psr/http-message-implementation": "1.0" +            }, +            "require-dev": { +                "bamarni/composer-bin-plugin": "^1.8.2", +                "http-interop/http-factory-tests": "0.9.0", +                "phpunit/phpunit": "^8.5.39 || ^9.6.20" +            }, +            "suggest": { +                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" +            }, +            "type": "library", +            "extra": { +                "bamarni-bin": { +                    "bin-links": true, +                    "forward-command": false +                } +            }, +            "autoload": { +                "psr-4": { +                    "GuzzleHttp\\Psr7\\": "src/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Graham Campbell", +                    "email": "hello@gjcampbell.co.uk", +                    "homepage": "https://github.com/GrahamCampbell" +                }, +                { +                    "name": "Michael Dowling", +                    "email": "mtdowling@gmail.com", +                    "homepage": "https://github.com/mtdowling" +                }, +                { +                    "name": "George Mponos", +                    "email": "gmponos@gmail.com", +                    "homepage": "https://github.com/gmponos" +                }, +                { +                    "name": "Tobias Nyholm", +                    "email": "tobias.nyholm@gmail.com", +                    "homepage": "https://github.com/Nyholm" +                }, +                { +                    "name": "Márk Sági-Kazár", +                    "email": "mark.sagikazar@gmail.com", +                    "homepage": "https://github.com/sagikazarmark" +                }, +                { +                    "name": "Tobias Schultze", +                    "email": "webmaster@tubo-world.de", +                    "homepage": "https://github.com/Tobion" +                }, +                { +                    "name": "Márk Sági-Kazár", +                    "email": "mark.sagikazar@gmail.com", +                    "homepage": "https://sagikazarmark.hu" +                } +            ], +            "description": "PSR-7 message implementation that also provides common utility methods", +            "keywords": [ +                "http", +                "message", +                "psr-7", +                "request", +                "response", +                "stream", +                "uri", +                "url" +            ], +            "support": { +                "issues": "https://github.com/guzzle/psr7/issues", +                "source": "https://github.com/guzzle/psr7/tree/2.7.1" +            }, +            "funding": [ +                { +                    "url": "https://github.com/GrahamCampbell", +                    "type": "github" +                }, +                { +                    "url": "https://github.com/Nyholm", +                    "type": "github" +                }, +                { +                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", +                    "type": "tidelift" +                } +            ], +            "time": "2025-03-27T12:30:47+00:00" +        }, +        { +            "name": "myclabs/deep-copy", +            "version": "1.13.4", +            "source": { +                "type": "git", +                "url": "https://github.com/myclabs/DeepCopy.git", +                "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", +                "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", +                "shasum": "" +            }, +            "require": { +                "php": "^7.1 || ^8.0" +            }, +            "conflict": { +                "doctrine/collections": "<1.6.8", +                "doctrine/common": "<2.13.3 || >=3 <3.2.2" +            }, +            "require-dev": { +                "doctrine/collections": "^1.6.8", +                "doctrine/common": "^2.13.3 || ^3.2.2", +                "phpspec/prophecy": "^1.10", +                "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" +            }, +            "type": "library", +            "autoload": { +                "files": [ +                    "src/DeepCopy/deep_copy.php" +                ], +                "psr-4": { +                    "DeepCopy\\": "src/DeepCopy/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "description": "Create deep copies (clones) of your objects", +            "keywords": [ +                "clone", +                "copy", +                "duplicate", +                "object", +                "object graph" +            ], +            "support": { +                "issues": "https://github.com/myclabs/DeepCopy/issues", +                "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" +            }, +            "funding": [ +                { +                    "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", +                    "type": "tidelift" +                } +            ], +            "time": "2025-08-01T08:46:24+00:00" +        }, +        { +            "name": "nikic/php-parser", +            "version": "v5.6.0", +            "source": { +                "type": "git", +                "url": "https://github.com/nikic/PHP-Parser.git", +                "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/221b0d0fdf1369c71047ad1d18bb5880017bbc56", +                "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56", +                "shasum": "" +            }, +            "require": { +                "ext-ctype": "*", +                "ext-json": "*", +                "ext-tokenizer": "*", +                "php": ">=7.4" +            }, +            "require-dev": { +                "ircmaxell/php-yacc": "^0.0.7", +                "phpunit/phpunit": "^9.0" +            }, +            "bin": [ +                "bin/php-parse" +            ], +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "5.0-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "PhpParser\\": "lib/PhpParser" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Nikita Popov" +                } +            ], +            "description": "A PHP parser written in PHP", +            "keywords": [ +                "parser", +                "php" +            ], +            "support": { +                "issues": "https://github.com/nikic/PHP-Parser/issues", +                "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.0" +            }, +            "time": "2025-07-27T20:03:57+00:00" +        }, +        { +            "name": "phar-io/manifest", +            "version": "2.0.4", +            "source": { +                "type": "git", +                "url": "https://github.com/phar-io/manifest.git", +                "reference": "54750ef60c58e43759730615a392c31c80e23176" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", +                "reference": "54750ef60c58e43759730615a392c31c80e23176", +                "shasum": "" +            }, +            "require": { +                "ext-dom": "*", +                "ext-libxml": "*", +                "ext-phar": "*", +                "ext-xmlwriter": "*", +                "phar-io/version": "^3.0.1", +                "php": "^7.2 || ^8.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.0.x-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Arne Blankerts", +                    "email": "arne@blankerts.de", +                    "role": "Developer" +                }, +                { +                    "name": "Sebastian Heuer", +                    "email": "sebastian@phpeople.de", +                    "role": "Developer" +                }, +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "Developer" +                } +            ], +            "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", +            "support": { +                "issues": "https://github.com/phar-io/manifest/issues", +                "source": "https://github.com/phar-io/manifest/tree/2.0.4" +            }, +            "funding": [ +                { +                    "url": "https://github.com/theseer", +                    "type": "github" +                } +            ], +            "time": "2024-03-03T12:33:53+00:00" +        }, +        { +            "name": "phar-io/version", +            "version": "3.2.1", +            "source": { +                "type": "git", +                "url": "https://github.com/phar-io/version.git", +                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", +                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", +                "shasum": "" +            }, +            "require": { +                "php": "^7.2 || ^8.0" +            }, +            "type": "library", +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Arne Blankerts", +                    "email": "arne@blankerts.de", +                    "role": "Developer" +                }, +                { +                    "name": "Sebastian Heuer", +                    "email": "sebastian@phpeople.de", +                    "role": "Developer" +                }, +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "Developer" +                } +            ], +            "description": "Library for handling version information and constraints", +            "support": { +                "issues": "https://github.com/phar-io/version/issues", +                "source": "https://github.com/phar-io/version/tree/3.2.1" +            }, +            "time": "2022-02-21T01:04:05+00:00" +        }, +        { +            "name": "phpunit/php-code-coverage", +            "version": "12.3.2", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/php-code-coverage.git", +                "reference": "086553c5b2e0e1e20293d782d788ab768202b621" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/086553c5b2e0e1e20293d782d788ab768202b621", +                "reference": "086553c5b2e0e1e20293d782d788ab768202b621", +                "shasum": "" +            }, +            "require": { +                "ext-dom": "*", +                "ext-libxml": "*", +                "ext-xmlwriter": "*", +                "nikic/php-parser": "^5.4.0", +                "php": ">=8.3", +                "phpunit/php-file-iterator": "^6.0", +                "phpunit/php-text-template": "^5.0", +                "sebastian/complexity": "^5.0", +                "sebastian/environment": "^8.0", +                "sebastian/lines-of-code": "^4.0", +                "sebastian/version": "^6.0", +                "theseer/tokenizer": "^1.2.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.1" +            }, +            "suggest": { +                "ext-pcov": "PHP extension that provides line coverage", +                "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "12.3.x-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", +            "homepage": "https://github.com/sebastianbergmann/php-code-coverage", +            "keywords": [ +                "coverage", +                "testing", +                "xunit" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", +                "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", +                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.3.2" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                }, +                { +                    "url": "https://liberapay.com/sebastianbergmann", +                    "type": "liberapay" +                }, +                { +                    "url": "https://thanks.dev/u/gh/sebastianbergmann", +                    "type": "thanks_dev" +                }, +                { +                    "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", +                    "type": "tidelift" +                } +            ], +            "time": "2025-07-29T06:19:24+00:00" +        }, +        { +            "name": "phpunit/php-file-iterator", +            "version": "6.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/php-file-iterator.git", +                "reference": "961bc913d42fe24a257bfff826a5068079ac7782" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", +                "reference": "961bc913d42fe24a257bfff826a5068079ac7782", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "6.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "FilterIterator implementation that filters files based on a list of suffixes.", +            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", +            "keywords": [ +                "filesystem", +                "iterator" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", +                "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", +                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:58:37+00:00" +        }, +        { +            "name": "phpunit/php-invoker", +            "version": "6.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/php-invoker.git", +                "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", +                "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "require-dev": { +                "ext-pcntl": "*", +                "phpunit/phpunit": "^12.0" +            }, +            "suggest": { +                "ext-pcntl": "*" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "6.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Invoke callables with a timeout", +            "homepage": "https://github.com/sebastianbergmann/php-invoker/", +            "keywords": [ +                "process" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/php-invoker/issues", +                "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", +                "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:58:58+00:00" +        }, +        { +            "name": "phpunit/php-text-template", +            "version": "5.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/php-text-template.git", +                "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", +                "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "5.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Simple template engine.", +            "homepage": "https://github.com/sebastianbergmann/php-text-template/", +            "keywords": [ +                "template" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/php-text-template/issues", +                "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", +                "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:59:16+00:00" +        }, +        { +            "name": "phpunit/php-timer", +            "version": "8.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/php-timer.git", +                "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", +                "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "8.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Utility class for timing", +            "homepage": "https://github.com/sebastianbergmann/php-timer/", +            "keywords": [ +                "timer" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/php-timer/issues", +                "security": "https://github.com/sebastianbergmann/php-timer/security/policy", +                "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:59:38+00:00" +        }, +        { +            "name": "phpunit/phpunit", +            "version": "12.3.4", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/phpunit.git", +                "reference": "429095031bd38cb5070ca44166bd9dd5a9245dd6" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/429095031bd38cb5070ca44166bd9dd5a9245dd6", +                "reference": "429095031bd38cb5070ca44166bd9dd5a9245dd6", +                "shasum": "" +            }, +            "require": { +                "ext-dom": "*", +                "ext-json": "*", +                "ext-libxml": "*", +                "ext-mbstring": "*", +                "ext-xml": "*", +                "ext-xmlwriter": "*", +                "myclabs/deep-copy": "^1.13.4", +                "phar-io/manifest": "^2.0.4", +                "phar-io/version": "^3.2.1", +                "php": ">=8.3", +                "phpunit/php-code-coverage": "^12.3.2", +                "phpunit/php-file-iterator": "^6.0.0", +                "phpunit/php-invoker": "^6.0.0", +                "phpunit/php-text-template": "^5.0.0", +                "phpunit/php-timer": "^8.0.0", +                "sebastian/cli-parser": "^4.0.0", +                "sebastian/comparator": "^7.1.2", +                "sebastian/diff": "^7.0.0", +                "sebastian/environment": "^8.0.2", +                "sebastian/exporter": "^7.0.0", +                "sebastian/global-state": "^8.0.0", +                "sebastian/object-enumerator": "^7.0.0", +                "sebastian/type": "^6.0.3", +                "sebastian/version": "^6.0.0", +                "staabm/side-effects-detector": "^1.0.5" +            }, +            "bin": [ +                "phpunit" +            ], +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "12.3-dev" +                } +            }, +            "autoload": { +                "files": [ +                    "src/Framework/Assert/Functions.php" +                ], +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "The PHP Unit Testing framework.", +            "homepage": "https://phpunit.de/", +            "keywords": [ +                "phpunit", +                "testing", +                "xunit" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/phpunit/issues", +                "security": "https://github.com/sebastianbergmann/phpunit/security/policy", +                "source": "https://github.com/sebastianbergmann/phpunit/tree/12.3.4" +            }, +            "funding": [ +                { +                    "url": "https://phpunit.de/sponsors.html", +                    "type": "custom" +                }, +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                }, +                { +                    "url": "https://liberapay.com/sebastianbergmann", +                    "type": "liberapay" +                }, +                { +                    "url": "https://thanks.dev/u/gh/sebastianbergmann", +                    "type": "thanks_dev" +                }, +                { +                    "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", +                    "type": "tidelift" +                } +            ], +            "time": "2025-08-12T07:35:30+00:00" +        }, +        { +            "name": "psr/http-client", +            "version": "1.0.3", +            "source": { +                "type": "git", +                "url": "https://github.com/php-fig/http-client.git", +                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", +                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", +                "shasum": "" +            }, +            "require": { +                "php": "^7.0 || ^8.0", +                "psr/http-message": "^1.0 || ^2.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.0.x-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "Psr\\Http\\Client\\": "src/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "PHP-FIG", +                    "homepage": "https://www.php-fig.org/" +                } +            ], +            "description": "Common interface for HTTP clients", +            "homepage": "https://github.com/php-fig/http-client", +            "keywords": [ +                "http", +                "http-client", +                "psr", +                "psr-18" +            ], +            "support": { +                "source": "https://github.com/php-fig/http-client" +            }, +            "time": "2023-09-23T14:17:50+00:00" +        }, +        { +            "name": "psr/http-factory", +            "version": "1.1.0", +            "source": { +                "type": "git", +                "url": "https://github.com/php-fig/http-factory.git", +                "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", +                "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.1", +                "psr/http-message": "^1.0 || ^2.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.0.x-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "Psr\\Http\\Message\\": "src/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "PHP-FIG", +                    "homepage": "https://www.php-fig.org/" +                } +            ], +            "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", +            "keywords": [ +                "factory", +                "http", +                "message", +                "psr", +                "psr-17", +                "psr-7", +                "request", +                "response" +            ], +            "support": { +                "source": "https://github.com/php-fig/http-factory" +            }, +            "time": "2024-04-15T12:06:14+00:00" +        }, +        { +            "name": "psr/http-message", +            "version": "2.0", +            "source": { +                "type": "git", +                "url": "https://github.com/php-fig/http-message.git", +                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", +                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", +                "shasum": "" +            }, +            "require": { +                "php": "^7.2 || ^8.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.0.x-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "Psr\\Http\\Message\\": "src/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "PHP-FIG", +                    "homepage": "https://www.php-fig.org/" +                } +            ], +            "description": "Common interface for HTTP messages", +            "homepage": "https://github.com/php-fig/http-message", +            "keywords": [ +                "http", +                "http-message", +                "psr", +                "psr-7", +                "request", +                "response" +            ], +            "support": { +                "source": "https://github.com/php-fig/http-message/tree/2.0" +            }, +            "time": "2023-04-04T09:54:51+00:00" +        }, +        { +            "name": "ralouphie/getallheaders", +            "version": "3.0.3", +            "source": { +                "type": "git", +                "url": "https://github.com/ralouphie/getallheaders.git", +                "reference": "120b605dfeb996808c31b6477290a714d356e822" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", +                "reference": "120b605dfeb996808c31b6477290a714d356e822", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.6" +            }, +            "require-dev": { +                "php-coveralls/php-coveralls": "^2.1", +                "phpunit/phpunit": "^5 || ^6.5" +            }, +            "type": "library", +            "autoload": { +                "files": [ +                    "src/getallheaders.php" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Ralph Khattar", +                    "email": "ralph.khattar@gmail.com" +                } +            ], +            "description": "A polyfill for getallheaders.", +            "support": { +                "issues": "https://github.com/ralouphie/getallheaders/issues", +                "source": "https://github.com/ralouphie/getallheaders/tree/develop" +            }, +            "time": "2019-03-08T08:55:37+00:00" +        }, +        { +            "name": "sebastian/cli-parser", +            "version": "4.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/cli-parser.git", +                "reference": "6d584c727d9114bcdc14c86711cd1cad51778e7c" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/6d584c727d9114bcdc14c86711cd1cad51778e7c", +                "reference": "6d584c727d9114bcdc14c86711cd1cad51778e7c", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "4.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Library for parsing CLI options", +            "homepage": "https://github.com/sebastianbergmann/cli-parser", +            "support": { +                "issues": "https://github.com/sebastianbergmann/cli-parser/issues", +                "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", +                "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:53:50+00:00" +        }, +        { +            "name": "sebastian/comparator", +            "version": "7.1.2", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/comparator.git", +                "reference": "1a7c2bce03a13a457ed3c975dfd331b3b4b133aa" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1a7c2bce03a13a457ed3c975dfd331b3b4b133aa", +                "reference": "1a7c2bce03a13a457ed3c975dfd331b3b4b133aa", +                "shasum": "" +            }, +            "require": { +                "ext-dom": "*", +                "ext-mbstring": "*", +                "php": ">=8.3", +                "sebastian/diff": "^7.0", +                "sebastian/exporter": "^7.0" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.2" +            }, +            "suggest": { +                "ext-bcmath": "For comparing BcMath\\Number objects" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "7.1-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                }, +                { +                    "name": "Jeff Welch", +                    "email": "whatthejeff@gmail.com" +                }, +                { +                    "name": "Volker Dusch", +                    "email": "github@wallbash.com" +                }, +                { +                    "name": "Bernhard Schussek", +                    "email": "bschussek@2bepublished.at" +                } +            ], +            "description": "Provides the functionality to compare PHP values for equality", +            "homepage": "https://github.com/sebastianbergmann/comparator", +            "keywords": [ +                "comparator", +                "compare", +                "equality" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/comparator/issues", +                "security": "https://github.com/sebastianbergmann/comparator/security/policy", +                "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.2" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                }, +                { +                    "url": "https://liberapay.com/sebastianbergmann", +                    "type": "liberapay" +                }, +                { +                    "url": "https://thanks.dev/u/gh/sebastianbergmann", +                    "type": "thanks_dev" +                }, +                { +                    "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", +                    "type": "tidelift" +                } +            ], +            "time": "2025-08-10T08:50:08+00:00" +        }, +        { +            "name": "sebastian/complexity", +            "version": "5.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/complexity.git", +                "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", +                "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", +                "shasum": "" +            }, +            "require": { +                "nikic/php-parser": "^5.0", +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "5.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Library for calculating the complexity of PHP code units", +            "homepage": "https://github.com/sebastianbergmann/complexity", +            "support": { +                "issues": "https://github.com/sebastianbergmann/complexity/issues", +                "security": "https://github.com/sebastianbergmann/complexity/security/policy", +                "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:55:25+00:00" +        }, +        { +            "name": "sebastian/diff", +            "version": "7.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/diff.git", +                "reference": "7ab1ea946c012266ca32390913653d844ecd085f" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", +                "reference": "7ab1ea946c012266ca32390913653d844ecd085f", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0", +                "symfony/process": "^7.2" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "7.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                }, +                { +                    "name": "Kore Nordmann", +                    "email": "mail@kore-nordmann.de" +                } +            ], +            "description": "Diff implementation", +            "homepage": "https://github.com/sebastianbergmann/diff", +            "keywords": [ +                "diff", +                "udiff", +                "unidiff", +                "unified diff" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/diff/issues", +                "security": "https://github.com/sebastianbergmann/diff/security/policy", +                "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:55:46+00:00" +        }, +        { +            "name": "sebastian/environment", +            "version": "8.0.2", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/environment.git", +                "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d364b9e5d0d3b18a2573351a1786fbf96b7e0792", +                "reference": "d364b9e5d0d3b18a2573351a1786fbf96b7e0792", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "suggest": { +                "ext-posix": "*" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "8.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                } +            ], +            "description": "Provides functionality to handle HHVM/PHP environments", +            "homepage": "https://github.com/sebastianbergmann/environment", +            "keywords": [ +                "Xdebug", +                "environment", +                "hhvm" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/environment/issues", +                "security": "https://github.com/sebastianbergmann/environment/security/policy", +                "source": "https://github.com/sebastianbergmann/environment/tree/8.0.2" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                }, +                { +                    "url": "https://liberapay.com/sebastianbergmann", +                    "type": "liberapay" +                }, +                { +                    "url": "https://thanks.dev/u/gh/sebastianbergmann", +                    "type": "thanks_dev" +                }, +                { +                    "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", +                    "type": "tidelift" +                } +            ], +            "time": "2025-05-21T15:05:44+00:00" +        }, +        { +            "name": "sebastian/exporter", +            "version": "7.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/exporter.git", +                "reference": "76432aafc58d50691a00d86d0632f1217a47b688" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/76432aafc58d50691a00d86d0632f1217a47b688", +                "reference": "76432aafc58d50691a00d86d0632f1217a47b688", +                "shasum": "" +            }, +            "require": { +                "ext-mbstring": "*", +                "php": ">=8.3", +                "sebastian/recursion-context": "^7.0" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "7.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                }, +                { +                    "name": "Jeff Welch", +                    "email": "whatthejeff@gmail.com" +                }, +                { +                    "name": "Volker Dusch", +                    "email": "github@wallbash.com" +                }, +                { +                    "name": "Adam Harvey", +                    "email": "aharvey@php.net" +                }, +                { +                    "name": "Bernhard Schussek", +                    "email": "bschussek@gmail.com" +                } +            ], +            "description": "Provides the functionality to export PHP variables for visualization", +            "homepage": "https://www.github.com/sebastianbergmann/exporter", +            "keywords": [ +                "export", +                "exporter" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/exporter/issues", +                "security": "https://github.com/sebastianbergmann/exporter/security/policy", +                "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:56:42+00:00" +        }, +        { +            "name": "sebastian/global-state", +            "version": "8.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/global-state.git", +                "reference": "570a2aeb26d40f057af686d63c4e99b075fb6cbc" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/570a2aeb26d40f057af686d63c4e99b075fb6cbc", +                "reference": "570a2aeb26d40f057af686d63c4e99b075fb6cbc", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3", +                "sebastian/object-reflector": "^5.0", +                "sebastian/recursion-context": "^7.0" +            }, +            "require-dev": { +                "ext-dom": "*", +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "8.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                } +            ], +            "description": "Snapshotting of global state", +            "homepage": "https://www.github.com/sebastianbergmann/global-state", +            "keywords": [ +                "global state" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/global-state/issues", +                "security": "https://github.com/sebastianbergmann/global-state/security/policy", +                "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:56:59+00:00" +        }, +        { +            "name": "sebastian/lines-of-code", +            "version": "4.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/lines-of-code.git", +                "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", +                "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", +                "shasum": "" +            }, +            "require": { +                "nikic/php-parser": "^5.0", +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "4.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Library for counting the lines of code in PHP source code", +            "homepage": "https://github.com/sebastianbergmann/lines-of-code", +            "support": { +                "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", +                "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", +                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:57:28+00:00" +        }, +        { +            "name": "sebastian/object-enumerator", +            "version": "7.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/object-enumerator.git", +                "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", +                "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3", +                "sebastian/object-reflector": "^5.0", +                "sebastian/recursion-context": "^7.0" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "7.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                } +            ], +            "description": "Traverses array structures and object graphs to enumerate all referenced objects", +            "homepage": "https://github.com/sebastianbergmann/object-enumerator/", +            "support": { +                "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", +                "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", +                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:57:48+00:00" +        }, +        { +            "name": "sebastian/object-reflector", +            "version": "5.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/object-reflector.git", +                "reference": "4bfa827c969c98be1e527abd576533293c634f6a" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", +                "reference": "4bfa827c969c98be1e527abd576533293c634f6a", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "5.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                } +            ], +            "description": "Allows reflection of object attributes, including inherited and non-public ones", +            "homepage": "https://github.com/sebastianbergmann/object-reflector/", +            "support": { +                "issues": "https://github.com/sebastianbergmann/object-reflector/issues", +                "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", +                "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T04:58:17+00:00" +        }, +        { +            "name": "sebastian/recursion-context", +            "version": "7.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/recursion-context.git", +                "reference": "c405ae3a63e01b32eb71577f8ec1604e39858a7c" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/c405ae3a63e01b32eb71577f8ec1604e39858a7c", +                "reference": "c405ae3a63e01b32eb71577f8ec1604e39858a7c", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "7.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                }, +                { +                    "name": "Jeff Welch", +                    "email": "whatthejeff@gmail.com" +                }, +                { +                    "name": "Adam Harvey", +                    "email": "aharvey@php.net" +                } +            ], +            "description": "Provides functionality to recursively process PHP variables", +            "homepage": "https://github.com/sebastianbergmann/recursion-context", +            "support": { +                "issues": "https://github.com/sebastianbergmann/recursion-context/issues", +                "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", +                "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T05:00:01+00:00" +        }, +        { +            "name": "sebastian/type", +            "version": "6.0.3", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/type.git", +                "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", +                "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^12.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "6.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Collection of value objects that represent the types of the PHP type system", +            "homepage": "https://github.com/sebastianbergmann/type", +            "support": { +                "issues": "https://github.com/sebastianbergmann/type/issues", +                "security": "https://github.com/sebastianbergmann/type/security/policy", +                "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                }, +                { +                    "url": "https://liberapay.com/sebastianbergmann", +                    "type": "liberapay" +                }, +                { +                    "url": "https://thanks.dev/u/gh/sebastianbergmann", +                    "type": "thanks_dev" +                }, +                { +                    "url": "https://tidelift.com/funding/github/packagist/sebastian/type", +                    "type": "tidelift" +                } +            ], +            "time": "2025-08-09T06:57:12+00:00" +        }, +        { +            "name": "sebastian/version", +            "version": "6.0.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/version.git", +                "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", +                "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", +                "shasum": "" +            }, +            "require": { +                "php": ">=8.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "6.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Library that helps with managing the version number of Git-hosted PHP projects", +            "homepage": "https://github.com/sebastianbergmann/version", +            "support": { +                "issues": "https://github.com/sebastianbergmann/version/issues", +                "security": "https://github.com/sebastianbergmann/version/security/policy", +                "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2025-02-07T05:00:38+00:00" +        }, +        { +            "name": "staabm/side-effects-detector", +            "version": "1.0.5", +            "source": { +                "type": "git", +                "url": "https://github.com/staabm/side-effects-detector.git", +                "reference": "d8334211a140ce329c13726d4a715adbddd0a163" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", +                "reference": "d8334211a140ce329c13726d4a715adbddd0a163", +                "shasum": "" +            }, +            "require": { +                "ext-tokenizer": "*", +                "php": "^7.4 || ^8.0" +            }, +            "require-dev": { +                "phpstan/extension-installer": "^1.4.3", +                "phpstan/phpstan": "^1.12.6", +                "phpunit/phpunit": "^9.6.21", +                "symfony/var-dumper": "^5.4.43", +                "tomasvotruba/type-coverage": "1.0.0", +                "tomasvotruba/unused-public": "1.0.0" +            }, +            "type": "library", +            "autoload": { +                "classmap": [ +                    "lib/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "description": "A static analysis tool to detect side effects in PHP code", +            "keywords": [ +                "static analysis" +            ], +            "support": { +                "issues": "https://github.com/staabm/side-effects-detector/issues", +                "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" +            }, +            "funding": [ +                { +                    "url": "https://github.com/staabm", +                    "type": "github" +                } +            ], +            "time": "2024-10-20T05:08:20+00:00" +        }, +        { +            "name": "theseer/tokenizer", +            "version": "1.2.3", +            "source": { +                "type": "git", +                "url": "https://github.com/theseer/tokenizer.git", +                "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", +                "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", +                "shasum": "" +            }, +            "require": { +                "ext-dom": "*", +                "ext-tokenizer": "*", +                "ext-xmlwriter": "*", +                "php": "^7.2 || ^8.0" +            }, +            "type": "library", +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Arne Blankerts", +                    "email": "arne@blankerts.de", +                    "role": "Developer" +                } +            ], +            "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", +            "support": { +                "issues": "https://github.com/theseer/tokenizer/issues", +                "source": "https://github.com/theseer/tokenizer/tree/1.2.3" +            }, +            "funding": [ +                { +                    "url": "https://github.com/theseer", +                    "type": "github" +                } +            ], +            "time": "2024-03-03T12:36:25+00:00" +        } +    ],      "aliases": [],      "minimum-stability": "stable",      "stability-flags": {}, diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..becac3d --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +         xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" +         bootstrap="vendor/autoload.php" +         cacheDirectory=".phpunit.cache" +         executionOrder="depends,defects" +         requireCoverageMetadata="false" +         beStrictAboutCoverageMetadata="false" +         beStrictAboutOutputDuringTests="true" +         displayDetailsOnPhpunitDeprecations="true" +         failOnPhpunitDeprecation="true" +         failOnRisky="true" +         failOnWarning="true" +         testdox="true" +> + +    <testsuites> +        <testsuite name="default"> +            <directory>tests</directory> +        </testsuite> +    </testsuites> +     +    <source ignoreIndirectDeprecations="true" restrictNotices="true" restrictWarnings="true"> +        <include> +            <directory>src</directory> +        </include> +    </source> +     +    <extensions> +      <bootstrap class="Tests\PHPUnit\Extensions\ServerExtension\ServerExtension" /> +    </extensions> +</phpunit> diff --git a/src/Router.php b/src/Router.php index 319d5e2..e0b09ad 100644 --- a/src/Router.php +++ b/src/Router.php @@ -24,6 +24,10 @@ class Router      $this->addRoutes();    } +  /** +   * match the current url against the routes. +   * also add preflight CORS headers on OPTIONS requests. +   */    public function run(): Response    {      $request = Request::createFromGlobals(); @@ -55,6 +59,9 @@ class Router      }    } +  /** +   * add routes from the routes file +   */    private function addRoutes(): void    {      $routes = include_once(__DIR__ . "/routes.php"); diff --git a/tests/PHPUnit/Extensions/ServerExtension/PostRunSubscriber.php b/tests/PHPUnit/Extensions/ServerExtension/PostRunSubscriber.php new file mode 100644 index 0000000..308394e --- /dev/null +++ b/tests/PHPUnit/Extensions/ServerExtension/PostRunSubscriber.php @@ -0,0 +1,19 @@ +<?php + +namespace Tests\PHPUnit\Extensions\ServerExtension; + +use PHPUnit\Event\TestRunner\ExecutionFinished; +use PHPUnit\Event\TestRunner\ExecutionFinishedSubscriber; + +class PostRunSubscriber implements ExecutionFinishedSubscriber +{ +  public function __construct(private readonly \stdClass $dataObject) +  {} +   +  public function notify(ExecutionFinished $event): void +  { +    if ($this->dataObject->process_id > 0) { +      exec("kill {$this->dataObject->process_id}"); +    } +  } +} diff --git a/tests/PHPUnit/Extensions/ServerExtension/PreRunSubscriber.php b/tests/PHPUnit/Extensions/ServerExtension/PreRunSubscriber.php new file mode 100644 index 0000000..ba35ee7 --- /dev/null +++ b/tests/PHPUnit/Extensions/ServerExtension/PreRunSubscriber.php @@ -0,0 +1,18 @@ +<?php + +namespace Tests\PHPUnit\Extensions\ServerExtension; + +use PHPUnit\Event\TestRunner\ExecutionStarted; +use PHPUnit\Event\TestRunner\ExecutionStartedSubscriber; + +class PreRunSubscriber implements ExecutionStartedSubscriber +{ +  public function __construct(private \stdClass $dataObject) +  {} +   +  public function notify(ExecutionStarted $event): void +  { +    $this->dataObject->process_id = (int)shell_exec("php -S localhost:8080 -t public > /dev/null 2>&1 & echo $!"); +    sleep(1); +  } +} diff --git a/tests/PHPUnit/Extensions/ServerExtension/ServerExtension.php b/tests/PHPUnit/Extensions/ServerExtension/ServerExtension.php new file mode 100644 index 0000000..a98f593 --- /dev/null +++ b/tests/PHPUnit/Extensions/ServerExtension/ServerExtension.php @@ -0,0 +1,19 @@ +<?php + +namespace Tests\PHPUnit\Extensions\ServerExtension; + +use PHPUnit\Runner\Extension\Extension; +use PHPUnit\Runner\Extension\Facade; +use PHPUnit\Runner\Extension\ParameterCollection; +use PHPUnit\TextUI\Configuration\Configuration; + +class ServerExtension implements Extension +{ +  public function bootstrap(Configuration $configuration, Facade $facade, ParameterCollection $parameters): void +  { +    $dataObject = new \stdClass(); +     +    $facade->registerSubscriber(new PreRunSubscriber($dataObject)); +    $facade->registerSubscriber(new PostRunSubscriber($dataObject)); +  } +} diff --git a/tests/PHPUnit/TestCases/HttpResponseTestCase.php b/tests/PHPUnit/TestCases/HttpResponseTestCase.php new file mode 100644 index 0000000..855e594 --- /dev/null +++ b/tests/PHPUnit/TestCases/HttpResponseTestCase.php @@ -0,0 +1,37 @@ +<?php + +namespace Tests\PHPUnit\TestCases; + +use GuzzleHttp\Client; +use GuzzleHttp\Psr7\Response; +use PHPUnit\Framework\TestCase; + +class HttpResponseTestCase extends TestCase +{ +  protected Client $client; +   +  protected function setUp(): void +  { +    $this->client = new Client([ +      "base_uri" => "http://localhost:8080", +    ]); +  } +   +  /** +   * @param array $options +   */ +  public function request(string $method, string $path, array $options = []): Response +  { +    return $this->client->request( +      $method, +      $path, +      ["http_errors" => false] + $options +    ); +  } +   +  public function hasJsonBody(Response $response): bool +  { +    json_decode((string)$response->getBody()); +    return json_last_error() === JSON_ERROR_NONE; +  } +} diff --git a/tests/ServerImplementationTest.php b/tests/ServerImplementationTest.php new file mode 100644 index 0000000..88be7c4 --- /dev/null +++ b/tests/ServerImplementationTest.php @@ -0,0 +1,36 @@ +<?php + +namespace Tests; + +use Symfony\Component\HttpFoundation\Response; +use Tests\PHPUnit\TestCases\HttpResponseTestCase; + +class ServerImplementationTest extends HttpResponseTestCase +{ +  public function testVersion(): void +  { +    $response = $this->request("GET", "/_matrix/federation/v1/version"); +     +    $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); +    $this->assertTrue($this->hasJsonBody($response)); +     +    $body = json_decode((string)$response->getBody(), true); +     +    $this->assertArrayHasKey("server", $body); +    $this->assertArrayHasKey("name", $body["server"]); +    $this->assertArrayHasKey("version", $body["server"]); +  } +   +  public function testVersions(): void +  { +    $response = $this->request("GET", "/_matrix/client/versions"); +     +    $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); +    $this->assertTrue($this->hasJsonBody($response)); +     +    $body = json_decode((string)$response->getBody(), true); +     +    $this->assertIsArray($body["versions"]); +    $this->assertTrue(count($body["versions"]) > 0); +  } +} | 
