- kasih return type - menyesuaikan factory - mengganti modalName - menyesuaikan seeder - menyesuaikan panggil component
195 lines
6.0 KiB
PHP
195 lines
6.0 KiB
PHP
<?php
|
|
|
|
use App\Livewire\Studio\Information\Faq;
|
|
use App\Models\Faq as FaqModel;
|
|
use App\Models\User;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Livewire\Livewire;
|
|
use Spatie\Permission\Models\Permission;
|
|
use Spatie\Permission\Models\Role;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
beforeEach(function () {
|
|
// Create permissions
|
|
Permission::create(['name' => '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');
|
|
});
|