Skip to content

Commit d652063

Browse files
authored
More e2e tests (#2083)
* Create Kember.js * Create isolve.js * load workbench by default * dispose Store after log out
1 parent d0b46e4 commit d652063

File tree

9 files changed

+185
-35
lines changed

9 files changed

+185
-35
lines changed

services/web/client/source/class/osparc/Application.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,6 @@ qx.Class.define("osparc.Application", {
220220
if (isLogged) {
221221
this.__loadMainPage();
222222
} else {
223-
// Reset store (cache)
224-
osparc.store.Store.getInstance().invalidate();
225-
226223
osparc.auth.Manager.getInstance().validateToken()
227224
.then(data => {
228225
if (data.role.toLowerCase() === "guest") {
@@ -287,6 +284,7 @@ qx.Class.define("osparc.Application", {
287284
if (this.__mainPage) {
288285
this.__mainPage.closeEditor();
289286
}
287+
osparc.store.Store.getInstance().dispose();
290288
this.__restart();
291289
},
292290

services/web/client/source/class/osparc/dashboard/SideSearch.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ qx.Class.define("osparc.dashboard.SideSearch", {
5959
marginLeft: -12,
6060
marginTop: -5
6161
});
62-
osparc.store.Store.getInstance().addListener("changeClassifiers", e => {
62+
osparc.store.Store.getInstance().addListener("changeClassifiers", () => {
6363
classifier.recreateTree();
6464
}, this);
6565
this._add(classifier, {

services/web/client/source/class/osparc/dashboard/StudyBrowser.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -284,9 +284,7 @@ qx.Class.define("osparc.dashboard.StudyBrowser", {
284284
this.resetSelection();
285285
});
286286
osparc.store.Store.getInstance().addListener("changeTags", () => {
287-
if (osparc.auth.Manager.getInstance().isLoggedIn()) {
288-
this.reloadUserStudies();
289-
}
287+
this.reloadUserStudies();
290288
}, this);
291289
},
292290

services/web/client/source/class/osparc/desktop/WorkbenchView.js

+16-18
Original file line numberDiff line numberDiff line change
@@ -94,26 +94,24 @@ qx.Class.define("osparc.desktop.WorkbenchView", {
9494

9595
const study = this.getStudy();
9696
const workbench = study.getWorkbench();
97-
if (nodeId === study.getUuid()) {
98-
this.__showInMainView(this.__workbenchUI, nodeId);
97+
const node = workbench.getNode(nodeId);
98+
if (node === null || nodeId === study.getUuid()) {
99+
this.__showInMainView(this.__workbenchUI, study.getUuid());
99100
this.__workbenchUI.loadModel(workbench);
101+
} else if (node.isContainer()) {
102+
this.__groupNodeView.setNode(node);
103+
this.__showInMainView(this.__workbenchUI, nodeId);
104+
this.__workbenchUI.loadModel(node);
105+
this.__groupNodeView.populateLayout();
106+
} else if (node.isFilePicker()) {
107+
const nodeView = new osparc.component.node.FilePickerNodeView();
108+
nodeView.setNode(node);
109+
this.__showInMainView(nodeView, nodeId);
110+
nodeView.populateLayout();
100111
} else {
101-
const node = workbench.getNode(nodeId);
102-
if (node.isContainer()) {
103-
this.__groupNodeView.setNode(node);
104-
this.__showInMainView(this.__workbenchUI, nodeId);
105-
this.__workbenchUI.loadModel(node);
106-
this.__groupNodeView.populateLayout();
107-
} else if (node.isFilePicker()) {
108-
const nodeView = new osparc.component.node.FilePickerNodeView();
109-
nodeView.setNode(node);
110-
this.__showInMainView(nodeView, nodeId);
111-
nodeView.populateLayout();
112-
} else {
113-
this.__nodeView.setNode(node);
114-
this.__showInMainView(this.__nodeView, nodeId);
115-
this.__nodeView.populateLayout();
116-
}
112+
this.__nodeView.setNode(node);
113+
this.__showInMainView(this.__nodeView, nodeId);
114+
this.__nodeView.populateLayout();
117115
}
118116
},
119117

services/web/client/source/class/osparc/file/FilePicker.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -245,15 +245,21 @@ qx.Class.define("osparc.file.FilePicker", {
245245

246246
__isOutputFileSelectedFromStore: function() {
247247
const outFile = this.__getOutputFile();
248-
if (outFile && "value" in outFile && "path" in outFile.value) {
248+
if (outFile &&
249+
"value" in outFile &&
250+
typeof outFile["value"] === "object" &&
251+
"path" in outFile["value"]) {
249252
return true;
250253
}
251254
return false;
252255
},
253256

254257
__isOutputFileSelectedFromLink: function() {
255258
const outFile = this.__getOutputFile();
256-
if (outFile && "value" in outFile && "downloadLink" in outFile.value) {
259+
if (outFile &&
260+
"value" in outFile &&
261+
typeof outFile["value"] === "object" &&
262+
"downloadLink" in outFile.value) {
257263
return true;
258264
}
259265
return false;

services/web/client/source/class/osparc/ui/mixin/FetchButton.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,14 @@ qx.Mixin.define("osparc.ui.mixin.FetchButton", {
2828
if (isFetching !== old) {
2929
this.setIcon(this.__icon);
3030
}
31-
this.getChildControl("icon").getContentElement().removeClass("rotate");
31+
if (this.getChildControl("icon")) {
32+
this.getChildControl("icon").getContentElement().removeClass("rotate");
33+
}
34+
}
35+
// Might have been destroyed already
36+
if (this.getLayoutParent()) {
37+
this.setEnabled(!isFetching);
3238
}
33-
this.setEnabled(!isFetching);
3439
}
3540
}
3641
});

services/web/client/source/class/osparc/wrapper/WebSocket.js

+1-6
Original file line numberDiff line numberDiff line change
@@ -251,12 +251,7 @@ qx.Class.define("osparc.wrapper.WebSocket", {
251251
},
252252

253253
slotExists: function(name) {
254-
for (let i = 0; i < this.__name.length; ++i) {
255-
if (this.__name[i] === name) {
256-
return true;
257-
}
258-
}
259-
return false;
254+
return this.__name && this.__name.includes(name);
260255
},
261256

262257
removeSlot: function(name) {

tests/e2e/portal/Kember.js

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// node kember.js [url_prefix] [template_uuid] [--demo]
2+
3+
const tutorialBase = require('../tutorials/tutorialBase');
4+
const auto = require('../utils/auto');
5+
const utils = require('../utils/utils');
6+
7+
const args = process.argv.slice(2);
8+
const {
9+
urlPrefix,
10+
templateUuid,
11+
enableDemoMode
12+
} = utils.parseCommandLineArgumentsTemplate(args);
13+
14+
const anonURL = urlPrefix + templateUuid;
15+
const screenshotPrefix = "Kember_";
16+
17+
18+
async function runTutorial () {
19+
const tutorial = new tutorialBase.TutorialBase(anonURL, screenshotPrefix, null, null, null, enableDemoMode);
20+
21+
tutorial.startScreenshooter();
22+
const page = await tutorial.beforeScript();
23+
const studyData = await tutorial.openStudyLink();
24+
const studyId = studyData["data"]["uuid"];
25+
console.log("Study ID:", studyId);
26+
27+
// Some time for loading the workbench
28+
await tutorial.waitFor(10000);
29+
await utils.takeScreenshot(page, screenshotPrefix + 'workbench_loaded');
30+
31+
await tutorial.runPipeline(studyId, 120000);
32+
await utils.takeScreenshot(page, screenshotPrefix + 'pipeline_run');
33+
34+
await tutorial.openNodeFiles(0);
35+
const outFiles = [
36+
"logs.zip",
37+
"outputController.dat"
38+
];
39+
await tutorial.checkResults(outFiles.length);
40+
41+
42+
// open kember viewer
43+
auto.openNode(page, 1);
44+
45+
await tutorial.waitFor(2000);
46+
await utils.takeScreenshot(page, screenshotPrefix + 'iFrame0');
47+
const iframeHandles = await page.$$("iframe");
48+
// expected two iframes = loading + raw-graph
49+
const frame = await iframeHandles[1].contentFrame();
50+
51+
// - restart kernel: click restart and accept
52+
const restartSelector = "#run_int > button:nth-child(3)";
53+
await frame.waitForSelector(restartSelector);
54+
await frame.click(restartSelector);
55+
await tutorial.waitFor(2000);
56+
await utils.takeScreenshot(page, screenshotPrefix + 'restart_pressed');
57+
const acceptSelector = "body > div.modal.fade.in > div > div > div.modal-footer > button.btn.btn-default.btn-sm.btn-danger";
58+
await frame.waitForSelector(acceptSelector);
59+
await frame.click(acceptSelector);
60+
await tutorial.waitFor(2000);
61+
await utils.takeScreenshot(page, screenshotPrefix + 'restart_accept');
62+
63+
await tutorial.waitFor(8000);
64+
await utils.takeScreenshot(page, screenshotPrefix + 'notebook_run');
65+
66+
// - check output
67+
await tutorial.openNodeFiles(0);
68+
const outFiles2 = [
69+
"Hear_Rate.csv",
70+
"notebooks.zip",
71+
"Parasympathetic_Cell_Activity.csv",
72+
"Table_Data.csv"
73+
];
74+
await tutorial.checkResults(outFiles2.length);
75+
76+
await tutorial.logOut();
77+
tutorial.stopScreenshooter();
78+
await tutorial.close();
79+
}
80+
81+
runTutorial()
82+
.catch(error => {
83+
console.log('Puppeteer error: ' + error);
84+
process.exit(1);
85+
});

tests/e2e/tutorials/isolve.js

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// node isolve.js [url] [user] [password] [--demo]
2+
3+
// https://itisfoundation.github.io/osparc-manual-z43/#/Tutorials/GeneralTutorial
4+
5+
const utils = require('../utils/utils');
6+
const tutorialBase = require('./tutorialBase');
7+
8+
const args = process.argv.slice(2);
9+
const {
10+
url,
11+
user,
12+
pass,
13+
newUser,
14+
enableDemoMode
15+
} = utils.parseCommandLineArguments(args)
16+
17+
const templateName = "isolve-gpu";
18+
19+
async function runTutorial() {
20+
const tutorial = new tutorialBase.TutorialBase(url, templateName, user, pass, newUser, enableDemoMode);
21+
22+
try {
23+
tutorial.startScreenshooter();
24+
await tutorial.start();
25+
const studyData = await tutorial.openService(1000);
26+
const studyId = studyData["data"]["uuid"];
27+
console.log("Study ID:", studyId);
28+
29+
// Some time for loading the workbench
30+
await tutorial.waitFor(5000);
31+
32+
await tutorial.runPipeline(studyId, 20000);
33+
console.log('Checking isolve results:');
34+
await tutorial.openNodeFiles(1);
35+
const outFiles = [
36+
"logs.zip",
37+
"output.h5",
38+
"log.tgz"
39+
];
40+
await tutorial.checkResults(outFiles.length);
41+
42+
await tutorial.toDashboard();
43+
44+
await tutorial.removeStudy(studyId);
45+
}
46+
catch(err) {
47+
tutorial.setTutorialFailed(true);
48+
console.log('Tutorial error: ' + err);
49+
}
50+
finally {
51+
await tutorial.logOut();
52+
tutorial.stopScreenshooter();
53+
await tutorial.close();
54+
}
55+
56+
if (tutorial.getTutorialFailed()) {
57+
throw "Tutorial Failed";
58+
}
59+
}
60+
61+
runTutorial()
62+
.catch(error => {
63+
console.log('Puppeteer error: ' + error);
64+
process.exit(1);
65+
});

0 commit comments

Comments
 (0)