UNPKG

siesta-lite

Version:

Stress-free JavaScript unit testing and functional testing tool, works in NodeJS and browsers

380 lines (281 loc) 11.7 kB
/* Siesta 5.6.1 Copyright(c) 2009-2022 Bryntum AB https://bryntum.com/contact https://bryntum.com/products/siesta/license */ Ext.define('Siesta.Project.Browser.UI.ViewportController', { extend : 'Ext.app.ViewController', alias : 'controller.viewport', requires : [ 'Siesta.Project.Browser.UI.TestGridContextMenu', 'Ext.window.Toast' ], mixins : [ 'Siesta.Project.Browser.UI.CanCopyToClipboard' ], control : { testgrid : { selectionchange : 'onTestGridSelectionChange', checkchange : 'onTestGridCheckChange', itemcontextmenu : 'onTestFileContextMenu', itemdblclick : 'onTestFileDoubleClick', itemclick : 'onTestFileClick', resize : 'onTestGridResize', optionchange : 'onTestGridOptionChange', buttonclick : 'onTestGridToolbarClick', framesizechange : 'onFrameSizeChange' }, 'testnamecolumn treefilter' : { change : { fn : 'onFilterChange', buffer : 300 } }, 'testgridcontextmenu #uncheckOthers' : { click : 'uncheckOthers' }, 'testgridcontextmenu #runThis' : { click : 'runThisFile' }, 'testgridcontextmenu #uncheckAll' : { click : 'uncheckAll' }, 'testgridcontextmenu #checkAll' : { click : 'checkAll' }, 'testgridcontextmenu #expandAll' : { click : 'expandAll' }, 'testgridcontextmenu #collapseAll' : { click : 'collapseAll' }, 'testgridcontextmenu #filterToCurrentGroup' : { click : 'filterToCurrentGroup' }, 'testgridcontextmenu #filterToFailed' : { click : 'filterToFailed' }, 'testgridcontextmenu #viewSource' : { click : 'viewSource' }, 'testgridcontextmenu #linkSelect' : { click : 'linkSelect' }, 'testgridcontextmenu #linkFilterAutoLaunch' : { click : 'linkFilterAutoLaunch' }, resultpanel : { optionchange : 'onResultPanelOptionChange', viewdomchange : 'onDomPanelVisibilityChange', runbuttonclick : 'runTest' } }, disableRunButtonTimeout : null, disableRunButtonInterval : 150, onFilterChange : function () { var viewport = this.getView(); viewport.saveState() }, filterToFailed : function () { var viewport = this.getView(); var filter = [] viewport.forEachTestFile(function (testFileRecord) { var test = testFileRecord.get('test') if (test && test.isFailed()) filter.push(testFileRecord.get('title')) }) if (filter.length) viewport.slots.filesTree.setFilterValue(filter.join(' | ')) }, filterToCurrentGroup : function () { var viewport = this.getView(); var desc = viewport.currentFile.get('descriptor') if (desc.parent) viewport.slots.filesTree.setFilterValue(desc.parent.group + '>') }, // Test Grid events onTestGridSelectionChange : function (selModel, selectedRecords) { if (selectedRecords.length) { var viewport = this.getView(); var testFile = selectedRecords[0] var test = testFile.get('test') if (test) { // magic global for users to ease access to the currently selected tests T = test viewport.slots.resultPanel.showTest(test, testFile.get('assertionsStore')) } if (testFile.isLeaf()) { Ext.History.add(testFile.data.url); } } }, onTestGridCheckChange : function (testFile, checked) { var viewport = this.getView(); viewport.setNodeChecked(testFile, checked) }, onTestFileContextMenu : function (view, testFile, el, index, event) { var viewport = this.getView(); if (viewport.isReadOnlyReport) return viewport.currentFile = testFile if (!viewport.contextMenu) { viewport.contextMenu = new Siesta.Project.Browser.UI.TestGridContextMenu(); } viewport.contextMenu.showAt(event.getXY()); event.preventDefault(); }, onTestFileDoubleClick : function (view, testFile) { var viewport = this.getView(); if (viewport.isReadOnlyReport) return var testsStore = viewport.testsStore if (testsStore.isTreeFiltered() && !testFile.isLeaf()) { var childDesc = [] testFile.cascadeBy(function (node) { if (node != testFile && node.isLeaf() && testsStore.isNodeFilteredIn(node)) childDesc.push(node.get('descriptor')) }) viewport.project.launch(childDesc); } else viewport.launchTest(testFile); }, onTestFileClick : function (view, testFile, p3, p4, event) { var viewport = this.getView(); if (viewport.isReadOnlyReport) return var referenceUrl = viewport.project.getDescriptorConfig(testFile.get('descriptor'), 'referenceUrl') if (referenceUrl && event.ctrlKey) { var popup = window.open(referenceUrl, "_blank") if (!popup) Ext.toast("Popups are disabled in the browser", "Can't open new tab") } }, onTestGridResize : function () { // preserve min width of the assertion grid this.getView().slots.resultPanel.ensureLayout(); }, onTestGridOptionChange : function (component, optionName, optionValue) { var viewport = this.getView(); viewport.setOption(optionName, optionValue) viewport.saveState() }, onResultPanelOptionChange : function (component, optionName, optionValue) { var viewport = this.getView(), test = viewport.slots.resultPanel.test; viewport.setOption(optionName, optionValue) viewport.saveState(); // If active test is running, update its simulator settings if (test) { var speedName; switch(optionName) { case 'mouseSimSlow': speedName = 'slow'; break; case 'mouseSimFast': speedName = 'speedRun'; break; case 'mouseSimFastest': speedName = 'turboMode'; break; default: throw new Error('Wrong option name: ' + optionName); } test.simulator.setSpeed(speedName); } }, onTestGridToolbarClick : function (hdr, button, action) { var viewport = this.getView(); switch (action) { case 'run-checked': viewport.runChecked(); break; case 'run-failed': viewport.runFailed(); break; case 'run-all': viewport.runAll(); break; // note, that this button does not exists case 'stop': viewport.stopSuite(button); break; } }, onFrameSizeChange : function(slider, width, height, landscape) { var viewport = this.getView(); if (!landscape) { var w = width; width = height; height = w; } $('.tr-iframe').width(width); $('.tr-iframe').height(height); viewport.project.viewportHeight = height; viewport.project.viewportWidth = width; }, // EOF Test Grid events // Test Grid Context Menu events uncheckOthers : function () { var viewport = this.getView(); var currentFile = viewport.currentFile viewport.uncheckAllExcept(currentFile) viewport.setNodeChecked(currentFile, true) }, linkFilterAutoLaunch : function () { var viewport = this.getView(); var currentFile = viewport.currentFile var match = /([^\/]*)$/.exec(currentFile.get('descriptor').url) var url = location.protocol + '//' + location.host + location.pathname + '?' + 'filter=' + encodeURIComponent(match[ 1 ]) + '&autolaunch=1' var success = this.copyToClipboard(url) if (success) { Ext.toast("Url copied to clipboard", 'Success') } else { Ext.Msg.show({ message : 'Please select & copy this url manually:<br>' + url, title : 'Copy to clipboard failed', modal : false }) } }, linkSelect : function () { var viewport = this.getView(); var currentFile = viewport.currentFile var url = location.protocol + '//' + location.host + location.pathname + '#' + currentFile.get('descriptor').url var success = this.copyToClipboard(url) if (success) { Ext.toast("Url copied to clipboard", 'Success') } else { Ext.Msg.show({ message : 'Please select & copy this url manually:<br>' + url, title : 'Copy to clipboard failed', modal : false }) } }, runThisFile : function () { var viewport = this.getView(); viewport.project.launch([ viewport.currentFile.get('descriptor') ]) }, uncheckAll : function () { var viewport = this.getView(); viewport.uncheckAllExcept() }, checkAll : function () { var viewport = this.getView(); viewport.testsStore.forEach(function (node) { viewport.setNodeChecked(node, true, true) }) }, expandAll : function () { var viewport = this.getView(); viewport.slots.filesTree.expandAll() }, collapseAll : function () { var viewport = this.getView(); viewport.slots.filesTree.collapseAll() }, viewSource : function() { var testRecord = this.getView().currentFile; var test = testRecord.get('test'); var win = window.open('', 'siesta-source'); var head = win.document.documentElement.getElementsByTagName('head')[0]; var body = win.document.body; head.innerHTML = '<title>' + testRecord.get('title') + '</title>' if (test) { body.innerHTML = '<pre>' + test.getSource() + '</pre>'; } else { $.ajax(testRecord.get('url'), { success: function(text) { body.innerHTML = '<pre>' + text + '</pre>'; } }); } }, // EOF Test Grid Context Menu events // Result Panel events onDomPanelVisibilityChange : function (g, value) { var viewport = this.getView(); viewport.setOption('viewDOM', value); viewport.saveState(); }, runTest : function () { // launch the "viewport.runTest();" immediately, but ignore any further calls to this method // during the following 100ms var me = this if (me.disableRunButtonTimeout != null) return me.disableRunButtonTimeout = setTimeout(function () { me.disableRunButtonTimeout = null }, me.disableRunButtonInterval) var viewport = me.getView(); viewport.runTest(); } // EOF Result Panel events })