setupUser(); $role = Role::firstOrCreate(['name' => 'Developer']); Permission::firstOrCreate(['name' => 'view analysis']); $role->givePermissionTo('view analysis'); $this->user->assignRole($role); }); it('renders the analysis page correctly', function () { $this->actingAs($this->user) ->get(route('studio.dashboard.analysis')) ->assertOk() ->assertSeeLivewire(Analysis::class); }); it('calculates counting data correctly', function () { // Basic counts Outlet::factory()->count(2)->create(); Category::factory()->count(3)->create(); // Member count (User with customer relation) $customerUser = User::factory()->create(); Customer::factory()->create(['user_id' => $customerUser->id]); // Member must be attached to the outlet to be counted $customerUser->outlets()->attach($this->outlet->id); // Employee count (User with employee relation) $employeeUser = User::factory()->create(); \App\Models\Employee::factory()->create(['user_id' => $employeeUser->id]); $employeeUser->outlets()->attach($this->outlet->id); Livewire::actingAs($this->user) ->test(Analysis::class) ->assertSet('countingData.0.title', 'Outlet') ->assertSet('countingData.0.value', 3) // 1 from setup + 2 created ->assertSet('countingData.4.title', 'Member') ->assertSet('countingData.4.value', 1); }); it('filters data by pre-defined periods', function () { // Order from 10 days ago Order::factory()->paid()->create([ 'outlet_id' => $this->outlet->id, 'total' => 100000, 'created_at' => now()->subDays(10), ]); // Order from today Order::factory()->paid()->create([ 'outlet_id' => $this->outlet->id, 'total' => 50000, 'created_at' => now(), ]); Livewire::actingAs($this->user) ->test(Analysis::class) // All period (default) ->assertSet('orders.5.value', 'Rp150.000') // Last 7 days (only shows today's order) ->set('period', '7') ->assertSet('orders.5.value', 'Rp50.000'); }); it('filters data by custom date range', function () { // Order in range Order::factory()->paid()->create([ 'outlet_id' => $this->outlet->id, 'total' => 200000, 'created_at' => Carbon::parse('2024-01-15'), ]); // Order out of range Order::factory()->paid()->create([ 'outlet_id' => $this->outlet->id, 'total' => 100000, 'created_at' => Carbon::parse('2024-02-15'), ]); Livewire::actingAs($this->user) ->test(Analysis::class) ->set('range.start', '2024-01-01') ->set('range.end', '2024-01-31') ->assertSet('orders.5.value', 'Rp200.000'); }); it('shows top performers correctly with aggregation', function () { $p1 = Perfume::factory()->create(['name' => 'Perfume A', 'sale_price' => 1000]); $p2 = Perfume::factory()->create(['name' => 'Perfume B', 'sale_price' => 2000]); // Sale of Perfume A (Total sales: 1500) $o1 = Order::factory()->paid()->create(['outlet_id' => $this->outlet->id]); OrderItem::factory()->forOrder($o1)->forPerfume($p1)->create([ 'unit_price' => 500, 'quantity' => 3, ]); // Sale of Perfume B (Total sales: 4000) $o2 = Order::factory()->paid()->create(['outlet_id' => $this->outlet->id]); OrderItem::factory()->forOrder($o2)->forPerfume($p2)->create([ 'unit_price' => 2000, 'quantity' => 2, ]); Livewire::actingAs($this->user) ->test(Analysis::class) ->assertSet('topPerfumes.0.name', 'Perfume B') ->assertSet('topPerfumes.0.total_sales', 'Rp4.000') ->assertSet('topPerfumes.1.name', 'Perfume A') ->assertSet('topPerfumes.1.total_sales', 'Rp1.500'); });