From fb68ac672bddb35125099fbc3301d826b3a295ea Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 5 Jun 2020 22:18:58 +0100 Subject: [PATCH] tests: OL/UL further testing. --- test.js | 77 ----------- tests/backend/specs/api/importexport.js | 177 ++++++++++++++++++++++++ tests/frontend/specs/ordered_list.js | 77 +++++++++++ tests/frontend/specs/unordered_list.js | 143 +++++++++++++++++++ 4 files changed, 397 insertions(+), 77 deletions(-) delete mode 100755 test.js create mode 100644 tests/backend/specs/api/importexport.js diff --git a/test.js b/test.js deleted file mode 100755 index aa3149ceb..000000000 --- a/test.js +++ /dev/null @@ -1,77 +0,0 @@ -const Changeset = require("./src/static/js/Changeset"); -const contentcollector = require("./src/static/js/contentcollector"); -const AttributePool = require("./src/static/js/AttributePool"); -const cheerio = require("./src/node_modules/cheerio"); -const util = require('util'); - -const tests = { - bulletListInOL:{ - description : "A bullet within an OL should not change numbering..", - html : "
  1. should be 1
  2. should be 2

", - expectedLineAttribs : [ '*0*1*2*3+1+b', '*0*4*2*5+1+i', '*0*1*2*5+1+b', '' ], - expectedText: ["*should be 1","*should be a bullet","*should be 2", ""] - } -} - -// For each test.. -for (let test in tests){ - let testObj = tests[test]; - -// describe(test, function() { -// it(testObj.description, function(done) { - var $ = cheerio.load(testObj.html); // Load HTML into Cheerio - var doc = $('html')[0]; // Creates a dom-like representation of HTML - // Create an empty attribute pool - var apool = new AttributePool(); - // Convert a dom tree into a list of lines and attribute liens - // using the content collector object - var cc = contentcollector.makeContentCollector(true, null, apool); - cc.collectContent(doc); - var result = cc.finish(); - var recievedAttributes = result.lineAttribs; - var expectedAttributes = testObj.expectedLineAttribs; - var recievedText = new Array(result.lines) - var expectedText = testObj.expectedText; - - // Check recieved text matches the expected text - if(arraysEqual(recievedText[0], expectedText)){ - console.log("PASS: Recieved Text did match Expected Text\nRecieved:", recievedText[0], "\nExpected:", testObj.expectedText) - }else{ - console.error("FAIL: Recieved Text did not match Expected Text\nRecieved:", recievedText[0], "\nExpected:", testObj.expectedText) - // throw new Error(); - } - - // Check recieved attributes matches the expected attributes - if(arraysEqual(recievedAttributes, expectedAttributes)){ - console.log("PASS: Recieved Attributes matched Expected Attributes"); - done(); - }else{ - console.error("FAIL", test, testObj.description); - console.error("FAIL: Recieved Attributes did not match Expected Attributes\nRecieved: ", recievedAttributes, "\nExpected: ", expectedAttributes) - console.error("FAILING HTML", testObj.html); - //throw new Error(); - } -// }); - -// }); - -}; - - - - -function arraysEqual(a, b) { - if (a === b) return true; - if (a == null || b == null) return false; - if (a.length != b.length) return false; - - // If you don't care about the order of the elements inside - // the array, you should sort both arrays here. - // Please note that calling sort on an array will modify that array. - // you might want to clone your array first. - - for (var i = 0; i < a.length; ++i) { - if (a[i] !== b[i]) return false; - } - return true; -} diff --git a/tests/backend/specs/api/importexport.js b/tests/backend/specs/api/importexport.js new file mode 100644 index 000000000..4635c88b1 --- /dev/null +++ b/tests/backend/specs/api/importexport.js @@ -0,0 +1,177 @@ +/* + * ACHTUNG: there is a copied & modified version of this file in + * /tests/container/spacs/api/pad.js + * + * TODO: unify those two files, and merge in a single one. + */ + +const assert = require('assert'); +const supertest = require(__dirname+'/../../../../src/node_modules/supertest'); +const fs = require('fs'); +const settings = require(__dirname+'/../../../../tests/container/loadSettings.js').loadSettings(); +const api = supertest('http://'+settings.ip+":"+settings.port); +const path = require('path'); +const async = require(__dirname+'/../../../../src/node_modules/async'); + +var filePath = path.join(__dirname, '../../../../APIKEY.txt'); + +var apiKey = fs.readFileSync(filePath, {encoding: 'utf-8'}); +apiKey = apiKey.replace(/\n$/, ""); +var apiVersion = 1; +var lastEdited = ""; + +var testImports = { + "malformed": { + input: '
  • wtf', + expectedHTML: 'wtf

    ', + expectedText: 'wtf\n\n' + }, + "nonelistiteminlist #3620":{ + input: '
      test
    • FOO
    ', + expectedHTML: '
      test
    • FOO

    ', + expectedText: '\ttest\n\t* FOO\n\n' + }, + "whitespaceinlist #3620":{ + input: '
    • FOO
    ', + expectedHTML: '
    • FOO

    ', + expectedText: '\t* FOO\n\n' + }, + /* + "prefixcorrectlinenumber #3450":{ + input: '
    1. should be 1
    2. test
    3. should be 2
    ', + expectedHTML: '
    1. should be 1
    2. test
    3. should be 2

    ', + expectedText: '\t1. should be 1\n\ttest\n\t2. should be 2\n\n' + } + , + "newlinesshouldntresetlinenumber #2194":{ + input: '
    1. should be 1
    2. test
    3. should be 2
    ', + expectedHTML: '
    1. should be 1
    2. test
    3. should be 2

    ', + expectedText: '\t1. should be 1\n\ttest\n\t2. should be 2\n\n' + } + */ +} + +Object.keys(testImports).forEach(function (testName) { + var testPadId = makeid(); + test = testImports[testName]; + describe('createPad', function(){ + it('creates a new Pad', function(done) { + api.get(endPoint('createPad')+"&padID="+testPadId) + .expect(function(res){ + if(res.body.code !== 0) throw new Error("Unable to create new Pad"); + }) + .expect('Content-Type', /json/) + .expect(200, done) + }); + }) + + describe('setHTML', function(){ + it('Sets the HTML', function(done) { + api.get(endPoint('setHTML')+"&padID="+testPadId+"&html="+test.input) + .expect(function(res){ + if(res.body.code !== 0) throw new Error("Error:"+testName) + }) + .expect('Content-Type', /json/) + .expect(200, done) + }); + }) + + describe('getHTML', function(){ + it('Gets back the HTML of a Pad', function(done) { + api.get(endPoint('getHTML')+"&padID="+testPadId) + .expect(function(res){ + var receivedHtml = res.body.data.html; + if (receivedHtml !== test.expectedHTML) { + throw new Error(`HTML received from export is not the one we were expecting. + Test Name: + ${testName} + + Received: + ${receivedHtml} + + Expected: + ${test.expectedHTML} + + Which is a different version of the originally imported one: + ${test.input}`); + } + }) + .expect('Content-Type', /json/) + .expect(200, done) + }); + }) + + describe('getText', function(){ + it('Gets back the Text of a Pad', function(done) { + api.get(endPoint('getText')+"&padID="+testPadId) + .expect(function(res){ + var receivedText = res.body.data.text; + if (receivedText !== test.expectedText) { + throw new Error(`Text received from export is not the one we were expecting. + Test Name: + ${testName} + + Received: + ${receivedText} + + Expected: + ${test.expectedText} + + Which is a different version of the originally imported one: + ${test.input}`); + } + }) + .expect('Content-Type', /json/) + .expect(200, done) + }); + }) +}); + + +var endPoint = function(point, version){ + version = version || apiVersion; + return '/api/'+version+'/'+point+'?apikey='+apiKey; +} + +function makeid() +{ + var text = ""; + var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + + for( var i=0; i < 5; i++ ){ + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; +} + +function generateLongText(){ + var text = ""; + var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + + for( var i=0; i < 80000; i++ ){ + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; +} + +// Need this to compare arrays (listSavedRevisions test) +Array.prototype.equals = function (array) { + // if the other array is a falsy value, return + if (!array) + return false; + // compare lengths - can save a lot of time + if (this.length != array.length) + return false; + for (var i = 0, l=this.length; i < l; i++) { + // Check if we have nested arrays + if (this[i] instanceof Array && array[i] instanceof Array) { + // recurse into the nested arrays + if (!this[i].equals(array[i])) + return false; + } else if (this[i] != array[i]) { + // Warning - two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + return true; +} diff --git a/tests/frontend/specs/ordered_list.js b/tests/frontend/specs/ordered_list.js index f4aa57273..174baa489 100644 --- a/tests/frontend/specs/ordered_list.js +++ b/tests/frontend/specs/ordered_list.js @@ -126,3 +126,80 @@ describe("assign ordered list", function(){ } }); + +describe("Pressing Tab in an OL increases and decreases indentation", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + it("indent and de-indent list item with keypress", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //get the first text element out of the inner iframe + var $firstTextElement = inner$("div").first(); + + //select this text element + $firstTextElement.sendkeys('{selectall}'); + + var $insertorderedlistButton = chrome$(".buttonicon-insertorderedlist"); + $insertorderedlistButton.click(); + + var e = inner$.Event(helper.evtType); + e.keyCode = 9; // tab + inner$("#innerdocbody").trigger(e); + + expect(inner$("div").first().find(".list-number2").length === 1).to.be(true); + e.shiftKey = true; // shift + e.keyCode = 9; // tab + inner$("#innerdocbody").trigger(e); + + helper.waitFor(function(){ + return inner$("div").first().find(".list-number1").length === 1; + }).done(done); + + }); + + +}); + + +describe("Pressing indent/outdent button in an OL increases and decreases indentation and bullet / ol formatting", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + it("indent and de-indent list item with indent button", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //get the first text element out of the inner iframe + var $firstTextElement = inner$("div").first(); + + //select this text element + $firstTextElement.sendkeys('{selectall}'); + + var $insertorderedlistButton = chrome$(".buttonicon-insertorderedlist"); + $insertorderedlistButton.click(); + + var $indentButton = chrome$(".buttonicon-indent"); + $indentButton.click(); // make it indented twice + + expect(inner$("div").first().find(".list-number2").length === 1).to.be(true); + + var $outdentButton = chrome$(".buttonicon-outdent"); + $outdentButton.click(); // make it deindented to 1 + + helper.waitFor(function(){ + return inner$("div").first().find(".list-number1").length === 1; + }).done(done); + + }); + + +}); + diff --git a/tests/frontend/specs/unordered_list.js b/tests/frontend/specs/unordered_list.js index 8a7fdd7a7..c3010c353 100644 --- a/tests/frontend/specs/unordered_list.js +++ b/tests/frontend/specs/unordered_list.js @@ -33,3 +33,146 @@ describe("assign unordered list", function(){ }); }); + +describe("unassign unordered list", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + it("insert unordered list text then remove by clicking list again", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + var originalText = inner$("div").first().text(); + + var $insertunorderedlistButton = chrome$(".buttonicon-insertunorderedlist"); + $insertunorderedlistButton.click(); + + helper.waitFor(function(){ + var newText = inner$("div").first().text(); + if(newText === originalText){ + return inner$("div").first().find("ul li").length === 1; + } + }).done(function(){ + + // remove indentation by bullet and ensure text string remains the same + $insertunorderedlistButton.click(); + helper.waitFor(function(){ + var isList = inner$("div").find("ul").length === 1; + // sohuldn't be list + return (isList === false); + }).done(function(){ + done(); + }); + + }); + }); +}); + + +describe("keep unordered list on enter key", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + it("Keeps the unordered list on enter for the new line", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + var $insertorderedlistButton = chrome$(".buttonicon-insertunorderedlist"); + $insertorderedlistButton.click(); + + //type a bit, make a line break and type again + var $firstTextElement = inner$("div span").first(); + $firstTextElement.sendkeys('line 1'); + $firstTextElement.sendkeys('{enter}'); + $firstTextElement.sendkeys('line 2'); + $firstTextElement.sendkeys('{enter}'); + + helper.waitFor(function(){ + return inner$("div span").first().text().indexOf("line 2") === -1; + }).done(function(){ + var $newSecondLine = inner$("div").first().next(); + var hasULElement = $newSecondLine.find("ul li").length === 1; + console.log($newSecondLine.find("ul").length); + expect(hasULElement).to.be(true); + expect($newSecondLine.text()).to.be("line 2"); + done(); + }); + }); + +}); + +describe("Pressing Tab in an UL increases and decreases indentation", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + it("indent and de-indent list item with keypress", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //get the first text element out of the inner iframe + var $firstTextElement = inner$("div").first(); + + //select this text element + $firstTextElement.sendkeys('{selectall}'); + + var $insertorderedlistButton = chrome$(".buttonicon-insertunorderedlist"); + $insertorderedlistButton.click(); + + var e = inner$.Event(helper.evtType); + e.keyCode = 9; // tab + inner$("#innerdocbody").trigger(e); + + expect(inner$("div").first().find(".list-bullet2").length === 1).to.be(true); + e.shiftKey = true; // shift + e.keyCode = 9; // tab + inner$("#innerdocbody").trigger(e); + + helper.waitFor(function(){ + return inner$("div").first().find(".list-bullet1").length === 1; + }).done(done); + + }); + +}); + +describe("Pressing indent/outdent button in an UL increases and decreases indentation and bullet / ol formatting", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + it("indent and de-indent list item with indent button", function(done){ + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //get the first text element out of the inner iframe + var $firstTextElement = inner$("div").first(); + + //select this text element + $firstTextElement.sendkeys('{selectall}'); + + var $insertunorderedlistButton = chrome$(".buttonicon-insertunorderedlist"); + $insertunorderedlistButton.click(); + + var $indentButton = chrome$(".buttonicon-indent"); + $indentButton.click(); // make it indented twice + + expect(inner$("div").first().find(".list-bullet2").length === 1).to.be(true); + var $outdentButton = chrome$(".buttonicon-outdent"); + $outdentButton.click(); // make it deindented to 1 + + helper.waitFor(function(){ + return inner$("div").first().find(".list-bullet1").length === 1; + }).done(done); + }); +}); +