alias(static fn (string $name, $default = '') => ''); } public function testRenderSampleUsesDefaultTemplateWhenDraftBlank(): void { $stored = new PaymentDueEmailTemplate(); $rendered = PaymentEmailController::renderSample($stored, '', '', ''); self::assertSame(PaymentDueEmailTemplate::defaultSubject(), $rendered['subject']); // Default body lists both sample items with a grand total and the sample // reference/credit blocks resolved. self::assertStringContainsString('Piano lesson', $rendered['body']); self::assertStringContainsString('Guitar lesson', $rendered['body']); self::assertStringContainsString('Jul 15, 2026', $rendered['body']); self::assertStringContainsString('Total due: CAD 55.00', $rendered['body']); // 75 - 20 credit self::assertStringContainsString('REF12345', $rendered['body']); self::assertStringContainsString('pay@studio.test', $rendered['body']); } public function testRenderSampleUsesDraftOverStored(): void { $stored = new PaymentDueEmailTemplate(); $rendered = PaymentEmailController::renderSample( $stored, 'Draft: {total_due}', "Hello {student_name}\n{items}", '> {label} {amount}' ); self::assertSame('Draft: CAD 55.00', $rendered['subject']); self::assertStringContainsString('Hello ' . PaymentEmailController::sampleStudentName(), $rendered['body']); self::assertStringContainsString('> Piano lesson 35.00', $rendered['body']); } public function testSampleItemsAreTwoLessons(): void { $items = PaymentEmailController::sampleItems(); self::assertCount(2, $items); self::assertSame(35.0, $items[0]['amount']); self::assertSame(40.0, $items[1]['amount']); } }