id = 10; $this->assertNull((new EventDateInfoFormatter)->format($date, collect())); } public function test_it_formats_cancellation_and_source_dates_for_a_reschedule_destination(): void { $date = new EventDate; $date->id = 20; $date->suspended_at = Carbon::parse('2026-09-15'); $changes = collect([ $this->reschedule(1, 20, '2026-10-09'), $this->reschedule(2, 20, '2026-10-10'), ]); $this->assertSame( 'Esta fecha fue cancelada. 09/10/2026 y 10/10/2026 se reprogramaron para este día.', (new EventDateInfoFormatter)->format($date, $changes), ); } public function test_it_includes_sources_that_reach_the_destination_through_intermediate_dates(): void { $date = new EventDate; $date->id = 30; $changes = collect([ $this->reschedule(13, 24, '2026-10-13'), $this->reschedule(22, 24, '2026-10-22'), $this->reschedule(24, 30, '2026-10-24'), $this->reschedule(29, 30, '2026-10-29'), $this->reschedule(10, 11, '2026-10-10'), ]); $this->assertSame( '13/10/2026, 22/10/2026, 24/10/2026 y 29/10/2026 se reprogramaron para este día.', (new EventDateInfoFormatter)->format($date, $changes), ); } private function reschedule(int $sourceId, int $destinationId, string $previousDate): EventDateChange { $change = new EventDateChange; $change->setRawAttributes([ 'change_type' => EventDateChangeType::Rescheduled->value, 'source_event_date_id' => $sourceId, 'destination_event_date_id' => $destinationId, 'previous_date' => $previousDate, ]); return $change; } }