139 lines
3.5 KiB
PHP
139 lines
3.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Unit;
|
|
|
|
use App\Http\Requests\LoginRequest;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use PHPUnit\Framework\Attributes\DataProvider;
|
|
use PHPUnit\Framework\Attributes\Test;
|
|
use Tests\TestCase;
|
|
|
|
class LoginRequestTest extends TestCase
|
|
{
|
|
|
|
private LoginRequest $request;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
$this->request = new LoginRequest();
|
|
}
|
|
|
|
#[Test]
|
|
public function it_validates_correctly(): void
|
|
{
|
|
$data = [
|
|
'email' => 'test@example.com',
|
|
'password' => 'password123',
|
|
];
|
|
|
|
$validator = Validator::make($data, $this->request->rules());
|
|
|
|
$this->assertTrue($validator->passes());
|
|
}
|
|
|
|
#[Test]
|
|
#[DataProvider('invalidEmailProvider')]
|
|
public function it_rejects_invalid_emails(string $invalidEmail): void
|
|
{
|
|
$data = [
|
|
'email' => $invalidEmail,
|
|
'password' => 'password123',
|
|
];
|
|
|
|
$validator = Validator::make($data, $this->request->rules());
|
|
|
|
$this->assertFalse($validator->passes());
|
|
$this->assertTrue($validator->errors()->has('email'));
|
|
}
|
|
|
|
public static function invalidEmailProvider(): array
|
|
{
|
|
return [
|
|
['invalid-email'],
|
|
['invalid@'],
|
|
['@example.com'],
|
|
['invalid@.com'],
|
|
[''],
|
|
];
|
|
}
|
|
|
|
#[Test]
|
|
#[DataProvider('validEmailProvider')]
|
|
public function it_accepts_valid_emails(string $validEmail): void
|
|
{
|
|
$data = [
|
|
'email' => $validEmail,
|
|
'password' => 'password123',
|
|
];
|
|
|
|
$validator = Validator::make($data, $this->request->rules());
|
|
|
|
$this->assertTrue(
|
|
$validator->passes(),
|
|
"Email '$validEmail' should be valid"
|
|
);
|
|
}
|
|
|
|
public static function validEmailProvider(): array
|
|
{
|
|
return [
|
|
['user@example.com'],
|
|
['user.name@example.com'],
|
|
['user+tag@example.com'],
|
|
['user@sub.example.com'],
|
|
['user@example.co.uk'],
|
|
['user123@example.io'],
|
|
];
|
|
}
|
|
|
|
#[Test]
|
|
public function it_requires_email_and_password(): void
|
|
{
|
|
$validator = Validator::make([], $this->request->rules(), $this->request->messages());
|
|
|
|
$this->assertFalse($validator->passes());
|
|
$this->assertTrue($validator->errors()->has('email'));
|
|
$this->assertTrue($validator->errors()->has('password'));
|
|
|
|
$this->assertEquals('Email is required', $validator->errors()->first('email'));
|
|
$this->assertEquals('Password is required', $validator->errors()->first('password'));
|
|
}
|
|
|
|
#[Test]
|
|
public function it_enforces_email_max_length(): void
|
|
{
|
|
$longEmail = str_repeat('a', 256).'@example.com';
|
|
|
|
$data = [
|
|
'email' => $longEmail,
|
|
'password' => 'password123',
|
|
];
|
|
|
|
$validator = Validator::make($data, $this->request->rules());
|
|
|
|
$this->assertFalse($validator->passes());
|
|
$this->assertTrue($validator->errors()->has('email'));
|
|
}
|
|
|
|
#[Test]
|
|
public function it_allows_email_at_max_length(): void
|
|
{
|
|
$maxEmail = str_repeat('a', 240).'@example.com';
|
|
|
|
$data = [
|
|
'email' => $maxEmail,
|
|
'password' => 'password123',
|
|
];
|
|
|
|
$validator = Validator::make($data, $this->request->rules());
|
|
|
|
$this->assertTrue(
|
|
$validator->passes(),
|
|
'Email at max length should be valid'
|
|
);
|
|
}
|
|
}
|