diff --git a/js/apps/system/aardvark/test/css/ResembleJs/resemble.js b/js/apps/system/aardvark/test/css/ResembleJs/resemble.js new file mode 100644 index 0000000000..b6ad4ddabd --- /dev/null +++ b/js/apps/system/aardvark/test/css/ResembleJs/resemble.js @@ -0,0 +1,537 @@ +/* +Author: James Cryer +Company: Huddle +Last updated date: 17 Sep 2013 +URL: https://github.com/Huddle/Resemble.js +*/ + +(function(_this){ + 'use strict'; + + _this['resemble'] = function( fileData ){ + + var data = {}; + var images = []; + var updateCallbackArray = []; + + var tolerance = { // between 0 and 255 + red: 16, + green: 16, + blue: 16, + minBrightness: 16, + maxBrightness: 240 + }; + + var ignoreAntialiasing = false; + var ignoreColors = false; + + function triggerDataUpdate(){ + var len = updateCallbackArray.length; + var i; + for(i=0;i tolerance.maxBrightness; + } + + function getHue(r,g,b){ + + r = r / 255; + g = g / 255; + b = b / 255; + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h; + var d; + + if (max == min){ + h = 0; // achromatic + } else{ + d = max - min; + switch(max){ + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + + return h; + } + + function isAntialiased(sourcePix, data, cacheSet, verticalPos, horizontalPos, width){ + var offset; + var targetPix; + var distance = 1; + var i; + var j; + var hasHighContrastSibling = 0; + var hasSiblingWithDifferentHue = 0; + var hasEquivilantSibling = 0; + + addHueInfo(sourcePix); + + for (i = distance*-1; i <= distance; i++){ + for (j = distance*-1; j <= distance; j++){ + + if(i===0 && j===0){ + // ignore source pixel + } else { + + offset = ((verticalPos+j)*width + (horizontalPos+i)) * 4; + targetPix = getPixelInfo(data, offset, cacheSet); + + if(targetPix === null){ + continue; + } + + addBrightnessInfo(targetPix); + addHueInfo(targetPix); + + if( isContrasting(sourcePix, targetPix) ){ + hasHighContrastSibling++; + } + + if( isRGBSame(sourcePix,targetPix) ){ + hasEquivilantSibling++; + } + + if( Math.abs(targetPix.h - sourcePix.h) > 0.3 ){ + hasSiblingWithDifferentHue++; + } + + if( hasSiblingWithDifferentHue > 1 || hasHighContrastSibling > 1){ + return true; + } + } + } + } + + if(hasEquivilantSibling < 2){ + return true; + } + + return false; + } + + function errorPixel(px, offset){ + px[offset] = 255; //r + px[offset + 1] = 0; //g + px[offset + 2] = 255; //b + px[offset + 3] = 255; //a + } + + function copyPixel(px, offset, data){ + px[offset] = data.r; //r + px[offset + 1] = data.g; //g + px[offset + 2] = data.b; //b + px[offset + 3] = 255; //a + } + + function copyGrayScalePixel(px, offset, data){ + px[offset] = data.brightness; //r + px[offset + 1] = data.brightness; //g + px[offset + 2] = data.brightness; //b + px[offset + 3] = 255; //a + } + + + function getPixelInfo(data, offset, cacheSet){ + var r; + var g; + var b; + var d; + + if(typeof data[offset] !== 'undefined'){ + r = data[offset]; + g = data[offset+1]; + b = data[offset+2]; + d = { + r: r, + g: g, + b: b + }; + + return d; + } else { + return null; + } + } + + function addBrightnessInfo(data){ + data.brightness = getBrightness(data.r,data.g,data.b); // 'corrected' lightness + } + + function addHueInfo(data){ + data.h = getHue(data.r,data.g,data.b); + } + + function analyseImages(img1, img2, width, height){ + + var hiddenCanvas = document.createElement('canvas'); + + var data1 = img1.data; + var data2 = img2.data; + + hiddenCanvas.width = width; + hiddenCanvas.height = height; + + var context = hiddenCanvas.getContext('2d'); + var imgd = context.createImageData(width,height); + var targetPix = imgd.data; + + var mismatchCount = 0; + + var time = Date.now(); + + var skip; + + if( (width > 1200 || height > 1200) && ignoreAntialiasing){ + skip = 6; + } + + loop(height, width, function(verticalPos, horizontalPos){ + + if(skip){ // only skip if the image isn't small + if(verticalPos % skip === 0 || horizontalPos % skip === 0){ + return; + } + } + + var offset = (verticalPos*width + horizontalPos) * 4; + var pixel1 = getPixelInfo(data1, offset, 1); + var pixel2 = getPixelInfo(data2, offset, 2); + + if(pixel1 === null || pixel2 === null){ + return; + } + + if (ignoreColors){ + + addBrightnessInfo(pixel1); + addBrightnessInfo(pixel2); + + if( isPixelBrightnessSimilar(pixel1, pixel2) ){ + copyGrayScalePixel(targetPix, offset, pixel2); + } else { + errorPixel(targetPix, offset); + mismatchCount++; + } + return; + } + + if( isRGBSimilar(pixel1, pixel2) ){ + copyPixel(targetPix, offset, pixel2); + + } else if( ignoreAntialiasing && ( + addBrightnessInfo(pixel1), // jit pixel info augmentation looks a little weird, sorry. + addBrightnessInfo(pixel2), + isAntialiased(pixel1, data1, 1, verticalPos, horizontalPos, width) || + isAntialiased(pixel2, data2, 2, verticalPos, horizontalPos, width) + )){ + + if( isPixelBrightnessSimilar(pixel1, pixel2) ){ + copyGrayScalePixel(targetPix, offset, pixel2); + } else { + errorPixel(targetPix, offset); + mismatchCount++; + } + } else { + errorPixel(targetPix, offset); + mismatchCount++; + } + + }); + + data.misMatchPercentage = (mismatchCount / (height*width) * 100).toFixed(2); + data.analysisTime = Date.now() - time; + + data.getImageDataUrl = function(text){ + var barHeight = 0; + + if(text){ + barHeight = addLabel(text,context,hiddenCanvas); + } + + context.putImageData(imgd, 0, barHeight); + + return hiddenCanvas.toDataURL("image/png"); + }; + } + + function addLabel(text, context, hiddenCanvas){ + var textPadding = 2; + + context.font = '12px sans-serif'; + + var textWidth = context.measureText(text).width + textPadding*2; + var barHeight = 22; + + if(textWidth > hiddenCanvas.width){ + hiddenCanvas.width = textWidth; + } + + hiddenCanvas.height += barHeight; + + context.fillStyle = "#666"; + context.fillRect(0,0,hiddenCanvas.width,barHeight -4); + context.fillStyle = "#fff"; + context.fillRect(0,barHeight -4,hiddenCanvas.width, 4); + + context.fillStyle = "#fff"; + context.textBaseline = "top"; + context.font = '12px sans-serif'; + context.fillText(text, textPadding, 1); + + return barHeight; + } + + function normalise(img, w, h){ + var c; + var context; + + if(img.height < h || img.width < w){ + c = document.createElement('canvas'); + c.width = w; + c.height = h; + context = c.getContext('2d'); + context.putImageData(img, 0, 0); + return context.getImageData(0, 0, w, h); + } + + return img; + } + + function compare(one, two){ + + function onceWeHaveBoth(){ + var width; + var height; + if(images.length === 2){ + width = images[0].width > images[1].width ? images[0].width : images[1].width; + height = images[0].height > images[1].height ? images[0].height : images[1].height; + + if( (images[0].width === images[1].width) && (images[0].height === images[1].height) ){ + data.isSameDimensions = true; + } else { + data.isSameDimensions = false; + } + + data.dimensionDifference = { width: images[0].width - images[1].width, height: images[0].height - images[1].height }; + + analyseImages( normalise(images[0],width, height), normalise(images[1],width, height), width, height); + + triggerDataUpdate(); + } + } + + images = []; + loadImageData(one, onceWeHaveBoth); + loadImageData(two, onceWeHaveBoth); + } + + function getCompareApi(param){ + + var secondFileData, + hasMethod = typeof param === 'function'; + + if( !hasMethod ){ + // assume it's file data + secondFileData = param; + } + + var self = { + ignoreNothing: function(){ + + tolerance.red = 16; + tolerance.green = 16; + tolerance.blue = 16; + tolerance.minBrightness = 16; + tolerance.maxBrightness = 240; + + ignoreAntialiasing = false; + ignoreColors = false; + + if(hasMethod) { param(); } + return self; + }, + ignoreAntialiasing: function(){ + + tolerance.red = 32; + tolerance.green = 32; + tolerance.blue = 32; + tolerance.minBrightness = 64; + tolerance.maxBrightness = 96; + + ignoreAntialiasing = true; + ignoreColors = false; + + if(hasMethod) { param(); } + return self; + }, + ignoreColors: function(){ + + tolerance.minBrightness = 16; + tolerance.maxBrightness = 240; + + ignoreAntialiasing = false; + ignoreColors = true; + + if(hasMethod) { param(); } + return self; + }, + onComplete: function( callback ){ + + updateCallbackArray.push(callback); + + var wrapper = function(){ + compare(fileData, secondFileData); + }; + + wrapper(); + + return getCompareApi(wrapper); + } + }; + + return self; + } + + return { + onComplete: function( callback ){ + updateCallbackArray.push(callback); + loadImageData(fileData, function(imageData, width, height){ + parseImage(imageData.data, width, height); + }); + }, + compareTo: function(secondFileData){ + return getCompareApi(secondFileData); + } + }; + + }; +}(this)); \ No newline at end of file diff --git a/js/apps/system/aardvark/test/css/ResembleJs/resemblejscontainer.html b/js/apps/system/aardvark/test/css/ResembleJs/resemblejscontainer.html new file mode 100644 index 0000000000..e6839b3d1c --- /dev/null +++ b/js/apps/system/aardvark/test/css/ResembleJs/resemblejscontainer.html @@ -0,0 +1 @@ +This blank HTML page is used for processing the images with Resemble.js \ No newline at end of file diff --git a/js/apps/system/aardvark/test/css/phantomcss.js b/js/apps/system/aardvark/test/css/phantomcss.js new file mode 100644 index 0000000000..a4ed4d4019 --- /dev/null +++ b/js/apps/system/aardvark/test/css/phantomcss.js @@ -0,0 +1,488 @@ +/* +Author: James Cryer +Company: Huddle +Last updated date: 03 Mar 2014 +URL: https://github.com/Huddle/PhantomCSS +More: http://tldr.huddle.com/blog/css-testing/ +*/ + +var fs = require('fs'); + +var _src = '.'+fs.separator+'screenshots'; +var _results; // for backwards compatibility results and src are the same - but you can change it! +var _failures = '.'+fs.separator+'failures'; + +var _count = 0; +var _realPath; +var _diffsToProcess = []; +var _libraryRoot = '.'; +var exitStatus; +var _hideElements; +var _addLabelToFailedImage = true; +var _test_match; +var _test_exclude; +var _mismatchTolerance = 0.05; +var diffsCreated = []; + +exports.screenshot = screenshot; +exports.compareAll = compareAll; +exports.compareMatched = compareMatched; +exports.compareExplicit = compareExplicit; +exports.compareSession = compareSession; +exports.init = init; +exports.update = update; +exports.turnOffAnimations = turnOffAnimations; +exports.getExitStatus = getExitStatus; +exports.getCreatedDiffFiles = getCreatedDiffFiles; + +function update(options){ + + function stripslash ( str ){ + return str.replace(/\/\//g,'/').replace(/\\/g,'\\'); + } + + options = options || {}; + + casper = options.casper || casper; + _libraryRoot = options.libraryRoot || _libraryRoot; + + _src = stripslash(options.screenshotRoot || _src); + _results = stripslash(options.comparisonResultRoot || _results || _src); + _failures = stripslash(options.failedComparisonsRoot || _failures); + + _fileNameGetter = options.fileNameGetter || _fileNameGetter; + + _onPass = options.onPass || _onPass; + _onFail = options.onFail || _onFail; + _onTimeout = options.onTimeout || _onTimeout; + _onComplete = options.onComplete || options.report || _onComplete; + + _hideElements = options.hideElements; + + _mismatchTolerance = options.mismatchTolerance || _mismatchTolerance; + + if(options.addLabelToFailedImage !== undefined){ + _addLabelToFailedImage = options.addLabelToFailedImage; + } +} + +function init(options){ + update(options); +} + +function turnOffAnimations(){ + console.log('[PhantomCSS] Turning off animations'); + casper.evaluate(function turnOffAnimations(){ + window.addEventListener('load', function(){ + + var css = document.createElement("style"); + css.type = "text/css"; + css.innerHTML = "* { -webkit-transition: none !important; transition: none !important; }"; + document.body.appendChild(css); + + if(jQuery){ + jQuery.fx.off = true; + } + },false); + }); +} + +function _fileNameGetter(root, fileName){ + var name; + + fileName = fileName || "screenshot"; + name = root + fs.separator + fileName + "_" + _count++; + + if(fs.isFile(name+'.png')){ + return name+'.diff.png'; + } else { + return name+'.png'; + } +} + +function screenshot(selector, timeToWait, hideSelector, fileName){ + + if(isNaN(Number(timeToWait)) && typeof timeToWait === 'string'){ + fileName = timeToWait; + timeToWait = void 0; + } + + casper.captureBase64('png'); // force pre-render + casper.wait(timeToWait || 250, function(){ + + var srcPath = _fileNameGetter(_src, fileName); + var resultPath = srcPath.replace(_src, _results); + + if(hideSelector || _hideElements){ + casper.evaluate(function(s1, s2){ + if(s1){ + $(s1).css('visibility', 'hidden'); + } + $(s2).css('visibility', 'hidden'); + }, { + s1: _hideElements, + s2: hideSelector + }); + } + + capture(srcPath, resultPath, selector); + + }); // give a bit of time for all the images appear +} + +function capture(srcPath, resultPath, selector){ + var originalForResult = resultPath.replace('.diff', ''); + var originalFromSource = srcPath.replace('.diff', ''); + + try { + + if( isThisImageADiff(resultPath) ){ + + casper.captureSelector( resultPath , selector ); + + diffsCreated.push(resultPath); + + if(srcPath !== resultPath){ + // also copy the original over to the result directory + copyAndReplaceFile(originalFromSource, originalForResult); + } + + } else { + + casper.captureSelector( srcPath , selector ); + + if(srcPath !== resultPath){ + copyAndReplaceFile(srcPath, resultPath); + } + } + + } + catch(ex){ + console.log("[PhantomCSS] Screenshot capture failed: ", ex.message); + } +} + +function isThisImageADiff(path){ + return /\.diff\.png/.test(path); +} + +function copyAndReplaceFile(src, dest){ + if(fs.isFile(dest)){ + fs.remove(dest); + } + fs.copy(src, dest); +} + +function asyncCompare(one, two, func){ + + if(!casper.evaluate(function(){ return window._imagediff_;})){ + initClient(); + } + + casper.fill('form#image-diff', { + 'one': one, + 'two': two + }); + + casper.evaluate(function(filename){ + window._imagediff_.run( filename ); + }, { + label: _addLabelToFailedImage ? one : false + }); + + casper.waitFor( + function check() { + return this.evaluate(function(){ + return window._imagediff_.hasResult; + }); + }, + function () { + + var mismatch = casper.evaluate(function(){ + return window._imagediff_.getResult(); + }); + + if(Number(mismatch)){ + func(false, mismatch); + } else { + func(true); + } + + }, function(){ + func(false); + }, + 10000 + ); +} + +function getDiffs (path){ + + var filePath; + + if(({'..':1,'.':1})[path]){ return true; } + + if(_realPath){ + _realPath += fs.separator + path; + } else { + _realPath = path; + } + + filePath = _realPath; + + if(fs.isDirectory(_realPath) ){ + fs.list(_realPath).forEach(getDiffs); + } else { + if( /\.diff\./.test(path.toLowerCase()) ){ + if(_test_match){ + if( _test_match.test(_realPath.toLowerCase()) ){ + if( !(_test_exclude && _test_exclude.test(_realPath.toLowerCase())) ){ + console.log('[PhantomCSS] Analysing', _realPath); + _diffsToProcess.push(filePath); + } + } + } else { + if( !(_test_exclude && _test_exclude.test(_realPath.toLowerCase())) ){ + _diffsToProcess.push(filePath); + } + } + } + } + + _realPath = _realPath.replace(fs.separator + path, ''); +} + +function getCreatedDiffFiles(){ + var d = diffsCreated; + diffsCreated = []; + return d; +} + +function compareMatched(match, exclude){ + // Search for diff images, but only compare matched filenames + _test_match = typeof match === 'string' ? new RegExp(match) : match; + compareAll(exclude); +} + +function compareExplicit(list){ + // An explicit list of diff images to compare ['/dialog.diff.png', '/header.diff.png'] + compareAll(void 0, list); +} + +function compareSession(list){ + // compare the diffs created in this session + compareAll(void 0, getCreatedDiffFiles() ); +} + +function compareAll(exclude, list){ + var tests = []; + var fails = 0; + var errors = 0; + + _test_exclude = typeof exclude === 'string' ? new RegExp(exclude) : exclude; + + if (list){ + _diffsToProcess = list; + } else { + _realPath = undefined; + getDiffs(_results); + } + + _diffsToProcess.forEach(function(file){ + + var baseFile = file.replace('.diff', ''); + var html = _libraryRoot+fs.separator+"ResembleJs"+fs.separator+"resemblejscontainer.html"; + var test = { + filename: baseFile + }; + + if(!fs.isFile(baseFile)) { + test.error = true; + errors++; + tests.push(test); + } else { + + if( !fs.isFile(html) ){ + console.log('[PhantomCSS] Can\'t find Resemble container. Perhaps the library root is mis configured. ('+html+')'); + return; + } + + casper.thenOpen ( html , function (){ + + asyncCompare(baseFile, file, function(isSame, mismatch){ + + tests.push(test); + + if(!isSame){ + + test.fail = true; + fails++; + + casper.waitFor( + function check() { + return casper.evaluate(function(){ + return window._imagediff_.hasImage; + }); + }, + function () { + var failFile, safeFileName, increment; + + if(_failures){ + // flattened structure for failed diffs so that it is easier to preview + failFile = _failures + fs.separator + file.split(fs.separator).pop().replace('.diff.png', ''); + safeFileName = failFile; + increment = 0; + + while ( fs.isFile(safeFileName+'.fail.png') ){ + increment++; + safeFileName = failFile+'.'+increment; + } + + failFile = safeFileName + '.fail.png'; + + casper.captureSelector(failFile, 'img'); + } + + casper.captureSelector(file.replace('.diff.png', '.fail.png'), 'img'); + + casper.evaluate(function(){ + window._imagediff_.hasImage = false; + }); + + if(mismatch){ + test.mismatch = mismatch; + _onFail(test); // casper.test.fail throws and error, this function call is aborted + return; // Just to make it clear what is happening + } else { + _onTimeout(test); + } + + }, function(){}, + 10000 + ); + } else { + _onPass(test); + } + + }); + }); + } + }); + + casper.then(function(){ + casper.waitFor(function(){ + return _diffsToProcess.length === tests.length; + }, function(){ + _onComplete(tests, fails, errors); + }, function(){ + + }, + 10000); + }); +} + +function initClient(){ + + casper.page.injectJs(_libraryRoot+fs.separator+'ResembleJs'+fs.separator+'resemble.js'); + + casper.evaluate(function(mismatchTolerance){ + + var result; + + var div = document.createElement('div'); + + // this is a bit of hack, need to get images into browser for analysis + div.style = "display:block;position:absolute;border:0;top:-1px;left:-1px;height:1px;width:1px;overflow:hidden;"; + div.innerHTML = '
'+ + ''+ + ''+ + '
'; + document.body.appendChild(div); + + window._imagediff_ = { + hasResult: false, + hasImage: false, + run: run, + getResult: function(){ + window._imagediff_.hasResult = false; + return result; + } + }; + + function run(label){ + + function render(data){ + var img = new Image(); + + img.onload = function(){ + window._imagediff_.hasImage = true; + }; + document.getElementById('image-diff').appendChild(img); + img.src = data.getImageDataUrl(label); + } + + resemble(document.getElementById('image-diff-one').files[0]). + compareTo(document.getElementById('image-diff-two').files[0]). + ignoreAntialiasing(). // <-- muy importante + onComplete(function(data){ + var diffImage; + + if(Number(data.misMatchPercentage) > mismatchTolerance){ + result = data.misMatchPercentage; + } else { + result = false; + } + + window._imagediff_.hasResult = true; + + if(Number(data.misMatchPercentage) > mismatchTolerance){ + render(data); + } + + }); + } + }, { + mismatchTolerance: _mismatchTolerance + }); +} + +function _onPass(test){ + console.log('\n'); + casper.test.pass('No changes found for screenshot ' + test.filename); +} +function _onFail(test){ + console.log('\n'); + casper.test.fail('Visual change found for screenshot ' + test.filename + ' (' + test.mismatch + '% mismatch)'); +} +function _onTimeout(test){ + console.log('\n'); + casper.test.info('Could not complete image comparison for ' + test.filename); +} +function _onComplete(tests, noOfFails, noOfErrors){ + + if( tests.length === 0){ + console.log("\nMust be your first time?"); + console.log("Some screenshots have been generated in the directory " + _results); + console.log("This is your 'baseline', check the images manually. If they're wrong, delete the images."); + console.log("The next time you run these tests, new screenshots will be taken. These screenshots will be compared to the original."); + console.log('If they are different, PhantomCSS will report a failure.'); + } else { + + if(noOfFails === 0){ + console.log("\nPhantomCSS found " + tests.length + " tests, None of them failed. Which is good right?"); + console.log("\nIf you want to make them fail, go change some CSS - weirdo."); + } else { + console.log("\nPhantomCSS found " + tests.length + " tests, " + noOfFails + ' of them failed.'); + console.log('\nPhantomCSS has created some images that try to show the difference (in the directory '+_failures+'). Fuchsia colored pixels indicate a difference betwen the new and old screenshots.'); + } + + if(noOfErrors !== 0){ + console.log("There were " + noOfErrors + "errors. Is it possible that a baseline image was deleted but not the diff?"); + } + + exitStatus = noOfErrors+noOfFails; + } +} + +function getExitStatus() { + return exitStatus; +} \ No newline at end of file diff --git a/js/apps/system/aardvark/test/karma/karma.conf.js b/js/apps/system/aardvark/test/karma/karma.conf.js index 51a903c179..d7705e43c7 100644 --- a/js/apps/system/aardvark/test/karma/karma.conf.js +++ b/js/apps/system/aardvark/test/karma/karma.conf.js @@ -155,6 +155,7 @@ module.exports = function(karma) { // Views 'frontend/js/views/navigationView.js', + 'frontend/js/views/notificationView.js', 'frontend/js/views/apiView.js', 'frontend/js/views/footerView.js', 'frontend/js/views/queryView.js', @@ -258,6 +259,7 @@ module.exports = function(karma) { 'test/specs/views/graphViewSpec.js', 'test/specs/views/graphManagementViewSpec.js', 'test/specs/views/addNewGraphViewSpec.js', + /* 'test/specs/views/clusterDashboardViewSpec.js', 'test/specs/views/clusterOverviewViewSpec.js', 'test/specs/views/clusterServerViewSpec.js', @@ -265,16 +267,17 @@ module.exports = function(karma) { 'test/specs/views/clusterDatabaseViewSpec.js', 'test/specs/views/clusterCollectionViewSpec.js', 'test/specs/views/clusterShardsViewSpec.js', + */ // Router 'test/specs/router/routerSpec.js', //Planner //Router - 'test/specs/planner/router/routerSpec.js', +// 'test/specs/planner/router/routerSpec.js', //View - 'test/specs/planner/views/planSymmetricViewSpec.js', - 'test/specs/planner/views/planTestViewSpec.js', - 'test/specs/planner/views/planScenarioSelectorViewSpec.js', +// 'test/specs/planner/views/planSymmetricViewSpec.js', +// 'test/specs/planner/views/planTestViewSpec.js', +// 'test/specs/planner/views/planScenarioSelectorViewSpec.js', 'test/specJSLint/jsLintSpec.js' ], diff --git a/js/apps/system/aardvark/test/specs/collections/clusterCollectionsSpec.js b/js/apps/system/aardvark/test/specs/collections/clusterCollectionsSpec.js index 252b27ef65..76499a631d 100644 --- a/js/apps/system/aardvark/test/specs/collections/clusterCollectionsSpec.js +++ b/js/apps/system/aardvark/test/specs/collections/clusterCollectionsSpec.js @@ -1,5 +1,5 @@ /*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true, browser: true*/ -/*global describe, beforeEach, afterEach, it, */ +/*global describe, beforeEach, afterEach, it, jasmine, */ /*global spyOn, expect*/ /*global _*/ (function() { @@ -8,9 +8,15 @@ describe("Cluster Collections Collection", function() { - var col, list, c1, c2, c3; + var col, list, c1, c2, c3, oldRouter; beforeEach(function() { + oldRouter = window.App; + window.App = { + registerForUpdate: function(){}, + addAuth: function(){}, + getNewRoute: function(){} + }; list = []; c1 = {name: "Documents", id: "123"}; c2 = {name: "Edges", id: "321"}; @@ -29,7 +35,8 @@ col.fetch.reset(); col.getList(); expect(col.fetch).toHaveBeenCalledWith({ - async: false + async: false, + beforeSend: jasmine.any(Function) }); }); diff --git a/js/apps/system/aardvark/test/specs/collections/clusterDatabasesSpec.js b/js/apps/system/aardvark/test/specs/collections/clusterDatabasesSpec.js index a8de5d295b..59ff871b3c 100644 --- a/js/apps/system/aardvark/test/specs/collections/clusterDatabasesSpec.js +++ b/js/apps/system/aardvark/test/specs/collections/clusterDatabasesSpec.js @@ -1,5 +1,5 @@ /*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true, browser: true*/ -/*global describe, beforeEach, afterEach, it, */ +/*global describe, beforeEach, afterEach, it, jasmine, */ /*global spyOn, expect*/ /*global _*/ (function() { @@ -8,9 +8,14 @@ describe("Cluster Databases Collection", function() { - var col, list, db1, db2, db3; + var col, list, db1, db2, db3, oldRouter; beforeEach(function() { + oldRouter = window.App; + window.App = { + registerForUpdate: function() {}, + addAuth: function() {} + }; list = []; db1 = {name: "_system"}; db2 = {name: "otherDB"}; @@ -23,13 +28,18 @@ }); }); + afterEach(function() { + window.App = oldRouter; + }); + describe("list", function() { it("should fetch the result sync", function() { col.fetch.reset(); col.getList(); expect(col.fetch).toHaveBeenCalledWith({ - async: false + async: false, + beforeSend: jasmine.any(Function) }); }); diff --git a/js/apps/system/aardvark/test/specs/collections/clusterServersSpec.js b/js/apps/system/aardvark/test/specs/collections/clusterServersSpec.js index e8f43ebffd..50471a5ebc 100644 --- a/js/apps/system/aardvark/test/specs/collections/clusterServersSpec.js +++ b/js/apps/system/aardvark/test/specs/collections/clusterServersSpec.js @@ -1,5 +1,5 @@ /*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true, browser: true*/ -/*global describe, beforeEach, afterEach, it, */ +/*global describe, beforeEach, afterEach, it, jasmine, */ /*global spyOn, expect*/ /*global templateEngine, $, _, uiMatchers*/ (function() { @@ -8,9 +8,14 @@ describe("Cluster Servers Collection", function() { - var col, list, prim1, prim2, prim3, sec1, sec2, sec3; + var col, list, prim1, prim2, prim3, sec1, sec2, sec3, oldRouter; beforeEach(function() { + oldRouter = window.App; + window.App = { + registerForUpdate: function(){}, + addAuth: function(){} + }; list = []; sec1 = { role: "secondary", @@ -53,13 +58,18 @@ }); }); + afterEach(function() { + window.App = oldRouter; + }); + describe("list overview", function() { it("should fetch the result sync", function() { col.fetch.reset(); col.getOverview(); expect(col.fetch).toHaveBeenCalledWith({ - async: false + async: false, + beforeSend: jasmine.any(Function) }); }); @@ -140,7 +150,8 @@ col.fetch.reset(); col.getList(); expect(col.fetch).toHaveBeenCalledWith({ - async: false + async: false, + beforeSend: jasmine.any(Function) }); }); diff --git a/js/apps/system/aardvark/test/specs/collections/clusterShardsSpec.js b/js/apps/system/aardvark/test/specs/collections/clusterShardsSpec.js index 054c967bf1..fdf79519b3 100644 --- a/js/apps/system/aardvark/test/specs/collections/clusterShardsSpec.js +++ b/js/apps/system/aardvark/test/specs/collections/clusterShardsSpec.js @@ -1,5 +1,5 @@ /*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true, browser: true*/ -/*global describe, beforeEach, afterEach, it, */ +/*global describe, beforeEach, afterEach, it, jasmine, */ /*global spyOn, expect*/ /*global _*/ (function() { @@ -8,19 +8,28 @@ describe("Cluster Shards Collection", function() { - var col, list, s1, s2, s3; + var col, list, s1, s2, s3, oldRouter; beforeEach(function() { + oldRouter = window.App; + window.App = { + registerForUpdate: function(){}, + addAuth: function(){}, + getNewRoute: function(){} + }; list = []; - s1 = {id: "Shard 1"}; - s2 = {id: "Shard 2"}; - s3 = {id: "Shard 3"}; + s1 = {name: "Pavel", shards: ["asd", "xyz", "123"]}; + s2 = {name: "Perry", shards: []}; + s3 = {name: "Pancho", shards: ["hallo", "hans", "12333"]}; col = new window.ClusterShards(); + spyOn(col, "fetch").andCallFake(function() { _.each(list, function(s) { col.add(s); }); }); + + }); describe("list overview", function() { @@ -29,10 +38,10 @@ col.fetch.reset(); col.getList(); expect(col.fetch).toHaveBeenCalledWith({ - async: false + async: false, + beforeSend: jasmine.any(Function) }); }); - it("should return a list with default ok status", function() { list.push(s1); @@ -40,16 +49,16 @@ list.push(s3); var expected = []; expected.push({ - id: s1.id, - status: "ok" + server: s1.name, + shards: s1.shards }); expected.push({ - id: s2.id, - status: "ok" + server: s2.name, + shards: s2.shards }); expected.push({ - id: s3.id, - status: "ok" + server: s3.name, + shards: s3.shards }); expect(col.getList()).toEqual(expected); }); diff --git a/js/apps/system/aardvark/test/specs/graphViewer/helper/uiMatchers.js b/js/apps/system/aardvark/test/specs/graphViewer/helper/uiMatchers.js index bda67450f7..049d8a5086 100644 --- a/js/apps/system/aardvark/test/specs/graphViewer/helper/uiMatchers.js +++ b/js/apps/system/aardvark/test/specs/graphViewer/helper/uiMatchers.js @@ -112,8 +112,7 @@ var uiMatchers = uiMatchers || {}; expect(li).toBeTag("li"); expect(li).toBeOfClass("graph_control"); expect(btn).toBeTag("button"); - expect(btn).toBeOfClass("btn"); - expect(btn).toBeOfClass("btn-primary"); + expect(btn).toBeOfClass("button-primary"); expect(btn).toBeOfClass("gv_dropdown_entry"); return true; } diff --git a/js/apps/system/aardvark/test/specs/graphViewer/specAdapter/arangoAdapterUISpec.js b/js/apps/system/aardvark/test/specs/graphViewer/specAdapter/arangoAdapterUISpec.js index 52b365409d..0a919eefe5 100644 --- a/js/apps/system/aardvark/test/specs/graphViewer/specAdapter/arangoAdapterUISpec.js +++ b/js/apps/system/aardvark/test/specs/graphViewer/specAdapter/arangoAdapterUISpec.js @@ -259,11 +259,11 @@ expect($("#" + idPrefix + "4").length).toEqual(1); expect($("#" + idPrefix + "5").length).toEqual(1); - expect($("#" + idPrefix + "1").attr("value")).toEqual(""); - expect($("#" + idPrefix + "2").attr("value")).toEqual(""); - expect($("#" + idPrefix + "3").attr("value")).toEqual(""); - expect($("#" + idPrefix + "4").attr("value")).toEqual(""); - expect($("#" + idPrefix + "5").attr("value")).toEqual(""); + expect($("#" + idPrefix + "1").val()).toEqual(""); + expect($("#" + idPrefix + "2").val()).toEqual(""); + expect($("#" + idPrefix + "3").val()).toEqual(""); + expect($("#" + idPrefix + "4").val()).toEqual(""); + expect($("#" + idPrefix + "5").val()).toEqual(""); expect($("#" + idPrefix + "addLine").length).toEqual(1); $("#" + idPrefix + "1").attr("value", "foo"); diff --git a/js/apps/system/aardvark/test/specs/graphViewer/specNodeShaper/nodeShaperUISpec.js b/js/apps/system/aardvark/test/specs/graphViewer/specNodeShaper/nodeShaperUISpec.js index 49e8e52e24..61a8a3b92d 100644 --- a/js/apps/system/aardvark/test/specs/graphViewer/specNodeShaper/nodeShaperUISpec.js +++ b/js/apps/system/aardvark/test/specs/graphViewer/specNodeShaper/nodeShaperUISpec.js @@ -442,11 +442,11 @@ expect($(lblAttrPrefix + "4").length).toEqual(1); expect($(lblAttrPrefix + "5").length).toEqual(1); - expect($(lblAttrPrefix + "1").attr("value")).toEqual(""); - expect($(lblAttrPrefix + "2").attr("value")).toEqual(""); - expect($(lblAttrPrefix + "3").attr("value")).toEqual(""); - expect($(lblAttrPrefix + "4").attr("value")).toEqual(""); - expect($(lblAttrPrefix + "5").attr("value")).toEqual(""); + expect($(lblAttrPrefix + "1").val()).toEqual(""); + expect($(lblAttrPrefix + "2").val()).toEqual(""); + expect($(lblAttrPrefix + "3").val()).toEqual(""); + expect($(lblAttrPrefix + "4").val()).toEqual(""); + expect($(lblAttrPrefix + "5").val()).toEqual(""); expect($("#" + addLabelLineId).length).toEqual(1); $(lblAttrPrefix + "1").attr("value", lbl1); diff --git a/js/apps/system/aardvark/test/specs/router/routerSpec.js b/js/apps/system/aardvark/test/specs/router/routerSpec.js index b1a5c02e74..412b3490c2 100644 --- a/js/apps/system/aardvark/test/specs/router/routerSpec.js +++ b/js/apps/system/aardvark/test/specs/router/routerSpec.js @@ -86,7 +86,6 @@ spyOn(window, "CollectionsView"); spyOn(window, "DocumentsView"); spyOn(window, "DocumentView"); - spyOn(window, "DocumentSourceView"); spyOn(window, "ArangoLogs").andReturn(logsDummy); spyOn(logsDummy, "fetch"); spyOn(window, "FooterView").andReturn(footerDummy); @@ -142,11 +141,11 @@ }); it("should create a documentView", function() { - expect(window.DocumentView).toHaveBeenCalledWith(); - }); - - it("should create a documentSourceView", function() { - expect(window.DocumentSourceView).toHaveBeenCalledWith(); + expect(window.DocumentView).toHaveBeenCalledWith( + { + collection : documentDummy + } + ); }); it("should create a documentsView", function() { @@ -416,32 +415,6 @@ true ); }); - - it("should route to the insalled applications", function() { - simpleNavigationCheck( - "applications/installed", - "FoxxActiveListView", - "applications-menu", - { collection: foxxDummy}, - { - reload: undefined - }, - true - ); - }); - - it("should route to the available applications", function() { - simpleNavigationCheck( - "applications/available", - "FoxxInstalledListView", - "applications-menu", - { collection: foxxDummy}, - { - reload: undefined - }, - true - ); - }); }); }); }()); diff --git a/js/apps/system/aardvark/test/specs/views/collectionViewSpec.js b/js/apps/system/aardvark/test/specs/views/collectionViewSpec.js index b855fd4889..efcaa74e9d 100644 --- a/js/apps/system/aardvark/test/specs/views/collectionViewSpec.js +++ b/js/apps/system/aardvark/test/specs/views/collectionViewSpec.js @@ -7,11 +7,13 @@ describe("Collection View", function() { - var myView; - window.App = function() {}; - window.App.navigate = function() {}; + var myView, oldRouter; + beforeEach(function() { + oldRouter = window.App; + window.App = function() {}; + window.App.navigate = function() {}; $('body').append('
'); myView = new window.CollectionView({ @@ -22,6 +24,7 @@ afterEach(function() { $('.removeMe').remove(); + window.App = oldRouter; }); diff --git a/js/apps/system/aardvark/test/specs/views/collectionsViewSpec.js b/js/apps/system/aardvark/test/specs/views/collectionsViewSpec.js index ea01fc5b2d..9263b681fc 100644 --- a/js/apps/system/aardvark/test/specs/views/collectionsViewSpec.js +++ b/js/apps/system/aardvark/test/specs/views/collectionsViewSpec.js @@ -70,11 +70,11 @@ it("Check if System Collections should be drawn", function() { myView.render(); var wasRendered; - $('#checkSystem').click(); spyOn(myView, 'render').andCallFake(function(request) { wasRendered = true; }); + $('#checkSystem').click(); myView.checkSystem(); expect(wasRendered).toBeTruthy(); }); @@ -93,11 +93,11 @@ it("Check if Edge Collections should be drawn", function() { myView.render(); var wasRendered; - $('#checkEdge').click(); - spyOn(myView, 'render').andCallFake(function(request) { wasRendered = true; }); + + $('#checkEdge').click(); myView.checkEdge(); expect(wasRendered).toBeTruthy(); }); @@ -116,11 +116,11 @@ it("Check if Document Collections should be drawn", function() { myView.render(); var wasRendered; - $('#checkDocument').click(); - spyOn(myView, 'render').andCallFake(function(request) { wasRendered = true; }); + + $('#checkDocument').click(); myView.checkDocument(); expect(wasRendered).toBeTruthy(); }); @@ -139,11 +139,11 @@ it("Check if Loaded Collections should be drawn", function() { myView.render(); var wasRendered; - $('#checkLoaded').click(); - spyOn(myView, 'render').andCallFake(function(request) { wasRendered = true; }); + + $('#checkLoaded').click(); myView.checkLoaded(); expect(wasRendered).toBeTruthy(); }); @@ -162,13 +162,15 @@ it("Check if Unloaded Collections should be drawn", function() { myView.render(); var wasRendered; - $('#checkUnloaded').click(); - spyOn(myView, 'render').andCallFake(function(request) { wasRendered = true; }); - myView.checkUnloaded(); + + $('#checkUnloaded').click(); expect(wasRendered).toBeTruthy(); + wasRendered =false; + myView.checkUnloaded(); + expect(wasRendered).toBeFalsy(); }); it("Check if Name Sort is inactive", function() { diff --git a/js/apps/system/aardvark/test/specs/views/dbSelectionViewSpec.js b/js/apps/system/aardvark/test/specs/views/dbSelectionViewSpec.js index 1e44b3d5a9..61210867fc 100644 --- a/js/apps/system/aardvark/test/specs/views/dbSelectionViewSpec.js +++ b/js/apps/system/aardvark/test/specs/views/dbSelectionViewSpec.js @@ -77,7 +77,7 @@ */ it("should not render the selection if the list has only one element", function() { var oneCollection = new window.ArangoDatabase(); - oneCollection.add({name: current}); + oneCollection.add(current); spyOn(oneCollection, "fetch"); view = new DBSelectionView( { diff --git a/js/apps/system/aardvark/test/specs/views/graphManagementViewSpec.js b/js/apps/system/aardvark/test/specs/views/graphManagementViewSpec.js index 0de1814bd2..7e223dcf0a 100644 --- a/js/apps/system/aardvark/test/specs/views/graphManagementViewSpec.js +++ b/js/apps/system/aardvark/test/specs/views/graphManagementViewSpec.js @@ -72,19 +72,19 @@ }); it("should create a sorted list of all graphs", function() { - var list = $("tbody > tr > td:last-child > a", "#graphsTable"); + var list = $("li.tile h5.collectionName", "#graphManagementThumbnailsIn"); expect(list.length).toEqual(3); // Order would be g2, g3, g1 - expect(list[0].id).toEqual(g2._key); - expect(list[1].id).toEqual(g3._key); - expect(list[2].id).toEqual(g1._key); + expect($(list[0]).html()).toEqual(g2._key); + expect($(list[1]).html()).toEqual(g3._key); + expect($(list[2]).html()).toEqual(g1._key); }); describe("creating a new graph", function() { it("should navigate to the graph adding view", function() { spyOn(window.App, "navigate"); - $("#addGraphButton").click(); + $("#createGraph").click(); expect(window.App.navigate).toHaveBeenCalledWith( "graphManagement/add", { @@ -98,7 +98,8 @@ it("should navigate to graph delete view", function() { spyOn(window.App, "navigate"); var lg = graphs.get("g3"); - $("#" + g3._key + " > span").click(); + $("#" + g3._key + "_settings").click(); + $("#deleteGraph").click(); expect(window.App.navigate).toHaveBeenCalledWith( "graphManagement/delete/" + g3._key, { diff --git a/js/apps/system/aardvark/test/specs/views/graphViewSpec.js b/js/apps/system/aardvark/test/specs/views/graphViewSpec.js index 702e2d9f22..47cf22b5ec 100644 --- a/js/apps/system/aardvark/test/specs/views/graphViewSpec.js +++ b/js/apps/system/aardvark/test/specs/views/graphViewSpec.js @@ -1,5 +1,5 @@ /*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true, browser: true*/ -/*global describe, beforeEach, afterEach, it, */ +/*global describe, beforeEach, afterEach, it, jasmine*/ /*global spyOn, runs, expect, waitsFor*/ /*global templateEngine, GraphView, _, $*/ (function() { @@ -11,6 +11,7 @@ div; beforeEach(function() { + window.App = {navigate : function(){}}; div = document.createElement("div"); div.id = "content"; document.body.appendChild(div); @@ -30,7 +31,7 @@ describe("after view creation", function() { var graphs, g1, g2, v1, v2, e1, e2, - myStore, sys1, cols, called; + myStore, sys1, cols, fakeStartNode; beforeEach(function() { @@ -43,7 +44,6 @@ status: "loaded" }); }; - called = false; v1 = createCol("z1", "document"); v2 = createCol("a2", "document"); e1 = createCol("y1", "edge"); @@ -76,7 +76,17 @@ collection: myStore, graphs: graphs }); + fakeStartNode = "vertices/123"; spyOn($, "ajax").andCallFake(function(opts) { + if (opts.url === "/_api/simple/any" + && _.isFunction(opts.success)) { + opts.success({ + document: { + _id: fakeStartNode + } + }); + return; + } throw "Test not implemented"; }); view.render(); @@ -142,7 +152,14 @@ spyOn(window, "GraphViewerUI"); $("#createViewer").click(); // Once load graphs, but never load random node - expect($.ajax).not.toHaveBeenCalled(); + expect($.ajax).toHaveBeenCalledWith({ + cache: false, + type: 'PUT', + url: '/_api/simple/any', + contentType: "application/json", + data: JSON.stringify({collection: v2.get("name")}), + success: jasmine.any(Function) + }); defaultAdapterConfig.nodeCollection = v2.get("name"); defaultAdapterConfig.edgeCollection = e2.get("name"); expect(window.GraphViewerUI).toHaveBeenCalledWith( @@ -150,7 +167,8 @@ defaultAdapterConfig, $("#content").width(), 680, - defaultGVConfig + defaultGVConfig, + fakeStartNode ); }); @@ -161,7 +179,14 @@ spyOn(window, "GraphViewerUI"); $("#createViewer").click(); // Once load graphs, but never load random node - expect($.ajax).not.toHaveBeenCalled(); + expect($.ajax).toHaveBeenCalledWith({ + cache: false, + type: 'PUT', + url: '/_api/simple/any', + contentType: "application/json", + data: JSON.stringify({collection: g2.vertices}), + success: jasmine.any(Function) + }); defaultAdapterConfig.graph = g2._key; defaultAdapterConfig.nodeCollection = g2.vertices; defaultAdapterConfig.edgeCollection = g2.edges; @@ -170,7 +195,8 @@ defaultAdapterConfig, $("#content").width(), 680, - defaultGVConfig + defaultGVConfig, + fakeStartNode ); }); diff --git a/js/apps/system/aardvark/test/specs/views/navigationViewSpec.js b/js/apps/system/aardvark/test/specs/views/navigationViewSpec.js index f5398451b0..4fdcb5bba0 100644 --- a/js/apps/system/aardvark/test/specs/views/navigationViewSpec.js +++ b/js/apps/system/aardvark/test/specs/views/navigationViewSpec.js @@ -8,11 +8,14 @@ describe("The navigation bar", function() { var div, view, currentDBFake, curName, isSystem, - DBSelectionViewDummy, StatisticBarViewDummy, UserBarViewDummy; + DBSelectionViewDummy, StatisticBarViewDummy, UserBarViewDummy, + NotificationViewDummy, UserCollectionDummy, oldRouter; beforeEach(function() { curName = "_system"; isSystem = true; + oldRouter = window.App; + window.App = {navigate : function(){}}; window.currentDB = window.currentDB || { get: function() {} @@ -33,9 +36,22 @@ render : function(){} }; + NotificationViewDummy = { + id : "NotificationViewDummy", + render : function(){} + }; + + UserCollectionDummy = { + id : "UserCollectionDummy", + whoAmI : function () {return "root";} + }; + + + spyOn(window, "UserBarView").andReturn(UserBarViewDummy); spyOn(window, "StatisticBarView").andReturn(StatisticBarViewDummy); spyOn(window, "DBSelectionView").andReturn(DBSelectionViewDummy); + spyOn(window, "NotificationView").andReturn(NotificationViewDummy); spyOn(window.currentDB, "get").andCallFake(function(key) { if (key === "name") { return curName; @@ -52,12 +68,13 @@ afterEach(function() { document.body.removeChild(div); + window.App = oldRouter; }); describe("in any database", function() { beforeEach(function() { - view = new window.NavigationView(); + view = new window.NavigationView({userCollection : UserCollectionDummy}); view.render(); }); @@ -115,7 +132,7 @@ describe("in _system database", function() { beforeEach(function() { - view = new window.NavigationView(); + view = new window.NavigationView({userCollection : UserCollectionDummy}); view.render(); }); @@ -133,7 +150,7 @@ beforeEach(function() { curName = "firstDB"; isSystem = false; - view = new window.NavigationView(); + view = new window.NavigationView({userCollection : UserCollectionDummy}); view.render(); });