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

143 lines
3.9 KiB
PHP

<?php
namespace Tests\App\Controllers\Api;
use App\Controllers\Api\ContactController;
use App\Controllers\View\EmailController;
use CodeIgniter\Test\CIUnitTestCase;
use Config\Services;
class FakeJsonRequest
{
public function __construct(private readonly ?array $payload)
{
}
public function getJSON(bool $assoc = false): ?array
{
return $this->payload;
}
}
class StubEmailController extends EmailController
{
public function __construct(private readonly bool $result)
{
}
public function sendEmail(
string $recipient,
string $subject,
string $htmlMessage,
?string $profile = null,
?string $replyToEmail = null,
?string $replyToName = null,
array $attachments = []
): bool {
return $this->result;
}
}
class TestableContactController extends ContactController
{
private ?EmailController $emailController = null;
public function __construct()
{
// Skip the parent bootstrap so we control dependencies manually.
}
public function setEmailController(EmailController $emailController): void
{
$this->emailController = $emailController;
}
protected function createEmailController(): EmailController
{
return $this->emailController ?? parent::createEmailController();
}
}
class ContactControllerTest extends CIUnitTestCase
{
private TestableContactController $controller;
protected function setUp(): void
{
parent::setUp();
Services::resetSingle('validation');
$this->controller = new TestableContactController();
}
public function testSubmitReturnsErrorWhenJsonMissing()
{
$this->setRequestPayload(null);
$response = $this->controller->submit();
$this->assertFalse($response['status']);
$this->assertSame(400, $response['code']);
$this->assertSame('Invalid request data', $response['message']);
}
public function testSubmitReturnsValidationErrors()
{
$this->setRequestPayload([
'name' => 'Al',
'email' => 'invalid',
'subject' => 'Hi',
'message' => 'short',
]);
$response = $this->controller->submit();
$this->assertFalse($response['status']);
$this->assertSame(422, $response['code']);
$this->assertSame('Validation failed', $response['message']);
$this->assertArrayHasKey('errors', $response);
$this->assertNotEmpty($response['errors']);
}
public function testSubmitReturnsSuccessWhenEmailSent()
{
$this->controller->setEmailController(new StubEmailController(true));
$this->setRequestPayload($this->validPayload());
$response = $this->controller->submit();
$this->assertTrue($response['status']);
$this->assertSame('Thank you for contacting us! We will get back to you soon.', $response['message']);
$this->assertNull($response['data']);
}
public function testSubmitReturnsErrorWhenEmailFails()
{
$this->controller->setEmailController(new StubEmailController(false));
$this->setRequestPayload($this->validPayload());
$response = $this->controller->submit();
$this->assertFalse($response['status']);
$this->assertSame(500, $response['code']);
$this->assertSame('There was an error sending your message. Please try again later.', $response['message']);
}
private function setRequestPayload(?array $payload): void
{
$request = new FakeJsonRequest($payload);
self::setPrivateProperty($this->controller, 'request', $request);
}
private function validPayload(): array
{
return [
'name' => 'Alia Ahmed',
'email' => 'alia@alrahmaisgl.org',
'subject' => 'Support request',
'message' => str_repeat('Please assist. ', 5),
];
}
}