parfum/tests/Feature/Studio/Information/FaqTest.php

229 lines
6.8 KiB
PHP

<?php
use App\Livewire\Studio\Information\Faq;
use App\Models\Faq as FaqModel;
use Livewire\Livewire;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
beforeEach(function () {
$this->setupUser();
$role = Role::firstOrCreate(['name' => 'Owner']);
Permission::firstOrCreate(['name' => 'view faq']);
Permission::firstOrCreate(['name' => 'create faq']);
Permission::firstOrCreate(['name' => 'update faq']);
Permission::firstOrCreate(['name' => 'delete faq']);
$role->givePermissionTo(['view faq', 'create faq', 'update faq', 'delete faq']);
$this->user->assignRole($role);
});
it('renders the faq page correctly', function () {
$this->actingAs($this->user)
->get(route('studio.information.faq.index'))
->assertOk()
->assertSeeLivewire(Faq::class);
});
it('can open create modal', function () {
Livewire::actingAs($this->user)
->test(Faq::class)
->dispatch('modal:open', method: 'create', modalTitle: 'Tambah FAQ')
->assertSet('method', 'create')
->assertSet('modalTitle', 'Tambah FAQ');
});
it('validates required fields on create', function () {
Livewire::actingAs($this->user)
->test(Faq::class)
->call('create')
->assertHasErrors([
'form.question' => 'required',
'form.answer' => 'required',
]);
});
it('validates question max length', function () {
Livewire::actingAs($this->user)
->test(Faq::class)
->set('form.question', str_repeat('a', 101))
->set('form.answer', 'Jawaban')
->call('create')
->assertHasErrors(['form.question' => 'max']);
});
it('can store a new faq', function () {
Livewire::actingAs($this->user)
->test(Faq::class)
->set('form.question', 'Apa itu FAQ?')
->set('form.answer', 'FAQ adalah Frequently Asked Questions')
->call('create')
->assertHasNoErrors()
->assertDispatched('refreshDatatable');
$this->assertDatabaseHas('faqs', [
'question' => 'Apa itu FAQ?',
'answer' => 'FAQ adalah Frequently Asked Questions',
'sort_order' => 1,
]);
});
it('increments sort order when creating new faq', function () {
// Create first FAQ
FaqModel::factory()->create(['sort_order' => 1]);
FaqModel::factory()->create(['sort_order' => 2]);
Livewire::actingAs($this->user)
->test(Faq::class)
->set('form.question', 'Pertanyaan Baru?')
->set('form.answer', 'Jawaban Baru')
->call('create')
->assertHasNoErrors();
// New FAQ should have sort_order 1, and existing ones should be incremented
$newFaq = FaqModel::where('question', 'Pertanyaan Baru?')->first();
expect($newFaq->sort_order)->toBe(1);
// Check that existing FAQs were incremented
expect(FaqModel::where('sort_order', '>', 1)->count())->toBe(2);
});
it('can open edit modal and load data', function () {
$faq = FaqModel::factory()->create([
'question' => 'Pertanyaan Edit?',
'answer' => 'Jawaban Edit',
]);
Livewire::actingAs($this->user)
->test(Faq::class)
->call('openModal', 'update', 'Ubah FAQ', $faq->hash_id)
->assertSet('method', 'update')
->assertSet('modalTitle', 'Ubah FAQ');
});
it('can update a faq', function () {
$faq = FaqModel::factory()->create([
'question' => 'Pertanyaan Lama?',
'answer' => 'Jawaban Lama',
]);
Livewire::actingAs($this->user)
->test(Faq::class)
->set('form.faq', $faq)
->set('form.question', 'Pertanyaan Diperbarui?')
->set('form.answer', 'Jawaban Diperbarui')
->call('update')
->assertHasNoErrors()
->assertDispatched('refreshDatatable');
$this->assertDatabaseHas('faqs', [
'id' => $faq->id,
'question' => 'Pertanyaan Diperbarui?',
'answer' => 'Jawaban Diperbarui',
]);
});
it('can delete a faq', function () {
$faq = FaqModel::factory()->create(['sort_order' => 2]);
Livewire::actingAs($this->user)
->test(Faq::class)
->call('delete', $faq)
->assertDispatched('refreshDatatable');
$this->assertSoftDeleted('faqs', ['id' => $faq->id]);
});
it('can move faq sort order up', function () {
$faq1 = FaqModel::factory()->create(['sort_order' => 1]);
$faq2 = FaqModel::factory()->create(['sort_order' => 2]);
$faq3 = FaqModel::factory()->create(['sort_order' => 3]);
Livewire::actingAs($this->user)
->test(Faq::class)
->call('sortOrder', $faq2, 'up')
->assertDispatched('refreshDatatable');
$faq1->refresh();
$faq2->refresh();
expect($faq2->sort_order)->toBe(1);
expect($faq1->sort_order)->toBe(2);
});
it('can move faq sort order down', function () {
$faq1 = FaqModel::factory()->create(['sort_order' => 1]);
$faq2 = FaqModel::factory()->create(['sort_order' => 2]);
$faq3 = FaqModel::factory()->create(['sort_order' => 3]);
Livewire::actingAs($this->user)
->test(Faq::class)
->call('sortOrder', $faq2, 'down')
->assertDispatched('refreshDatatable');
$faq2->refresh();
$faq3->refresh();
expect($faq2->sort_order)->toBe(3);
expect($faq3->sort_order)->toBe(2);
});
it('cannot access faq page without permission', function () {
$this->user->roles()->detach();
$this->user->permissions()->detach();
$this->actingAs($this->user)
->get(route('studio.information.faq.index'))
->assertForbidden();
});
it('cannot create faq without permission', function () {
$this->user->roles()->detach();
$this->user->permissions()->detach();
Livewire::actingAs($this->user)
->test(Faq::class)
->set('form.question', 'Test?')
->set('form.answer', 'Test')
->call('create')
->assertForbidden();
});
it('cannot update faq without permission', function () {
$faq = FaqModel::factory()->create();
$this->user->roles()->detach();
$this->user->permissions()->detach();
Livewire::actingAs($this->user)
->test(Faq::class)
->call('openModal', 'update', 'Ubah FAQ', $faq->hash_id)
->set('form.question', 'Updated?')
->call('update')
->assertForbidden();
});
it('cannot delete faq without permission', function () {
$faq = FaqModel::factory()->create();
$this->user->roles()->detach();
$this->user->permissions()->detach();
Livewire::actingAs($this->user)
->test(Faq::class)
->call('delete', $faq)
->assertForbidden();
});
it('cannot sort faq without permission', function () {
$faq = FaqModel::factory()->create(['sort_order' => 2]);
$this->user->roles()->detach();
$this->user->permissions()->detach();
Livewire::actingAs($this->user)
->test(Faq::class)
->call('sortOrder', $faq, 'up')
->assertForbidden();
});