Files
alrahma_sunday_school/tests/app/Controllers/Api/FilesControllerTest.php
T
2026-02-10 22:11:06 -05:00

142 lines
3.9 KiB
PHP

<?php
namespace Tests\App\Controllers\Api;
use App\Controllers\Api\FilesController;
use CodeIgniter\HTTP\IncomingRequest;
use CodeIgniter\HTTP\URI;
use CodeIgniter\HTTP\UserAgent;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\Mock\MockIncomingRequest;
use Config\App;
use Config\Services;
class FakeFilesRequest extends MockIncomingRequest
{
public function __construct(private readonly array $gets = [])
{
parent::__construct(config(App::class), new URI('https://test.alrahmaisgl.org'), 'php://input', new UserAgent());
}
public function getGet($key = null, $filter = null, $default = null)
{
if ($key === null) {
return $this->gets;
}
return $this->gets[$key] ?? $default;
}
}
class FakeStreamResponse
{
public array $headers = [];
public string $body = '';
public function setHeader(string $key, string $value)
{
$this->headers[$key] = $value;
return $this;
}
public function setBody(string $body)
{
$this->body = $body;
return $this;
}
}
class TestableFilesController extends FilesController
{
protected function respond($data = null, ?int $status = null, string $message = '')
{
$payload = $data;
if (is_array($data) && isset($data['message'])) {
$message = $data['message'] ?? $message;
$payload = $data['data'] ?? $data;
}
return [
'status' => true,
'message' => $message,
'data' => $payload,
'code' => $status,
];
}
protected function error(string $message = 'An error occurred', int $code = 400, ?array $errors = null)
{
$payload = ['status' => false, 'message' => $message, 'code' => $code];
if (!empty($errors)) {
$payload['errors'] = $errors;
}
return $payload;
}
}
class FilesControllerTest extends CIUnitTestCase
{
private TestableFilesController $controller;
protected function setUp(): void
{
parent::setUp();
Services::resetSingle('session');
$this->controller = new TestableFilesController();
$response = new FakeStreamResponse();
self::setPrivateProperty($this->controller, 'response', $response);
}
public function testReceiptRejectsInvalidFilename()
{
$response = $this->controller->receipt('../secret.txt');
$this->assertFalse($response['status']);
$this->assertSame(400, $response['code']);
}
public function testReceiptRejectsUnsupportedExtension()
{
$response = $this->controller->receipt('malware.exe');
$this->assertFalse($response['status']);
$this->assertSame(400, $response['code']);
}
public function testReceiptReturnsNotFoundWhenMissing()
{
$response = $this->controller->receipt('missing.pdf');
$this->assertFalse($response['status']);
$this->assertSame(404, $response['code']);
}
public function testIndexRejectsInvalidType()
{
$request = new FakeFilesRequest(['type' => 'avatars']);
$this->controller->setRequest($request);
$response = $this->controller->index();
$this->assertFalse($response['status']);
$this->assertSame(400, $response['code']);
}
public function testIndexReturnsFileList()
{
$request = new FakeFilesRequest(['type' => 'receipts']);
$this->controller->setRequest($request);
$response = $this->controller->index();
$this->assertTrue($response['status']);
$this->assertSame('Files retrieved successfully', $response['message']);
$this->assertSame('receipts', $response['data']['type']);
$this->assertGreaterThanOrEqual(0, $response['data']['count']);
$names = array_column($response['data']['files'], 'name');
$this->assertIsArray($names);
}
}