create(); $category = $user->currentHousehold->categories()->create(['name' => 'Loyer', 'type' => 'depense', 'position' => 1]); Livewire::actingAs($user) ->test(Index::class) ->set('name', 'Loyer') ->set('categoryId', $category->id) ->set('amount', '1200') ->set('dayOfMonth', '5') ->call('add') ->assertHasNoErrors(); $recurring = $user->currentHousehold->recurringTransactions()->first(); expect($recurring)->not->toBeNull(); expect($recurring->name)->toBe('Loyer'); expect((float) $recurring->amount)->toBe(1200.0); expect($recurring->day_of_month)->toBe(5); expect($recurring->active)->toBeTrue(); }); it('prevents editing a recurring transaction from another household', function (): void { $owner = User::factory()->create(); $intruder = User::factory()->create(); $category = $owner->currentHousehold->categories()->create(['name' => 'Loyer', 'type' => 'depense', 'position' => 1]); $recurring = $owner->currentHousehold->recurringTransactions()->create([ 'category_id' => $category->id, 'name' => 'Loyer', 'amount' => 1200, 'day_of_month' => 5, ]); Livewire::actingAs($intruder) ->test(Index::class) ->call('startEdit', $recurring->id) ->assertForbidden(); }); it('toggles active state', function (): void { $user = User::factory()->create(); $category = $user->currentHousehold->categories()->create(['name' => 'Loyer', 'type' => 'depense', 'position' => 1]); $recurring = $user->currentHousehold->recurringTransactions()->create([ 'category_id' => $category->id, 'name' => 'Loyer', 'amount' => 1200, 'day_of_month' => 5, ]); Livewire::actingAs($user)->test(Index::class)->call('toggleActive', $recurring->id); expect($recurring->fresh()->active)->toBeFalse(); }); it('deletes a recurring transaction', function (): void { $user = User::factory()->create(); $category = $user->currentHousehold->categories()->create(['name' => 'Loyer', 'type' => 'depense', 'position' => 1]); $recurring = $user->currentHousehold->recurringTransactions()->create([ 'category_id' => $category->id, 'name' => 'Loyer', 'amount' => 1200, 'day_of_month' => 5, ]); Livewire::actingAs($user)->test(Index::class)->call('delete', $recurring->id); expect(RecurringTransaction::find($recurring->id))->toBeNull(); }); it('assigns a recurring transaction to a household member', function (): void { $owner = User::factory()->create(); $member = User::factory()->create(); $household = $owner->currentHousehold; $member->households()->attach($household->id, ['role' => 'member']); $category = $household->categories()->create(['name' => 'Loyer', 'type' => 'depense', 'position' => 1]); Livewire::actingAs($owner) ->test(Index::class) ->set('name', 'Loyer') ->set('categoryId', $category->id) ->set('amount', '1200') ->set('dayOfMonth', '5') ->set('paidByUserId', (string) $member->id) ->call('add'); $recurring = $household->recurringTransactions()->first(); expect($recurring->paid_by_user_id)->toBe($member->id); }); it('carries the recurring paid-by user onto the generated transaction', function (): void { $this->travelTo(now()->setDate(2026, 3, 10)); $owner = User::factory()->create(); $member = User::factory()->create(); $household = $owner->currentHousehold; $member->households()->attach($household->id, ['role' => 'member']); $category = $household->categories()->create(['name' => 'Loyer', 'type' => 'depense', 'position' => 1]); $recurring = $household->recurringTransactions()->create([ 'category_id' => $category->id, 'paid_by_user_id' => $member->id, 'name' => 'Loyer', 'amount' => 1200, 'day_of_month' => 5, ]); Livewire::actingAs($owner) ->test(App\Livewire\Suivi\Index::class) ->call('confirmRecurrence', $recurring->id, '1200'); $transaction = $household->transactions()->where('recurring_transaction_id', $recurring->id)->first(); expect($transaction->paid_by_user_id)->toBe($member->id); });