109 lines
5.0 KiB
PHP
109 lines
5.0 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
namespace Tests\Feature;
|
|||
|
|
|
|||
|
|
use App\Models\Client;
|
|||
|
|
use App\Models\Product;
|
|||
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|||
|
|
use Tests\TestCase;
|
|||
|
|
|
|||
|
|
class ValidationTp5Test extends TestCase
|
|||
|
|
{
|
|||
|
|
use RefreshDatabase;
|
|||
|
|
|
|||
|
|
public function test_client_creation_rejects_invalid_values_and_keeps_old_input(): void
|
|||
|
|
{
|
|||
|
|
$this->from(route('clients.create'))->post(route('clients.store'), [
|
|||
|
|
'name' => '',
|
|||
|
|
'email' => 'bonjour',
|
|||
|
|
'city' => 'Paris',
|
|||
|
|
])->assertRedirect(route('clients.create'))
|
|||
|
|
->assertSessionHasErrors(['name', 'email'])
|
|||
|
|
->assertSessionHasInput('city', 'Paris');
|
|||
|
|
|
|||
|
|
$this->followingRedirects()->from(route('clients.create'))->post(route('clients.store'), [
|
|||
|
|
'name' => '',
|
|||
|
|
'email' => 'bonjour',
|
|||
|
|
'city' => 'Paris',
|
|||
|
|
])
|
|||
|
|
->assertSee('Le nom du client est obligatoire.')
|
|||
|
|
->assertSee('L’adresse e-mail n’est pas valide.')
|
|||
|
|
->assertSee('value="Paris"', false);
|
|||
|
|
|
|||
|
|
$this->assertDatabaseCount('clients', 0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function test_client_limits_optional_fields_and_update_validation(): void
|
|||
|
|
{
|
|||
|
|
$valid = ['name' => 'Jean Dupont', 'email' => 'jean@example.test'];
|
|||
|
|
$this->post(route('clients.store'), $valid)->assertRedirect(route('clients.index'));
|
|||
|
|
$client = Client::firstOrFail();
|
|||
|
|
$this->assertNull($client->city);
|
|||
|
|
$this->assertNull($client->phone);
|
|||
|
|
$this->get(route('clients.index'))->assertOk()->assertSee('Jean Dupont');
|
|||
|
|
|
|||
|
|
$this->post(route('clients.store'), [...$valid, 'name' => str_repeat('A', 101), 'email' => 'autre@example.test'])
|
|||
|
|
->assertSessionHasErrors('name');
|
|||
|
|
$this->post(route('clients.store'), [...$valid, 'email' => 'autre@example.test', 'phone' => str_repeat('1', 21)])
|
|||
|
|
->assertSessionHasErrors('phone');
|
|||
|
|
$this->post(route('clients.store'), [...$valid, 'email' => 'autre@example.test', 'city' => str_repeat('V', 101)])
|
|||
|
|
->assertSessionHasErrors('city');
|
|||
|
|
$this->post(route('clients.store'), $valid)->assertSessionHasErrors('email');
|
|||
|
|
$this->post(route('clients.store'), ['name' => 'Autre', 'email' => ''])
|
|||
|
|
->assertSessionHasErrors('email');
|
|||
|
|
|
|||
|
|
$this->put(route('clients.update', $client), ['name' => '', 'email' => 'incorrect'])
|
|||
|
|
->assertSessionHasErrors(['name', 'email']);
|
|||
|
|
$this->assertDatabaseHas('clients', ['id' => $client->id, 'name' => 'Jean Dupont']);
|
|||
|
|
|
|||
|
|
$this->put(route('clients.update', $client), [
|
|||
|
|
'name' => 'Jean Dupont',
|
|||
|
|
'email' => 'jean@example.test',
|
|||
|
|
'phone' => '01 02 03 04 05',
|
|||
|
|
'city' => 'Paris',
|
|||
|
|
])->assertRedirect(route('clients.index'));
|
|||
|
|
$this->assertDatabaseHas('clients', ['id' => $client->id, 'phone' => '01 02 03 04 05', 'city' => 'Paris']);
|
|||
|
|
|
|||
|
|
// Le sujet demande une chaîne facultative, sans règle de chiffres uniquement.
|
|||
|
|
$this->put(route('clients.update', $client), [
|
|||
|
|
'name' => 'Jean Dupont',
|
|||
|
|
'email' => 'jean@example.test',
|
|||
|
|
'phone' => 'poste ABC',
|
|||
|
|
'city' => '',
|
|||
|
|
])->assertRedirect(route('clients.index'));
|
|||
|
|
$this->assertDatabaseHas('clients', ['id' => $client->id, 'phone' => 'poste ABC', 'city' => null]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function test_product_creation_and_update_reject_invalid_values(): void
|
|||
|
|
{
|
|||
|
|
foreach ([
|
|||
|
|
['name' => '', 'price' => 15, 'stock' => 10, 'field' => 'name'],
|
|||
|
|
['name' => 'Clavier', 'price' => -10, 'stock' => 10, 'field' => 'price'],
|
|||
|
|
['name' => 'Clavier', 'price' => 15, 'stock' => -5, 'field' => 'stock'],
|
|||
|
|
['name' => 'Clavier', 'price' => 'quinze', 'stock' => 'dix', 'field' => 'price'],
|
|||
|
|
['name' => str_repeat('C', 151), 'price' => 15, 'stock' => 10, 'field' => 'name'],
|
|||
|
|
] as $case) {
|
|||
|
|
$field = $case['field'];
|
|||
|
|
unset($case['field']);
|
|||
|
|
$this->post(route('products.store'), $case)->assertSessionHasErrors($field);
|
|||
|
|
}
|
|||
|
|
$this->assertDatabaseCount('products', 0);
|
|||
|
|
$this->post(route('products.store'), ['name' => 'Clavier', 'price' => 'quinze', 'stock' => 'dix'])
|
|||
|
|
->assertSessionHasErrors(['price', 'stock']);
|
|||
|
|
|
|||
|
|
$this->post(route('products.store'), ['name' => 'Clavier', 'price' => 15.50, 'stock' => 10])
|
|||
|
|
->assertRedirect(route('products.index'));
|
|||
|
|
$product = Product::firstOrFail();
|
|||
|
|
$this->assertEquals(15.50, $product->price);
|
|||
|
|
|
|||
|
|
$this->put(route('products.update', $product), ['name' => 'Clavier', 'price' => -1, 'stock' => 10])
|
|||
|
|
->assertSessionHasErrors('price');
|
|||
|
|
$this->assertDatabaseHas('products', ['id' => $product->id, 'stock' => 10]);
|
|||
|
|
|
|||
|
|
$this->followingRedirects()->from(route('products.edit', $product))
|
|||
|
|
->put(route('products.update', $product), ['name' => 'Clavier', 'price' => -1, 'stock' => 10])
|
|||
|
|
->assertSee('Le prix doit être supérieur ou égal à zéro.')
|
|||
|
|
->assertSee('value="-1"', false);
|
|||
|
|
}
|
|||
|
|
}
|