Adjust editor config (#976)

* Adjust editor config

Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
Co-authored-by: Erik Michelson <github@erik.michelson.eu>
This commit is contained in:
Tilman Vatteroth 2021-02-03 22:13:04 +01:00 committed by GitHub
parent 0180c75e55
commit e12dc523f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
301 changed files with 4393 additions and 3741 deletions

View file

@ -24,7 +24,9 @@ describe('Banner', () => {
.find('.fa-times')
.click()
.then(() => {
expect(localStorage.getItem('bannerTimeStamp')).to.equal(banner.timestamp)
expect(localStorage.getItem('bannerTimeStamp'))
.to
.equal(banner.timestamp)
})
cy.get('.alert-primary.show')
.should('not.exist')

View file

@ -16,73 +16,73 @@ describe('Document Title', () => {
describe('title should be yaml metadata title', () => {
it('just yaml metadata title', () => {
cy.codemirrorFill(`---\ntitle: ${title}\n---`)
cy.codemirrorFill(`---\ntitle: ${ title }\n---`)
cy.title()
.should('eq', `${title} - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } - HedgeDoc @ ${ branding.name }`)
})
it('yaml metadata title and opengraph title', () => {
cy.codemirrorFill(`---\ntitle: ${title}\nopengraph:\n title: False title\n---`)
cy.codemirrorFill(`---\ntitle: ${ title }\nopengraph:\n title: False title\n---`)
cy.title()
.should('eq', `${title} - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } - HedgeDoc @ ${ branding.name }`)
})
it('yaml metadata title, opengraph title and first heading', () => {
cy.codemirrorFill(`---\ntitle: ${title}\nopengraph:\n title: False title\n---\n# a first title`)
cy.codemirrorFill(`---\ntitle: ${ title }\nopengraph:\n title: False title\n---\n# a first title`)
cy.title()
.should('eq', `${title} - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } - HedgeDoc @ ${ branding.name }`)
})
})
describe('title should be opengraph title', () => {
it('just opengraph title', () => {
cy.codemirrorFill(`---\nopengraph:\n title: ${title}\n---`)
cy.codemirrorFill(`---\nopengraph:\n title: ${ title }\n---`)
cy.title()
.should('eq', `${title} - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } - HedgeDoc @ ${ branding.name }`)
})
it('opengraph title and first heading', () => {
cy.codemirrorFill(`---\nopengraph:\n title: ${title}\n---\n# a first title`)
cy.codemirrorFill(`---\nopengraph:\n title: ${ title }\n---\n# a first title`)
cy.title()
.should('eq', `${title} - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } - HedgeDoc @ ${ branding.name }`)
})
})
describe('title should be first heading', () => {
it('just first heading', () => {
cy.codemirrorFill(`# ${title}`)
cy.codemirrorFill(`# ${ title }`)
cy.title()
.should('eq', `${title} - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } - HedgeDoc @ ${ branding.name }`)
})
it('just first heading with alt-text instead of image', () => {
cy.codemirrorFill(`# ${title} ![abc](https://dummyimage.com/48)`)
cy.codemirrorFill(`# ${ title } ![abc](https://dummyimage.com/48)`)
cy.title()
.should('eq', `${title} abc - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } abc - HedgeDoc @ ${ branding.name }`)
})
it('just first heading without link syntax', () => {
cy.codemirrorFill(`# ${title} [link](https://hedgedoc.org)`)
cy.codemirrorFill(`# ${ title } [link](https://hedgedoc.org)`)
cy.title()
.should('eq', `${title} link - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } link - HedgeDoc @ ${ branding.name }`)
})
it('markdown syntax removed first', () => {
cy.codemirrorFill(`# ${title} 1*2*3 4*5**`)
cy.codemirrorFill(`# ${ title } 1*2*3 4*5**`)
cy.title()
.should('eq', `${title} 123 4*5** - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } 123 4*5** - HedgeDoc @ ${ branding.name }`)
})
it('markdown syntax removed second', () => {
cy.codemirrorFill(`# ${title} **1 2*`)
cy.codemirrorFill(`# ${ title } **1 2*`)
cy.title()
.should('eq', `${title} *1 2 - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } *1 2 - HedgeDoc @ ${ branding.name }`)
})
it('markdown syntax removed third', () => {
cy.codemirrorFill(`# ${title} _asd_`)
cy.codemirrorFill(`# ${ title } _asd_`)
cy.title()
.should('eq', `${title} asd - HedgeDoc @ ${branding.name}`)
.should('eq', `${ title } asd - HedgeDoc @ ${ branding.name }`)
})
it('katex code looks right', () => {
@ -93,7 +93,7 @@ describe('Document Title', () => {
cy.get('.CodeMirror textarea')
.type('{Enter}{Enter}{Enter}{Enter}{Enter}') //This is a workaround because I don't know how to make sure, that the title gets updated in time.
cy.title()
.should('eq', `α-foo - HedgeDoc @ ${branding.name}`)
.should('eq', `α-foo - HedgeDoc @ ${ branding.name }`)
})
})
})

View file

@ -6,7 +6,7 @@
describe('Export', () => {
const testTitle = 'testContent'
const testContent = `---\ntitle: ${testTitle}\n---\nThis is some test content`
const testContent = `---\ntitle: ${ testTitle }\n---\nThis is some test content`
beforeEach(() => {
cy.visitTestEditor()

View file

@ -45,35 +45,40 @@ describe('File upload', () => {
cy.get('div.btn-group > input[type=file]')
.attachFile({ filePath: 'acme.png', mimeType: 'image/png' })
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `![](${imageUrl})`)
.should('have.text', `![](${ imageUrl })`)
})
it('via paste', () => {
cy.fixture('acme.png').then((image: string) => {
const pasteEvent = {
clipboardData: {
files: [Cypress.Blob.base64StringToBlob(image, 'image/png')]
cy.fixture('acme.png')
.then((image: string) => {
const pasteEvent = {
clipboardData: {
files: [Cypress.Blob.base64StringToBlob(image, 'image/png')]
}
}
}
cy.get('.CodeMirror-scroll').trigger('paste', pasteEvent)
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `![](${imageUrl})`)
})
cy.get('.CodeMirror-scroll')
.trigger('paste', pasteEvent)
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `![](${ imageUrl })`)
})
})
it('via drag and drop', () => {
cy.fixture('acme.png').then((image: string) => {
const dropEvent = {
dataTransfer: {
files: [Cypress.Blob.base64StringToBlob(image, 'image/png')],
effectAllowed: 'uninitialized'
cy.fixture('acme.png')
.then((image: string) => {
const dropEvent = {
dataTransfer: {
files: [Cypress.Blob.base64StringToBlob(image, 'image/png')],
effectAllowed: 'uninitialized'
}
}
}
cy.get('.CodeMirror-scroll').trigger('dragenter', dropEvent)
cy.get('.CodeMirror-scroll').trigger('drop', dropEvent)
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `![](${imageUrl})`)
})
cy.get('.CodeMirror-scroll')
.trigger('dragenter', dropEvent)
cy.get('.CodeMirror-scroll')
.trigger('drop', dropEvent)
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `![](${ imageUrl })`)
})
})
})
@ -86,10 +91,11 @@ describe('File upload', () => {
})
cy.get('.fa-upload')
.click()
cy.fixture('acme.png').then(() => {
cy.get('input[type=file]')
.attachFile({ filePath: 'acme.png', mimeType: 'image/png' })
})
cy.fixture('acme.png')
.then(() => {
cy.get('input[type=file]')
.attachFile({ filePath: 'acme.png', mimeType: 'image/png' })
})
cy.get('.CodeMirror-activeline > .CodeMirror-line > span > span')
.should('have.text', String.fromCharCode(8203)) //thanks codemirror....
})
@ -101,8 +107,9 @@ describe('File upload', () => {
getData: (type = 'text') => testText
}
}
cy.get('.CodeMirror-scroll').trigger('paste', pasteEvent)
cy.get('.CodeMirror-scroll')
.trigger('paste', pasteEvent)
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `${testText}`)
.should('have.text', `${ testText }`)
})
})

View file

@ -6,8 +6,8 @@
const findHljsCodeBlock = () => {
return cy.getMarkdownBody()
.find('pre > code.hljs')
.should('be.visible')
.find('pre > code.hljs')
.should('be.visible')
}
describe('Code', () => {
@ -160,14 +160,15 @@ describe('Code', () => {
return cy.wrap(null)
}
cy.spy(frame.contentWindow.navigator.clipboard, 'writeText').as("copy")
cy.spy(frame.contentWindow.navigator.clipboard, 'writeText')
.as('copy')
})
cy.getMarkdownRenderer()
.find('[data-cy="copy-code-button"]')
.click()
cy.get("@copy")
cy.get('@copy')
.should('be.calledWithExactly', 'let x = 0\n')
})
})

View file

@ -17,7 +17,8 @@ describe('Languages', () => {
cy.get('@languages')
.should('have.length', 28)
languages.forEach(language => {
cy.get('@languages').contains(language)
cy.get('@languages')
.contains(language)
})
})

View file

@ -64,14 +64,16 @@ describe('Links Intro', () => {
describe('Menu Buttons logged in', () => {
it('New note', () => {
cy.get('.d-inline-flex.btn-primary').click()
cy.get('.d-inline-flex.btn-primary')
.click()
cy.url()
.should('include', '/new')
})
describe('User Menu', () => {
beforeEach(() => {
cy.get('#dropdown-user').click()
cy.get('#dropdown-user')
.click()
})
it('Features', () => {

View file

@ -7,7 +7,7 @@
describe('The status bar text length info', () => {
const warningTestContent = ('0123456789'.repeat(10))
const dangerTestContent = ('0123456789'.repeat(20))
const tooMuchTestContent = `${dangerTestContent}a`
const tooMuchTestContent = `${ dangerTestContent }a`
beforeEach(() => {
cy.visitTestEditor()

View file

@ -12,7 +12,7 @@ describe('profile page', () => {
}, {
body: [
{
label: "cypress-App",
label: 'cypress-App',
created: 1601991518
}
]

View file

@ -21,7 +21,7 @@ describe('Toolbar Buttons', () => {
beforeEach(() => {
cy.codemirrorFill(testText)
cy.get('.CodeMirror-line > span')
.should("exist")
.should('exist')
.should('have.text', testText)
})
@ -35,42 +35,42 @@ describe('Toolbar Buttons', () => {
cy.get('.btn-toolbar [data-cy="format-bold"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `**${testText}**`)
.should('have.text', `**${ testText }**`)
})
it('should format as italic', () => {
cy.get('.btn-toolbar [data-cy="format-italic"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `*${testText}*`)
.should('have.text', `*${ testText }*`)
})
it('should format as underline', () => {
cy.get('.btn-toolbar [data-cy="format-underline"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `++${testText}++`)
.should('have.text', `++${ testText }++`)
})
it('should format as strikethrough', () => {
cy.get('.btn-toolbar [data-cy="format-strikethrough"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `~~${testText}~~`)
.should('have.text', `~~${ testText }~~`)
})
it('should format as subscript', () => {
cy.get('.btn-toolbar [data-cy="format-subscript"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `~${testText}~`)
.should('have.text', `~${ testText }~`)
})
it('should format as superscript', () => {
cy.get('.btn-toolbar [data-cy="format-superscript"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `^${testText}^`)
.should('have.text', `^${ testText }^`)
})
it('should format the line as code block', () => {
@ -88,14 +88,14 @@ describe('Toolbar Buttons', () => {
cy.get('.btn-toolbar [data-cy="format-link"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `[${testText}](https://)`)
.should('have.text', `[${ testText }](https://)`)
})
it('should format as image', () => {
cy.get('.btn-toolbar [data-cy="format-image"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `![${testText}](https://)`)
.should('have.text', `![${ testText }](https://)`)
})
})
@ -103,11 +103,11 @@ describe('Toolbar Buttons', () => {
cy.get('.btn-toolbar [data-cy="format-heading"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `# ${testText}`)
.should('have.text', `# ${ testText }`)
cy.get('.fa-header')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `## ${testText}`)
.should('have.text', `## ${ testText }`)
})
it('should format the line as code', () => {
@ -125,58 +125,58 @@ describe('Toolbar Buttons', () => {
cy.get('.btn-toolbar [data-cy="format-block-quote"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `> ${testText}`)
.should('have.text', `> ${ testText }`)
cy.get('.btn-toolbar [data-cy="format-block-quote"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `> > ${testText}`)
.should('have.text', `> > ${ testText }`)
})
it('should format as unordered list', () => {
cy.get('.btn-toolbar [data-cy="format-unordered-list"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `- ${testText}`)
.should('have.text', `- ${ testText }`)
cy.get('.btn-toolbar [data-cy="format-unordered-list"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `- - ${testText}`)
.should('have.text', `- - ${ testText }`)
})
it('should format as ordered list', () => {
cy.get('.btn-toolbar [data-cy="format-ordered-list"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `1. ${testText}`)
.should('have.text', `1. ${ testText }`)
cy.get('.btn-toolbar [data-cy="format-ordered-list"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `1. 1. ${testText}`)
.should('have.text', `1. 1. ${ testText }`)
})
it('should format as check list', () => {
cy.get('.btn-toolbar [data-cy="format-check-list"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `- [ ] ${testText}`)
.should('have.text', `- [ ] ${ testText }`)
cy.get('.btn-toolbar [data-cy="format-check-list"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `- [ ] - [ ] ${testText}`)
.should('have.text', `- [ ] - [ ] ${ testText }`)
})
it('should insert links', () => {
cy.get('.btn-toolbar [data-cy="format-link"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `${testText}[](https://)`)
.should('have.text', `${ testText }[](https://)`)
})
it('should insert an empty image link', () => {
cy.get('.btn-toolbar [data-cy="format-image"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `${testText}![](https://)`)
.should('have.text', `${ testText }![](https://)`)
})
})
@ -184,7 +184,7 @@ describe('Toolbar Buttons', () => {
beforeEach(() => {
cy.codemirrorFill(testLink)
cy.get('.CodeMirror-line > span')
.should("exist")
.should('exist')
.should('have.text', testLink)
cy.get('@codeinput')
.type('{ctrl}a')
@ -194,14 +194,14 @@ describe('Toolbar Buttons', () => {
cy.get('.btn-toolbar [data-cy="format-link"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `[](${testLink})`)
.should('have.text', `[](${ testLink })`)
})
it('should format as image', () => {
cy.get('.btn-toolbar [data-cy="format-image"]')
.click()
cy.get('.CodeMirror-activeline > .CodeMirror-line > span')
.should('have.text', `![](${testLink})`)
.should('have.text', `![](${ testLink })`)
})
})

View file

@ -11,11 +11,12 @@ declare namespace Cypress {
* Custom command to check an external Link.
* @example cy.get(a#extern).checkExternalLink('http://example.com')
*/
checkExternalLink (url: string): Chainable<Element>
checkExternalLink(url: string): Chainable<Element>
}
}
Cypress.Commands.add('checkExternalLink', { prevSubject: 'element' }, ($element: JQuery, url: string) => {
cy.wrap($element).should('have.attr', 'href', url)
cy.wrap($element)
.should('have.attr', 'href', url)
.should('have.attr', 'target', '_blank')
})

View file

@ -50,9 +50,9 @@ beforeEach(() => {
sourceCodeUrl: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
issueTrackerUrl: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'
},
"iframeCommunication": {
"editorOrigin": "http://127.0.0.1:3001",
"rendererOrigin": "http://127.0.0.1:3001"
'iframeCommunication': {
'editorOrigin': 'http://127.0.0.1:3001',
'rendererOrigin': 'http://127.0.0.1:3001'
}
}
})

View file

@ -11,8 +11,9 @@ declare namespace Cypress {
* Custom command to fill an input field with text and trigger a change event.
* @example cy.get(input).fill('content')
*/
fill (value: string): Chainable<Element>
codemirrorFill (value: string): Chainable<Element>
fill(value: string): Chainable<Element>
codemirrorFill(value: string): Chainable<Element>
}
}
@ -20,17 +21,18 @@ Cypress.Commands.add('fill', {
prevSubject: 'element'
}, (subject, value) => {
return cy.wrap(subject)
.invoke('val', value)
.trigger('change', { force: true })
.invoke('val', value)
.trigger('change', { force: true })
})
Cypress.Commands.add('codemirrorFill', (content: string) => {
const line = content.split("\n").find(value => value !== '');
const line = content.split('\n')
.find(value => value !== '')
cy.get('.CodeMirror')
.click()
.get('textarea')
.fill(content)
if(line) {
if (line) {
cy.get('.CodeMirror')
.contains('.CodeMirror-line', line)
}

View file

@ -6,22 +6,22 @@
declare namespace Cypress {
interface Chainable {
getMarkdownRenderer (): Chainable<Element>
getMarkdownRenderer(): Chainable<Element>
getMarkdownBody (): Chainable<Element>
getMarkdownBody(): Chainable<Element>
}
}
Cypress.Commands.add('getMarkdownRenderer', () => {
return cy.get(`iframe[data-cy="documentIframe"]`)
.its('0.contentDocument')
.should('exist')
.its('body')
.should('not.be.undefined')
.then(cy.wrap.bind(cy))
.its('0.contentDocument')
.should('exist')
.its('body')
.should('not.be.undefined')
.then(cy.wrap.bind(cy))
})
Cypress.Commands.add('getMarkdownBody', () => {
return cy.getMarkdownRenderer()
.find('.markdown-body')
.find('.markdown-body')
})

View file

@ -11,11 +11,13 @@ declare namespace Cypress {
* Custom command to log the user out.
* @example cy.logout()
*/
logout (): Chainable<Window>
logout(): Chainable<Window>
}
}
Cypress.Commands.add('logout', () => {
cy.get('#dropdown-user').click()
cy.get('.fa-sign-out').click()
cy.get('#dropdown-user')
.click()
cy.get('.fa-sign-out')
.click()
})

View file

@ -6,28 +6,28 @@
declare namespace Cypress {
interface Chainable {
visitTestEditor (query?: string): Chainable<Cypress.AUTWindow>
visitTestEditor(query?: string): Chainable<Cypress.AUTWindow>
}
}
export const testNoteId = 'test'
Cypress.Commands.add('visitTestEditor', (query?: string) => {
return cy.visit(`/n/${testNoteId}${query ? `?${query}` : ''}`)
return cy.visit(`/n/${ testNoteId }${ query ? `?${ query }` : '' }`)
})
beforeEach(() => {
cy.intercept(`/api/v2/notes/${testNoteId}-get`, {
"id": "ABC123",
"alias": "banner",
"lastChange": {
"userId": "test",
"timestamp": 1600033920
cy.intercept(`/api/v2/notes/${ testNoteId }-get`, {
'id': 'ABC123',
'alias': 'banner',
'lastChange': {
'userId': 'test',
'timestamp': 1600033920
},
"viewCount": 0,
"createTime": 1600033920,
"content": "",
"authorship": [],
"preVersionTwoNote": true
'viewCount': 0,
'createTime': 1600033920,
'content': '',
'authorship': [],
'preVersionTwoNote': true
})
})

View file

@ -3,8 +3,15 @@
"strict": true,
"baseUrl": "../node_modules",
"target": "es6",
"lib": ["es6", "dom"],
"types": ["cypress" ,"cypress-commands", "cypress-file-upload"]
"lib": [
"es6",
"dom"
],
"types": [
"cypress",
"cypress-commands",
"cypress-file-upload"
]
},
"include": [
"**/*.ts"