import { MarkdownPipe } from './markdown.pipe' describe('MarkdownPipe', () => { const pipe = new MarkdownPipe() it('should return empty string for empty input', () => { expect(pipe.transform(null)).toEqual('') expect(pipe.transform(undefined)).toEqual('') expect(pipe.transform('')).toEqual('') }) it('should render basic markdown', () => { const html = pipe.transform( '**bold** _em_ `code`\n\n- one\n- two\n\n| a | b |\n|---|---|\n| 1 | 2 |' ) expect(html).toContain('bold') expect(html).toContain('em') expect(html).toContain('code') expect(html).toContain('
  • one
  • ') expect(html).toContain('') }) it('should escape raw html', () => { const html = pipe.transform( 'hi x\n\n' ) expect(html).not.toContain('') expect(html).toContain('<script>') }) it('should not render images', () => { const html = pipe.transform( '![secret](https://otherdomain.example/x.png?d=1)' ) expect(html).not.toContain(' { const html = pipe.transform('[docs](https://docs.paperless-ngx.com "Docs")') expect(html).toContain( 'docs' ) expect(pipe.transform('[mail](mailto:a@b.c)')).toContain( 'href="mailto:a@b.c"' ) }) it('should drop unsafe or relative links but keep their text', () => { for (const href of [ 'javascript:alert(1)', 'JaVaScRiPt:alert(1)', 'data:text/html,', 'vbscript:msgbox', '/api/documents/', ]) { const html = pipe.transform(`[click](${href})`) expect(html).not.toContain(' { for (const protocol of ['http', 'https']) { const html = pipe.transform( `[docs.paperless-ngx.com](${protocol}://docs.paperless-ngx.com@otherdomain.example/path?secret=1)` ) expect(html).toContain( ' (otherdomain.example)' ) expect(html).not.toContain('(docs.paperless-ngx.com)') } }) it('should omit the hostname label for mailto links', () => { expect(pipe.transform('[mail](mailto:a@b.c)')).toBe( '

    mail

    \n' ) }) it('should escape link titles', () => { const html = pipe.transform( '[x](https://a.example "a\\" onmouseover=\\"1")' ) expect(html).not.toMatch(/"\s*onmouseover=/) }) })