assertEquals('2026-05-15', $start->format('Y-m-d'), 'last_fetched nutzt Datum des letzten Abrufs'); $this->assert(str_contains($label, '15.05.2026'), 'Label enthält Datum des letzten Abrufs'); // 2. last_fetched ohne vorherigen Abruf → Fallback 365 Tage [$start] = BankSource::computeStartDate('last_fetched', null, $today); $this->assertEquals('2025-05-22', $start->format('Y-m-d'), 'Ohne last_fetched: 365 Tage zurück'); // 3. last_week → 7 Tage zurück [$start, $label] = BankSource::computeStartDate('last_week', '2026-05-20 00:00:00', $today); $this->assertEquals('2026-05-15', $start->format('Y-m-d'), 'last_week = today - 7d'); $this->assert(str_contains($label, '7 Tage'), 'Label nennt 7 Tage'); // 4. current_month → 01. des aktuellen Monats [$start] = BankSource::computeStartDate('current_month', null, $today); $this->assertEquals('2026-05-01', $start->format('Y-m-d'), 'current_month = erster Tag des Monats'); // 5. last_30_days → 30 Tage zurück [$start] = BankSource::computeStartDate('last_30_days', null, $today); $this->assertEquals('2026-04-22', $start->format('Y-m-d'), 'last_30_days = today - 30d'); // 6. full → 365 Tage zurück (überschreibt last_fetched_at) [$start, $label] = BankSource::computeStartDate('full', '2026-05-20 00:00:00', $today); $this->assertEquals('2025-05-22', $start->format('Y-m-d'), 'full ignoriert last_fetched'); $this->assert(str_contains($label, '365'), 'Label nennt 365 Tage'); // 7. Unbekannter Wert fällt auf last_fetched zurück (Validierung im Modell selbst) [$start] = BankSource::computeStartDate('quark', '2026-05-10 00:00:00', $today); $this->assertEquals('2026-05-10', $start->format('Y-m-d'), 'Unbekanntes Range → last_fetched'); // 8. null Range → last_fetched [$start] = BankSource::computeStartDate(null, '2026-05-10 00:00:00', $today); $this->assertEquals('2026-05-10', $start->format('Y-m-d'), 'null Range → last_fetched'); } }