'create faq', 'guard_name' => 'web']); Permission::create(['name' => 'update faq', 'guard_name' => 'web']); Permission::create(['name' => 'delete faq', 'guard_name' => 'web']); // Create role and assign permissions $role = Role::create(['name' => 'Admin', 'guard_name' => 'web']); $role->givePermissionTo(['create faq', 'update faq', 'delete faq']); // Create admin user $this->adminUser = User::factory()->create(); $this->adminUser->assignRole('Admin'); }); it('renders page successfully', function () { Livewire::actingAs($this->adminUser) ->test(Faq::class) ->assertOk() ->assertSet('method', 'create') ->assertSet('modalTitle', '') ->assertSee('FAQs'); }); it('has title attribute', function () { $component = new Faq; $reflection = new \ReflectionClass($component); $attributes = $reflection->getAttributes(\Livewire\Attributes\Title::class); expect($attributes)->not->toBeEmpty(); }); it('opens modal for create', function () { Livewire::actingAs($this->adminUser) ->test(Faq::class) ->call('openModal', 'create', 'Tambah FAQs') ->assertSet('method', 'create') ->assertSet('modalTitle', 'Tambah FAQs') ->assertSet('form.question', '') ->assertSet('form.answer', ''); }); it('opens modal for update', function () { $faq = FaqModel::factory()->create([ 'question' => 'Test Question', 'answer' => 'Test Answer', ]); Livewire::actingAs($this->adminUser) ->test(Faq::class) ->call('openModal', 'update', 'Ubah FAQs', $faq->hash) ->assertSet('method', 'update') ->assertSet('modalTitle', 'Ubah FAQs') ->assertSet('form.question', 'Test Question') ->assertSet('form.answer', 'Test Answer'); }); it('creates faq successfully', function () { Livewire::actingAs($this->adminUser) ->test(Faq::class) ->set('form.question', 'What is Laravel?') ->set('form.answer', 'Laravel is a PHP framework.') ->call('create') ->assertDispatched('refreshDatatable'); $this->assertDatabaseHas('faqs', [ 'question' => 'What is Laravel?', 'answer' => 'Laravel is a PHP framework.', 'sort_order' => 1, ]); }); it('requires permission to create faq', function () { $userWithoutPermission = User::factory()->create(); Livewire::actingAs($userWithoutPermission) ->test(Faq::class) ->set('form.question', 'Test Question') ->set('form.answer', 'Test Answer') ->call('create') ->assertForbidden(); }); it('updates faq successfully', function () { $faq = FaqModel::factory()->create([ 'question' => 'Old Question', 'answer' => 'Old Answer', ]); Livewire::actingAs($this->adminUser) ->test(Faq::class) ->call('openModal', 'update', 'Ubah FAQs', $faq->hash) ->set('form.question', 'Updated Question') ->set('form.answer', 'Updated Answer') ->call('update') ->assertDispatched('refreshDatatable'); $this->assertDatabaseHas('faqs', [ 'id' => $faq->id, 'question' => 'Updated Question', 'answer' => 'Updated Answer', ]); }); it('requires permission to update faq', function () { $faq = FaqModel::factory()->create(); $userWithoutPermission = User::factory()->create(); Livewire::actingAs($userWithoutPermission) ->test(Faq::class) ->call('openModal', 'update', 'Ubah FAQs', $faq->hash) ->set('form.question', 'Updated Question') ->set('form.answer', 'Updated Answer') ->call('update') ->assertForbidden(); }); it('deletes faq successfully', function () { $faq = FaqModel::factory()->create(); Livewire::actingAs($this->adminUser) ->test(Faq::class) ->call('delete', $faq) ->assertDispatched('refreshDatatable'); expect($faq->trashed())->toBeTrue(); }); it('sorts order up', function () { $faq1 = FaqModel::factory()->create(['sort_order' => 1]); $faq2 = FaqModel::factory()->create(['sort_order' => 2]); Livewire::actingAs($this->adminUser) ->test(Faq::class) ->call('sortOrder', $faq2, 'up') ->assertDispatched('refreshDatatable'); expect($faq1->fresh()->sort_order)->toBe(2); expect($faq2->fresh()->sort_order)->toBe(1); }); it('sorts order down', function () { $faq1 = FaqModel::factory()->create(['sort_order' => 1]); $faq2 = FaqModel::factory()->create(['sort_order' => 2]); Livewire::actingAs($this->adminUser) ->test(Faq::class) ->call('sortOrder', $faq1, 'down') ->assertDispatched('refreshDatatable'); expect($faq1->fresh()->sort_order)->toBe(2); expect($faq2->fresh()->sort_order)->toBe(1); }); it('requires permission to sort order', function () { $faq = FaqModel::factory()->create(); $userWithoutPermission = User::factory()->create(); Livewire::actingAs($userWithoutPermission) ->test(Faq::class) ->call('sortOrder', $faq, 'up') ->assertForbidden(); }); it('displays validation errors', function () { Livewire::actingAs($this->adminUser) ->test(Faq::class) ->set('form.question', '') // Empty question ->set('form.answer', '') // Empty answer ->call('create') ->assertHasErrors(['form.question', 'form.answer']); }); it('opens modal correctly', function () { $faq = FaqModel::factory()->create(); Livewire::actingAs($this->adminUser) ->test(Faq::class) ->call('openModal', 'create', 'Tambah FAQs') ->assertSet('method', 'create') ->assertSet('modalTitle', 'Tambah FAQs'); });