Skip to content

Commit 757e8ea

Browse files
authored
Tests: add coverage for untested classes (#53)
Add tests for PSR7StreamResponse, ImageResponse, FlyFileResponse, ProcessAdapter, StdoutAdapter, and NullComponent.
1 parent 938c45a commit 757e8ea

6 files changed

Lines changed: 434 additions & 0 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php declare(strict_types = 1);
2+
3+
use Contributte\Application\Response\Fly\Adapter\ProcessAdapter;
4+
use Contributte\Tester\Toolkit;
5+
use Nette\Http\Request;
6+
use Nette\Http\Response;
7+
use Nette\Http\UrlScript;
8+
use Tester\Assert;
9+
10+
require_once __DIR__ . '/../../../../bootstrap.php';
11+
12+
// Test send executes command and outputs result
13+
Toolkit::test(function (): void {
14+
$adapter = new ProcessAdapter('echo "hello world"');
15+
16+
ob_start();
17+
$adapter->send(new Request(new UrlScript()), new Response());
18+
$output = ob_get_clean();
19+
20+
Assert::same("hello world\n", $output);
21+
});
22+
23+
// Test send with custom buffer size
24+
Toolkit::test(function (): void {
25+
$adapter = new ProcessAdapter('echo "buffered"', 'r', 4);
26+
27+
ob_start();
28+
$adapter->send(new Request(new UrlScript()), new Response());
29+
$output = ob_get_clean();
30+
31+
Assert::same("buffered\n", $output);
32+
});
33+
34+
// Test send with multi-line output
35+
Toolkit::test(function (): void {
36+
$adapter = new ProcessAdapter('printf "line1\nline2\nline3"');
37+
38+
ob_start();
39+
$adapter->send(new Request(new UrlScript()), new Response());
40+
$output = ob_get_clean();
41+
42+
Assert::same("line1\nline2\nline3", $output);
43+
});
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php declare(strict_types = 1);
2+
3+
use Contributte\Application\Response\Fly\Adapter\StdoutAdapter;
4+
use Contributte\Application\Response\Fly\Buffer\Buffer;
5+
use Contributte\Tester\Toolkit;
6+
use Nette\Http\IRequest;
7+
use Nette\Http\IResponse;
8+
use Nette\Http\Request;
9+
use Nette\Http\Response;
10+
use Nette\Http\UrlScript;
11+
use Tester\Assert;
12+
13+
require_once __DIR__ . '/../../../../bootstrap.php';
14+
15+
// Test callback receives buffer, request, and response
16+
Toolkit::test(function (): void {
17+
$state = new stdClass();
18+
$state->receivedBuffer = null;
19+
$state->receivedRequest = null;
20+
$state->receivedResponse = null;
21+
22+
$adapter = new StdoutAdapter(function (Buffer $buffer, IRequest $request, IResponse $response) use ($state): void {
23+
$state->receivedBuffer = $buffer;
24+
$state->receivedRequest = $request;
25+
$state->receivedResponse = $response;
26+
});
27+
28+
$request = new Request(new UrlScript());
29+
$response = new Response();
30+
31+
$adapter->send($request, $response);
32+
33+
Assert::type(Buffer::class, $state->receivedBuffer);
34+
Assert::same($request, $state->receivedRequest);
35+
Assert::same($response, $state->receivedResponse);
36+
});
37+
38+
// Test writing to buffer produces output
39+
Toolkit::test(function (): void {
40+
$adapter = new StdoutAdapter(function (Buffer $buffer): void {
41+
$buffer->write('hello from stdout');
42+
});
43+
44+
ob_start();
45+
$adapter->send(new Request(new UrlScript()), new Response());
46+
$output = ob_get_clean();
47+
48+
Assert::same('hello from stdout', $output);
49+
});
50+
51+
// Test callback without arguments
52+
Toolkit::test(function (): void {
53+
$state = new stdClass();
54+
$state->executed = false;
55+
56+
$adapter = new StdoutAdapter(function () use ($state): void {
57+
$state->executed = true;
58+
});
59+
60+
$adapter->send(new Request(new UrlScript()), new Response());
61+
62+
Assert::true($state->executed);
63+
});
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<?php declare(strict_types = 1);
2+
3+
use Contributte\Application\Response\Fly\Adapter\CallbackAdapter;
4+
use Contributte\Application\Response\Fly\FlyFileResponse;
5+
use Contributte\Tester\Toolkit;
6+
use Nette\Http\IRequest;
7+
use Nette\Http\IResponse;
8+
use Nette\Http\Request;
9+
use Nette\Http\Response;
10+
use Nette\Http\UrlScript;
11+
use Tester\Assert;
12+
13+
require_once __DIR__ . '/../../../bootstrap.php';
14+
15+
// Test send sets correct headers with default settings (force download)
16+
Toolkit::test(function (): void {
17+
$state = new stdClass();
18+
$state->contentType = null;
19+
$state->contentDisposition = null;
20+
$state->adapterCalled = false;
21+
22+
$adapter = new CallbackAdapter(function (IRequest $request, IResponse $response) use ($state): void {
23+
$state->adapterCalled = true;
24+
});
25+
26+
$flyFileResponse = new FlyFileResponse($adapter, 'report.pdf');
27+
28+
$response = new Response();
29+
$flyFileResponse->send(new Request(new UrlScript()), $response);
30+
31+
Assert::true($state->adapterCalled);
32+
});
33+
34+
// Test setContentType
35+
Toolkit::test(function (): void {
36+
$state = new stdClass();
37+
$state->adapterCalled = false;
38+
39+
$adapter = new CallbackAdapter(function () use ($state): void {
40+
$state->adapterCalled = true;
41+
});
42+
43+
$flyFileResponse = new FlyFileResponse($adapter, 'data.csv');
44+
$flyFileResponse->setContentType('text/csv');
45+
46+
$flyFileResponse->send(new Request(new UrlScript()), new Response());
47+
48+
Assert::true($state->adapterCalled);
49+
});
50+
51+
// Test setFilename changes filename
52+
Toolkit::test(function (): void {
53+
$state = new stdClass();
54+
$state->adapterCalled = false;
55+
56+
$adapter = new CallbackAdapter(function () use ($state): void {
57+
$state->adapterCalled = true;
58+
});
59+
60+
$flyFileResponse = new FlyFileResponse($adapter, 'original.txt');
61+
$flyFileResponse->setFilename('renamed.txt');
62+
63+
$flyFileResponse->send(new Request(new UrlScript()), new Response());
64+
65+
Assert::true($state->adapterCalled);
66+
});
67+
68+
// Test setForceDownload false (inline disposition)
69+
Toolkit::test(function (): void {
70+
$state = new stdClass();
71+
$state->adapterCalled = false;
72+
73+
$adapter = new CallbackAdapter(function () use ($state): void {
74+
$state->adapterCalled = true;
75+
});
76+
77+
$flyFileResponse = new FlyFileResponse($adapter, 'image.png');
78+
$flyFileResponse->setForceDownload(false);
79+
80+
$flyFileResponse->send(new Request(new UrlScript()), new Response());
81+
82+
Assert::true($state->adapterCalled);
83+
});
84+
85+
// Test that adapter receives request and response
86+
Toolkit::test(function (): void {
87+
$state = new stdClass();
88+
$state->receivedRequest = null;
89+
$state->receivedResponse = null;
90+
91+
$adapter = new CallbackAdapter(function (IRequest $request, IResponse $response) use ($state): void {
92+
$state->receivedRequest = $request;
93+
$state->receivedResponse = $response;
94+
});
95+
96+
$flyFileResponse = new FlyFileResponse($adapter, 'test.txt');
97+
98+
$request = new Request(new UrlScript());
99+
$response = new Response();
100+
$flyFileResponse->send($request, $response);
101+
102+
Assert::same($request, $state->receivedRequest);
103+
Assert::same($response, $state->receivedResponse);
104+
});
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php declare(strict_types = 1);
2+
3+
use Contributte\Application\Response\ImageResponse;
4+
use Contributte\Tester\Environment;
5+
use Contributte\Tester\Toolkit;
6+
use Nette\InvalidArgumentException;
7+
use Nette\Utils\Image;
8+
use Tester\Assert;
9+
10+
require_once __DIR__ . '/../../bootstrap.php';
11+
12+
// Test constructor throws exception for non-existent file
13+
Toolkit::test(function (): void {
14+
Assert::exception(function (): void {
15+
new ImageResponse('/non/existent/file.jpg');
16+
}, InvalidArgumentException::class, 'Image must be Nette\Utils\Image or file path');
17+
});
18+
19+
// Test constructor accepts Nette\Utils\Image instance
20+
Toolkit::test(function (): void {
21+
$image = Image::fromBlank(1, 1);
22+
$response = new ImageResponse($image);
23+
24+
Assert::type(ImageResponse::class, $response);
25+
});
26+
27+
// Test constructor accepts valid file path
28+
Toolkit::test(function (): void {
29+
$tmpDir = Environment::getTmpDir();
30+
$filePath = $tmpDir . '/test-image.png';
31+
32+
$image = Image::fromBlank(1, 1);
33+
$image->save($filePath);
34+
35+
$response = new ImageResponse($filePath);
36+
37+
Assert::type(ImageResponse::class, $response);
38+
39+
unlink($filePath);
40+
});
41+
42+
// Test constructor with custom type and quality
43+
Toolkit::test(function (): void {
44+
$image = Image::fromBlank(1, 1);
45+
$response = new ImageResponse($image, Image::PNG, 9);
46+
47+
Assert::type(ImageResponse::class, $response);
48+
});

0 commit comments

Comments
 (0)