Files
suivicpt/tests/Feature/DashboardTest.php
T
jeremy bayseandClaude Sonnet 5 5ef655d16f Add "reste à dépenser" tile to the dashboard
Shows the total remaining depense budget for the selected period,
above the breakdown table — reuses the totals.reste figure already
computed per section, no new query.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-26 13:41:48 +02:00

100 lines
4.3 KiB
PHP

<?php
use App\Livewire\Dashboard\Index;
use App\Models\User;
use Livewire\Livewire;
it('shows budget vs tracked totals for the selected year', function (): void {
$user = User::factory()->create();
$household = $user->currentHousehold;
$category = $household->categories()->create(['name' => 'Loyer', 'type' => 'depense', 'position' => 1]);
$category->budgetLines()->create(['household_id' => $household->id, 'year' => 2026, 'month' => null, 'amount' => 1200]);
$household->transactions()->create([
'category_id' => $category->id, 'user_id' => $user->id,
'date' => '2026-03-01', 'date_effective' => '2026-03-01', 'amount' => 1200,
]);
$component = Livewire::actingAs($user)->test(Index::class)->set('year', 2026)->set('period', 'year');
$sections = $component->viewData('sections');
expect($sections['depense']['totals']['budget'])->toBe(14400.0); // 1200 * 12
expect($sections['depense']['totals']['tracked'])->toBe(1200.0);
});
it('defaults to the current month instead of the full year', function (): void {
$user = User::factory()->create();
$component = Livewire::actingAs($user)->test(Index::class);
expect($component->get('period'))->toBe((string) now()->month);
expect($component->get('year'))->toBe((int) now()->year);
});
it('filters tracked and budget to a single month when a period is selected', function (): void {
$user = User::factory()->create();
$household = $user->currentHousehold;
$category = $household->categories()->create(['name' => 'Assurances', 'type' => 'depense', 'position' => 1]);
$category->budgetLines()->create(['household_id' => $household->id, 'year' => 2026, 'month' => null, 'amount' => 189.89]);
$category->budgetLines()->create(['household_id' => $household->id, 'year' => 2026, 'month' => 8, 'amount' => 270]);
$component = Livewire::actingAs($user)->test(Index::class)
->set('year', 2026)
->set('period', '8');
$sections = $component->viewData('sections');
expect($sections['depense']['totals']['budget'])->toBe(270.0);
});
it('computes the remaining depense budget total for the tile', function (): void {
$user = User::factory()->create();
$household = $user->currentHousehold;
$loyer = $household->categories()->create(['name' => 'Loyer', 'type' => 'depense', 'position' => 1]);
$courses = $household->categories()->create(['name' => 'Courses', 'type' => 'depense', 'position' => 2]);
$loyer->budgetLines()->create(['household_id' => $household->id, 'year' => 2026, 'month' => null, 'amount' => 1000]);
$courses->budgetLines()->create(['household_id' => $household->id, 'year' => 2026, 'month' => null, 'amount' => 400]);
$household->transactions()->create([
'category_id' => $loyer->id, 'user_id' => $user->id,
'date' => '2026-03-05', 'date_effective' => '2026-03-05', 'amount' => 1000,
]);
$household->transactions()->create([
'category_id' => $courses->id, 'user_id' => $user->id,
'date' => '2026-03-05', 'date_effective' => '2026-03-05', 'amount' => 150,
]);
$component = Livewire::actingAs($user)->test(Index::class)->set('year', 2026)->set('period', '3');
expect($component->viewData('sections')['depense']['totals']['reste'])->toBe(250.0);
});
it('excludes zero-tracked categories from chart data and caps it at 6', function (): void {
$user = User::factory()->create();
$household = $user->currentHousehold;
$tracked = collect();
for ($i = 1; $i <= 8; $i++) {
$category = $household->categories()->create(['name' => "Cat{$i}", 'type' => 'depense', 'position' => $i]);
$household->transactions()->create([
'category_id' => $category->id, 'user_id' => $user->id,
'date' => '2026-01-01', 'date_effective' => '2026-01-01', 'amount' => $i * 10,
]);
$tracked->push($category);
}
$zero = $household->categories()->create(['name' => 'CatZero', 'type' => 'depense', 'position' => 99]);
$component = Livewire::actingAs($user)->test(Index::class)->set('year', 2026)->set('period', 'year');
$chartData = $component->viewData('chartData');
expect($chartData['depense']['labels'])->toHaveCount(6);
expect($chartData['depense']['labels'])->not->toContain('CatZero');
expect($chartData['depense']['labels']->first())->toBe('Cat8'); // highest tracked first
});