import { describe, it, expect } from 'vitest'; import { extractInquiryFields } from '@/lib/services/website-intake-fields'; describe('extractInquiryFields', () => { it('maps a berth inquiry payload (berth -> mooringNumber)', () => { const f = extractInquiryFields({ first_name: 'Jane', last_name: 'Doe', email: 'jane@example.com', phone: '+15551234', berth: 'A1', interest: 'berths', }); expect(f).toMatchObject({ firstName: 'Jane', lastName: 'Doe', fullName: 'Jane Doe', email: 'jane@example.com', phone: '+15551234', mooringNumber: 'A1', placeOfResidence: null, }); }); it('maps a residence inquiry payload (address -> placeOfResidence, no mooring)', () => { const f = extractInquiryFields({ first_name: 'Sam', last_name: 'Lee', email: 's@example.com', phone: '2', address: 'London', interest: 'residences', }); expect(f.mooringNumber).toBeNull(); expect(f.placeOfResidence).toBe('London'); expect(f.fullName).toBe('Sam Lee'); }); it('maps residence_types[] + method_of_contact from the register form', () => { const f = extractInquiryFields({ first_name: 'Mia', last_name: 'Ng', email: 'mia@example.com', interest: 'residences', residence_types: ['Two Bedroom Marina Villa', 'Five Bedroom Oceanfront Villa'], method_of_contact: 'phone', }); expect(f.residenceTypes).toEqual(['Two Bedroom Marina Villa', 'Five Bedroom Oceanfront Villa']); expect(f.preferredContact).toBe('phone'); }); it('coerces a lone residence_types string to a single-item array and filters blanks', () => { const f = extractInquiryFields({ residence_types: ['Two Bedroom Marina Villa', '', 7 as unknown as string], method_of_contact: 'EMAIL', }); expect(f.residenceTypes).toEqual(['Two Bedroom Marina Villa']); expect(f.preferredContact).toBe('email'); const single = extractInquiryFields({ residence_types: 'Four Bedroom Oceanfront Villa' }); expect(single.residenceTypes).toEqual(['Four Bedroom Oceanfront Villa']); }); it('maps a contact form payload (interest[] -> joined interestType + comments)', () => { const f = extractInquiryFields({ first_name: 'Ann', last_name: 'Poe', email: 'a@example.com', interest: ['owner', 'broker'], comments: 'Please call me', }); expect(f.interestType).toBe('owner, broker'); expect(f.comments).toBe('Please call me'); expect(f.phone).toBe(''); }); it('trims whitespace and degrades missing/garbage fields safely', () => { const f = extractInquiryFields({ first_name: ' Jo ', last_name: 42 as unknown }); expect(f.firstName).toBe('Jo'); expect(f.fullName).toBe('Jo'); expect(f.email).toBe(''); expect(f.mooringNumber).toBeNull(); expect(f.interestType).toBeNull(); }); it('returns all-empty for an empty payload', () => { expect(extractInquiryFields({})).toMatchObject({ firstName: '', lastName: '', fullName: '', email: '', phone: '', mooringNumber: null, placeOfResidence: null, comments: null, interestType: null, residenceTypes: [], preferredContact: null, }); }); });