user = User::factory()->has(Employee::factory(), 'employee')->create(); $this->outlet = Outlet::factory()->create(); $this->user->outlets()->attach($this->outlet); // Give permissions to view actions // actions column checks: update expense, delete expense, or own data // So for own data, no perm needed. }); it('renders successfully', function () { $this->actingAs($this->user); Livewire::test(ExpensesTable::class) ->assertStatus(200); }); it('shows expenses from user outlets', function () { $this->actingAs($this->user); Expense::factory()->create([ 'user_id' => $this->user->id, 'outlet_id' => $this->outlet->id, 'description' => 'My Expense', 'amount' => 50000, ]); Livewire::test(ExpensesTable::class) ->assertSee('My Expense') ->assertSee('50.000'); // Assuming currency formatting adds dot for thousands (ID) }); it('does not show expenses from other outlets', function () { $this->actingAs($this->user); $otherOutlet = Outlet::factory()->create(); $otherUser = User::factory()->has(Employee::factory(), 'employee')->create(); $otherUser->outlets()->attach($otherOutlet); Expense::factory()->create([ 'user_id' => $otherUser->id, 'outlet_id' => $otherOutlet->id, 'description' => 'Other Expense', 'amount' => 100000, ]); Livewire::test(ExpensesTable::class) ->assertDontSee('Other Expense'); }); it('can search by description', function () { $this->actingAs($this->user); Expense::factory()->create([ 'user_id' => $this->user->id, 'outlet_id' => $this->outlet->id, 'description' => 'UniqueTerm', 'amount' => 12345, ]); Expense::factory()->create([ 'user_id' => $this->user->id, 'outlet_id' => $this->outlet->id, 'description' => 'AnotherItem', 'amount' => 67890, ]); Livewire::test(ExpensesTable::class) ->set('search', 'UniqueTerm') // Standard search property ->assertSee('UniqueTerm') ->assertDontSee('AnotherItem'); }); it('can search by amount', function () { $this->actingAs($this->user); Expense::factory()->create([ 'user_id' => $this->user->id, 'outlet_id' => $this->outlet->id, 'description' => 'Exp1', 'amount' => 8888, ]); Expense::factory()->create([ 'user_id' => $this->user->id, 'outlet_id' => $this->outlet->id, 'description' => 'Exp2', 'amount' => 9999, ]); Livewire::test(ExpensesTable::class) ->set('search', '8888') ->assertSee('Exp1') ->assertDontSee('Exp2'); }); it('renders columns correctly', function () { $this->actingAs($this->user); Livewire::test(ExpensesTable::class) ->assertSee('Pegawai') ->assertSee('Keterangan') ->assertSee('Jumlah') ->assertSee('Outlet') ->assertSee('Tanggal') ->assertSee('Aksi'); });