Files
alrahma_sunday_school/tests/app/Controllers/View/PaymentControllerRegressionTest.php
T
2026-06-01 02:08:27 -04:00

139 lines
3.5 KiB
PHP

<?php
namespace App\Controllers\View {
if (!function_exists(__NAMESPACE__ . '\view')) {
function view($name, array $data = [], $options = [])
{
return ['view' => $name, 'data' => $data, 'options' => $options];
}
}
}
namespace Tests\App\Controllers\View {
use App\Controllers\View\PaymentController;
use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\Test\CIUnitTestCase;
class PaymentRequestStub
{
public function __construct(
private string $method = 'get',
private array $post = [],
private $file = null
) {
}
public function getMethod(): string
{
return $this->method;
}
public function getPost(?string $key = null)
{
if ($key === null) {
return $this->post;
}
return $this->post[$key] ?? null;
}
public function getFile(string $name)
{
return $name === 'proof' ? $this->file : null;
}
}
class ManualPaymentModelSpy
{
public array $inserted = [];
public function insert(array $data)
{
$this->inserted[] = $data;
return true;
}
}
class AttachmentServiceStub
{
public function __construct(private ?string $path = null)
{
}
public function saveUploadedFile($file, string $subdir): ?string
{
return $this->path;
}
}
class TestablePaymentController extends PaymentController
{
public function __construct()
{
}
public function setRequestObject($request): self
{
$this->request = $request;
return $this;
}
public function setManualPaymentModel($model): self
{
$this->manualPaymentModel = $model;
return $this;
}
public function setAttachmentService($service): self
{
$this->financialAttachmentService = $service;
return $this;
}
}
class PaymentControllerRegressionTest extends CIUnitTestCase
{
public function testRedirectPageSendsUsersBackToInvoicePaymentWithInfoMessage(): void
{
$controller = new TestablePaymentController();
$response = $controller->redirectPage();
$this->assertInstanceOf(RedirectResponse::class, $response);
$this->assertStringContainsString('parent/invoice_payment', $response->getHeaderLine('Location'));
}
public function testManualGetReturnsManualPaymentView(): void
{
$controller = (new TestablePaymentController())
->setRequestObject(new PaymentRequestStub('get'));
$result = $controller->manual();
$this->assertSame('payment/manual_payment', $result['view']);
}
public function testManualPostStoresProofPathFromAttachmentService(): void
{
$model = new ManualPaymentModelSpy();
$controller = (new TestablePaymentController())
->setManualPaymentModel($model)
->setAttachmentService(new AttachmentServiceStub('proofs/check-123.pdf'))
->setRequestObject(new PaymentRequestStub('post', [
'invoice_number' => 'INV-001',
'amount' => '125.00',
'payment_method' => 'check',
'reference' => 'CHK123',
], new \stdClass()));
$response = $controller->manual();
$this->assertInstanceOf(RedirectResponse::class, $response);
$this->assertCount(1, $model->inserted);
$this->assertSame('proofs/check-123.pdf', $model->inserted[0]['proof_path']);
$this->assertSame('INV-001', $model->inserted[0]['invoice_number']);
}
}
}