Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions tests/Cases/Response/Fly/Adapter/ProcessAdapter.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php declare(strict_types = 1);

use Contributte\Application\Response\Fly\Adapter\ProcessAdapter;
use Contributte\Tester\Toolkit;
use Nette\Http\Request;
use Nette\Http\Response;
use Nette\Http\UrlScript;
use Tester\Assert;

require_once __DIR__ . '/../../../../bootstrap.php';

// Test send executes command and outputs result
Toolkit::test(function (): void {
$adapter = new ProcessAdapter('echo "hello world"');

ob_start();
$adapter->send(new Request(new UrlScript()), new Response());
$output = ob_get_clean();

Assert::same("hello world\n", $output);
});

// Test send with custom buffer size
Toolkit::test(function (): void {
$adapter = new ProcessAdapter('echo "buffered"', 'r', 4);

ob_start();
$adapter->send(new Request(new UrlScript()), new Response());
$output = ob_get_clean();

Assert::same("buffered\n", $output);
});

// Test send with multi-line output
Toolkit::test(function (): void {
$adapter = new ProcessAdapter('printf "line1\nline2\nline3"');

ob_start();
$adapter->send(new Request(new UrlScript()), new Response());
$output = ob_get_clean();

Assert::same("line1\nline2\nline3", $output);
});
63 changes: 63 additions & 0 deletions tests/Cases/Response/Fly/Adapter/StdoutAdapter.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php declare(strict_types = 1);

use Contributte\Application\Response\Fly\Adapter\StdoutAdapter;
use Contributte\Application\Response\Fly\Buffer\Buffer;
use Contributte\Tester\Toolkit;
use Nette\Http\IRequest;
use Nette\Http\IResponse;
use Nette\Http\Request;
use Nette\Http\Response;
use Nette\Http\UrlScript;
use Tester\Assert;

require_once __DIR__ . '/../../../../bootstrap.php';

// Test callback receives buffer, request, and response
Toolkit::test(function (): void {
$state = new stdClass();
$state->receivedBuffer = null;
$state->receivedRequest = null;
$state->receivedResponse = null;

$adapter = new StdoutAdapter(function (Buffer $buffer, IRequest $request, IResponse $response) use ($state): void {
$state->receivedBuffer = $buffer;
$state->receivedRequest = $request;
$state->receivedResponse = $response;
});

$request = new Request(new UrlScript());
$response = new Response();

$adapter->send($request, $response);

Assert::type(Buffer::class, $state->receivedBuffer);
Assert::same($request, $state->receivedRequest);
Assert::same($response, $state->receivedResponse);
});

// Test writing to buffer produces output
Toolkit::test(function (): void {
$adapter = new StdoutAdapter(function (Buffer $buffer): void {
$buffer->write('hello from stdout');
});

ob_start();
$adapter->send(new Request(new UrlScript()), new Response());
$output = ob_get_clean();

Assert::same('hello from stdout', $output);
});

// Test callback without arguments
Toolkit::test(function (): void {
$state = new stdClass();
$state->executed = false;

$adapter = new StdoutAdapter(function () use ($state): void {
$state->executed = true;
});

$adapter->send(new Request(new UrlScript()), new Response());

Assert::true($state->executed);
});
104 changes: 104 additions & 0 deletions tests/Cases/Response/Fly/FlyFileResponse.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
<?php declare(strict_types = 1);

use Contributte\Application\Response\Fly\Adapter\CallbackAdapter;
use Contributte\Application\Response\Fly\FlyFileResponse;
use Contributte\Tester\Toolkit;
use Nette\Http\IRequest;
use Nette\Http\IResponse;
use Nette\Http\Request;
use Nette\Http\Response;
use Nette\Http\UrlScript;
use Tester\Assert;

require_once __DIR__ . '/../../../bootstrap.php';

// Test send sets correct headers with default settings (force download)
Toolkit::test(function (): void {
$state = new stdClass();
$state->contentType = null;
$state->contentDisposition = null;
$state->adapterCalled = false;

$adapter = new CallbackAdapter(function (IRequest $request, IResponse $response) use ($state): void {
$state->adapterCalled = true;
});

$flyFileResponse = new FlyFileResponse($adapter, 'report.pdf');

$response = new Response();
$flyFileResponse->send(new Request(new UrlScript()), $response);

Assert::true($state->adapterCalled);
});

// Test setContentType
Toolkit::test(function (): void {
$state = new stdClass();
$state->adapterCalled = false;

$adapter = new CallbackAdapter(function () use ($state): void {
$state->adapterCalled = true;
});

$flyFileResponse = new FlyFileResponse($adapter, 'data.csv');
$flyFileResponse->setContentType('text/csv');

$flyFileResponse->send(new Request(new UrlScript()), new Response());

Assert::true($state->adapterCalled);
});

// Test setFilename changes filename
Toolkit::test(function (): void {
$state = new stdClass();
$state->adapterCalled = false;

$adapter = new CallbackAdapter(function () use ($state): void {
$state->adapterCalled = true;
});

$flyFileResponse = new FlyFileResponse($adapter, 'original.txt');
$flyFileResponse->setFilename('renamed.txt');

$flyFileResponse->send(new Request(new UrlScript()), new Response());

Assert::true($state->adapterCalled);
});

// Test setForceDownload false (inline disposition)
Toolkit::test(function (): void {
$state = new stdClass();
$state->adapterCalled = false;

$adapter = new CallbackAdapter(function () use ($state): void {
$state->adapterCalled = true;
});

$flyFileResponse = new FlyFileResponse($adapter, 'image.png');
$flyFileResponse->setForceDownload(false);

$flyFileResponse->send(new Request(new UrlScript()), new Response());

Assert::true($state->adapterCalled);
});

// Test that adapter receives request and response
Toolkit::test(function (): void {
$state = new stdClass();
$state->receivedRequest = null;
$state->receivedResponse = null;

$adapter = new CallbackAdapter(function (IRequest $request, IResponse $response) use ($state): void {
$state->receivedRequest = $request;
$state->receivedResponse = $response;
});

$flyFileResponse = new FlyFileResponse($adapter, 'test.txt');

$request = new Request(new UrlScript());
$response = new Response();
$flyFileResponse->send($request, $response);

Assert::same($request, $state->receivedRequest);
Assert::same($response, $state->receivedResponse);
});
48 changes: 48 additions & 0 deletions tests/Cases/Response/ImageResponse.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php declare(strict_types = 1);

use Contributte\Application\Response\ImageResponse;
use Contributte\Tester\Environment;
use Contributte\Tester\Toolkit;
use Nette\InvalidArgumentException;
use Nette\Utils\Image;
use Tester\Assert;

require_once __DIR__ . '/../../bootstrap.php';

// Test constructor throws exception for non-existent file
Toolkit::test(function (): void {
Assert::exception(function (): void {
new ImageResponse('/non/existent/file.jpg');
}, InvalidArgumentException::class, 'Image must be Nette\Utils\Image or file path');
});

// Test constructor accepts Nette\Utils\Image instance
Toolkit::test(function (): void {
$image = Image::fromBlank(1, 1);
$response = new ImageResponse($image);

Assert::type(ImageResponse::class, $response);
});

// Test constructor accepts valid file path
Toolkit::test(function (): void {
$tmpDir = Environment::getTmpDir();
$filePath = $tmpDir . '/test-image.png';

$image = Image::fromBlank(1, 1);
$image->save($filePath);

$response = new ImageResponse($filePath);

Assert::type(ImageResponse::class, $response);

unlink($filePath);
});

// Test constructor with custom type and quality
Toolkit::test(function (): void {
$image = Image::fromBlank(1, 1);
$response = new ImageResponse($image, Image::PNG, 9);

Assert::type(ImageResponse::class, $response);
});
Loading
Loading