mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'devel' of https://github.com/triAGENS/ArangoDB into devel
This commit is contained in:
commit
d76c0dd6d3
|
@ -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<len;i++){
|
||||||
|
if (typeof updateCallbackArray[i] === 'function'){
|
||||||
|
updateCallbackArray[i](data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function loop(x, y, callback){
|
||||||
|
var i,j;
|
||||||
|
|
||||||
|
for (i=0;i<x;i++){
|
||||||
|
for (j=0;j<y;j++){
|
||||||
|
callback(i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseImage(sourceImageData, width, height){
|
||||||
|
|
||||||
|
var pixleCount = 0;
|
||||||
|
var redTotal = 0;
|
||||||
|
var greenTotal = 0;
|
||||||
|
var blueTotal = 0;
|
||||||
|
var brightnessTotal = 0;
|
||||||
|
|
||||||
|
loop(height, width, function(verticalPos, horizontalPos){
|
||||||
|
var offset = (verticalPos*width + horizontalPos) * 4;
|
||||||
|
var red = sourceImageData[offset];
|
||||||
|
var green = sourceImageData[offset + 1];
|
||||||
|
var blue = sourceImageData[offset + 2];
|
||||||
|
var brightness = getBrightness(red,green,blue);
|
||||||
|
|
||||||
|
pixleCount++;
|
||||||
|
|
||||||
|
redTotal += red / 255 * 100;
|
||||||
|
greenTotal += green / 255 * 100;
|
||||||
|
blueTotal += blue / 255 * 100;
|
||||||
|
brightnessTotal += brightness / 255 * 100;
|
||||||
|
});
|
||||||
|
|
||||||
|
data.red = Math.floor(redTotal / pixleCount);
|
||||||
|
data.green = Math.floor(greenTotal / pixleCount);
|
||||||
|
data.blue = Math.floor(blueTotal / pixleCount);
|
||||||
|
data.brightness = Math.floor(brightnessTotal / pixleCount);
|
||||||
|
|
||||||
|
triggerDataUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadImageData( fileData, callback ){
|
||||||
|
var fileReader;
|
||||||
|
var hiddenImage = new Image();
|
||||||
|
|
||||||
|
hiddenImage.onload = function() {
|
||||||
|
|
||||||
|
var hiddenCanvas = document.createElement('canvas');
|
||||||
|
var imageData;
|
||||||
|
var width = hiddenImage.width;
|
||||||
|
var height = hiddenImage.height;
|
||||||
|
|
||||||
|
hiddenCanvas.width = width;
|
||||||
|
hiddenCanvas.height = height;
|
||||||
|
hiddenCanvas.getContext('2d').drawImage(hiddenImage, 0, 0, width, height);
|
||||||
|
imageData = hiddenCanvas.getContext('2d').getImageData(0, 0, width, height);
|
||||||
|
|
||||||
|
images.push(imageData);
|
||||||
|
|
||||||
|
callback(imageData, width, height);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof fileData === 'string') {
|
||||||
|
hiddenImage.src = fileData;
|
||||||
|
} else {
|
||||||
|
fileReader = new FileReader();
|
||||||
|
fileReader.onload = function (event) {
|
||||||
|
hiddenImage.src = event.target.result;
|
||||||
|
};
|
||||||
|
fileReader.readAsDataURL(fileData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isColorSimilar(a, b, color){
|
||||||
|
|
||||||
|
var absDiff = Math.abs(a - b);
|
||||||
|
|
||||||
|
if(typeof a === 'undefined'){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(typeof b === 'undefined'){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(a === b){
|
||||||
|
return true;
|
||||||
|
} else if ( absDiff < tolerance[color] ) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isNumber(n) {
|
||||||
|
return !isNaN(parseFloat(n));
|
||||||
|
}
|
||||||
|
|
||||||
|
function isPixelBrightnessSimilar(d1, d2){
|
||||||
|
return Math.abs(d1.brightness - d2.brightness) < tolerance.minBrightness;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBrightness(r,g,b){
|
||||||
|
return 0.3*r + 0.59*g + 0.11*b;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isRGBSame(d1,d2){
|
||||||
|
var red = d1.r === d2.r;
|
||||||
|
var green = d1.g === d2.g;
|
||||||
|
var blue = d1.b === d2.b;
|
||||||
|
return red && green && blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isRGBSimilar(d1, d2){
|
||||||
|
var red = isColorSimilar(d1.r,d2.r,'red');
|
||||||
|
var green = isColorSimilar(d1.g,d2.g,'green');
|
||||||
|
var blue = isColorSimilar(d1.b,d2.b,'blue');
|
||||||
|
|
||||||
|
return red && green && blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isContrasting(d1, d2){
|
||||||
|
return Math.abs(d1.brightness - d2.brightness) > 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));
|
|
@ -0,0 +1 @@
|
||||||
|
<html><body>This blank HTML page is used for processing the images with Resemble.js</body></html>
|
|
@ -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 = '<form id="image-diff">'+
|
||||||
|
'<input type="file" id="image-diff-one" name="one"/>'+
|
||||||
|
'<input type="file" id="image-diff-two" name="two"/>'+
|
||||||
|
'</form><div id="image-diff"></div>';
|
||||||
|
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;
|
||||||
|
}
|
|
@ -155,6 +155,7 @@ module.exports = function(karma) {
|
||||||
|
|
||||||
// Views
|
// Views
|
||||||
'frontend/js/views/navigationView.js',
|
'frontend/js/views/navigationView.js',
|
||||||
|
'frontend/js/views/notificationView.js',
|
||||||
'frontend/js/views/apiView.js',
|
'frontend/js/views/apiView.js',
|
||||||
'frontend/js/views/footerView.js',
|
'frontend/js/views/footerView.js',
|
||||||
'frontend/js/views/queryView.js',
|
'frontend/js/views/queryView.js',
|
||||||
|
@ -258,6 +259,7 @@ module.exports = function(karma) {
|
||||||
'test/specs/views/graphViewSpec.js',
|
'test/specs/views/graphViewSpec.js',
|
||||||
'test/specs/views/graphManagementViewSpec.js',
|
'test/specs/views/graphManagementViewSpec.js',
|
||||||
'test/specs/views/addNewGraphViewSpec.js',
|
'test/specs/views/addNewGraphViewSpec.js',
|
||||||
|
/*
|
||||||
'test/specs/views/clusterDashboardViewSpec.js',
|
'test/specs/views/clusterDashboardViewSpec.js',
|
||||||
'test/specs/views/clusterOverviewViewSpec.js',
|
'test/specs/views/clusterOverviewViewSpec.js',
|
||||||
'test/specs/views/clusterServerViewSpec.js',
|
'test/specs/views/clusterServerViewSpec.js',
|
||||||
|
@ -265,16 +267,17 @@ module.exports = function(karma) {
|
||||||
'test/specs/views/clusterDatabaseViewSpec.js',
|
'test/specs/views/clusterDatabaseViewSpec.js',
|
||||||
'test/specs/views/clusterCollectionViewSpec.js',
|
'test/specs/views/clusterCollectionViewSpec.js',
|
||||||
'test/specs/views/clusterShardsViewSpec.js',
|
'test/specs/views/clusterShardsViewSpec.js',
|
||||||
|
*/
|
||||||
// Router
|
// Router
|
||||||
'test/specs/router/routerSpec.js',
|
'test/specs/router/routerSpec.js',
|
||||||
|
|
||||||
//Planner
|
//Planner
|
||||||
//Router
|
//Router
|
||||||
'test/specs/planner/router/routerSpec.js',
|
// 'test/specs/planner/router/routerSpec.js',
|
||||||
//View
|
//View
|
||||||
'test/specs/planner/views/planSymmetricViewSpec.js',
|
// 'test/specs/planner/views/planSymmetricViewSpec.js',
|
||||||
'test/specs/planner/views/planTestViewSpec.js',
|
// 'test/specs/planner/views/planTestViewSpec.js',
|
||||||
'test/specs/planner/views/planScenarioSelectorViewSpec.js',
|
// 'test/specs/planner/views/planScenarioSelectorViewSpec.js',
|
||||||
'test/specJSLint/jsLintSpec.js'
|
'test/specJSLint/jsLintSpec.js'
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true, browser: true*/
|
/*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 spyOn, expect*/
|
||||||
/*global _*/
|
/*global _*/
|
||||||
(function() {
|
(function() {
|
||||||
|
@ -8,9 +8,15 @@
|
||||||
|
|
||||||
describe("Cluster Collections Collection", function() {
|
describe("Cluster Collections Collection", function() {
|
||||||
|
|
||||||
var col, list, c1, c2, c3;
|
var col, list, c1, c2, c3, oldRouter;
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
|
oldRouter = window.App;
|
||||||
|
window.App = {
|
||||||
|
registerForUpdate: function(){},
|
||||||
|
addAuth: function(){},
|
||||||
|
getNewRoute: function(){}
|
||||||
|
};
|
||||||
list = [];
|
list = [];
|
||||||
c1 = {name: "Documents", id: "123"};
|
c1 = {name: "Documents", id: "123"};
|
||||||
c2 = {name: "Edges", id: "321"};
|
c2 = {name: "Edges", id: "321"};
|
||||||
|
@ -29,7 +35,8 @@
|
||||||
col.fetch.reset();
|
col.fetch.reset();
|
||||||
col.getList();
|
col.getList();
|
||||||
expect(col.fetch).toHaveBeenCalledWith({
|
expect(col.fetch).toHaveBeenCalledWith({
|
||||||
async: false
|
async: false,
|
||||||
|
beforeSend: jasmine.any(Function)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true, browser: true*/
|
/*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 spyOn, expect*/
|
||||||
/*global _*/
|
/*global _*/
|
||||||
(function() {
|
(function() {
|
||||||
|
@ -8,9 +8,14 @@
|
||||||
|
|
||||||
describe("Cluster Databases Collection", function() {
|
describe("Cluster Databases Collection", function() {
|
||||||
|
|
||||||
var col, list, db1, db2, db3;
|
var col, list, db1, db2, db3, oldRouter;
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
|
oldRouter = window.App;
|
||||||
|
window.App = {
|
||||||
|
registerForUpdate: function() {},
|
||||||
|
addAuth: function() {}
|
||||||
|
};
|
||||||
list = [];
|
list = [];
|
||||||
db1 = {name: "_system"};
|
db1 = {name: "_system"};
|
||||||
db2 = {name: "otherDB"};
|
db2 = {name: "otherDB"};
|
||||||
|
@ -23,13 +28,18 @@
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
afterEach(function() {
|
||||||
|
window.App = oldRouter;
|
||||||
|
});
|
||||||
|
|
||||||
describe("list", function() {
|
describe("list", function() {
|
||||||
|
|
||||||
it("should fetch the result sync", function() {
|
it("should fetch the result sync", function() {
|
||||||
col.fetch.reset();
|
col.fetch.reset();
|
||||||
col.getList();
|
col.getList();
|
||||||
expect(col.fetch).toHaveBeenCalledWith({
|
expect(col.fetch).toHaveBeenCalledWith({
|
||||||
async: false
|
async: false,
|
||||||
|
beforeSend: jasmine.any(Function)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true, browser: true*/
|
/*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 spyOn, expect*/
|
||||||
/*global templateEngine, $, _, uiMatchers*/
|
/*global templateEngine, $, _, uiMatchers*/
|
||||||
(function() {
|
(function() {
|
||||||
|
@ -8,9 +8,14 @@
|
||||||
|
|
||||||
describe("Cluster Servers Collection", function() {
|
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() {
|
beforeEach(function() {
|
||||||
|
oldRouter = window.App;
|
||||||
|
window.App = {
|
||||||
|
registerForUpdate: function(){},
|
||||||
|
addAuth: function(){}
|
||||||
|
};
|
||||||
list = [];
|
list = [];
|
||||||
sec1 = {
|
sec1 = {
|
||||||
role: "secondary",
|
role: "secondary",
|
||||||
|
@ -53,13 +58,18 @@
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
afterEach(function() {
|
||||||
|
window.App = oldRouter;
|
||||||
|
});
|
||||||
|
|
||||||
describe("list overview", function() {
|
describe("list overview", function() {
|
||||||
|
|
||||||
it("should fetch the result sync", function() {
|
it("should fetch the result sync", function() {
|
||||||
col.fetch.reset();
|
col.fetch.reset();
|
||||||
col.getOverview();
|
col.getOverview();
|
||||||
expect(col.fetch).toHaveBeenCalledWith({
|
expect(col.fetch).toHaveBeenCalledWith({
|
||||||
async: false
|
async: false,
|
||||||
|
beforeSend: jasmine.any(Function)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -140,7 +150,8 @@
|
||||||
col.fetch.reset();
|
col.fetch.reset();
|
||||||
col.getList();
|
col.getList();
|
||||||
expect(col.fetch).toHaveBeenCalledWith({
|
expect(col.fetch).toHaveBeenCalledWith({
|
||||||
async: false
|
async: false,
|
||||||
|
beforeSend: jasmine.any(Function)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true, browser: true*/
|
/*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 spyOn, expect*/
|
||||||
/*global _*/
|
/*global _*/
|
||||||
(function() {
|
(function() {
|
||||||
|
@ -8,19 +8,28 @@
|
||||||
|
|
||||||
describe("Cluster Shards Collection", function() {
|
describe("Cluster Shards Collection", function() {
|
||||||
|
|
||||||
var col, list, s1, s2, s3;
|
var col, list, s1, s2, s3, oldRouter;
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
|
oldRouter = window.App;
|
||||||
|
window.App = {
|
||||||
|
registerForUpdate: function(){},
|
||||||
|
addAuth: function(){},
|
||||||
|
getNewRoute: function(){}
|
||||||
|
};
|
||||||
list = [];
|
list = [];
|
||||||
s1 = {id: "Shard 1"};
|
s1 = {name: "Pavel", shards: ["asd", "xyz", "123"]};
|
||||||
s2 = {id: "Shard 2"};
|
s2 = {name: "Perry", shards: []};
|
||||||
s3 = {id: "Shard 3"};
|
s3 = {name: "Pancho", shards: ["hallo", "hans", "12333"]};
|
||||||
col = new window.ClusterShards();
|
col = new window.ClusterShards();
|
||||||
|
|
||||||
spyOn(col, "fetch").andCallFake(function() {
|
spyOn(col, "fetch").andCallFake(function() {
|
||||||
_.each(list, function(s) {
|
_.each(list, function(s) {
|
||||||
col.add(s);
|
col.add(s);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("list overview", function() {
|
describe("list overview", function() {
|
||||||
|
@ -29,10 +38,10 @@
|
||||||
col.fetch.reset();
|
col.fetch.reset();
|
||||||
col.getList();
|
col.getList();
|
||||||
expect(col.fetch).toHaveBeenCalledWith({
|
expect(col.fetch).toHaveBeenCalledWith({
|
||||||
async: false
|
async: false,
|
||||||
|
beforeSend: jasmine.any(Function)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
it("should return a list with default ok status", function() {
|
it("should return a list with default ok status", function() {
|
||||||
list.push(s1);
|
list.push(s1);
|
||||||
|
@ -40,16 +49,16 @@
|
||||||
list.push(s3);
|
list.push(s3);
|
||||||
var expected = [];
|
var expected = [];
|
||||||
expected.push({
|
expected.push({
|
||||||
id: s1.id,
|
server: s1.name,
|
||||||
status: "ok"
|
shards: s1.shards
|
||||||
});
|
});
|
||||||
expected.push({
|
expected.push({
|
||||||
id: s2.id,
|
server: s2.name,
|
||||||
status: "ok"
|
shards: s2.shards
|
||||||
});
|
});
|
||||||
expected.push({
|
expected.push({
|
||||||
id: s3.id,
|
server: s3.name,
|
||||||
status: "ok"
|
shards: s3.shards
|
||||||
});
|
});
|
||||||
expect(col.getList()).toEqual(expected);
|
expect(col.getList()).toEqual(expected);
|
||||||
});
|
});
|
||||||
|
|
|
@ -112,8 +112,7 @@ var uiMatchers = uiMatchers || {};
|
||||||
expect(li).toBeTag("li");
|
expect(li).toBeTag("li");
|
||||||
expect(li).toBeOfClass("graph_control");
|
expect(li).toBeOfClass("graph_control");
|
||||||
expect(btn).toBeTag("button");
|
expect(btn).toBeTag("button");
|
||||||
expect(btn).toBeOfClass("btn");
|
expect(btn).toBeOfClass("button-primary");
|
||||||
expect(btn).toBeOfClass("btn-primary");
|
|
||||||
expect(btn).toBeOfClass("gv_dropdown_entry");
|
expect(btn).toBeOfClass("gv_dropdown_entry");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -259,11 +259,11 @@
|
||||||
expect($("#" + idPrefix + "4").length).toEqual(1);
|
expect($("#" + idPrefix + "4").length).toEqual(1);
|
||||||
expect($("#" + idPrefix + "5").length).toEqual(1);
|
expect($("#" + idPrefix + "5").length).toEqual(1);
|
||||||
|
|
||||||
expect($("#" + idPrefix + "1").attr("value")).toEqual("");
|
expect($("#" + idPrefix + "1").val()).toEqual("");
|
||||||
expect($("#" + idPrefix + "2").attr("value")).toEqual("");
|
expect($("#" + idPrefix + "2").val()).toEqual("");
|
||||||
expect($("#" + idPrefix + "3").attr("value")).toEqual("");
|
expect($("#" + idPrefix + "3").val()).toEqual("");
|
||||||
expect($("#" + idPrefix + "4").attr("value")).toEqual("");
|
expect($("#" + idPrefix + "4").val()).toEqual("");
|
||||||
expect($("#" + idPrefix + "5").attr("value")).toEqual("");
|
expect($("#" + idPrefix + "5").val()).toEqual("");
|
||||||
|
|
||||||
expect($("#" + idPrefix + "addLine").length).toEqual(1);
|
expect($("#" + idPrefix + "addLine").length).toEqual(1);
|
||||||
$("#" + idPrefix + "1").attr("value", "foo");
|
$("#" + idPrefix + "1").attr("value", "foo");
|
||||||
|
|
|
@ -442,11 +442,11 @@
|
||||||
expect($(lblAttrPrefix + "4").length).toEqual(1);
|
expect($(lblAttrPrefix + "4").length).toEqual(1);
|
||||||
expect($(lblAttrPrefix + "5").length).toEqual(1);
|
expect($(lblAttrPrefix + "5").length).toEqual(1);
|
||||||
|
|
||||||
expect($(lblAttrPrefix + "1").attr("value")).toEqual("");
|
expect($(lblAttrPrefix + "1").val()).toEqual("");
|
||||||
expect($(lblAttrPrefix + "2").attr("value")).toEqual("");
|
expect($(lblAttrPrefix + "2").val()).toEqual("");
|
||||||
expect($(lblAttrPrefix + "3").attr("value")).toEqual("");
|
expect($(lblAttrPrefix + "3").val()).toEqual("");
|
||||||
expect($(lblAttrPrefix + "4").attr("value")).toEqual("");
|
expect($(lblAttrPrefix + "4").val()).toEqual("");
|
||||||
expect($(lblAttrPrefix + "5").attr("value")).toEqual("");
|
expect($(lblAttrPrefix + "5").val()).toEqual("");
|
||||||
|
|
||||||
expect($("#" + addLabelLineId).length).toEqual(1);
|
expect($("#" + addLabelLineId).length).toEqual(1);
|
||||||
$(lblAttrPrefix + "1").attr("value", lbl1);
|
$(lblAttrPrefix + "1").attr("value", lbl1);
|
||||||
|
|
|
@ -86,7 +86,6 @@
|
||||||
spyOn(window, "CollectionsView");
|
spyOn(window, "CollectionsView");
|
||||||
spyOn(window, "DocumentsView");
|
spyOn(window, "DocumentsView");
|
||||||
spyOn(window, "DocumentView");
|
spyOn(window, "DocumentView");
|
||||||
spyOn(window, "DocumentSourceView");
|
|
||||||
spyOn(window, "ArangoLogs").andReturn(logsDummy);
|
spyOn(window, "ArangoLogs").andReturn(logsDummy);
|
||||||
spyOn(logsDummy, "fetch");
|
spyOn(logsDummy, "fetch");
|
||||||
spyOn(window, "FooterView").andReturn(footerDummy);
|
spyOn(window, "FooterView").andReturn(footerDummy);
|
||||||
|
@ -142,11 +141,11 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should create a documentView", function() {
|
it("should create a documentView", function() {
|
||||||
expect(window.DocumentView).toHaveBeenCalledWith();
|
expect(window.DocumentView).toHaveBeenCalledWith(
|
||||||
});
|
{
|
||||||
|
collection : documentDummy
|
||||||
it("should create a documentSourceView", function() {
|
}
|
||||||
expect(window.DocumentSourceView).toHaveBeenCalledWith();
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should create a documentsView", function() {
|
it("should create a documentsView", function() {
|
||||||
|
@ -416,32 +415,6 @@
|
||||||
true
|
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
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}());
|
}());
|
||||||
|
|
|
@ -7,11 +7,13 @@
|
||||||
|
|
||||||
describe("Collection View", function() {
|
describe("Collection View", function() {
|
||||||
|
|
||||||
var myView;
|
var myView, oldRouter;
|
||||||
window.App = function() {};
|
|
||||||
window.App.navigate = function() {};
|
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
|
oldRouter = window.App;
|
||||||
|
window.App = function() {};
|
||||||
|
window.App.navigate = function() {};
|
||||||
$('body').append('<div id="content" class="removeMe"></div>');
|
$('body').append('<div id="content" class="removeMe"></div>');
|
||||||
|
|
||||||
myView = new window.CollectionView({
|
myView = new window.CollectionView({
|
||||||
|
@ -22,6 +24,7 @@
|
||||||
|
|
||||||
afterEach(function() {
|
afterEach(function() {
|
||||||
$('.removeMe').remove();
|
$('.removeMe').remove();
|
||||||
|
window.App = oldRouter;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -70,11 +70,11 @@
|
||||||
it("Check if System Collections should be drawn", function() {
|
it("Check if System Collections should be drawn", function() {
|
||||||
myView.render();
|
myView.render();
|
||||||
var wasRendered;
|
var wasRendered;
|
||||||
$('#checkSystem').click();
|
|
||||||
|
|
||||||
spyOn(myView, 'render').andCallFake(function(request) {
|
spyOn(myView, 'render').andCallFake(function(request) {
|
||||||
wasRendered = true;
|
wasRendered = true;
|
||||||
});
|
});
|
||||||
|
$('#checkSystem').click();
|
||||||
myView.checkSystem();
|
myView.checkSystem();
|
||||||
expect(wasRendered).toBeTruthy();
|
expect(wasRendered).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
@ -93,11 +93,11 @@
|
||||||
it("Check if Edge Collections should be drawn", function() {
|
it("Check if Edge Collections should be drawn", function() {
|
||||||
myView.render();
|
myView.render();
|
||||||
var wasRendered;
|
var wasRendered;
|
||||||
$('#checkEdge').click();
|
|
||||||
|
|
||||||
spyOn(myView, 'render').andCallFake(function(request) {
|
spyOn(myView, 'render').andCallFake(function(request) {
|
||||||
wasRendered = true;
|
wasRendered = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#checkEdge').click();
|
||||||
myView.checkEdge();
|
myView.checkEdge();
|
||||||
expect(wasRendered).toBeTruthy();
|
expect(wasRendered).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
@ -116,11 +116,11 @@
|
||||||
it("Check if Document Collections should be drawn", function() {
|
it("Check if Document Collections should be drawn", function() {
|
||||||
myView.render();
|
myView.render();
|
||||||
var wasRendered;
|
var wasRendered;
|
||||||
$('#checkDocument').click();
|
|
||||||
|
|
||||||
spyOn(myView, 'render').andCallFake(function(request) {
|
spyOn(myView, 'render').andCallFake(function(request) {
|
||||||
wasRendered = true;
|
wasRendered = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#checkDocument').click();
|
||||||
myView.checkDocument();
|
myView.checkDocument();
|
||||||
expect(wasRendered).toBeTruthy();
|
expect(wasRendered).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
@ -139,11 +139,11 @@
|
||||||
it("Check if Loaded Collections should be drawn", function() {
|
it("Check if Loaded Collections should be drawn", function() {
|
||||||
myView.render();
|
myView.render();
|
||||||
var wasRendered;
|
var wasRendered;
|
||||||
$('#checkLoaded').click();
|
|
||||||
|
|
||||||
spyOn(myView, 'render').andCallFake(function(request) {
|
spyOn(myView, 'render').andCallFake(function(request) {
|
||||||
wasRendered = true;
|
wasRendered = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#checkLoaded').click();
|
||||||
myView.checkLoaded();
|
myView.checkLoaded();
|
||||||
expect(wasRendered).toBeTruthy();
|
expect(wasRendered).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
@ -162,13 +162,15 @@
|
||||||
it("Check if Unloaded Collections should be drawn", function() {
|
it("Check if Unloaded Collections should be drawn", function() {
|
||||||
myView.render();
|
myView.render();
|
||||||
var wasRendered;
|
var wasRendered;
|
||||||
$('#checkUnloaded').click();
|
|
||||||
|
|
||||||
spyOn(myView, 'render').andCallFake(function(request) {
|
spyOn(myView, 'render').andCallFake(function(request) {
|
||||||
wasRendered = true;
|
wasRendered = true;
|
||||||
});
|
});
|
||||||
myView.checkUnloaded();
|
|
||||||
|
$('#checkUnloaded').click();
|
||||||
expect(wasRendered).toBeTruthy();
|
expect(wasRendered).toBeTruthy();
|
||||||
|
wasRendered =false;
|
||||||
|
myView.checkUnloaded();
|
||||||
|
expect(wasRendered).toBeFalsy();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Check if Name Sort is inactive", function() {
|
it("Check if Name Sort is inactive", function() {
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
*/
|
*/
|
||||||
it("should not render the selection if the list has only one element", function() {
|
it("should not render the selection if the list has only one element", function() {
|
||||||
var oneCollection = new window.ArangoDatabase();
|
var oneCollection = new window.ArangoDatabase();
|
||||||
oneCollection.add({name: current});
|
oneCollection.add(current);
|
||||||
spyOn(oneCollection, "fetch");
|
spyOn(oneCollection, "fetch");
|
||||||
view = new DBSelectionView(
|
view = new DBSelectionView(
|
||||||
{
|
{
|
||||||
|
|
|
@ -72,19 +72,19 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should create a sorted list of all graphs", function() {
|
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);
|
expect(list.length).toEqual(3);
|
||||||
// Order would be g2, g3, g1
|
// Order would be g2, g3, g1
|
||||||
expect(list[0].id).toEqual(g2._key);
|
expect($(list[0]).html()).toEqual(g2._key);
|
||||||
expect(list[1].id).toEqual(g3._key);
|
expect($(list[1]).html()).toEqual(g3._key);
|
||||||
expect(list[2].id).toEqual(g1._key);
|
expect($(list[2]).html()).toEqual(g1._key);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("creating a new graph", function() {
|
describe("creating a new graph", function() {
|
||||||
|
|
||||||
it("should navigate to the graph adding view", function() {
|
it("should navigate to the graph adding view", function() {
|
||||||
spyOn(window.App, "navigate");
|
spyOn(window.App, "navigate");
|
||||||
$("#addGraphButton").click();
|
$("#createGraph").click();
|
||||||
expect(window.App.navigate).toHaveBeenCalledWith(
|
expect(window.App.navigate).toHaveBeenCalledWith(
|
||||||
"graphManagement/add",
|
"graphManagement/add",
|
||||||
{
|
{
|
||||||
|
@ -98,7 +98,8 @@
|
||||||
it("should navigate to graph delete view", function() {
|
it("should navigate to graph delete view", function() {
|
||||||
spyOn(window.App, "navigate");
|
spyOn(window.App, "navigate");
|
||||||
var lg = graphs.get("g3");
|
var lg = graphs.get("g3");
|
||||||
$("#" + g3._key + " > span").click();
|
$("#" + g3._key + "_settings").click();
|
||||||
|
$("#deleteGraph").click();
|
||||||
expect(window.App.navigate).toHaveBeenCalledWith(
|
expect(window.App.navigate).toHaveBeenCalledWith(
|
||||||
"graphManagement/delete/" + g3._key,
|
"graphManagement/delete/" + g3._key,
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*jslint indent: 2, nomen: true, maxlen: 100, white: true plusplus: true, browser: true*/
|
/*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 spyOn, runs, expect, waitsFor*/
|
||||||
/*global templateEngine, GraphView, _, $*/
|
/*global templateEngine, GraphView, _, $*/
|
||||||
(function() {
|
(function() {
|
||||||
|
@ -11,6 +11,7 @@
|
||||||
div;
|
div;
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
|
window.App = {navigate : function(){}};
|
||||||
div = document.createElement("div");
|
div = document.createElement("div");
|
||||||
div.id = "content";
|
div.id = "content";
|
||||||
document.body.appendChild(div);
|
document.body.appendChild(div);
|
||||||
|
@ -30,7 +31,7 @@
|
||||||
describe("after view creation", function() {
|
describe("after view creation", function() {
|
||||||
|
|
||||||
var graphs, g1, g2, v1, v2, e1, e2,
|
var graphs, g1, g2, v1, v2, e1, e2,
|
||||||
myStore, sys1, cols, called;
|
myStore, sys1, cols, fakeStartNode;
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
|
|
||||||
|
@ -43,7 +44,6 @@
|
||||||
status: "loaded"
|
status: "loaded"
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
called = false;
|
|
||||||
v1 = createCol("z1", "document");
|
v1 = createCol("z1", "document");
|
||||||
v2 = createCol("a2", "document");
|
v2 = createCol("a2", "document");
|
||||||
e1 = createCol("y1", "edge");
|
e1 = createCol("y1", "edge");
|
||||||
|
@ -76,7 +76,17 @@
|
||||||
collection: myStore,
|
collection: myStore,
|
||||||
graphs: graphs
|
graphs: graphs
|
||||||
});
|
});
|
||||||
|
fakeStartNode = "vertices/123";
|
||||||
spyOn($, "ajax").andCallFake(function(opts) {
|
spyOn($, "ajax").andCallFake(function(opts) {
|
||||||
|
if (opts.url === "/_api/simple/any"
|
||||||
|
&& _.isFunction(opts.success)) {
|
||||||
|
opts.success({
|
||||||
|
document: {
|
||||||
|
_id: fakeStartNode
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
throw "Test not implemented";
|
throw "Test not implemented";
|
||||||
});
|
});
|
||||||
view.render();
|
view.render();
|
||||||
|
@ -142,7 +152,14 @@
|
||||||
spyOn(window, "GraphViewerUI");
|
spyOn(window, "GraphViewerUI");
|
||||||
$("#createViewer").click();
|
$("#createViewer").click();
|
||||||
// Once load graphs, but never load random node
|
// 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.nodeCollection = v2.get("name");
|
||||||
defaultAdapterConfig.edgeCollection = e2.get("name");
|
defaultAdapterConfig.edgeCollection = e2.get("name");
|
||||||
expect(window.GraphViewerUI).toHaveBeenCalledWith(
|
expect(window.GraphViewerUI).toHaveBeenCalledWith(
|
||||||
|
@ -150,7 +167,8 @@
|
||||||
defaultAdapterConfig,
|
defaultAdapterConfig,
|
||||||
$("#content").width(),
|
$("#content").width(),
|
||||||
680,
|
680,
|
||||||
defaultGVConfig
|
defaultGVConfig,
|
||||||
|
fakeStartNode
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -161,7 +179,14 @@
|
||||||
spyOn(window, "GraphViewerUI");
|
spyOn(window, "GraphViewerUI");
|
||||||
$("#createViewer").click();
|
$("#createViewer").click();
|
||||||
// Once load graphs, but never load random node
|
// 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.graph = g2._key;
|
||||||
defaultAdapterConfig.nodeCollection = g2.vertices;
|
defaultAdapterConfig.nodeCollection = g2.vertices;
|
||||||
defaultAdapterConfig.edgeCollection = g2.edges;
|
defaultAdapterConfig.edgeCollection = g2.edges;
|
||||||
|
@ -170,7 +195,8 @@
|
||||||
defaultAdapterConfig,
|
defaultAdapterConfig,
|
||||||
$("#content").width(),
|
$("#content").width(),
|
||||||
680,
|
680,
|
||||||
defaultGVConfig
|
defaultGVConfig,
|
||||||
|
fakeStartNode
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -8,11 +8,14 @@
|
||||||
describe("The navigation bar", function() {
|
describe("The navigation bar", function() {
|
||||||
|
|
||||||
var div, view, currentDBFake, curName, isSystem,
|
var div, view, currentDBFake, curName, isSystem,
|
||||||
DBSelectionViewDummy, StatisticBarViewDummy, UserBarViewDummy;
|
DBSelectionViewDummy, StatisticBarViewDummy, UserBarViewDummy,
|
||||||
|
NotificationViewDummy, UserCollectionDummy, oldRouter;
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
curName = "_system";
|
curName = "_system";
|
||||||
isSystem = true;
|
isSystem = true;
|
||||||
|
oldRouter = window.App;
|
||||||
|
window.App = {navigate : function(){}};
|
||||||
|
|
||||||
window.currentDB = window.currentDB || {
|
window.currentDB = window.currentDB || {
|
||||||
get: function() {}
|
get: function() {}
|
||||||
|
@ -33,9 +36,22 @@
|
||||||
render : function(){}
|
render : function(){}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
NotificationViewDummy = {
|
||||||
|
id : "NotificationViewDummy",
|
||||||
|
render : function(){}
|
||||||
|
};
|
||||||
|
|
||||||
|
UserCollectionDummy = {
|
||||||
|
id : "UserCollectionDummy",
|
||||||
|
whoAmI : function () {return "root";}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
spyOn(window, "UserBarView").andReturn(UserBarViewDummy);
|
spyOn(window, "UserBarView").andReturn(UserBarViewDummy);
|
||||||
spyOn(window, "StatisticBarView").andReturn(StatisticBarViewDummy);
|
spyOn(window, "StatisticBarView").andReturn(StatisticBarViewDummy);
|
||||||
spyOn(window, "DBSelectionView").andReturn(DBSelectionViewDummy);
|
spyOn(window, "DBSelectionView").andReturn(DBSelectionViewDummy);
|
||||||
|
spyOn(window, "NotificationView").andReturn(NotificationViewDummy);
|
||||||
spyOn(window.currentDB, "get").andCallFake(function(key) {
|
spyOn(window.currentDB, "get").andCallFake(function(key) {
|
||||||
if (key === "name") {
|
if (key === "name") {
|
||||||
return curName;
|
return curName;
|
||||||
|
@ -52,12 +68,13 @@
|
||||||
|
|
||||||
afterEach(function() {
|
afterEach(function() {
|
||||||
document.body.removeChild(div);
|
document.body.removeChild(div);
|
||||||
|
window.App = oldRouter;
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("in any database", function() {
|
describe("in any database", function() {
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
view = new window.NavigationView();
|
view = new window.NavigationView({userCollection : UserCollectionDummy});
|
||||||
view.render();
|
view.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -115,7 +132,7 @@
|
||||||
describe("in _system database", function() {
|
describe("in _system database", function() {
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
view = new window.NavigationView();
|
view = new window.NavigationView({userCollection : UserCollectionDummy});
|
||||||
view.render();
|
view.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -133,7 +150,7 @@
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
curName = "firstDB";
|
curName = "firstDB";
|
||||||
isSystem = false;
|
isSystem = false;
|
||||||
view = new window.NavigationView();
|
view = new window.NavigationView({userCollection : UserCollectionDummy});
|
||||||
view.render();
|
view.render();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue