2020-12-18 05:30:03 +00:00
'use strict' ;
2020-06-05 21:18:58 +00:00
/ *
* ACHTUNG : there is a copied & modified version of this file in
* < basedir > / t e s t s / c o n t a i n e r / s p a c s / a p i / p a d . j s
*
* TODO : unify those two files , and merge in a single one .
* /
2020-12-18 05:30:03 +00:00
/* eslint-disable max-len */
2020-10-08 05:37:17 +00:00
const common = require ( '../../common' ) ;
2020-11-23 18:21:51 +00:00
const supertest = require ( ` ${ _ _dirname } /../../../../src/node_modules/supertest ` ) ;
const settings = require ( ` ${ _ _dirname } /../../../../tests/container/loadSettings.js ` ) . loadSettings ( ) ;
const api = supertest ( ` http:// ${ settings . ip } : ${ settings . port } ` ) ;
2020-06-05 21:18:58 +00:00
2020-10-08 05:37:17 +00:00
const apiKey = common . apiKey ;
2020-11-23 18:21:51 +00:00
const apiVersion = 1 ;
2020-06-05 21:18:58 +00:00
2020-11-23 18:21:51 +00:00
const testImports = {
'malformed' : {
2020-06-05 21:18:58 +00:00
input : '<html><body><li>wtf</ul></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>wtf<br><br></body></html>' ,
2020-11-23 18:21:51 +00:00
expectedText : 'wtf\n\n' ,
2020-06-05 21:18:58 +00:00
} ,
2020-11-23 18:21:51 +00:00
'nonelistiteminlist #3620' : {
2020-06-05 21:18:58 +00:00
input : '<html><body><ul>test<li>FOO</li></ul></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body><ul class="bullet">test<li>FOO</ul><br></body></html>' ,
2020-11-23 18:21:51 +00:00
expectedText : '\ttest\n\t* FOO\n\n' ,
2020-06-05 21:18:58 +00:00
} ,
2020-11-23 18:21:51 +00:00
'whitespaceinlist #3620' : {
2020-06-05 21:18:58 +00:00
input : '<html><body><ul> <li>FOO</li></ul></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body><ul class="bullet"><li>FOO</ul><br></body></html>' ,
2020-11-23 18:21:51 +00:00
expectedText : '\t* FOO\n\n' ,
2020-06-05 21:18:58 +00:00
} ,
2020-11-23 18:21:51 +00:00
'prefixcorrectlinenumber' : {
2020-06-06 13:30:13 +00:00
input : '<html><body><ol><li>should be 1</li><li>should be 2</li></ol></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body><ol start="1" class="number"><li>should be 1</li><li>should be 2</ol><br></body></html>' ,
2020-11-23 18:21:51 +00:00
expectedText : '\t1. should be 1\n\t2. should be 2\n\n' ,
2020-06-06 13:30:13 +00:00
} ,
2020-11-23 18:21:51 +00:00
'prefixcorrectlinenumbernested' : {
2020-06-06 13:30:13 +00:00
input : '<html><body><ol><li>should be 1</li><ol><li>foo</li></ol><li>should be 2</li></ol></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body><ol start="1" class="number"><li>should be 1<ol start="2" class="number"><li>foo</ol><li>should be 2</ol><br></body></html>' ,
2020-11-23 18:21:51 +00:00
expectedText : '\t1. should be 1\n\t\t1.1. foo\n\t2. should be 2\n\n' ,
2020-06-06 13:30:13 +00:00
} ,
2020-06-05 21:18:58 +00:00
/ *
2020-06-06 13:30:13 +00:00
"prefixcorrectlinenumber when introduced none list item - currently not supported see #3450" : {
2020-06-05 21:18:58 +00:00
input : '<html><body><ol><li>should be 1</li>test<li>should be 2</li></ol></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body><ol start="1" class="number"><li>should be 1</li>test<li>should be 2</li></ol><br></body></html>' ,
expectedText : '\t1. should be 1\n\ttest\n\t2. should be 2\n\n'
}
,
"newlinesshouldntresetlinenumber #2194" : {
input : '<html><body><ol><li>should be 1</li>test<li>should be 2</li></ol></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body><ol class="number"><li>should be 1</li>test<li>should be 2</li></ol><br></body></html>' ,
expectedText : '\t1. should be 1\n\ttest\n\t2. should be 2\n\n'
}
* /
2020-12-18 09:37:37 +00:00
'ignoreAnyTagsOutsideBody' : {
description : 'Content outside body should be ignored' ,
input : '<html><head><title>title</title><style></style></head><body>empty<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>empty<br><br></body></html>' ,
expectedText : 'empty\n\n' ,
} ,
2020-12-20 06:00:18 +00:00
'indentedListsAreNotBullets' : {
description : 'Indented lists are represented with tabs and without bullets' ,
input : '<html><body><ul class="indent"><li>indent</li><li>indent</ul></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body><ul class="indent"><li>indent</li><li>indent</ul><br></body></html>' ,
expectedText : '\tindent\n\tindent\n\n'
2020-12-20 06:18:19 +00:00
} ,
lineWithMultipleSpaces : {
description : 'Multiple spaces should be collapsed' ,
input : '<html><body>Text with more than one space.<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>Text with more than one space.<br><br></body></html>' ,
expectedText : 'Text with more than one space.\n\n'
} ,
lineWithMultipleNonBreakingAndNormalSpaces : {
// XXX the HTML between "than" and "one" looks strange
description : 'non-breaking space should be preserved, but can be replaced when it' ,
input : '<html><body>Text with more than one space.<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>Text with more than one space.<br><br></body></html>' ,
expectedText : 'Text with more than one space.\n\n'
} ,
multiplenbsp : {
description : 'Multiple non-breaking space should be preserved' ,
input : '<html><body> <br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body> <br><br></body></html>' ,
expectedText : ' \n\n'
} ,
multipleNonBreakingSpaceBetweenWords : {
description : 'A normal space is always inserted before a word' ,
input : '<html><body> word1 word2 word3<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body> word1 word2 word3<br><br></body></html>' ,
expectedText : ' word1 word2 word3\n\n'
} ,
nonBreakingSpacePreceededBySpaceBetweenWords : {
description : 'A non-breaking space preceeded by a normal space' ,
input : '<html><body> word1 word2 word3<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body> word1 word2 word3<br><br></body></html>' ,
expectedText : ' word1 word2 word3\n\n'
} ,
nonBreakingSpaceFollowededBySpaceBetweenWords : {
description : 'A non-breaking space followed by a normal space' ,
input : '<html><body> word1 word2 word3<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body> word1 word2 word3<br><br></body></html>' ,
expectedText : ' word1 word2 word3\n\n'
} ,
spacesAfterNewline : {
description : 'Collapse spaces that follow a newline' ,
input : '<!doctype html><html><body>something<br> something<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>something<br>something<br><br></body></html>' ,
expectedText : 'something\nsomething\n\n'
} ,
spacesAfterNewlineP : {
description : 'Collapse spaces that follow a paragraph' ,
input : '<!doctype html><html><body>something<p></p> something<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>something<br><br>something<br><br></body></html>' ,
expectedText : 'something\n\nsomething\n\n'
} ,
spacesAtEndOfLine : {
description : 'Collapse spaces that preceed/follow a newline' ,
input : '<html><body>something <br> something<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>something<br>something<br><br></body></html>' ,
expectedText : 'something\nsomething\n\n'
} ,
spacesAtEndOfLineP : {
description : 'Collapse spaces that preceed/follow a paragraph' ,
input : '<html><body>something <p></p> something<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>something<br><br>something<br><br></body></html>' ,
expectedText : 'something\n\nsomething\n\n'
} ,
nonBreakingSpacesAfterNewlines : {
description : 'Don\'t collapse non-breaking spaces that follow a newline' ,
input : '<html><body>something<br> something<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>something<br> something<br><br></body></html>' ,
expectedText : 'something\n something\n\n'
} ,
nonBreakingSpacesAfterNewlinesP : {
description : 'Don\'t collapse non-breaking spaces that follow a paragraph' ,
input : '<html><body>something<p></p> something<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>something<br><br> something<br><br></body></html>' ,
expectedText : 'something\n\n something\n\n'
} ,
collapseSpacesInsideElements : {
description : 'Preserve only one space when multiple are present' ,
input : '<html><body>Need <span> more </span> space<i> s </i> !<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>Need more space<em> s </em>!<br><br></body></html>' ,
expectedText : 'Need more space s !\n\n'
} ,
collapseSpacesAcrossNewlines : {
description : 'Newlines and multiple spaces across newlines should be collapsed' ,
input : `
< html > < body > Need
< span > more < / s p a n >
space
< i > s < / i >
! < br > < / b o d y > < / h t m l > ` ,
expectedHTML : '<!DOCTYPE HTML><html><body>Need more space <em>s </em>!<br><br></body></html>' ,
expectedText : 'Need more space s !\n\n'
} ,
multipleNewLinesAtBeginning : {
description : 'Multiple new lines and paragraphs at the beginning should be preserved' ,
input : '<html><body><br><br><p></p><p></p>first line<br><br>second line<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body><br><br><br><br>first line<br><br>second line<br><br></body></html>' ,
expectedText : '\n\n\n\nfirst line\n\nsecond line\n\n'
} ,
multiLineParagraph : {
description : "A paragraph with multiple lines should not loose spaces when lines are combined" ,
input : ` <html><body>
< p >
а б в г ґ д е є ж з и і ї й к л м н о
п р с т у ф х ц ч ш щ ю я ь
< / p >
< / b o d y > < / h t m l > ` ,
expectedHTML : '<!DOCTYPE HTML><html><body>а б в г ґ д е є ж з и і ї й к л м н о п р с т у ф х ц ч ш щ ю я ь<br><br></body></html>' ,
expectedText : 'а б в г ґ д е є ж з и і ї й к л м н о п р с т у ф х ц ч ш щ ю я ь\n\n'
} ,
multiLineParagraphWithPre : {
//XXX why is there before "in"?
description : "lines in preformatted text should be kept intact" ,
input : ` <html><body>
< p >
а б в г ґ д е є ж з и і ї й к л м н о < pre > multiple
lines
in
pre
< / p r e > < / p > < p > п р с т у ф х ц ч ш щ ю я
ь < / p >
< / b o d y > < / h t m l > ` ,
expectedHTML : '<!DOCTYPE HTML><html><body>а б в г ґ д е є ж з и і ї й к л м н о<br>multiple<br> lines<br> in<br> pre<br><br>п р с т у ф х ц ч ш щ ю я ь<br><br></body></html>' ,
expectedText : 'а б в г ґ д е є ж з и і ї й к л м н о \nmultiple\n lines\n in\n pre\n\nп р с т у ф х ц ч ш щ ю я ь\n\n'
} ,
preIntroducesASpace : {
description : "pre should be on a new line not preceeded by a space" ,
input : ` <html><body><p>
1
< pre > preline
< / p r e > < / p > < / b o d y > < / h t m l > ` ,
expectedHTML : '<!DOCTYPE HTML><html><body>1<br>preline<br><br><br></body></html>' ,
expectedText : '1\npreline\n\n\n'
} ,
dontDeleteSpaceInsideElements : {
description : 'Preserve spaces inside elements' ,
input : '<html><body>Need<span> more </span>space<i> s </i>!<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>Need more space<em> s </em>!<br><br></body></html>' ,
expectedText : 'Need more space s !\n\n'
} ,
dontDeleteSpaceOutsideElements : {
description : 'Preserve spaces outside elements' ,
input : '<html><body>Need <span>more</span> space <i>s</i> !<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>Need more space <em>s</em> !<br><br></body></html>' ,
expectedText : 'Need more space s !\n\n'
} ,
dontDeleteSpaceAtEndOfElement : {
description : 'Preserve spaces at the end of an element' ,
input : '<html><body>Need <span>more </span>space <i>s </i>!<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>Need more space <em>s </em>!<br><br></body></html>' ,
expectedText : 'Need more space s !\n\n'
} ,
dontDeleteSpaceAtBeginOfElements : {
description : 'Preserve spaces at the start of an element' ,
input : '<html><body>Need<span> more</span> space<i> s</i> !<br></body></html>' ,
expectedHTML : '<!DOCTYPE HTML><html><body>Need more space<em> s</em> !<br><br></body></html>' ,
expectedText : 'Need more space s !\n\n'
} ,
2020-11-23 18:21:51 +00:00
} ;
2020-06-05 21:18:58 +00:00
2020-11-23 18:21:51 +00:00
describe ( _ _filename , function ( ) {
Object . keys ( testImports ) . forEach ( ( testName ) => {
const testPadId = makeid ( ) ;
2020-12-18 05:30:03 +00:00
const test = testImports [ testName ] ;
if ( test . disabled ) {
return xit ( ` DISABLED: ${ testName } ` , function ( done ) {
done ( ) ;
} ) ;
}
describe ( ` createPad ${ testName } ` , function ( ) {
2020-11-23 18:21:51 +00:00
it ( 'creates a new Pad' , function ( done ) {
api . get ( ` ${ endPoint ( 'createPad' ) } &padID= ${ testPadId } ` )
. expect ( ( res ) => {
if ( res . body . code !== 0 ) throw new Error ( 'Unable to create new Pad' ) ;
2020-10-09 22:19:46 +00:00
} )
. expect ( 'Content-Type' , /json/ )
2020-11-23 18:21:51 +00:00
. expect ( 200 , done ) ;
2020-10-09 22:19:46 +00:00
} ) ;
2020-11-23 18:21:51 +00:00
} ) ;
2020-10-09 22:19:46 +00:00
2020-12-18 05:30:03 +00:00
describe ( ` setHTML ${ testName } ` , function ( ) {
2020-11-23 18:21:51 +00:00
it ( 'Sets the HTML' , function ( done ) {
2020-12-18 05:30:03 +00:00
api . get ( ` ${ endPoint ( 'setHTML' ) } &padID= ${ testPadId } &html= ${ encodeURIComponent ( test . input ) } ` )
2020-11-23 18:21:51 +00:00
. expect ( ( res ) => {
if ( res . body . code !== 0 ) throw new Error ( ` Error: ${ testName } ` ) ;
2020-10-09 22:19:46 +00:00
} )
. expect ( 'Content-Type' , /json/ )
2020-11-23 18:21:51 +00:00
. expect ( 200 , done ) ;
2020-10-09 22:19:46 +00:00
} ) ;
2020-11-23 18:21:51 +00:00
} ) ;
2020-10-09 22:19:46 +00:00
2020-12-18 05:30:03 +00:00
describe ( ` getHTML ${ testName } ` , function ( ) {
2020-11-23 18:21:51 +00:00
it ( 'Gets back the HTML of a Pad' , function ( done ) {
api . get ( ` ${ endPoint ( 'getHTML' ) } &padID= ${ testPadId } ` )
. expect ( ( res ) => {
const receivedHtml = res . body . data . html ;
2020-10-09 22:19:46 +00:00
if ( receivedHtml !== test . expectedHTML ) {
throw new Error ( ` HTML received from export is not the one we were expecting.
2020-06-05 21:18:58 +00:00
Test Name :
$ { testName }
Received :
2020-12-18 05:30:03 +00:00
$ { JSON . stringify ( receivedHtml ) }
2020-06-05 21:18:58 +00:00
Expected :
2020-12-18 05:30:03 +00:00
$ { JSON . stringify ( test . expectedHTML ) }
2020-06-05 21:18:58 +00:00
Which is a different version of the originally imported one :
$ { test . input } ` );
2020-10-09 22:19:46 +00:00
}
} )
. expect ( 'Content-Type' , /json/ )
2020-11-23 18:21:51 +00:00
. expect ( 200 , done ) ;
2020-10-09 22:19:46 +00:00
} ) ;
2020-11-23 18:21:51 +00:00
} ) ;
2020-10-09 22:19:46 +00:00
2020-12-18 05:30:03 +00:00
describe ( ` getText ${ testName } ` , function ( ) {
2020-11-23 18:21:51 +00:00
it ( 'Gets back the Text of a Pad' , function ( done ) {
api . get ( ` ${ endPoint ( 'getText' ) } &padID= ${ testPadId } ` )
. expect ( ( res ) => {
const receivedText = res . body . data . text ;
2020-10-09 22:19:46 +00:00
if ( receivedText !== test . expectedText ) {
throw new Error ( ` Text received from export is not the one we were expecting.
2020-06-05 21:18:58 +00:00
Test Name :
$ { testName }
Received :
2020-12-18 05:30:03 +00:00
$ { JSON . stringify ( receivedText ) }
2020-06-05 21:18:58 +00:00
Expected :
2020-12-18 05:30:03 +00:00
$ { JSON . stringify ( test . expectedText ) }
2020-06-05 21:18:58 +00:00
Which is a different version of the originally imported one :
$ { test . input } ` );
2020-10-09 22:19:46 +00:00
}
} )
. expect ( 'Content-Type' , /json/ )
2020-11-23 18:21:51 +00:00
. expect ( 200 , done ) ;
2020-10-09 22:19:46 +00:00
} ) ;
2020-11-23 18:21:51 +00:00
} ) ;
2020-10-09 22:19:46 +00:00
} ) ;
2020-06-05 21:18:58 +00:00
} ) ;
2020-12-18 05:30:03 +00:00
function endPoint ( point , version ) {
2020-06-05 21:18:58 +00:00
version = version || apiVersion ;
2020-11-23 18:21:51 +00:00
return ` /api/ ${ version } / ${ point } ?apikey= ${ apiKey } ` ;
} ;
2020-06-05 21:18:58 +00:00
2020-11-21 18:37:57 +00:00
function makeid ( ) {
2020-11-23 18:21:51 +00:00
let text = '' ;
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' ;
2020-06-05 21:18:58 +00:00
2020-11-23 18:21:51 +00:00
for ( let i = 0 ; i < 5 ; i ++ ) {
2020-06-05 21:18:58 +00:00
text += possible . charAt ( Math . floor ( Math . random ( ) * possible . length ) ) ;
}
return text ;
}