Skip to content

Commit

Permalink
Fix echo 0; (or 0.0, or "0") not triggering the development console
Browse files Browse the repository at this point in the history
  • Loading branch information
thekid committed Jun 2, 2024
1 parent bc372e5 commit 7d82ad3
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 2 deletions.
2 changes: 2 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions src/main/php/xp/web/dev/Console.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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');
Expand Down
134 changes: 134 additions & 0 deletions src/test/php/web/unittest/server/ConsoleTest.class.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<?php namespace web\unittest\server;

use test\{Assert, Test, Values};
use web\io\{TestInput, TestOutput};
use web\{Filters, Request, Response};
use xp\web\dev\Console;

class ConsoleTest {

/**
* Handles a request with the given headers and handler function,
* returning the response.
*
* @param function(web.Request, web.Response): var $handler
* @return web.Response
*/
private function handle($handler) {
$compress= new Filters([new Console()], $handler);
$req= new Request(new TestInput('GET', '/?test=true'));
$res= new Response(new TestOutput());

foreach ($compress->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(
'/<pre id="output">'.(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(
'/<pre id="output">string\(4\) &quot;true&quot;\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 <span id="status">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(
'/<td class="name">Content-Type<\/td>.*<td class="value">text\/plain; charset=utf-8<\/td>/s',
$res->output()->bytes()
);
}
}

0 comments on commit 7d82ad3

Please sign in to comment.