diff --git a/apps/settings/src/components/Markdown.cy.ts b/apps/settings/src/components/Markdown.cy.ts
new file mode 100644
index 0000000000000..ccdf43c26df87
--- /dev/null
+++ b/apps/settings/src/components/Markdown.cy.ts
@@ -0,0 +1,58 @@
+/*!
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import Markdown from './Markdown.vue'
+
+describe('Markdown component', () => {
+ it('renders links', () => {
+ cy.mount(Markdown, {
+ propsData: {
+ text: 'This is [a link](http://example.com)!',
+ },
+ })
+
+ cy.contains('This is')
+ .find('a')
+ .should('exist')
+ .and('have.attr', 'href', 'http://example.com')
+ .and('contain.text', 'a link')
+ })
+
+ it('renders headings', () => {
+ cy.mount(Markdown, {
+ propsData: {
+ text: '# level 1\nText\n## level 2\nText\n### level 3\nText\n#### level 4\nText\n##### level 5\nText\n###### level 6\nText\n',
+ },
+ })
+
+ for (let level = 1; level <= 6; level++) {
+ cy.contains(`h${level}`, `level ${level}`)
+ .should('be.visible')
+ }
+ })
+
+ it('can limit headings', () => {
+ cy.mount(Markdown, {
+ propsData: {
+ text: '# level 1\nText\n## level 2\nText\n### level 3\nText\n#### level 4\nText\n##### level 5\nText\n###### level 6\nText\n',
+ minHeading: 4,
+ },
+ })
+
+ cy.get('h1').should('not.exist')
+ cy.get('h2').should('not.exist')
+ cy.get('h3').should('not.exist')
+ cy.get('h4')
+ .should('exist')
+ .and('contain.text', 'level 1')
+ cy.get('h5')
+ .should('exist')
+ .and('contain.text', 'level 2')
+ cy.contains('h6', 'level 3').should('exist')
+ cy.contains('h6', 'level 4').should('exist')
+ cy.contains('h6', 'level 5').should('exist')
+ cy.contains('h6', 'level 6').should('exist')
+ })
+})
diff --git a/apps/settings/src/components/Markdown.vue b/apps/settings/src/components/Markdown.vue
index 18a9ea39018cd..cd236432638df 100644
--- a/apps/settings/src/components/Markdown.vue
+++ b/apps/settings/src/components/Markdown.vue
@@ -26,7 +26,7 @@ export default {
computed: {
renderMarkdown() {
const renderer = new marked.Renderer()
- renderer.link = function(href, title, text) {
+ renderer.link = function({ href, title, text }) {
let prot
try {
prot = decodeURIComponent(unescape(href))
@@ -47,18 +47,18 @@ export default {
out += '>' + text + ''
return out
}
- renderer.heading = (text, level) => {
- level = Math.min(6, level + (this.minHeading - 1))
- return `
${text}` } return dompurify.sanitize( marked(this.text.trim(), { @@ -99,45 +99,13 @@ export default { diff --git a/cypress.config.ts b/cypress.config.ts index e9b09f2012d11..8bf65b90fa0cf 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -110,6 +110,7 @@ export default defineConfig({ }, component: { + specPattern: ['core/**/*.cy.ts', 'apps/**/*.cy.ts'], devServer: { framework: 'vue', bundler: 'webpack',