import {
  sanitizeBoardContent,
  sanitizeBoardTitle,
  sanitizeTermsContent,
} from './sanitize.helper';

describe('sanitizeTermsContent', () => {
  it('약관 표 형식은 보존하고 실행 가능한 HTML은 제거한다', () => {
    const result = sanitizeTermsContent(`
      <script>alert('xss')</script>
      <style>.danger { color: red; }</style>
      <table class="terms" width="100%" align="center" role="text" style="color:red" onclick="alert(1)">
        <caption><small>수집 항목</small></caption>
        <colgroup><col width="40%" onmouseover="alert(1)"></colgroup>
        <tfoot><tr><td colspan="2" rowspan="1" align="right">안내</td></tr></tfoot>
      </table>
      <pre class="notice">보존 문구</pre>
      <a href="javascript:alert(1)" onfocus="alert(1)">링크</a>
    `);

    expect(result).toContain(
      '<table class="terms" width="100%" align="center" role="text">',
    );
    expect(result).toContain('<caption><small>수집 항목</small></caption>');
    expect(result).toContain('<colgroup><col width="40%"></col></colgroup>');
    expect(result).toContain(
      '<tfoot><tr><td colspan="2" rowspan="1" align="right">안내</td></tr></tfoot>',
    );
    expect(result).toContain('<pre class="notice">보존 문구</pre>');
    expect(result).not.toMatch(/<script|<style|\sstyle=|\son\w+=|javascript:/i);
  });
});

describe('sanitizeBoardContent', () => {
  it('에디터의 업로드 이미지와 글자색·배경색은 남기고 실행 가능한 HTML은 제거한다', () => {
    const result = sanitizeBoardContent(
      '<p class="ql-align-center"><span style="color: rgb(230, 0, 0); position: fixed">빨강</span>' +
        '<span style="background-color: #ffff00">노랑</span>' +
        '<img src="https://cdn.example.com/a.png" alt="uploaded image" onerror="alert(1)">' +
        '<img src="javascript:alert(1)"><img src="data:image/svg+xml;base64,AA">' +
        '<span style="color: url(javascript:alert(1))">x</span><script>alert(1)</script></p>',
    );

    expect(result).toContain('<p class="ql-align-center">');
    expect(result).toContain('<span style="color:rgb(230, 0, 0)">빨강</span>');
    expect(result).toContain(
      '<span style="background-color:#ffff00">노랑</span>',
    );
    expect(result).toContain(
      '<img src="https://cdn.example.com/a.png" alt="uploaded image" />',
    );
    expect(result).not.toMatch(/javascript:|data:|onerror|position|<script/i);
  });
});

describe('sanitizeBoardTitle', () => {
  it('태그는 지우고 & 는 그대로 두며 꺾쇠는 이스케이프한다', () => {
    expect(sanitizeBoardTitle('A & B <b>공지</b>')).toBe('A & B 공지');
    expect(sanitizeBoardTitle('<img src=x onerror=alert(1)>1<2')).toBe(
      '1&lt;2',
    );
    expect(sanitizeBoardTitle(null)).toBeNull();
  });
});
