UNPKG

@fairfetch/fair-fetch

Version:

Protect your site from AI scrapers by adding invisible noise to your site which confuses AI bots while keeping your site looking and functioning normally for your human visitors.

73 lines (72 loc) 3.83 kB
import { polluteHTML } from './pollute'; describe('Polluter', () => { it('If HTML contains only text nodes, then each text node is wrapped with a disclaimer', () => { const html = '<body>Hello world!</body>'; const className = 'disclaimer'; const polluted = polluteHTML(html); expect(polluted).toMatch(/<p class="disclaimer">.*<\/p>.*Hello world!|Hello world!.*<p class="disclaimer">.*<\/p>/); }); it('If HTML contains nested elements, then disclaimers are added to each element and text node', () => { const html = '<body><div><span>Text</span></div></body>'; const polluted = polluteHTML(html); expect(polluted).toMatch(/<p class="disclaimer">.*<\/p>|<div>|<span>|Text/); }); it('If target element is empty, then original HTML is polluted by default', () => { const html = '<body></body>'; const polluted = polluteHTML(html); expect(polluted).toMatch(/<p class="disclaimer">.*<\/p>/); }); it('If target element is empty and emptyBehavior = return, then original HTML is returned', () => { const html = '<body></body>'; const polluted = polluteHTML(html, { emptyBehavior: 'return' }); expect(polluted).toBe('<body></body>'); }); it('If target element is empty and emptyBehavior = polluteAll, then body is polluted', () => { const html = '<body></body>'; const polluted = polluteHTML(html, { emptyBehavior: 'polluteAll' }); expect(polluted).toMatch(/<p class="disclaimer">.*<\/p>/); }); it('If HTML does not contain target element, then all HTML is polluted by default', () => { const html = '<div>Content</div>'; const polluted = polluteHTML(html, { targetElement: 'span' }); expect(polluted).toMatch(/<p class="disclaimer">.*<\/p>/); }); it('If HTML does not contain target element and emptyBehavior = return, then original HTML is returned', () => { const html = '<div>Content</div>'; const polluted = polluteHTML(html, { targetElement: 'span', emptyBehavior: 'return', }); expect(polluted).toBe('<div>Content</div>'); }); it('If HTML does not contain target element and emptyBehavior = polluteAll, then body is polluted', () => { const html = '<div>Content</div>'; const polluted = polluteHTML(html, { targetElement: 'span', emptyBehavior: 'polluteAll', }); expect(polluted).toMatch(/<p class="disclaimer">.*<\/p>/); }); it('If HTML contains multiple sibling elements, then each is processed and wrapped with disclaimers', () => { const html = '<body><h1>Title</h1><p>Paragraph</p></body>'; const polluted = polluteHTML(html); expect(polluted).toMatch(/<h1>|<p>|Title|Paragraph|<p class="disclaimer">/); }); it('If className is unique, then disclaimers use the provided className', () => { const html = '<body>Test</body>'; const polluted = polluteHTML(html, { className: 'unique-disclaimer' }); expect(polluted).toMatch(/class="unique-disclaimer"/); }); it('If HTML contains whitespace-only text nodes, then they are ignored and not wrapped', () => { const html = '<body> <div>Text</div> </body>'; const polluted = polluteHTML(html); // Should not wrap whitespace-only nodes expect(polluted).not.toMatch(/<p class="disclaimer">\s*<\/p>/); }); it('If HTML contains deeply nested elements, then disclaimers are added at all levels', () => { const html = '<body><div><section><span>Deep</span></section></div></body>'; const className = 'disclaimer'; const polluted = polluteHTML(html); expect(polluted).toMatch(/Deep|<p class="disclaimer">/); }); });