From 7d82ad3015ae0d53d66c6f7507c02272d708c1f1 Mon Sep 17 00:00:00 2001 From: Timm Friebe Date: Sun, 2 Jun 2024 13:42:31 +0200 Subject: [PATCH] Fix `echo 0;` (or 0.0, or "0") not triggering the development console --- ChangeLog.md | 2 + src/main/php/xp/web/dev/Console.class.php | 5 +- .../web/unittest/server/ConsoleTest.class.php | 134 ++++++++++++++++++ 3 files changed, 139 insertions(+), 2 deletions(-) create mode 100755 src/test/php/web/unittest/server/ConsoleTest.class.php diff --git a/ChangeLog.md b/ChangeLog.md index 2fddfe82..1bfe3598 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -3,6 +3,8 @@ Web change log ## ?.?.? / ????-??-?? +* Fixed `echo 0;` (or 0.0, or "0") not triggering the development console + (@thekid) * Fixed trace data not appearing in logfile in development mode - @thekid * Merged PR #115: Add `web.Headers::qfactors()`, which can be used when implementing content negotiation diff --git a/src/main/php/xp/web/dev/Console.class.php b/src/main/php/xp/web/dev/Console.class.php index 6af58813..1d9beeb4 100755 --- a/src/main/php/xp/web/dev/Console.class.php +++ b/src/main/php/xp/web/dev/Console.class.php @@ -8,7 +8,8 @@ * inside an easily readable format above the real output, using a 200 * HTTP response status. * - * @see php://ob_start + * @see https://www.php.net/ob_start + * @test web.unittest.server.ConsoleTest */ class Console implements Filter { private $template; @@ -56,7 +57,7 @@ public function filter($req, $res, $invocation) { $res->trace= $buffer->trace; $out= $buffer->output(); - if (empty($debug)) { + if (0 === strlen($debug)) { $out->drain($res); } else { $res->status(200, 'Debug'); diff --git a/src/test/php/web/unittest/server/ConsoleTest.class.php b/src/test/php/web/unittest/server/ConsoleTest.class.php new file mode 100755 index 00000000..4c81f8ef --- /dev/null +++ b/src/test/php/web/unittest/server/ConsoleTest.class.php @@ -0,0 +1,134 @@ +handle($req, $res) ?? [] as $_) { } + return $res; + } + + #[Test] + public function can_create() { + new Console(); + } + + #[Test] + public function send() { + $res= $this->handle(function($req, $res) { + $res->send('Test', 'text/plain; charset=utf-8'); + }); + + Assert::equals( + "HTTP/1.1 200 OK\r\n". + "Content-Type: text/plain; charset=utf-8\r\n". + "Content-Length: 4\r\n". + "\r\n". + "Test", + $res->output()->bytes() + ); + } + + #[Test] + public function stream() { + $res= $this->handle(function($req, $res) { + $res->header('Content-Type', 'text/plain; charset=utf-8'); + $stream= $res->stream(); + $stream->write('Test'); + $stream->close(); + }); + + Assert::equals( + "HTTP/1.1 200 OK\r\n". + "Content-Type: text/plain; charset=utf-8\r\n". + "Transfer-Encoding: chunked\r\n". + "\r\n". + "4\r\nTest\r\n0\r\n\r\n", + $res->output()->bytes() + ); + } + + #[Test] + public function empty_echo_does_not_trigger() { + $res= $this->handle(function($req, $res) { + echo ''; + $res->send('Test', 'text/plain; charset=utf-8'); + }); + + Assert::equals( + "HTTP/1.1 200 OK\r\n". + "Content-Type: text/plain; charset=utf-8\r\n". + "Content-Length: 4\r\n". + "\r\n". + "Test", + $res->output()->bytes() + ); + } + + #[Test, Values(['true', '0', 0, 0.0])] + public function echo_output_appears_in_console($arg) { + $res= $this->handle(function($req, $res) use($arg) { + echo $arg; + $res->send('Test', 'text/plain; charset=utf-8'); + }); + + Assert::matches( + '/
'.(string)$arg.'<\/pre>/',
+      $res->output()->bytes()
+    );
+  }
+
+  #[Test]
+  public function var_dump_output_appears_in_console() {
+    $res= $this->handle(function($req, $res) {
+      var_dump($req->param('test'));
+      $res->send('Test', 'text/plain; charset=utf-8');
+    });
+
+    Assert::matches(
+      '/
string\(4\) "true"\n<\/pre>/',
+      $res->output()->bytes()
+    );
+  }
+
+  #[Test]
+  public function status_appears_in_console() {
+    $res= $this->handle(function($req, $res) {
+      echo 'Test';
+      $res->answer(204);
+    });
+
+    Assert::matches(
+      '/HTTP\/1.1 204 No Content<\/span>/',
+      $res->output()->bytes()
+    );
+  }
+
+  #[Test]
+  public function headers_appear_in_console() {
+    $res= $this->handle(function($req, $res) {
+      echo $req->param('test');
+      $res->send('Test', 'text/plain; charset=utf-8');
+    });
+
+    Assert::matches(
+      '/Content-Type<\/td>.*text\/plain; charset=utf-8<\/td>/s',
+      $res->output()->bytes()
+    );
+  }
+}
\ No newline at end of file