X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/8132fc186eb0c5fd02c86828c3a4735754296d02..5913c54d19b8f6775633176032161d49f9b2f1aa:/src/wiki/tests/xslt/auto/auto_test.js diff --git a/src/wiki/tests/xslt/auto/auto_test.js b/src/wiki/tests/xslt/auto/auto_test.js new file mode 100644 index 00000000..f9e50ee4 --- /dev/null +++ b/src/wiki/tests/xslt/auto/auto_test.js @@ -0,0 +1,139 @@ +var jsdom = require("jsdom"); +var $ = require('jquery')(new jsdom.JSDOM().window); +var fs = require('fs'); +var exec = require('child_process').exec; +var pd = require('pretty-data').pd; +var ansidiff = require('ansidiff'); + + +eval(fs.readFileSync(__dirname + '/../../../../redakcja/static/js/wiki/xslt.js') + ''); + + +function assertNodesEqual(lhs, rhs, areHTMLNodes) { + + function throwError() { + throw new Error(ansidiff.chars(pd.xml(lhs), pd.xml(rhs))); + } + + var lhsNode = $(lhs)[0], + rhsNode = $(rhs)[0]; + + if(areHTMLNodes) { + var getMagicAttrsInfo = function(node) { + var valuePrefix = 'x-attr-value-'; + var namePrefix = 'x-attr-name-'; + var startsWith = function(str, prefix) { return str.substr(0, prefix.length) === prefix; } + var isNameAttribute = function(attr) { return startsWith(attr.name, namePrefix); } + var isValueAttribute = function(attr) { return startsWith(attr.name, valuePrefix); } + var extractId = function(attr) { return attr.name.split('-').pop(); } + var temp = {}; + var toret = {map: {}, magicAttrsList: []}; + + for(var i = 0; i < node.attributes.length; i++) { + var attr = node.attributes[i]; + if(isNameAttribute(attr) || isValueAttribute(attr)) { + var id = extractId(attr); + temp[id] = typeof temp[id] === 'undefined' ? {} : temp[id]; + if(isNameAttribute(attr)) + temp[id]['name'] = attr.value; + else + temp[id]['value'] = attr.value; + toret.magicAttrsList.push(attr.name); + } + } + + Object.keys(temp).forEach(function(id) { + var pair = temp[id]; + toret.map[pair.name] = typeof toret.map[pair.name] === 'undefined' ? toret.map[pair.name] = [] : toret.map[pair.name]; + toret.map[pair.name].push(pair.value); + }); + + return toret; + } + + var removeAttrs = function(node, attrsNames) { + attrsNames.forEach(function(name) { + node.removeAttribute(name); + }); + } + + var mapsEqual = function(map1, map2) { + if(Object.keys(map1).length != Object.keys(map2).length) + return false; + var arraysEqual = function(a1, a2) {return a1.slice().sort().join('') === a2.slice().sort().join('');} + Object.keys(map1).forEach(function(key) { + if(Object.keys(map2).indexOf(key) === -1 || !arraysEqual(map2[key], map1[key])) + return false; + }); + return true; + } + + var lhsMagicAttrsInfo = getMagicAttrsInfo(lhsNode), + rhsMagicAttrsInfo = getMagicAttrsInfo(rhsNode); + + removeAttrs(lhsNode, lhsMagicAttrsInfo.magicAttrsList); + removeAttrs(rhsNode, rhsMagicAttrsInfo.magicAttrsList); + + if(!mapsEqual(lhsMagicAttrsInfo.map, rhsMagicAttrsInfo.map)) + throwError(); + } + + if(!lhsNode.isEqualNode(rhsNode)) + throwError(); +} + +suite('wiki.tests.xslt.auto', function() { + + var tempFileName = '.temp.xml'; + var xsltStyleSheetPath = __dirname + '/../../../../redakcja/static/xsl/wl2html_client.xsl'; + + fs.readdirSync(__dirname + '/data/').forEach(function(fileName) { + + if(fileName === tempFileName) + return; + + var ext = fileName.split('.').pop(); + if(ext !== 'html' && ext !== 'xml') + return; + + var inputData = fs.readFileSync(__dirname + '/data/' + fileName) + ''; + + if(ext === 'html') { + test('[HTML->XML->HTML] ' + fileName, function(done) { + var result = html2text({ + element: $(inputData)[0], + stripOuter: false, + success: function(generatedXML) { + fs.writeFileSync(tempFileName, generatedXML); + exec(['xsltproc', xsltStyleSheetPath, tempFileName].join(' ') , {}, + function(error, stdout, stderr) { + fs.unlinkSync(tempFileName); + assertNodesEqual(inputData, stdout, true); + done(); + }); + }, + error: function(msg){throw msg;} + }); + }); + } else if(ext === 'xml') { + test('[XML->HTML->XML] ' + fileName, function(done) { + var originalXML = $(inputData); + exec(['xsltproc', xsltStyleSheetPath, __dirname + '/data/' + fileName].join(' ') , {}, + function(error, stdout, stderr) { + var generatedHTML = $(stdout); + var result = html2text({ + element: generatedHTML[0], + stripOuter: false, + success: function(xmltext) { + assertNodesEqual(inputData, xmltext); + done(); + }, + error: function(msg){throw msg;} + }); + }); + }); + } + }); +}); + +