In this last lesson, we will have another test for Quizzes form.
As always we need a factory.
php artisan make:factory QuizFactory
database/factories/QuizFactory.php:
use Illuminate\Support\Str; class QuizFactory extends Factory{ public function definition(): array { $title = $this->faker->sentence(); $slug = Str::slug($title); return [ 'title' => $title, 'slug' => $slug, 'description' => fake()->paragraph(), 'published' => false, 'public' => false, ]; }}
And the feature test.
php artisan make:test Livewire/QuizzesTest
tests/Feature/Livewire/QuizzesTest.php:
use App\Models\User;use App\Models\Quiz;use Livewire\Livewire;use App\Models\Question;use App\Livewire\Quiz\QuizForm;use Illuminate\Foundation\Testing\RefreshDatabase; class QuizzesTest extends TestCase{ use RefreshDatabase; public function testAdminCanCreateQuiz() { $this->actingAs(User::factory()->admin()->create()); Livewire::test(QuizForm::class) ->set('title', 'quiz title') ->call('save') ->assertHasNoErrors(['title', 'slug', 'description', 'published', 'public', 'questions']) ->assertRedirect(route('quizzes')); $this->assertDatabaseHas('quizzes', [ 'title' => 'quiz title', ]); } public function testTitleIsRequired() { $this->actingAs(User::factory()->admin()->create()); Livewire::test(QuizForm::class) ->set('title', '') ->call('save') ->assertHasErrors(['title' => 'required']); } public function testAdminCanEditQuiz() { $this->actingAs(User::factory()->admin()->create()); $quiz = Quiz::factory() ->has(Question::factory()) ->create(); Livewire::test(QuizForm::class, [$quiz]) ->set('title', 'new quiz') ->set('published', true) ->call('save') ->assertSet('published', true) ->assertHasNoErrors(['title', 'slug', 'description', 'published', 'public', 'questions']); $this->assertDatabaseHas('quizzes', [ 'title' => 'new quiz', 'published' => true, ]); }}
These tests are very similar to the Questions. For the quiz edit, we also check if setting published
to true is correct.