test(request): cover exception-based validation failures
This commit is contained in:
138
tests/Unit/RequestTest.php
Normal file
138
tests/Unit/RequestTest.php
Normal file
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use Exception;
|
||||
use Libs\Request;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* RequestTest - DuckBrain test harness
|
||||
*
|
||||
* Cubre el modelo de fallo por excepcion del Request: la validacion lanza
|
||||
* con code 422 y el mensaje unico de Validator::message() (con overrides de
|
||||
* messages()/attributes()), en lugar de responder HTTP y hacer exit() como
|
||||
* hacia antes. Que estas pruebas puedan ejecutar expectException ya demuestra
|
||||
* que el constructor no termina el proceso.
|
||||
*/
|
||||
final class RequestTest extends TestCase
|
||||
{
|
||||
private array $serverBackup = [];
|
||||
private array $getBackup = [];
|
||||
private array $postBackup = [];
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->serverBackup = $_SERVER;
|
||||
$this->getBackup = $_GET;
|
||||
$this->postBackup = $_POST;
|
||||
|
||||
$_SERVER['REQUEST_METHOD'] = 'GET';
|
||||
$_SERVER['REQUEST_URI'] = '/test';
|
||||
$_SERVER['DOCUMENT_ROOT'] = '/nonexistent-docroot';
|
||||
unset($_SERVER['CONTENT_TYPE'], $_SERVER['HTTP_ACCEPT']);
|
||||
$_GET = [];
|
||||
$_POST = [];
|
||||
}
|
||||
|
||||
protected function tearDown(): void
|
||||
{
|
||||
$_SERVER = $this->serverBackup;
|
||||
$_GET = $this->getBackup;
|
||||
$_POST = $this->postBackup;
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function failedValidationThrowsWithHttp422Code(): void
|
||||
{
|
||||
$_SERVER['REQUEST_METHOD'] = 'POST';
|
||||
$_POST = ['age' => '5'];
|
||||
|
||||
$this->expectException(Exception::class);
|
||||
$this->expectExceptionMessage('The age must be at least 18.');
|
||||
$this->expectExceptionCode(422);
|
||||
|
||||
new class extends Request {
|
||||
public function rules(): array
|
||||
{
|
||||
return ['age' => 'required|min:18'];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function messagesOverrideWinsForFailedRule(): void
|
||||
{
|
||||
$_SERVER['REQUEST_METHOD'] = 'POST';
|
||||
$_POST = ['age' => '5'];
|
||||
|
||||
$this->expectException(Exception::class);
|
||||
$this->expectExceptionMessage('Way too short');
|
||||
|
||||
new class extends Request {
|
||||
public function rules(): array
|
||||
{
|
||||
return ['age' => 'required|min:18'];
|
||||
}
|
||||
|
||||
public function messages(): array
|
||||
{
|
||||
return ['age.min' => 'Way too short'];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function attributesRenameTheFieldInDefaultMessage(): void
|
||||
{
|
||||
$_SERVER['REQUEST_METHOD'] = 'POST';
|
||||
$_POST = ['age' => '5'];
|
||||
|
||||
$this->expectException(Exception::class);
|
||||
$this->expectExceptionMessage('The applicant age must be at least 18.');
|
||||
|
||||
new class extends Request {
|
||||
public function rules(): array
|
||||
{
|
||||
return ['age' => 'required|min:18'];
|
||||
}
|
||||
|
||||
public function attributes(): array
|
||||
{
|
||||
return ['age' => 'applicant age'];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function getRulesFailureThrowsToo(): void
|
||||
{
|
||||
$this->expectException(Exception::class);
|
||||
$this->expectExceptionMessage('The q field is required.');
|
||||
|
||||
new class extends Request {
|
||||
public function getRules(): array
|
||||
{
|
||||
return ['q' => 'required'];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function validDataDoesNotThrow(): void
|
||||
{
|
||||
$_SERVER['REQUEST_METHOD'] = 'POST';
|
||||
$_POST = ['age' => '20'];
|
||||
|
||||
$request = new class extends Request {
|
||||
public function rules(): array
|
||||
{
|
||||
return ['age' => 'required|min:18'];
|
||||
}
|
||||
};
|
||||
|
||||
$this->assertSame('20', $request->post->age);
|
||||
$this->assertSame('/test', $request->path);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user