import { resolveAlarmDeepLink } from './alarm-deeplink.util';
import { AlarmType } from './alarm.entity';

describe('resolveAlarmDeepLink — 알람타입별 인앱 목적지 결정', () => {
  it('SND001 결제 → 결제내역', () => {
    expect(resolveAlarmDeepLink(AlarmType.결제, '카드 사용 알림')).toBe(
      '/mypage/payment-history',
    );
  });

  it('SND002 분석(일반) → 일반분석 목록', () => {
    expect(
      resolveAlarmDeepLink(AlarmType.분석, '보험 분석이 완료되었습니다'),
    ).toBe('/analysis/list');
  });

  it('SND002 분석(실손) → 실손분석 목록', () => {
    expect(
      resolveAlarmDeepLink(AlarmType.분석, '실손 분석이 완료되었습니다'),
    ).toBe('/analysis/loss/list');
  });

  it('SND003 팩스 → 청구서 목록 (죽은 팩스 경로로 보내지 않는다)', () => {
    expect(resolveAlarmDeepLink(AlarmType.팩스, '팩스가 도착했습니다')).toBe(
      '/invoices/list',
    );
  });

  it('미지 타입 → 메인 (파생 실패가 이벤트 상세로 새지 않는다)', () => {
    //* DB 의 alm_type 은 enum 밖 값일 수 있다 — 캐스팅으로 그 런타임 입력을 재현한다
    expect(resolveAlarmDeepLink('SND999' as AlarmType, '알 수 없음')).toBe(
      '/main',
    );
    expect(resolveAlarmDeepLink(AlarmType.이벤트, '이벤트')).toBe('/main');
  });

  it('알람타입 코드는 AlarmType enum 이 정본이다 — 유틸이 문자열을 다시 적지 않는다', () => {
    //* 층위 2 항체: 헤더 주석의 "enum 을 그대로 쓴다" 주장에 대응하는 검사.
    //* enum 값이 바뀌면 이 대조가 먼저 깨진다.
    expect(resolveAlarmDeepLink(AlarmType.결제, '')).toBe(
      resolveAlarmDeepLink('SND001' as AlarmType, ''),
    );
    expect(resolveAlarmDeepLink(AlarmType.분석, '')).toBe(
      resolveAlarmDeepLink('SND002' as AlarmType, ''),
    );
    expect(resolveAlarmDeepLink(AlarmType.팩스, '')).toBe(
      resolveAlarmDeepLink('SND003' as AlarmType, ''),
    );
  });

  it('반환값은 항상 인앱 상대경로다 — 절대 URL 을 만들지 않는다', () => {
    const all = [
      resolveAlarmDeepLink(AlarmType.결제, ''),
      resolveAlarmDeepLink(AlarmType.분석, ''),
      resolveAlarmDeepLink(AlarmType.분석, '실손'),
      resolveAlarmDeepLink(AlarmType.팩스, ''),
      resolveAlarmDeepLink(AlarmType.이벤트, ''),
    ];
    all.forEach((p) => {
      expect(p.startsWith('/')).toBe(true);
      expect(p).not.toMatch(/^https?:/);
    });
  });
});
