blob: 65562a37587aabbb64d1d3e217f6f94fb356bba4 [file] [log] [blame]
import { expect } from 'chai';
import { escapeAndLinkify } from './linkify';
describe('formatAndLinkify', () => {
it('wraps links in anchor tags', () => {
test(
'http://example.com',
'<a href="http://example.com" target="_blank" rel="noopener">http://example.com</a>'
);
test(
'visit https://example.com for more',
'visit <a href="https://example.com" target="_blank" rel="noopener">' +
'https://example.com</a> for more'
);
});
it('replaces newlines with <br/>', () => {
test(
'hello \n world \r\n good \t to \\ see \r you',
'hello <br> world <br> good \t to \\ see <br> you'
);
});
it('replaces expands bug shorthand with anchor tags', () => {
test(
'skia:1234',
'<a href="http://skbug.com/1234" target="_blank" rel="noopener">skia:1234</a>'
);
test(
'chromium:123456789101112',
'<a href="http://crbug.com/123456789101112" target="_blank" rel="noopener">' +
'chromium:123456789101112</a>'
);
test(
'v8:42',
'<a href="http://crbug.com/v8/42" target="_blank" rel="noopener">v8:42</a>'
);
test(
'See skia:1234 and skia:456',
'See <a href="http://skbug.com/1234" target="_blank" rel="noopener">skia:1234</a> ' +
'and <a href="http://skbug.com/456" target="_blank" rel="noopener">skia:456</a>'
);
});
it('does not replace invalid shorthand', () => {
test('skia:abcd', 'skia:abcd');
test('unknown:123', 'unknown:123');
test('skia:', 'skia:');
});
it('escapes tags, to avoid XSS', () => {
test('<div>foo</div>', '&lt;div&gt;foo&lt;/div&gt;');
test(
'<script>alert("xss")</script>',
'&lt;script&gt;alert("xss")&lt;/script&gt;'
);
});
it('does all of the above at once', () => {
test(
'<b>Hey<b>, check out skia:9000 \n and http://www.example.com/cool/thing?special=true',
'&lt;b&gt;Hey&lt;b&gt;, check out ' +
'<a href="http://skbug.com/9000" target="_blank" rel="noopener">skia:9000</a> ' +
'<br> and <a href="http://www.example.com/cool/thing?special=true" ' +
'target="_blank" rel="noopener">http://www.example.com/cool/thing?special=true</a>'
);
});
it('handles newline following link', () => {
test(
'Reviewed-on: https://skia-review.googlesource.com/c/skia/+/123\nfoo',
'Reviewed-on: <a href="https://skia-review.googlesource.com/c/skia/+/123" target="_blank" rel="noopener">https://skia-review.googlesource.com/c/skia/+/123</a><br>foo'
);
});
});
const test = (input: string, output: string) => {
expect((escapeAndLinkify(input) as HTMLDivElement).innerHTML).to.equal(
output
);
};