import { AligoService } from './aligo.service';

describe('AligoService 문자 대체발송 스위치(ALIGO_FORCE_SMS)', () => {
  const dto = {
    tpl_code: 'TY_2331',
    sender: '1533-5948',
    receiver_1: '01012345678',
    recvname_1: '홍길동',
    subject_1: '알림톡 제목',
    message_1: '알림톡 본문',
    button_1: '',
    failover: 'Y',
    fsubject_1: '보험유니버스 진료정보분석 안내',
    fmessage_1: '대체문자 본문\nhttps://example.test/alimtalk/redirect/a1',
    testMode: 'N',
  };

  function build(env: Record<string, string>, response: unknown) {
    const config = {
      'aligo.apiKey': 'api-key',
      'aligo.senderKey': 'sender-key',
      'aligo.userId': 'user-id',
      'aligo.baseUrl': 'https://kakaoapi.aligo.in/akv10',
      'aligo.alimtalkEndPoint': '/alimtalk/send/',
      ...env,
    } as Record<string, string>;
    const post = jest.fn().mockResolvedValue(response);
    const service = new AligoService(
      { get: (k: string) => config[k] } as any,
      { post } as any,
    );
    return { service, post };
  }

  it('스위치가 없으면 알림톡 API 로 보낸다', async () => {
    const { service, post } = build(
      {},
      { code: 0, message: 'ok', info: { mid: 7 } },
    );
    const res = await service.send(dto);
    expect(post.mock.calls[0][0]).toBe(
      'https://kakaoapi.aligo.in/akv10/alimtalk/send/',
    );
    expect(post.mock.calls[0][1]).toMatchObject({
      tpl_code: 'TY_2331',
      apikey: 'api-key',
    });
    expect(res.info?.mid).toBe(7);
  });

  it('ALIGO_FORCE_SMS=Y 면 대체문자 내용을 문자 API 로 보내고 알림톡 응답 모양으로 돌려준다', async () => {
    const { service, post } = build(
      { ALIGO_FORCE_SMS: 'Y' },
      {
        result_code: '1',
        message: 'success',
        msg_id: '123',
        success_cnt: 1,
        error_cnt: 0,
        msg_type: 'LMS',
      },
    );
    const res = await service.send(dto);
    expect(post.mock.calls[0][0]).toBe('https://apis.aligo.in/send/');
    expect(post.mock.calls[0][1]).toEqual({
      key: 'api-key',
      user_id: 'user-id',
      sender: '15335948',
      receiver: '01012345678',
      msg_type: 'LMS',
      title: '보험유니버스 진료정보분석 안내',
      msg: '대체문자 본문\nhttps://example.test/alimtalk/redirect/a1',
      testmode_yn: 'N',
    });
    expect(res.code).toBe(0);
    //* mid 가 비어야 알림톡 상태 스케줄러가 이 행을 알림톡 이력으로 조회하지 않는다.
    expect(res.info?.mid).toBeUndefined();
    expect(res.info?.scnt).toBe(1);
  });

  it('문자 API 실패(result_code≠1)는 code≠0 으로 돌려 호출부가 실패로 기록하게 한다', async () => {
    const { service } = build(
      { ALIGO_FORCE_SMS: 'Y' },
      { result_code: -101, message: '인증오류입니다.' },
    );
    const res = await service.send(dto);
    expect(res.code).toBe(-101);
    expect(res.message).toBe('인증오류입니다.');
  });
});
