From 0a759fe4f5e70274708299254e21537a3f9ca603 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 10 Jul 2025 17:52:30 +0530 Subject: [PATCH 01/28] Create PR --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d7cd0715..1c9bddea 100644 --- a/README.md +++ b/README.md @@ -332,3 +332,4 @@ Professional support, consulting as well as software development services are av https://www.cebe.cc/en/contact Development of this library is sponsored by [cebe.:cloud: "Your Professional Deployment Platform"](https://cebe.cloud). + From d40a157cf63ffa0e987edacaf3ba333db0f2b324 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 21 Aug 2025 16:10:50 +0530 Subject: [PATCH 02/28] Add dependency --- README.md | 1 - composer.json | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1c9bddea..d7cd0715 100644 --- a/README.md +++ b/README.md @@ -332,4 +332,3 @@ Professional support, consulting as well as software development services are av https://www.cebe.cc/en/contact Development of this library is sponsored by [cebe.:cloud: "Your Professional Deployment Platform"](https://cebe.cloud). - diff --git a/composer.json b/composer.json index 3dbff339..0559719b 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,8 @@ "mermade/openapi3-examples": "1.0.0", "apis-guru/openapi-directory": "1.0.0", "nexmo/api-specification": "1.0.0", - "phpstan/phpstan": "^0.12.0 || ^1.9" + "phpstan/phpstan": "^0.12.0 || ^1.9", + "donatj/mock-webserver": "^0.4.0" }, "conflict": { "symfony/yaml": "3.4.0 - 3.4.4 || 4.0.0 - 4.4.17 || 5.0.0 - 5.1.9 || 5.2.0" From b240bad06749cd9b736febfebdf5d8e737aac7e6 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 21 Aug 2025 17:47:09 +0530 Subject: [PATCH 03/28] Setup mock web server lib --- composer.json | 1 + tests/docker/Dockerfile | 3 +++ tests/spec/ReferenceTest.php | 31 ++++++++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0559719b..3c659206 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "justinrainbow/json-schema": "^5.2 || ^6.0" }, "require-dev": { + "ext-sockets": "*", "cebe/indent": "*", "phpunit/phpunit": "^6.5 || ^7.5 || ^8.5 || ^9.4", "oai/openapi-specification": "3.0.3", diff --git a/tests/docker/Dockerfile b/tests/docker/Dockerfile index 4dce3b53..f740edb6 100644 --- a/tests/docker/Dockerfile +++ b/tests/docker/Dockerfile @@ -19,10 +19,13 @@ RUN apt-get update && \ curl \ libcurl4-openssl-dev \ libssl-dev \ + procps \ --no-install-recommends && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ && pecl install xdebug-2.9.6 \ + && docker-php-ext-install sockets \ + && docker-php-ext-enable sockets \ && docker-php-ext-enable xdebug \ && docker-php-ext-install \ zip \ diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index b94c946e..9ecc8009 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -1,19 +1,35 @@ server = new MockWebServer(); + $this->server->stop(); + $this->server->start(); + } + + protected function tearDown(): void + { + $this->server->stop(); + } + public function testResolveInDocument() { /** @var $openapi OpenApi */ @@ -233,6 +249,19 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() public function testResolveFileHttp() { + $url = $this->server->setResponseOfPath( + '/definedPath', + 'This is our http body response' + ); + + $content = file_get_contents($url); + $this->assertSame('This is our http body response', $content); + + + // TODO + return; + + $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; /** @var $openapi OpenApi */ $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); From 1833ef6cf5ddba9e95d3d826c478fdb7132cb60d Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Fri, 22 Aug 2025 18:38:53 +0530 Subject: [PATCH 04/28] Attempt to fix failing CI for Windows --- .github/workflows/php.yml | 8 ++++++++ tests/spec/ReferenceTest.php | 3 +++ 2 files changed, 11 insertions(+) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index add9b3d7..98c9ff99 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -81,6 +81,14 @@ jobs: run: "composer require phpunit/phpunit '^9.5' --dev --no-interaction --ansi --no-install" if: matrix.php == '8.1' || matrix.php == '8.2' || matrix.php == '8.3' + # ✅ Fix for Windows: enable sockets if missing + - name: Enable sockets on Windows + if: runner.os == 'Windows' + run: | + echo "extension=sockets" | Out-File -Append "C:\tools\php\php.ini" + php -m | findstr sockets || (echo "sockets not enabled" && exit 1) + + - name: "Install dependencies with Composer" uses: "ramsey/composer-install@v2" with: diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 9ecc8009..796fc3c1 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -262,6 +262,9 @@ public function testResolveFileHttp() return; + // TODO +// $host +// $path $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; /** @var $openapi OpenApi */ $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); From f1b10c61801f161f362cabe1b6a56efbe820666a Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Fri, 22 Aug 2025 18:42:18 +0530 Subject: [PATCH 05/28] Attempt 2 --- .github/workflows/php.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 98c9ff99..beed8030 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -74,13 +74,6 @@ jobs: coverage: pcov tools: composer:v2 - - name: Require specific symfony/yaml version - run: "composer require symfony/yaml:'${{ matrix.symfony-yaml }}' --no-interaction --ansi --no-install" - - - name: Require newer phpunit/phpunit version - run: "composer require phpunit/phpunit '^9.5' --dev --no-interaction --ansi --no-install" - if: matrix.php == '8.1' || matrix.php == '8.2' || matrix.php == '8.3' - # ✅ Fix for Windows: enable sockets if missing - name: Enable sockets on Windows if: runner.os == 'Windows' @@ -88,6 +81,12 @@ jobs: echo "extension=sockets" | Out-File -Append "C:\tools\php\php.ini" php -m | findstr sockets || (echo "sockets not enabled" && exit 1) + - name: Require specific symfony/yaml version + run: "composer require symfony/yaml:'${{ matrix.symfony-yaml }}' --no-interaction --ansi --no-install" + + - name: Require newer phpunit/phpunit version + run: "composer require phpunit/phpunit '^9.5' --dev --no-interaction --ansi --no-install" + if: matrix.php == '8.1' || matrix.php == '8.2' || matrix.php == '8.3' - name: "Install dependencies with Composer" uses: "ramsey/composer-install@v2" From 7398f5d6c2544df67f36900a4ab58d20f0607ece Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Sat, 23 Aug 2025 08:31:58 +0530 Subject: [PATCH 06/28] Run again --- .github/workflows/php.yml | 2 +- tests/spec/ReferenceTest.php | 35 ++++++++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index beed8030..f9f25800 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -74,7 +74,7 @@ jobs: coverage: pcov tools: composer:v2 - # ✅ Fix for Windows: enable sockets if missing + # Fix for Windows: enable sockets if missing for package donatj/mock-webserver (https://github.com/cebe/php-openapi/issues/236) - name: Enable sockets on Windows if: runner.os == 'Windows' run: | diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 796fc3c1..478508c2 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -249,23 +249,39 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() public function testResolveFileHttp() { - $url = $this->server->setResponseOfPath( - '/definedPath', - 'This is our http body response' + $this->server->setResponseOfPath( + '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', + 'openapi: 3.0.0 +info: + title: Link Example + version: 1.0.0 +components: + schemas: + Pet: + $ref: definitions.yaml#/Pet + Dog: + $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog +paths: + \'/pet\': + get: + responses: + 200: + description: return a pet' ); - $content = file_get_contents($url); - $this->assertSame('This is our http body response', $content); +// $content = file_get_contents($url); +// $this->assertSame('This is our http body response', $content); // TODO - return; +// return; // TODO -// $host -// $path - $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; + $host = $this->server->getHost().':'.$this->server->getPort(); + $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; +// $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; + $file = 'http://'.$host.$path; /** @var $openapi OpenApi */ $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); @@ -690,3 +706,4 @@ public function testResolveRelativePathAll() } } + From 7bb4ca8f0926be997c7f518c326e22e13d1d292b Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Sat, 23 Aug 2025 08:37:02 +0530 Subject: [PATCH 07/28] again --- tests/spec/ReferenceTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 478508c2..02212935 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -249,6 +249,7 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() public function testResolveFileHttp() { + return; $this->server->setResponseOfPath( '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', 'openapi: 3.0.0 From 21632e2597767711e00d4a775b3e820e1fb67ab1 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Sat, 23 Aug 2025 09:17:37 +0530 Subject: [PATCH 08/28] Add test --- tests/spec/ReferenceTest.php | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 02212935..3f10eb53 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -249,10 +249,27 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() public function testResolveFileHttp() { - return; + $this->server->setResponseOfPath( + '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/definitions.yaml', + ' +Pet: + type: object + properties: + id: + type: integer + format: int64 +Dog: + type: object + properties: + name: + type: string +' + ); + $this->server->setResponseOfPath( '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', - 'openapi: 3.0.0 + ' +openapi: 3.0.0 info: title: Link Example version: 1.0.0 @@ -267,21 +284,14 @@ public function testResolveFileHttp() get: responses: 200: - description: return a pet' + description: return a pet +' ); -// $content = file_get_contents($url); -// $this->assertSame('This is our http body response', $content); - - - // TODO -// return; - + // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; - // TODO $host = $this->server->getHost().':'.$this->server->getPort(); $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; -// $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; $file = 'http://'.$host.$path; /** @var $openapi OpenApi */ $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); From f7809549480785bb829cdc0c51cfff56c3c18895 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Sat, 23 Aug 2025 09:26:09 +0530 Subject: [PATCH 09/28] Attempt to fix Windows CI --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7d9358f0..be5f670f 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ install: composer.json package.json test: unit test-recursion.json test-recursion2.yaml test-recursion3_index.yaml test-empty-maps.json unit: - $(DOCKER_PHP) php $(PHPARGS) $(XPHPARGS) vendor/bin/phpunit --verbose --colors=always $(TESTCASE) + $(DOCKER_PHP) php -d output_buffering=0 $(PHPARGS) $(XPHPARGS) vendor/bin/phpunit --verbose --colors=always $(TESTCASE) # test specific JSON files in tests/spec/data/ # e.g. test-recursion will run validation on tests/spec/data/recursion.json From a09b8bce83edc230b4aeeeefa2119083d1214a56 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Sat, 23 Aug 2025 09:52:11 +0530 Subject: [PATCH 10/28] Check if CI for Windows runs without this particular test --- tests/spec/ReferenceTest.php | 148 +++++++++++++++++------------------ 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 3f10eb53..d7c08b18 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -18,17 +18,17 @@ class ReferenceTest extends \PHPUnit\Framework\TestCase /** @var MockWebServer */ private $server; - protected function setUp(): void - { - $this->server = new MockWebServer(); - $this->server->stop(); - $this->server->start(); - } - - protected function tearDown(): void - { - $this->server->stop(); - } +// protected function setUp(): void +// { +// $this->server = new MockWebServer(); +// $this->server->stop(); +// $this->server->start(); +// } +// +// protected function tearDown(): void +// { +// $this->server->stop(); +// } public function testResolveInDocument() { @@ -247,69 +247,69 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() $this->assertTrue($result); } - public function testResolveFileHttp() - { - $this->server->setResponseOfPath( - '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/definitions.yaml', - ' -Pet: - type: object - properties: - id: - type: integer - format: int64 -Dog: - type: object - properties: - name: - type: string -' - ); - - $this->server->setResponseOfPath( - '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', - ' -openapi: 3.0.0 -info: - title: Link Example - version: 1.0.0 -components: - schemas: - Pet: - $ref: definitions.yaml#/Pet - Dog: - $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog -paths: - \'/pet\': - get: - responses: - 200: - description: return a pet -' - ); - - // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; - - $host = $this->server->getHost().':'.$this->server->getPort(); - $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; - $file = 'http://'.$host.$path; - /** @var $openapi OpenApi */ - $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); - - $result = $openapi->validate(); - $this->assertEquals([], $openapi->getErrors()); - $this->assertTrue($result); - - $this->assertInstanceOf(Reference::class, $petItems = $openapi->components->schemas['Pet']); - $this->assertInstanceOf(Reference::class, $petItems = $openapi->components->schemas['Dog']); - - $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, $file)); - - $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Pet']); - $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Dog']); - $this->assertArrayHasKey('id', $openapi->components->schemas['Pet']->properties); - $this->assertArrayHasKey('name', $openapi->components->schemas['Dog']->properties); - } +// public function testResolveFileHttp() +// { +// $this->server->setResponseOfPath( +// '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/definitions.yaml', +// ' +//Pet: +// type: object +// properties: +// id: +// type: integer +// format: int64 +//Dog: +// type: object +// properties: +// name: +// type: string +//' +// ); +// +// $this->server->setResponseOfPath( +// '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', +// ' +//openapi: 3.0.0 +//info: +// title: Link Example +// version: 1.0.0 +//components: +// schemas: +// Pet: +// $ref: definitions.yaml#/Pet +// Dog: +// $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog +//paths: +// \'/pet\': +// get: +// responses: +// 200: +// description: return a pet +//' +// ); +// +// // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; +// +// $host = $this->server->getHost().':'.$this->server->getPort(); +// $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; +// $file = 'http://'.$host.$path; +// /** @var $openapi OpenApi */ +// $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); +// +// $result = $openapi->validate(); +// $this->assertEquals([], $openapi->getErrors()); +// $this->assertTrue($result); +// +// $this->assertInstanceOf(Reference::class, $petItems = $openapi->components->schemas['Pet']); +// $this->assertInstanceOf(Reference::class, $petItems = $openapi->components->schemas['Dog']); +// +// $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, $file)); +// +// $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Pet']); +// $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Dog']); +// $this->assertArrayHasKey('id', $openapi->components->schemas['Pet']->properties); +// $this->assertArrayHasKey('name', $openapi->components->schemas['Dog']->properties); +// } public function testResolvePaths() { From 76c43d1a07cc04ea1db2a128ed7ab3a2da655aea Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Mon, 25 Aug 2025 16:17:40 +0530 Subject: [PATCH 11/28] Attempt --- .github/workflows/php.yml | 5 + tests/spec/ReferenceTest.php | 173 ++++++++++++++++++----------------- 2 files changed, 92 insertions(+), 86 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index f9f25800..5876c4ce 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -64,6 +64,11 @@ jobs: runs-on: ${{ matrix.os }} + defaults: + run: + shell: bash + + steps: - uses: actions/checkout@v2 diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index d7c08b18..ee3e4707 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -1,6 +1,7 @@ server = new MockWebServer(); -// $this->server->stop(); -// $this->server->start(); -// } -// -// protected function tearDown(): void -// { -// $this->server->stop(); -// } + protected function setUp(): void + { + $this->server = new MockWebServer(); + $this->server->stop(); + $this->server->start(); + } + + protected function tearDown(): void + { + $this->server->stop(); + } public function testResolveInDocument() { @@ -82,7 +83,7 @@ public function testResolveInDocument() $this->assertInstanceOf(Reference::class, $petResponse->content['application/json']->examples['frog']); $this->assertInstanceOf(Reference::class, $openapi->paths->getPath('/pet/1')->get->responses['200']); - $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, 'file:///tmp/openapi.yaml')); + $openapi->resolveReferences(new ReferenceContext($openapi, 'file:///tmp/openapi.yaml')); $this->assertInstanceOf(Schema::class, $refSchema = $petResponse->content['application/json']->schema); $this->assertInstanceOf(Example::class, $refExample = $petResponse->content['application/json']->examples['frog']); @@ -141,7 +142,7 @@ public function testResolveCyclicReferenceInDocument() $this->assertInstanceOf(Reference::class, $response->content['application/json']->examples['frog']); // $this->expectException(\cebe\openapi\exceptions\UnresolvableReferenceException::class); - $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, 'file:///tmp/openapi.yaml')); + $openapi->resolveReferences(new ReferenceContext($openapi, 'file:///tmp/openapi.yaml')); $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Pet']->properties['id']->items); $this->assertInstanceOf(Schema::class, $refSchema = $response->content['application/json']->schema); @@ -176,7 +177,7 @@ public function testResolveFile() $this->assertInstanceOf(Reference::class, $petItems = $openapi->components->schemas['Pet']); $this->assertInstanceOf(Reference::class, $petItems = $openapi->components->schemas['Dog']); - $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, $file)); + $openapi->resolveReferences(new ReferenceContext($openapi, $file)); $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Pet']); $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Dog']); @@ -205,7 +206,7 @@ public function testResolveFileInSubdir() $this->assertInstanceOf(Reference::class, $openapi->components->schemas['Dog']); $this->assertInstanceOf(Reference::class, $openapi->components->parameters['Parameter.PetId']); - $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, $file)); + $openapi->resolveReferences(new ReferenceContext($openapi, $file)); $this->assertInstanceOf(Schema::class, $openapi->components->schemas['Pet']); $this->assertInstanceOf(Schema::class, $openapi->components->schemas['Dog']); @@ -247,69 +248,69 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() $this->assertTrue($result); } -// public function testResolveFileHttp() -// { -// $this->server->setResponseOfPath( -// '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/definitions.yaml', -// ' -//Pet: -// type: object -// properties: -// id: -// type: integer -// format: int64 -//Dog: -// type: object -// properties: -// name: -// type: string -//' -// ); -// -// $this->server->setResponseOfPath( -// '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', -// ' -//openapi: 3.0.0 -//info: -// title: Link Example -// version: 1.0.0 -//components: -// schemas: -// Pet: -// $ref: definitions.yaml#/Pet -// Dog: -// $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog -//paths: -// \'/pet\': -// get: -// responses: -// 200: -// description: return a pet -//' -// ); -// -// // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; -// -// $host = $this->server->getHost().':'.$this->server->getPort(); -// $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; -// $file = 'http://'.$host.$path; -// /** @var $openapi OpenApi */ -// $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); -// -// $result = $openapi->validate(); -// $this->assertEquals([], $openapi->getErrors()); -// $this->assertTrue($result); -// -// $this->assertInstanceOf(Reference::class, $petItems = $openapi->components->schemas['Pet']); -// $this->assertInstanceOf(Reference::class, $petItems = $openapi->components->schemas['Dog']); -// -// $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, $file)); -// -// $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Pet']); -// $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Dog']); -// $this->assertArrayHasKey('id', $openapi->components->schemas['Pet']->properties); -// $this->assertArrayHasKey('name', $openapi->components->schemas['Dog']->properties); -// } + public function testResolveFileHttp() + { + $this->server->setResponseOfPath( + '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/definitions.yaml', + ' +Pet: + type: object + properties: + id: + type: integer + format: int64 +Dog: + type: object + properties: + name: + type: string +' + ); + + $this->server->setResponseOfPath( + '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', + ' +openapi: 3.0.0 +info: + title: Link Example + version: 1.0.0 +components: + schemas: + Pet: + $ref: definitions.yaml#/Pet + Dog: + $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog +paths: + \'/pet\': + get: + responses: + 200: + description: return a pet +' + ); + + // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; + + $host = $this->server->getHost() . ':' . $this->server->getPort(); + $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; + $file = 'http://' . $host . $path; + /** @var $openapi OpenApi */ + $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); + + $result = $openapi->validate(); + $this->assertEquals([], $openapi->getErrors()); + $this->assertTrue($result); + + $this->assertInstanceOf(Reference::class, $petItems = $openapi->components->schemas['Pet']); + $this->assertInstanceOf(Reference::class, $petItems = $openapi->components->schemas['Dog']); + + $openapi->resolveReferences(new ReferenceContext($openapi, $file)); + + $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Pet']); + $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Dog']); + $this->assertArrayHasKey('id', $openapi->components->schemas['Pet']->properties); + $this->assertArrayHasKey('name', $openapi->components->schemas['Dog']->properties); + } public function testResolvePaths() { @@ -371,7 +372,7 @@ enum: YAML; $openapi = Reader::readFromYaml($schema); - $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, $this->createFileUri(__DIR__ . '/data/reference/definitions.yaml'))); + $openapi->resolveReferences(new ReferenceContext($openapi, $this->createFileUri(__DIR__ . '/data/reference/definitions.yaml'))); $this->assertTrue(isset($openapi->components->schemas['Pet'])); $this->assertEquals(['One', 'Two'], $openapi->components->schemas['Pet']->properties['typeA']->enum); @@ -413,7 +414,7 @@ public function testTransitiveReference() YAML; $openapi = Reader::readFromYaml($schema); - $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, 'file:///tmp/openapi.yaml')); + $openapi->resolveReferences(new ReferenceContext($openapi, 'file:///tmp/openapi.yaml')); $this->assertTrue(isset($openapi->components->schemas['City'])); $this->assertTrue(isset($openapi->components->schemas['Named'])); @@ -452,7 +453,7 @@ public function testTransitiveReferenceToFile() YAML; $openapi = Reader::readFromYaml($schema); - $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, $this->createFileUri(__DIR__ . '/data/reference/definitions.yaml'))); + $openapi->resolveReferences(new ReferenceContext($openapi, $this->createFileUri(__DIR__ . '/data/reference/definitions.yaml'))); $this->assertTrue(isset($openapi->components->schemas['Dog'])); $this->assertEquals('object', $openapi->components->schemas['Dog']->type); @@ -490,12 +491,12 @@ public function testTransitiveReferenceCyclic() $this->expectException(\cebe\openapi\exceptions\UnresolvableReferenceException::class); $this->expectExceptionMessage('Cyclic reference detected on a Reference Object.'); - $openapi->resolveReferences(new \cebe\openapi\ReferenceContext($openapi, 'file:///tmp/openapi.yaml')); + $openapi->resolveReferences(new ReferenceContext($openapi, 'file:///tmp/openapi.yaml')); } public function testTransitiveReferenceOverTwoFiles() { - $openapi = Reader::readFromYamlFile(__DIR__ . '/data/reference/structure.yaml', OpenApi::class, \cebe\openapi\ReferenceContext::RESOLVE_MODE_INLINE); + $openapi = Reader::readFromYamlFile(__DIR__ . '/data/reference/structure.yaml', OpenApi::class, ReferenceContext::RESOLVE_MODE_INLINE); $yaml = \cebe\openapi\Writer::writeToYaml($openapi); @@ -530,7 +531,7 @@ public function testTransitiveReferenceOverTwoFiles() public function testReferencedCommonParamsInReferencedPath() { - $openapi = Reader::readFromYamlFile(__DIR__ . '/data/reference/ReferencedCommonParamsInReferencedPath.yml', OpenApi::class, \cebe\openapi\ReferenceContext::RESOLVE_MODE_INLINE); + $openapi = Reader::readFromYamlFile(__DIR__ . '/data/reference/ReferencedCommonParamsInReferencedPath.yml', OpenApi::class, ReferenceContext::RESOLVE_MODE_INLINE); $yaml = \cebe\openapi\Writer::writeToYaml($openapi); $expected = << Date: Mon, 25 Aug 2025 16:22:13 +0530 Subject: [PATCH 12/28] Attempt 2 --- .github/workflows/php.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 5876c4ce..f35f9d1e 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -79,12 +79,12 @@ jobs: coverage: pcov tools: composer:v2 - # Fix for Windows: enable sockets if missing for package donatj/mock-webserver (https://github.com/cebe/php-openapi/issues/236) + # Fix for Windows: enable sockets if missing for package donatj/mock-webserver - name: Enable sockets on Windows if: runner.os == 'Windows' run: | - echo "extension=sockets" | Out-File -Append "C:\tools\php\php.ini" - php -m | findstr sockets || (echo "sockets not enabled" && exit 1) + echo "extension=sockets" >> /c/tools/php/php.ini + php -m | grep -q sockets || { echo "sockets not enabled"; exit 1; } - name: Require specific symfony/yaml version run: "composer require symfony/yaml:'${{ matrix.symfony-yaml }}' --no-interaction --ansi --no-install" From 2d58a222ff6d72b400302e3d4d2753c8e26d4f40 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Mon, 25 Aug 2025 17:48:21 +0530 Subject: [PATCH 13/28] Attempt 3 --- .github/workflows/php.yml | 14 ++++++-------- tests/spec/ReferenceTest.php | 5 +++++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index f35f9d1e..0f51d30d 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -64,11 +64,6 @@ jobs: runs-on: ${{ matrix.os }} - defaults: - run: - shell: bash - - steps: - uses: actions/checkout@v2 @@ -79,12 +74,12 @@ jobs: coverage: pcov tools: composer:v2 - # Fix for Windows: enable sockets if missing for package donatj/mock-webserver + # Fix for Windows: enable sockets if missing for package donatj/mock-webserver (https://github.com/cebe/php-openapi/issues/236) - name: Enable sockets on Windows if: runner.os == 'Windows' run: | - echo "extension=sockets" >> /c/tools/php/php.ini - php -m | grep -q sockets || { echo "sockets not enabled"; exit 1; } + echo "extension=sockets" | Out-File -Append "C:\tools\php\php.ini" + php -m | findstr sockets || (echo "sockets not enabled" && exit 1) - name: Require specific symfony/yaml version run: "composer require symfony/yaml:'${{ matrix.symfony-yaml }}' --no-interaction --ansi --no-install" @@ -101,6 +96,9 @@ jobs: - name: Validate test data run: make lint +# - name: Add host to known_hosts +# run: ssh-keyscan -H 192.168.1.10 | Out-File -Append -Encoding ASCII $env:USERPROFILE\.ssh\known_hosts + - name: PHPUnit tests run: make test diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index ee3e4707..f61ad323 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -24,6 +24,11 @@ protected function setUp(): void $this->server = new MockWebServer(); $this->server->stop(); $this->server->start(); + + if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { +// echo "Running on Windows\n"; + exec('ssh-keyscan -H '.$this->server->getHost().' | Out-File -Append -Encoding ASCII $env:USERPROFILE\.ssh\known_hosts'); + } } protected function tearDown(): void From 52372c7596cac6ff0f7f9ad219033feaa7414707 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Mon, 25 Aug 2025 19:03:29 +0530 Subject: [PATCH 14/28] Replace mockwebserver lib with custom implemention for Windows support --- tests/data/issue/236/base.yaml | 17 ++++ tests/data/issue/236/definitions.yaml | 12 +++ tests/spec/ReferenceTest.php | 134 +++++++++++++++----------- 3 files changed, 107 insertions(+), 56 deletions(-) create mode 100644 tests/data/issue/236/base.yaml create mode 100644 tests/data/issue/236/definitions.yaml diff --git a/tests/data/issue/236/base.yaml b/tests/data/issue/236/base.yaml new file mode 100644 index 00000000..f60a79f5 --- /dev/null +++ b/tests/data/issue/236/base.yaml @@ -0,0 +1,17 @@ + +openapi: 3.0.0 +info: + title: Link Example + version: 1.0.0 +components: + schemas: + Pet: + $ref: definitions.yaml#/Pet + Dog: + $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog +paths: + '/pet': + get: + responses: + 200: + description: return a pet diff --git a/tests/data/issue/236/definitions.yaml b/tests/data/issue/236/definitions.yaml new file mode 100644 index 00000000..d490632f --- /dev/null +++ b/tests/data/issue/236/definitions.yaml @@ -0,0 +1,12 @@ + +Pet: + type: object + properties: + id: + type: integer + format: int64 +Dog: + type: object + properties: + name: + type: string diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index f61ad323..32695fd4 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -19,22 +19,22 @@ class ReferenceTest extends \PHPUnit\Framework\TestCase /** @var MockWebServer */ private $server; - protected function setUp(): void - { - $this->server = new MockWebServer(); - $this->server->stop(); - $this->server->start(); - - if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { -// echo "Running on Windows\n"; - exec('ssh-keyscan -H '.$this->server->getHost().' | Out-File -Append -Encoding ASCII $env:USERPROFILE\.ssh\known_hosts'); - } - } - - protected function tearDown(): void - { - $this->server->stop(); - } +// protected function setUp(): void +// { +// $this->server = new MockWebServer(); +// $this->server->stop(); +// $this->server->start(); +// +// if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { +//// echo "Running on Windows\n"; +// exec('ssh-keyscan -H '.$this->server->getHost().' | Out-File -Append -Encoding ASCII $env:USERPROFILE\.ssh\known_hosts'); +// } +// } +// +// protected function tearDown(): void +// { +// $this->server->stop(); +// } public function testResolveInDocument() { @@ -255,49 +255,21 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() public function testResolveFileHttp() { - $this->server->setResponseOfPath( - '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/definitions.yaml', - ' -Pet: - type: object - properties: - id: - type: integer - format: int64 -Dog: - type: object - properties: - name: - type: string -' - ); + $this->handleMockServer(); +// return; + + + + + - $this->server->setResponseOfPath( - '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', - ' -openapi: 3.0.0 -info: - title: Link Example - version: 1.0.0 -components: - schemas: - Pet: - $ref: definitions.yaml#/Pet - Dog: - $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog -paths: - \'/pet\': - get: - responses: - 200: - description: return a pet -' - ); // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; - $host = $this->server->getHost() . ':' . $this->server->getPort(); - $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; +// $host = $this->server->getHost() . ':' . $this->server->getPort(); + $host = 'localhost:8787'; +// $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; + $path = '/tests/data/issue/236/base.yaml'; $file = 'http://' . $host . $path; /** @var $openapi OpenApi */ $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); @@ -722,5 +694,55 @@ public function testResolveRelativePathAll() } } -} + private function handleMockServer() + { +// $cmd = 'php -S localhost:8787'; +//// $cmd = 'pwd'; +// exec($cmd, $output); +// $this->assertSame(0, $output); +// return; + + +// exec('cd tests/spec'); +// exec('pwd', $op); +// $this->assertNull($op); +// return; + + +// file_put_contents(__DIR__.'/definitions.yaml', ' +//Pet: +// type: object +// properties: +// id: +// type: integer +// format: int64 +//Dog: +// type: object +// properties: +// name: +// type: string +//'); +// +// +// +// file_put_contents(__DIR__.'/base.yaml', ' +//openapi: 3.0.0 +//info: +// title: Link Example +// version: 1.0.0 +//components: +// schemas: +// Pet: +// $ref: definitions.yaml#/Pet +// Dog: +// $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog +//paths: +// \'/pet\': +// get: +// responses: +// 200: +// description: return a pet +//'); + } +} From 241df9f32caa795c0836b24ba243b20ebc1db978 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Tue, 26 Aug 2025 13:20:26 +0530 Subject: [PATCH 15/28] Use `setUpBeforeClass()` --- tests/spec/ReferenceTest.php | 78 +++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 14 deletions(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 32695fd4..34996a2f 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -17,24 +17,30 @@ class ReferenceTest extends \PHPUnit\Framework\TestCase { /** @var MockWebServer */ - private $server; + protected static $server; + + + public static function setUpBeforeClass(): void + { + self::$server = new MockWebServer; + self::$server->start(); -// protected function setUp(): void -// { // $this->server = new MockWebServer(); // $this->server->stop(); // $this->server->start(); // // if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { //// echo "Running on Windows\n"; -// exec('ssh-keyscan -H '.$this->server->getHost().' | Out-File -Append -Encoding ASCII $env:USERPROFILE\.ssh\known_hosts'); +//// exec('ssh-keyscan -H '.$this->server->getHost().' | Out-File -Append -Encoding ASCII $env:USERPROFILE\.ssh\known_hosts'); // } -// } -// -// protected function tearDown(): void -// { + } + + public static function tearDownAfterClass(): void + { // $this->server->stop(); -// } + self::$server->stop(); + + } public function testResolveInDocument() { @@ -255,7 +261,8 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() public function testResolveFileHttp() { - $this->handleMockServer(); + $this->registerPaths(); +// $this->handleMockServer(); // return; @@ -266,10 +273,10 @@ public function testResolveFileHttp() // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; -// $host = $this->server->getHost() . ':' . $this->server->getPort(); - $host = 'localhost:8787'; -// $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; - $path = '/tests/data/issue/236/base.yaml'; + $host = static::$server->getHost() . ':' . static::$server->getPort(); +// $host = 'localhost:8787'; + $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; +// $path = '/tests/data/issue/236/base.yaml'; $file = 'http://' . $host . $path; /** @var $openapi OpenApi */ $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); @@ -745,4 +752,47 @@ private function handleMockServer() //'); } + + private function registerPaths() + { + static::$server->setResponseOfPath( + '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/definitions.yaml', + ' +Pet: + type: object + properties: + id: + type: integer + format: int64 +Dog: + type: object + properties: + name: + type: string +' + ); + + static::$server->setResponseOfPath( + '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', + ' +openapi: 3.0.0 +info: + title: Link Example + version: 1.0.0 +components: + schemas: + Pet: + $ref: definitions.yaml#/Pet + Dog: + $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog +paths: + \'/pet\': + get: + responses: + 200: + description: return a pet +' + ); + + } } From c5fd30e2fa49803f6c9ad679d77733d4fdd9df46 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Tue, 26 Aug 2025 13:49:18 +0530 Subject: [PATCH 16/28] Attempt using nohup/start-process instead of donatj/mock-webserver --- tests/spec/ReferenceTest.php | 145 +++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 68 deletions(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 34996a2f..3b6f916f 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -17,30 +17,30 @@ class ReferenceTest extends \PHPUnit\Framework\TestCase { /** @var MockWebServer */ - protected static $server; +// protected static $server; - public static function setUpBeforeClass(): void - { - self::$server = new MockWebServer; - self::$server->start(); - -// $this->server = new MockWebServer(); -// $this->server->stop(); -// $this->server->start(); +// public static function setUpBeforeClass(): void +// { +// self::$server = new MockWebServer; +// self::$server->start(); // -// if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { -//// echo "Running on Windows\n"; -//// exec('ssh-keyscan -H '.$this->server->getHost().' | Out-File -Append -Encoding ASCII $env:USERPROFILE\.ssh\known_hosts'); -// } - } - - public static function tearDownAfterClass(): void - { -// $this->server->stop(); - self::$server->stop(); - - } +//// $this->server = new MockWebServer(); +//// $this->server->stop(); +//// $this->server->start(); +//// +//// if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { +////// echo "Running on Windows\n"; +////// exec('ssh-keyscan -H '.$this->server->getHost().' | Out-File -Append -Encoding ASCII $env:USERPROFILE\.ssh\known_hosts'); +//// } +// } + +// public static function tearDownAfterClass(): void +// { +//// $this->server->stop(); +// self::$server->stop(); +// +// } public function testResolveInDocument() { @@ -261,7 +261,7 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() public function testResolveFileHttp() { - $this->registerPaths(); +// $this->registerPaths(); // $this->handleMockServer(); // return; @@ -273,10 +273,19 @@ public function testResolveFileHttp() // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; - $host = static::$server->getHost() . ':' . static::$server->getPort(); -// $host = 'localhost:8787'; - $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; -// $path = '/tests/data/issue/236/base.yaml'; + if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { + exec('Start-Process php -S localhost:8787', $op); + } else { + exec('nohup php -S localhost:8787 > /dev/null 2>&1 &', $op); + } + sleep(2); + + +// $this->assertNull($op); +// $host = static::$server->getHost() . ':' . static::$server->getPort(); + $host = 'localhost:8787'; +// $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; + $path = '/tests/data/issue/236/base.yaml'; $file = 'http://' . $host . $path; /** @var $openapi OpenApi */ $openapi = Reader::readFromYaml(str_replace('##ABSOLUTEPATH##', dirname($file), file_get_contents($file))); @@ -753,46 +762,46 @@ private function handleMockServer() } - private function registerPaths() - { - static::$server->setResponseOfPath( - '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/definitions.yaml', - ' -Pet: - type: object - properties: - id: - type: integer - format: int64 -Dog: - type: object - properties: - name: - type: string -' - ); - - static::$server->setResponseOfPath( - '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', - ' -openapi: 3.0.0 -info: - title: Link Example - version: 1.0.0 -components: - schemas: - Pet: - $ref: definitions.yaml#/Pet - Dog: - $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog -paths: - \'/pet\': - get: - responses: - 200: - description: return a pet -' - ); - - } +// private function registerPaths() +// { +// static::$server->setResponseOfPath( +// '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/definitions.yaml', +// ' +//Pet: +// type: object +// properties: +// id: +// type: integer +// format: int64 +//Dog: +// type: object +// properties: +// name: +// type: string +//' +// ); +// +// static::$server->setResponseOfPath( +// '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', +// ' +//openapi: 3.0.0 +//info: +// title: Link Example +// version: 1.0.0 +//components: +// schemas: +// Pet: +// $ref: definitions.yaml#/Pet +// Dog: +// $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog +//paths: +// \'/pet\': +// get: +// responses: +// 200: +// description: return a pet +//' +// ); +// +// } } From 9c8ba08c47dc018a8eb096392be5d016e6dbb301 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Tue, 26 Aug 2025 13:56:19 +0530 Subject: [PATCH 17/28] Fix for windows --- tests/spec/ReferenceTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 3b6f916f..fd5191d2 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -274,7 +274,7 @@ public function testResolveFileHttp() // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { - exec('Start-Process php -S localhost:8787', $op); + exec('start php -S localhost:8787', $op); } else { exec('nohup php -S localhost:8787 > /dev/null 2>&1 &', $op); } From c03bbf5c959d568fd8b5e2647777cddc4764eb5b Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Tue, 26 Aug 2025 14:03:45 +0530 Subject: [PATCH 18/28] Fix for windows - attempt 2 --- tests/spec/ReferenceTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index fd5191d2..3b35246d 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -274,7 +274,7 @@ public function testResolveFileHttp() // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { - exec('start php -S localhost:8787', $op); + exec('pwsh -Command "Start-Process php -ArgumentList \'-S localhost:8787\' -NoNewWindow"', $op); } else { exec('nohup php -S localhost:8787 > /dev/null 2>&1 &', $op); } From 1697bef09c5eab9867d9d153f747f3a029dd9cf1 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Tue, 26 Aug 2025 14:11:05 +0530 Subject: [PATCH 19/28] Fix for windows - attempt 3 --- tests/spec/ReferenceTest.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 3b35246d..7b6f23f1 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -274,7 +274,10 @@ public function testResolveFileHttp() // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { - exec('pwsh -Command "Start-Process php -ArgumentList \'-S localhost:8787\' -NoNewWindow"', $op); +// exec('pwsh -Command "Start-Process php -ArgumentList \'-S localhost:8787\' -NoNewWindow"', $op); + $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S localhost:8787\' -NoNewWindow"'; + popen($cmd, "r"); + } else { exec('nohup php -S localhost:8787 > /dev/null 2>&1 &', $op); } From 40e6da0aeff9a3e10ff3481725afd5dd13c33fc7 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Tue, 26 Aug 2025 14:39:28 +0530 Subject: [PATCH 20/28] Cleanup --- .github/workflows/php.yml | 10 --- Makefile | 2 +- composer.json | 4 +- tests/docker/Dockerfile | 3 - tests/spec/ReferenceTest.php | 140 +---------------------------------- 5 files changed, 3 insertions(+), 156 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 0f51d30d..add9b3d7 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -74,13 +74,6 @@ jobs: coverage: pcov tools: composer:v2 - # Fix for Windows: enable sockets if missing for package donatj/mock-webserver (https://github.com/cebe/php-openapi/issues/236) - - name: Enable sockets on Windows - if: runner.os == 'Windows' - run: | - echo "extension=sockets" | Out-File -Append "C:\tools\php\php.ini" - php -m | findstr sockets || (echo "sockets not enabled" && exit 1) - - name: Require specific symfony/yaml version run: "composer require symfony/yaml:'${{ matrix.symfony-yaml }}' --no-interaction --ansi --no-install" @@ -96,9 +89,6 @@ jobs: - name: Validate test data run: make lint -# - name: Add host to known_hosts -# run: ssh-keyscan -H 192.168.1.10 | Out-File -Append -Encoding ASCII $env:USERPROFILE\.ssh\known_hosts - - name: PHPUnit tests run: make test diff --git a/Makefile b/Makefile index be5f670f..7d9358f0 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ install: composer.json package.json test: unit test-recursion.json test-recursion2.yaml test-recursion3_index.yaml test-empty-maps.json unit: - $(DOCKER_PHP) php -d output_buffering=0 $(PHPARGS) $(XPHPARGS) vendor/bin/phpunit --verbose --colors=always $(TESTCASE) + $(DOCKER_PHP) php $(PHPARGS) $(XPHPARGS) vendor/bin/phpunit --verbose --colors=always $(TESTCASE) # test specific JSON files in tests/spec/data/ # e.g. test-recursion will run validation on tests/spec/data/recursion.json diff --git a/composer.json b/composer.json index 3c659206..3dbff339 100644 --- a/composer.json +++ b/composer.json @@ -24,15 +24,13 @@ "justinrainbow/json-schema": "^5.2 || ^6.0" }, "require-dev": { - "ext-sockets": "*", "cebe/indent": "*", "phpunit/phpunit": "^6.5 || ^7.5 || ^8.5 || ^9.4", "oai/openapi-specification": "3.0.3", "mermade/openapi3-examples": "1.0.0", "apis-guru/openapi-directory": "1.0.0", "nexmo/api-specification": "1.0.0", - "phpstan/phpstan": "^0.12.0 || ^1.9", - "donatj/mock-webserver": "^0.4.0" + "phpstan/phpstan": "^0.12.0 || ^1.9" }, "conflict": { "symfony/yaml": "3.4.0 - 3.4.4 || 4.0.0 - 4.4.17 || 5.0.0 - 5.1.9 || 5.2.0" diff --git a/tests/docker/Dockerfile b/tests/docker/Dockerfile index f740edb6..4dce3b53 100644 --- a/tests/docker/Dockerfile +++ b/tests/docker/Dockerfile @@ -19,13 +19,10 @@ RUN apt-get update && \ curl \ libcurl4-openssl-dev \ libssl-dev \ - procps \ --no-install-recommends && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ && pecl install xdebug-2.9.6 \ - && docker-php-ext-install sockets \ - && docker-php-ext-enable sockets \ && docker-php-ext-enable xdebug \ && docker-php-ext-install \ zip \ diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 7b6f23f1..4e346aa2 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -9,39 +9,12 @@ use cebe\openapi\spec\RequestBody; use cebe\openapi\spec\Response; use cebe\openapi\spec\Schema; -use donatj\MockWebServer\MockWebServer; /** * @covers \cebe\openapi\spec\Reference */ class ReferenceTest extends \PHPUnit\Framework\TestCase { - /** @var MockWebServer */ -// protected static $server; - - -// public static function setUpBeforeClass(): void -// { -// self::$server = new MockWebServer; -// self::$server->start(); -// -//// $this->server = new MockWebServer(); -//// $this->server->stop(); -//// $this->server->start(); -//// -//// if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { -////// echo "Running on Windows\n"; -////// exec('ssh-keyscan -H '.$this->server->getHost().' | Out-File -Append -Encoding ASCII $env:USERPROFILE\.ssh\known_hosts'); -//// } -// } - -// public static function tearDownAfterClass(): void -// { -//// $this->server->stop(); -// self::$server->stop(); -// -// } - public function testResolveInDocument() { /** @var $openapi OpenApi */ @@ -261,33 +234,17 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() public function testResolveFileHttp() { -// $this->registerPaths(); -// $this->handleMockServer(); -// return; - - - - - - - // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; - if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { -// exec('pwsh -Command "Start-Process php -ArgumentList \'-S localhost:8787\' -NoNewWindow"', $op); $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S localhost:8787\' -NoNewWindow"'; popen($cmd, "r"); - } else { exec('nohup php -S localhost:8787 > /dev/null 2>&1 &', $op); } sleep(2); - -// $this->assertNull($op); -// $host = static::$server->getHost() . ':' . static::$server->getPort(); $host = 'localhost:8787'; -// $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; + // $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; $path = '/tests/data/issue/236/base.yaml'; $file = 'http://' . $host . $path; /** @var $openapi OpenApi */ @@ -712,99 +669,4 @@ public function testResolveRelativePathAll() $this->assertEquals($expected, $yaml, $yaml); } } - - private function handleMockServer() - { -// $cmd = 'php -S localhost:8787'; -//// $cmd = 'pwd'; -// exec($cmd, $output); -// $this->assertSame(0, $output); -// return; - - -// exec('cd tests/spec'); -// exec('pwd', $op); -// $this->assertNull($op); -// return; - - -// file_put_contents(__DIR__.'/definitions.yaml', ' -//Pet: -// type: object -// properties: -// id: -// type: integer -// format: int64 -//Dog: -// type: object -// properties: -// name: -// type: string -//'); -// -// -// -// file_put_contents(__DIR__.'/base.yaml', ' -//openapi: 3.0.0 -//info: -// title: Link Example -// version: 1.0.0 -//components: -// schemas: -// Pet: -// $ref: definitions.yaml#/Pet -// Dog: -// $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog -//paths: -// \'/pet\': -// get: -// responses: -// 200: -// description: return a pet -//'); - - } - -// private function registerPaths() -// { -// static::$server->setResponseOfPath( -// '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/definitions.yaml', -// ' -//Pet: -// type: object -// properties: -// id: -// type: integer -// format: int64 -//Dog: -// type: object -// properties: -// name: -// type: string -//' -// ); -// -// static::$server->setResponseOfPath( -// '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml', -// ' -//openapi: 3.0.0 -//info: -// title: Link Example -// version: 1.0.0 -//components: -// schemas: -// Pet: -// $ref: definitions.yaml#/Pet -// Dog: -// $ref: ##ABSOLUTEPATH##/definitions.yaml#/Dog -//paths: -// \'/pet\': -// get: -// responses: -// 200: -// description: return a pet -//' -// ); -// -// } } From 0f69e6b1e6bff91bc2bd4a573c8c956b7c49b59a Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Tue, 26 Aug 2025 16:53:39 +0530 Subject: [PATCH 21/28] Polish --- tests/spec/ReferenceTest.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 4e346aa2..26d36b41 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -234,16 +234,16 @@ public function testResolveFileInSubdirWithMultipleRelativePaths() public function testResolveFileHttp() { + $host = 'localhost:8787'; # create mock web server to avoid calling real GitHub URL and rate limit hit // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { - $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S localhost:8787\' -NoNewWindow"'; - popen($cmd, "r"); + $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow"'; + $res = popen($cmd, "r"); } else { - exec('nohup php -S localhost:8787 > /dev/null 2>&1 &', $op); + exec('nohup php -S '.$host.' > /dev/null 2>&1 &'); } sleep(2); - $host = 'localhost:8787'; // $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; $path = '/tests/data/issue/236/base.yaml'; $file = 'http://' . $host . $path; @@ -263,6 +263,10 @@ public function testResolveFileHttp() $this->assertInstanceOf(Schema::class, $petItems = $openapi->components->schemas['Dog']); $this->assertArrayHasKey('id', $openapi->components->schemas['Pet']->properties); $this->assertArrayHasKey('name', $openapi->components->schemas['Dog']->properties); + + if (isset($res) && is_resource($petItems)) { + pclose($res); + } } public function testResolvePaths() From 0c1fdb396a0592b4257f1834623f7452c15166e6 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 28 Aug 2025 18:02:02 +0530 Subject: [PATCH 22/28] Discard redundant stdout messages --- tests/spec/ReferenceTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 26d36b41..50bb8e9d 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -237,7 +237,7 @@ public function testResolveFileHttp() $host = 'localhost:8787'; # create mock web server to avoid calling real GitHub URL and rate limit hit // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { - $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow"'; + $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow -RedirectStandardOutput $null"'; $res = popen($cmd, "r"); } else { exec('nohup php -S '.$host.' > /dev/null 2>&1 &'); From ad507a5852fb851b8ca0f50cb83039d7c1c975ee Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 28 Aug 2025 18:03:03 +0530 Subject: [PATCH 23/28] Add comment --- tests/spec/ReferenceTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 50bb8e9d..c047936f 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -242,6 +242,7 @@ public function testResolveFileHttp() } else { exec('nohup php -S '.$host.' > /dev/null 2>&1 &'); } + // ENH: turn off the server sleep(2); // $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; From 7c62d7dd1e0d931415c76fe75368accca9f28a22 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 28 Aug 2025 18:08:21 +0530 Subject: [PATCH 24/28] Discard redundant stdout messages - attempt 2 --- tests/spec/ReferenceTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index c047936f..287de0b8 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -237,7 +237,7 @@ public function testResolveFileHttp() $host = 'localhost:8787'; # create mock web server to avoid calling real GitHub URL and rate limit hit // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { - $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow -RedirectStandardOutput $null"'; + $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow -RedirectStandardOutput \'NUL\'"'; $res = popen($cmd, "r"); } else { exec('nohup php -S '.$host.' > /dev/null 2>&1 &'); From d5c690a21bed8c63dfdd6bb44d7e3e128a5c409c Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 28 Aug 2025 18:16:13 +0530 Subject: [PATCH 25/28] Discard redundant stdout messages - attempt 3 --- tests/spec/ReferenceTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 287de0b8..1eb8cc92 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -237,7 +237,8 @@ public function testResolveFileHttp() $host = 'localhost:8787'; # create mock web server to avoid calling real GitHub URL and rate limit hit // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { - $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow -RedirectStandardOutput \'NUL\'"'; +// $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow -RedirectStandardOutput \'NUL\'"'; + $cmd = 'powershell -Command "php -S localhost:8787 *> NUL 2>&1 &"'; $res = popen($cmd, "r"); } else { exec('nohup php -S '.$host.' > /dev/null 2>&1 &'); From b91e163cf14590dfb5f2f5234fc53350a4980acd Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 28 Aug 2025 18:21:12 +0530 Subject: [PATCH 26/28] Discard redundant stdout messages - attempt 4 --- tests/spec/ReferenceTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 1eb8cc92..6f31f97b 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -238,7 +238,7 @@ public function testResolveFileHttp() // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { // $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow -RedirectStandardOutput \'NUL\'"'; - $cmd = 'powershell -Command "php -S localhost:8787 *> NUL 2>&1 &"'; + $cmd = 'powershell -Command "Start-Job { php -S localhost:8787 *> NUL: 2>&1 }"'; $res = popen($cmd, "r"); } else { exec('nohup php -S '.$host.' > /dev/null 2>&1 &'); From cad33f0bb1eb523f0fce4bc682bfa99fd3787ad9 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 28 Aug 2025 18:25:36 +0530 Subject: [PATCH 27/28] Discard redundant stdout messages - attempt 5 --- tests/spec/ReferenceTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 6f31f97b..49e02743 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -238,7 +238,9 @@ public function testResolveFileHttp() // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { // $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow -RedirectStandardOutput \'NUL\'"'; - $cmd = 'powershell -Command "Start-Job { php -S localhost:8787 *> NUL: 2>&1 }"'; + $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S localhost:8787\' -WindowStyle Hidden -RedirectStandardOutput \'NUL:\'"'; + + $res = popen($cmd, "r"); } else { exec('nohup php -S '.$host.' > /dev/null 2>&1 &'); From c91f9a57a934163f2eb6860f3eb0a5212940fa3f Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 28 Aug 2025 18:30:20 +0530 Subject: [PATCH 28/28] Revert --- tests/spec/ReferenceTest.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/spec/ReferenceTest.php b/tests/spec/ReferenceTest.php index 49e02743..6b74b317 100644 --- a/tests/spec/ReferenceTest.php +++ b/tests/spec/ReferenceTest.php @@ -237,15 +237,13 @@ public function testResolveFileHttp() $host = 'localhost:8787'; # create mock web server to avoid calling real GitHub URL and rate limit hit // $file = 'https://raw.githubusercontent.com/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml'; if (stripos(PHP_OS_FAMILY, 'Windows') !== false) { -// $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow -RedirectStandardOutput \'NUL\'"'; - $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S localhost:8787\' -WindowStyle Hidden -RedirectStandardOutput \'NUL:\'"'; - - + $cmd = 'powershell -Command "Start-Process php -ArgumentList \'-S '.$host.'\' -NoNewWindow"'; $res = popen($cmd, "r"); } else { exec('nohup php -S '.$host.' > /dev/null 2>&1 &'); } // ENH: turn off the server + // ENH: avoid displaying stdout in CI while starting the server sleep(2); // $path = '/cebe/php-openapi/290389bbd337cf4d70ecedfd3a3d886715e19552/tests/spec/data/reference/base.yaml';