siesta-lite
Version:
Stress-free JavaScript unit testing and functional testing tool, works in NodeJS and browsers
104 lines (74 loc) • 2.78 kB
JavaScript
/*
Siesta 5.6.1
Copyright(c) 2009-2022 Bryntum AB
https://bryntum.com/contact
https://bryntum.com/products/siesta/license
*/
Ext.define('Siesta.Recorder.UI.Store.Action', {
extend : 'Ext.data.TreeStore',
alias : 'store.actionstore',
model : 'Siesta.Recorder.UI.Model.Action',
proxy : 'memory',
root : {
expanded : true
},
tabSize : 4,
generateCode : function (name) {
var root = this.getRootNode();
var code = '';
var isPageNav = this.doesRecordingNavigatePages();
if (root.childNodes.length > 0) {
if (root.firstChild.isLeaf()) {
// Make a simple chain
code = this.generateChain(root);
} else {
// Group assertions into "it" statements
code = root.childNodes.map(this.generateCodeForNode, this).join('\n\n');
}
}
// If recording navigates between pages we need to force enablePageRedirect option or test execution will break
if (isPageNav) {
return 'describe({\n name : "' + name + '",' +
'\n enablePageRedirect : true\n}, function(t) {\n' + code + '\n});'
} else {
return 'describe("' + name + '", function(t) {\n' + code + '\n});'
}
},
doesRecordingNavigatePages : function() {
var pageNav = false;
this.getRoot().cascadeBy(function(node) {
if (node.get('waitForPageLoad')) {
pageNav = true;
return false;
}
});
return pageNav;
},
generateCodeForNode : function (node) {
if (node.isLeaf()) {
return this.getIndent(node.data.depth + 1) + node.asCode();
}
if (node.get('action') === 'group') {
return this.generateIt(node);
}
},
generateIt : function (node) {
var indent = this.getIndent(node.data.depth);
var itPre = indent + 't.it("' + (node.get('value') || 'should...') + '", function(t) {\n';
var itPost = '\n' + indent + '});';
return itPre + this.generateChain(node) + itPost;
},
generateChain : function (node) {
var me = this;
var indent = this.getIndent(node.data.depth + 1);
var chainPre = indent + 't.chain(\n';
var chainPost = '\n' + indent + ');';
var codeForSteps = node.childNodes.map(function (step) {
return me.generateCodeForNode(step);
}).join(',\n\n');
return chainPre + codeForSteps + chainPost;
},
getIndent : function (tabs) {
return new Array((this.tabSize * tabs) + 1).join(' ');
}
});