alias(static fn (string $name, $default = '') => ''); $template = new PaymentDueEmailTemplate(); self::assertSame(PaymentDueEmailTemplate::defaultSubject(), $template->subject()); self::assertSame(PaymentDueEmailTemplate::defaultBody(), $template->body()); self::assertSame(PaymentDueEmailTemplate::defaultItemLine(), $template->itemLine()); } public function testReadsStoredValues(): void { Functions\when('get_option')->alias(static function (string $name) { return match ($name) { PaymentDueEmailTemplate::OPT_SUBJECT => 'Custom subject', PaymentDueEmailTemplate::OPT_BODY => 'Custom body {items}', PaymentDueEmailTemplate::OPT_ITEM_LINE => '{label}: {amount}', default => '', }; }); $template = new PaymentDueEmailTemplate(); self::assertSame('Custom subject', $template->subject()); self::assertSame('Custom body {items}', $template->body()); self::assertSame('{label}: {amount}', $template->itemLine()); } public function testRenderSubstitutesTokens(): void { Functions\when('get_option')->alias(static function (string $name) { return match ($name) { PaymentDueEmailTemplate::OPT_SUBJECT => 'Hi {student_name}', PaymentDueEmailTemplate::OPT_BODY => 'Total: {total_due}', default => '', }; }); $template = new PaymentDueEmailTemplate(); self::assertSame('Hi Sam', $template->renderSubject(['{student_name}' => 'Sam'])); self::assertSame('Total: CAD 10.00', $template->renderBody(['{total_due}' => 'CAD 10.00'])); } public function testSaveWritesOptions(): void { Functions\expect('update_option')->once()->with(PaymentDueEmailTemplate::OPT_SUBJECT, 'S'); Functions\expect('update_option')->once()->with(PaymentDueEmailTemplate::OPT_BODY, 'B'); Functions\expect('update_option')->once()->with(PaymentDueEmailTemplate::OPT_ITEM_LINE, 'I'); $template = new PaymentDueEmailTemplate(); $template->saveSubject('S'); $template->saveBody('B'); $template->saveItemLine('I'); } public function testDefaultBodyCarriesEveryBlockToken(): void { $body = PaymentDueEmailTemplate::defaultBody(); foreach (['{items}', '{credit}', '{total_due}', '{etransfer}', '{reference}'] as $token) { self::assertStringContainsString($token, $body); } } }