Files
pn-new-crm/tests/unit/email/client-confirmations.test.ts
Matt caaebd77fa
All checks were successful
Build & Push Docker Images / lint (push) Successful in 2m55s
Build & Push Docker Images / build-and-push (push) Successful in 8m49s
fix(intake): client inquiry emails mirror website copy + never show "Port Nimara CRM"
Client-facing confirmation emails now:
- use the PUBLIC port name ("Port Nimara" via ports.name), never the CRM
  appName ("Port Nimara CRM") which is reserved for internal/staff surfaces
- mirror the website's wording verbatim ("Thank you for expressing
  interest…", "Best regards,") and drop the CRM-style headings
- sign off per category: berth → "Port Nimara Sales Team", contact →
  "Port Nimara Team", residential → "Port Nimara Residences Team"
- show + reply-to a public contact address, admin-configurable per category
  (inquiry_contact_email → sales@ for berth/residence,
  contact_form_contact_email → hello@ for contact form), never the noreply From

Internal alerts keep the CRM detail-line format + link (name fixed to
"Port Nimara"), EXCEPT the residential alert which drops all CRM mention
(it reaches an external recipient) and signs "- Port Nimara Residences".

sendEmail gains an optional per-message replyTo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L2qc3xZTfif7N4Wq3QDa8X
2026-06-25 22:07:47 +02:00

53 lines
2.3 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { inquiryClientConfirmation } from '@/lib/email/templates/inquiry-client-confirmation';
import { contactFormClientConfirmation } from '@/lib/email/templates/contact-form-client-confirmation';
// Note: assert prose that spans an interpolation on the plain-text part — the
// React-Email HTML renderer inserts `<!-- -->` markers at value boundaries.
describe('inquiryClientConfirmation (berth)', () => {
it('mirrors the website copy for a specific berth + signs off as Sales', async () => {
const { subject, html, text } = await inquiryClientConfirmation({
firstName: 'Jane',
mooringNumber: 'D13',
contactEmail: 'sales@portnimara.com',
portName: 'Port Nimara',
});
expect(subject).toBe('Port Nimara — Thank You for Your Interest');
expect(text).toContain('Thank you for expressing interest in Berth D13');
expect(text).toContain('Our team has registered your interest');
expect(text).toContain('reach out to us at sales@portnimara.com');
expect(text).toContain('The Port Nimara Sales Team');
expect(html).toContain('sales@portnimara.com');
expect(html).not.toContain('Port Nimara CRM');
});
it('uses "a Berth" when no mooring is given', async () => {
const { text, html } = await inquiryClientConfirmation({
firstName: 'Jane',
mooringNumber: null,
contactEmail: 'sales@portnimara.com',
portName: 'Port Nimara',
});
expect(text).toContain('Thank you for expressing interest in a Berth');
expect(html).not.toContain('Port Nimara CRM');
});
});
describe('contactFormClientConfirmation', () => {
it('mirrors the website copy + signs off as the Port Nimara Team', async () => {
const { subject, html, text } = await contactFormClientConfirmation({
firstName: 'Bob',
contactEmail: 'hello@portnimara.com',
portName: 'Port Nimara',
});
expect(subject).toBe('Port Nimara — Thank You for Contacting Us');
expect(text).toContain('Thank you for contacting Port Nimara');
expect(text).toContain('We have received your message');
expect(text).toContain('reach out to us at hello@portnimara.com');
expect(text).toContain('The Port Nimara Team');
expect(html).not.toContain('Port Nimara CRM');
});
});