| /** |
| * @license |
| * Copyright 2022 Google LLC |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| import '../../../test/common-test-setup'; |
| import {assert, fixture, html} from '@open-wc/testing'; |
| import {changeModelToken} from '../../../models/change/change-model'; |
| import { |
| ConfigModel, |
| configModelToken, |
| } from '../../../models/config/config-model'; |
| import {wrapInProvider} from '../../../models/di-provider-element'; |
| import {getAppContext} from '../../../services/app-context'; |
| import './gr-markdown'; |
| import {GrMarkdown} from './gr-markdown'; |
| import {createConfig} from '../../../test/test-data-generators'; |
| import {waitUntilObserved} from '../../../test/test-utils'; |
| import {CommentLinks} from '../../../api/rest-api'; |
| import {testResolver} from '../../../test/common-test-setup'; |
| |
| suite('gr-markdown tests', () => { |
| let element: GrMarkdown; |
| let configModel: ConfigModel; |
| |
| async function setCommentLinks(commentlinks: CommentLinks) { |
| configModel.updateRepoConfig({...createConfig(), commentlinks}); |
| await waitUntilObserved( |
| configModel.repoCommentLinks$, |
| links => links === commentlinks |
| ); |
| } |
| |
| setup(async () => { |
| configModel = new ConfigModel( |
| testResolver(changeModelToken), |
| getAppContext().restApiService |
| ); |
| await setCommentLinks({ |
| customLinkRewrite: { |
| match: '(LinkRewriteMe)', |
| link: 'http://google.com/$1', |
| }, |
| customHtmlRewrite: { |
| match: 'HTMLRewriteMe', |
| html: '<div>HTMLRewritten</div>', |
| }, |
| }); |
| element = ( |
| await fixture( |
| wrapInProvider( |
| html`<gr-markdown></gr-markdown>`, |
| configModelToken, |
| configModel |
| ) |
| ) |
| ).querySelector('gr-markdown')!; |
| }); |
| |
| test('renders plain text with links and rewrites', async () => { |
| element.markdown = `text |
| \ntext with plain link: google.com |
| \ntext with config link: LinkRewriteMe |
| \ntext with config html: HTMLRewriteMe`; |
| await element.updateComplete; |
| |
| assert.shadowDom.equal( |
| element, |
| /* HTML */ ` |
| <marked-element> |
| <div slot="markdown-html"> |
| <p>text</p> |
| <p> |
| text with plain link: |
| <a href="http://google.com" rel="noopener" target="_blank"> |
| google.com |
| </a> |
| </p> |
| <p> |
| text with config link: |
| <a |
| href="http://google.com/LinkRewriteMe" |
| rel="noopener" |
| target="_blank" |
| > |
| LinkRewriteMe |
| </a> |
| </p> |
| <p>text with config html:</p> |
| <div>HTMLRewritten</div> |
| <p></p> |
| </div> |
| </marked-element> |
| ` |
| ); |
| }); |
| |
| test('renders headings with links and rewrites', async () => { |
| element.markdown = `# h1-heading |
| \n## h2-heading |
| \n### h3-heading |
| \n#### h4-heading |
| \n##### h5-heading |
| \n###### h6-heading |
| \n# heading with plain link: google.com |
| \n# heading with config link: LinkRewriteMe |
| \n# heading with config html: HTMLRewriteMe`; |
| await element.updateComplete; |
| |
| assert.shadowDom.equal( |
| element, |
| /* HTML */ ` |
| <marked-element> |
| <div slot="markdown-html"> |
| <h1 id="h1-heading">h1-heading</h1> |
| <h2 id="h2-heading">h2-heading</h2> |
| <h3 id="h3-heading">h3-heading</h3> |
| <h4 id="h4-heading">h4-heading</h4> |
| <h5 id="h5-heading">h5-heading</h5> |
| <h6 id="h6-heading">h6-heading</h6> |
| <h1 id="heading-with-plain-link-google-com"> |
| heading with plain link: |
| <a href="http://google.com" rel="noopener" target="_blank"> |
| google.com |
| </a> |
| </h1> |
| <h1 id="heading-with-config-link-linkrewriteme"> |
| heading with config link: |
| <a |
| href="http://google.com/LinkRewriteMe" |
| rel="noopener" |
| target="_blank" |
| > |
| LinkRewriteMe |
| </a> |
| </h1> |
| <h1 id="heading-with-config-html-htmlrewriteme"> |
| heading with config html: |
| <div>HTMLRewritten</div> |
| </h1> |
| </div> |
| </marked-element> |
| ` |
| ); |
| }); |
| |
| test('renders inline-code without linking or rewriting', async () => { |
| element.markdown = `\`inline code\` |
| \n\`inline code with plain link: google.com\` |
| \n\`inline code with config link: LinkRewriteMe\` |
| \n\`inline code with config html: HTMLRewriteMe\``; |
| await element.updateComplete; |
| |
| assert.shadowDom.equal( |
| element, |
| /* HTML */ ` |
| <marked-element> |
| <div slot="markdown-html"> |
| <p> |
| <code> inline code </code> |
| </p> |
| <p> |
| <code> inline code with plain link: google.com </code> |
| </p> |
| <p> |
| <code> inline code with config link: LinkRewriteMe </code> |
| </p> |
| <p> |
| <code> inline code with config html: HTMLRewriteMe </code> |
| </p> |
| </div> |
| </marked-element> |
| ` |
| ); |
| }); |
| test('renders multiline-code without linking or rewriting', async () => { |
| element.markdown = `\`\`\`\nmultiline code\n\`\`\` |
| \n\`\`\`\nmultiline code with plain link: google.com\n\`\`\` |
| \n\`\`\`\nmultiline code with config link: LinkRewriteMe\n\`\`\` |
| \n\`\`\`\nmultiline code with config html: HTMLRewriteMe\n\`\`\``; |
| await element.updateComplete; |
| |
| assert.shadowDom.equal( |
| element, |
| /* HTML */ ` |
| <marked-element> |
| <div slot="markdown-html"> |
| <pre> |
| <code> multiline code </code> |
| </pre> |
| <pre> |
| <code> multiline code with plain link: google.com </code> |
| </pre> |
| <pre> |
| <code> multiline code with config link: LinkRewriteMe </code> |
| </pre> |
| <pre> |
| <code> multiline code with config html: HTMLRewriteMe </code> |
| </pre> |
| </div> |
| </marked-element> |
| ` |
| ); |
| }); |
| |
| test('does not render inline images into <img> tags', async () => { |
| element.markdown = '![img](google.com/img.png)'; |
| await element.updateComplete; |
| |
| assert.shadowDom.equal( |
| element, |
| /* HTML */ ` |
| <marked-element> |
| <div slot="markdown-html"> |
| <p>![img](google.com/img.png)</p> |
| </div> |
| </marked-element> |
| ` |
| ); |
| }); |
| |
| test('renders inline links into <a> tags', async () => { |
| element.markdown = '[myLink](https://www.google.com)'; |
| await element.updateComplete; |
| |
| assert.shadowDom.equal( |
| element, |
| /* HTML */ ` |
| <marked-element> |
| <div slot="markdown-html"> |
| <p> |
| <a href="https://www.google.com">myLink</a> |
| </p> |
| </div> |
| </marked-element> |
| ` |
| ); |
| }); |
| |
| test('renders block quotes with links and rewrites', async () => { |
| element.markdown = `> block quote |
| \n> block quote with plain link: google.com |
| \n> block quote with config link: LinkRewriteMe |
| \n> block quote with config html: HTMLRewriteMe`; |
| await element.updateComplete; |
| |
| assert.shadowDom.equal( |
| element, |
| /* HTML */ ` |
| <marked-element> |
| <div slot="markdown-html"> |
| <blockquote> |
| <p>block quote</p> |
| </blockquote> |
| <blockquote> |
| <p> |
| block quote with plain link: |
| <a href="http://google.com" rel="noopener" target="_blank"> |
| google.com |
| </a> |
| </p> |
| </blockquote> |
| <blockquote> |
| <p> |
| block quote with config link: |
| <a |
| href="http://google.com/LinkRewriteMe" |
| rel="noopener" |
| target="_blank" |
| > |
| LinkRewriteMe |
| </a> |
| </p> |
| </blockquote> |
| <blockquote> |
| <p>block quote with config html:</p> |
| <div>HTMLRewritten</div> |
| <p></p> |
| </blockquote> |
| </div> |
| </marked-element> |
| ` |
| ); |
| }); |
| |
| test('never renders typed html', async () => { |
| element.markdown = `plain text <div>foo</div> |
| \n\`inline code <div>foo</div>\` |
| \n\`\`\`\nmultiline code <div>foo</div>\`\`\` |
| \n> block quote <div>foo</div> |
| \n[inline link <div>foo</div>](http://google.com)`; |
| await element.updateComplete; |
| |
| const escapedDiv = '<div>foo</div>'; |
| assert.shadowDom.equal( |
| element, |
| /* HTML */ ` |
| <marked-element> |
| <div slot="markdown-html"> |
| <p>plain text ${escapedDiv}</p> |
| <p> |
| <code> inline code ${escapedDiv} </code> |
| </p> |
| <pre> |
| <code> |
| multiline code ${escapedDiv} |
| </code> |
| </pre> |
| <blockquote> |
| <p>block quote ${escapedDiv}</p> |
| </blockquote> |
| <p> |
| <a href="http://google.com"> inline link ${escapedDiv} </a> |
| </p> |
| </div> |
| </marked-element> |
| ` |
| ); |
| }); |
| }); |