'use strict'; var common = require('../common'); describe('Model', function () { describe('getExpirationDefault', function () { before(function () { $.PrivateBin.Model.reset(); cleanup(); }); jsc.property( 'returns the contents of the element with id "pasteExpiration"', 'array asciinestring', 'string', 'small nat', function (keys, value, key) { keys = keys.map(common.htmlEntities); value = common.htmlEntities(value); var content = keys.length > key ? keys[key] : (keys.length > 0 ? keys[0] : 'null'), contents = ''; $('body').html(contents); var result = common.htmlEntities( $.PrivateBin.Model.getExpirationDefault() ); $.PrivateBin.Model.reset(); return content === result; } ); }); describe('getFormatDefault', function () { before(function () { $.PrivateBin.Model.reset(); cleanup(); }); jsc.property( 'returns the contents of the element with id "pasteFormatter"', 'array asciinestring', 'string', 'small nat', function (keys, value, key) { keys = keys.map(common.htmlEntities); value = common.htmlEntities(value); var content = keys.length > key ? keys[key] : (keys.length > 0 ? keys[0] : 'null'), contents = ''; $('body').html(contents); var result = common.htmlEntities( $.PrivateBin.Model.getFormatDefault() ); $.PrivateBin.Model.reset(); return content === result; } ); }); describe('getPasteId', function () { this.timeout(30000); beforeEach(function () { $.PrivateBin.Model.reset(); cleanup(); }); jsc.property( 'returns the query string without separator, if any', jsc.nearray(common.jscA2zString()), jsc.nearray(common.jscA2zString()), jsc.tuple(new Array(16).fill(common.jscHexString)), jsc.array(common.jscQueryString()), jsc.array(common.jscQueryString()), 'string', function (schema, address, pasteId, queryStart, queryEnd, fragment) { var pasteIdString = pasteId.join(''), queryStartString = queryStart.join('') + (queryStart.length > 0 ? '&' : ''), queryEndString = (queryEnd.length > 0 ? '&' : '') + queryEnd.join(''), queryString = queryStartString + pasteIdString + queryEndString, clean = jsdom('', { url: schema.join('') + '://' + address.join('') + '/?' + queryString + '#' + fragment }), result = $.PrivateBin.Model.getPasteId(); $.PrivateBin.Model.reset(); clean(); return pasteIdString === result; } ); jsc.property( 'throws exception on empty query string', jsc.nearray(common.jscA2zString()), jsc.nearray(common.jscA2zString()), 'string', function (schema, address, fragment) { var clean = jsdom('', { url: schema.join('') + '://' + address.join('') + '/#' + fragment }), result = false; try { $.PrivateBin.Model.getPasteId(); } catch(err) { result = true; } $.PrivateBin.Model.reset(); clean(); return result; } ); }); describe('getPasteKey', function () { this.timeout(30000); beforeEach(function () { $.PrivateBin.Model.reset(); cleanup(); }); jsc.property( 'returns the fragment of a v1 URL', jsc.nearray(common.jscA2zString()), jsc.nearray(common.jscA2zString()), jsc.array(common.jscQueryString()), 'nestring', function (schema, address, query, fragment) { const fragmentString = common.btoa(fragment.padStart(32, String.fromCharCode(0))); let clean = jsdom('', { url: schema.join('') + '://' + address.join('') + '/?' + query.join('') + '#' + fragmentString }), result = $.PrivateBin.Model.getPasteKey(); $.PrivateBin.Model.reset(); clean(); return fragmentString === result; } ); jsc.property( 'returns the v1 fragment stripped of trailing query parts', jsc.nearray(common.jscA2zString()), jsc.nearray(common.jscA2zString()), jsc.array(common.jscQueryString()), 'nestring', jsc.array(common.jscHashString()), function (schema, address, query, fragment, trail) { const fragmentString = common.btoa(fragment.padStart(32, String.fromCharCode(0))); let clean = jsdom('', { url: schema.join('') + '://' + address.join('') + '/?' + query.join('') + '#' + fragmentString + '&' + trail.join('') }), result = $.PrivateBin.Model.getPasteKey(); $.PrivateBin.Model.reset(); clean(); return fragmentString === result; } ); jsc.property( 'returns the fragment of a v2 URL', jsc.nearray(common.jscA2zString()), jsc.nearray(common.jscA2zString()), jsc.array(common.jscQueryString()), 'nestring', function (schema, address, query, fragment) { // base58 strips leading NULL bytes while(fragment.charAt(0) === '\u0000') { fragment = fragment.substr(1); } // string may not be empty (when only NULL bytes and trimmed) if (fragment.length === 0) { return true; } let fragmentString = $.PrivateBin.CryptTool.base58encode(fragment), clean = jsdom('', { url: schema.join('') + '://' + address.join('') + '/?' + query.join('') + '#' + fragmentString }), result = $.PrivateBin.Model.getPasteKey(); $.PrivateBin.Model.reset(); clean(); return fragment === result; } ); jsc.property( 'returns the v2 fragment stripped of trailing query parts', jsc.nearray(common.jscA2zString()), jsc.nearray(common.jscA2zString()), jsc.array(common.jscQueryString()), 'nestring', jsc.array(common.jscHashString()), function (schema, address, query, fragment, trail) { // base58 strips leading NULL bytes while(fragment.charAt(0) === '\u0000') { fragment = fragment.substr(1); } // string may not be empty (when only NULL bytes and trimmed) if (fragment.length === 0) { return true; } let fragmentString = $.PrivateBin.CryptTool.base58encode(fragment), clean = jsdom('', { url: schema.join('') + '://' + address.join('') + '/?' + query.join('') + '#' + fragmentString + '&' + trail.join('') }), result = $.PrivateBin.Model.getPasteKey(); $.PrivateBin.Model.reset(); clean(); return fragment === result; } ); jsc.property( 'throws exception on empty fragment of the URL', jsc.nearray(common.jscA2zString()), jsc.nearray(common.jscA2zString()), jsc.array(common.jscQueryString()), function (schema, address, query) { var clean = jsdom('', { url: schema.join('') + '://' + address.join('') + '/?' + query.join('') }), result = false; try { $.PrivateBin.Model.getPasteKey(); } catch(err) { result = true; } $.PrivateBin.Model.reset(); clean(); return result; } ); }); describe('getTemplate', function () { beforeEach(function () { $.PrivateBin.Model.reset(); cleanup(); }); jsc.property( 'returns the contents of the element with id "[name]template"', jsc.nearray(common.jscAlnumString()), jsc.nearray(common.jscA2zString()), jsc.nearray(common.jscAlnumString()), function (id, element, value) { id = id.join(''); element = element.join(''); value = value.join('').trim(); //
,
, and tags can't contain strings, // table tags can't be alone, so test with a

instead if (['br', 'col', 'hr', 'img', 'tr', 'td', 'th', 'wbr'].indexOf(element) >= 0) { element = 'p'; } $('body').html( '

<' + element + ' id="' + id + 'template">' + value + '
' ); $.PrivateBin.Model.init(); var template = '<' + element + ' id="' + id + '">' + value + '', result = $.PrivateBin.Model.getTemplate(id).wrap('

').parent().html(); $.PrivateBin.Model.reset(); return template === result; } ); }); });