From 71600847fed4cc81c8d3e29a76732a7b262cf840 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Fri, 2 Jan 2026 19:27:02 +0700 Subject: [PATCH] feat: Add feature tests for customer management, including CRUD operations and permission checks. --- tests/Feature/Studio/Loyalty/CustomerTest.php | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 tests/Feature/Studio/Loyalty/CustomerTest.php diff --git a/tests/Feature/Studio/Loyalty/CustomerTest.php b/tests/Feature/Studio/Loyalty/CustomerTest.php new file mode 100644 index 0000000..44450b0 --- /dev/null +++ b/tests/Feature/Studio/Loyalty/CustomerTest.php @@ -0,0 +1,117 @@ +setupUser(); + + $role = Role::firstOrCreate(['name' => 'Owner']); + Permission::firstOrCreate(['name' => 'view customer']); + Permission::firstOrCreate(['name' => 'create customer']); + Permission::firstOrCreate(['name' => 'update customer']); + Permission::firstOrCreate(['name' => 'delete customer']); + $role->givePermissionTo(['view customer', 'create customer', 'update customer', 'delete customer']); + $this->user->assignRole($role); +}); + +it('renders the customer page correctly', function () { + $this->actingAs($this->user) + ->get(route('studio.loyalty.customer.index')) + ->assertOk() + ->assertSeeLivewire(Customer::class); +}); + +it('can open create modal', function () { + Livewire::actingAs($this->user) + ->test(Customer::class) + ->call('openModal', 'create', 'Tambah Customer') + ->assertSet('method', 'create') + ->assertSet('modalTitle', 'Tambah Customer'); +}); + +it('shows validation errors on create', function () { + Livewire::actingAs($this->user) + ->test(Customer::class) + ->call('create') + ->assertHasErrors([ + 'form.name' => 'required', + 'form.gender' => 'required', + ]); +}); + +it('can store a new customer', function () { + Livewire::actingAs($this->user) + ->test(Customer::class) + ->set('form.name', 'John Doe') + ->set('form.phone_number', '0812 3456 7890') + ->set('form.gender', Gender::MALE->value) + ->call('create') + ->assertHasNoErrors() + ->assertDispatched('refreshDatatable'); + + $this->assertDatabaseHas('customers', [ + 'name' => 'John Doe', + 'phone_number' => '0812 3456 7890', + 'gender' => Gender::MALE->value, + ]); +}); + +it('can open edit modal and load data', function () { + $customer = CustomerModel::factory()->create(['name' => 'Old Name']); + + Livewire::actingAs($this->user) + ->test(Customer::class) + ->call('openModal', 'update', 'Ubah Customer', $customer->hash_id) + ->set('form.customer', $customer) + ->set('form.name', 'Old Name') + ->assertSet('method', 'update') + ->assertSet('form.name', 'Old Name') + ->assertSet('form.customer.id', $customer->id); +}); + +it('can update a customer', function () { + $customer = CustomerModel::factory()->create(['name' => 'Old Name']); + + Livewire::actingAs($this->user) + ->test(Customer::class) + ->call('openModal', 'update', 'Ubah Customer', $customer->hash_id) + // Manually set because of potential HashId resolution issues in tests + ->set('form.customer', $customer) + ->set('form.name', 'Updated Name') + ->set('form.gender', Gender::FEMALE->value) + ->call('update') + ->assertHasNoErrors() + ->assertDispatched('refreshDatatable'); + + $this->assertDatabaseHas('customers', [ + 'id' => $customer->id, + 'name' => 'Updated Name', + 'gender' => Gender::FEMALE->value, + ]); +}); + +it('can delete a customer', function () { + $customer = CustomerModel::factory()->create(); + + Livewire::actingAs($this->user) + ->test(Customer::class) + ->call('delete', $customer->id) + ->assertHasNoErrors() + ->assertDispatched('refreshDatatable'); + + $this->assertSoftDeleted('customers', ['id' => $customer->id]); +}); + +it('cannot access customer page without permission', function () { + $this->user->roles()->detach(); + $this->user->permissions()->detach(); + + $this->actingAs($this->user) + ->get(route('studio.loyalty.customer.index')) + ->assertForbidden(); +});