I like to use a providers to test validation rules.
/**
* @test
* @dataProvider storeValidationProvider
* @param $fieldValue
* @param $field
*/
public function store_validation_tests($field, $fieldValue)
{
$book = Book::factory()->make([
$field => $fieldValue
]);
$response = $this->post('/books', $book->toArray());
$response->assertStatus(302);
$response->assertSessionHasErrorsIn($field);
}
public function storeValidationProvider()
{
return [
'the title is required' => ['title', ''],
'part must be numeric' => ['part', 'One'],
'format_id is required' => ['format_id', ''],
'format_id must exist in formats' => ['format_id', 100],
'genre_id is required' => ['genre_id', ''],
'genre_id must exist in genres' => ['genre_id', 100],
'isbn is required' => ['isbn', ''],
'invalid isbn10 cant be stored' => ['isbn', '123456789'],
'invalid isbn13 cant be stored' => ['isbn', '9771234567890'],
'released is required' => ['released', ''],
'pages is required' => ['pages', ''],
'pages must be numeric' => ['pages', 'Ten'],
'blurb is required' => ['blurb', ''],
'released cant be earlier than 1800' => ['released', 1799],
'released cant be later than current year + 1' => ['released', Carbon::now()->addYear(2)->year],
'reprinted cant be earlier than 1800' => ['reprinted', 1799],
'reprinted cant be later than current year + 1' => ['reprinted', Carbon::now()->addYear(2)->year]
];
}