import { normalizeWidgetOptions } from '../domain/WidgetOptions'; import type { WidgetOptions } from '../domain/WidgetOptions'; describe('normalizeWidgetOptions', () => { it('returns options unchanged when no legacy fields are present', () => { const options: WidgetOptions = { maxAttemptsAfterDismiss: 5, waitDaysAfterWidgetDismiss: 2, waitDaysAfterWidgetSubmit: 30, waitDaysAfterWidgetPartialSubmit: 60, }; expect(normalizeWidgetOptions(options)).toEqual(options); }); it('maps retry.attempts to maxAttemptsAfterDismiss', () => { const result = normalizeWidgetOptions({ retry: { attempts: 3 } }); expect(result.maxAttemptsAfterDismiss).toBe(3); }); it('maps retry.interval to waitDaysAfterWidgetDismiss', () => { const result = normalizeWidgetOptions({ retry: { interval: 1 } }); expect(result.waitDaysAfterWidgetDismiss).toBe(1); }); it('maps waitDelayAfterRating to waitDaysAfterWidgetSubmit and waitDaysAfterWidgetPartialSubmit', () => { const result = normalizeWidgetOptions({ waitDelayAfterRating: 30 }); expect(result.waitDaysAfterWidgetSubmit).toBe(30); expect(result.waitDaysAfterWidgetPartialSubmit).toBe(30); }); it('canonical fields take precedence over legacy retry fields', () => { const result = normalizeWidgetOptions({ maxAttemptsAfterDismiss: 10, waitDaysAfterWidgetDismiss: 7, retry: { attempts: 3, interval: 1 }, }); expect(result.maxAttemptsAfterDismiss).toBe(10); expect(result.waitDaysAfterWidgetDismiss).toBe(7); }); it('canonical fields take precedence over legacy waitDelayAfterRating', () => { const result = normalizeWidgetOptions({ waitDaysAfterWidgetSubmit: 90, waitDaysAfterWidgetPartialSubmit: 45, waitDelayAfterRating: 30, }); expect(result.waitDaysAfterWidgetSubmit).toBe(90); expect(result.waitDaysAfterWidgetPartialSubmit).toBe(45); }); it('should handle backward-compatible format when legacy fields are provided', (): void => { const result = normalizeWidgetOptions({ retry: { attempts: 3, interval: 1 }, waitDelayAfterRating: 30, }); expect(result.maxAttemptsAfterDismiss).toBe(3); expect(result.waitDaysAfterWidgetDismiss).toBe(1); expect(result.waitDaysAfterWidgetSubmit).toBe(30); expect(result.waitDaysAfterWidgetPartialSubmit).toBe(30); }); it('should preserve other options when normalizing legacy fields', (): void => { const result = normalizeWidgetOptions({ enabled: true, samplingPercentage: 50, height: 400, retry: { attempts: 3, interval: 1 }, waitDelayAfterRating: 30, }); expect(result.enabled).toBe(true); expect(result.samplingPercentage).toBe(50); expect(result.height).toBe(400); }); it('should leave fields undefined when retry object is empty', (): void => { const result = normalizeWidgetOptions({ retry: {} }); expect(result.maxAttemptsAfterDismiss).toBeUndefined(); expect(result.waitDaysAfterWidgetDismiss).toBeUndefined(); }); });