From 9bf7dd5b86ecaeea8e6ebdaaba4422c12d88eb53 Mon Sep 17 00:00:00 2001 From: Karlis Zalite Date: Tue, 11 May 2021 14:26:59 +0200 Subject: [PATCH] fix webpack config; fix end to end tests; --- R/r-base/Dockerfile | 2 +- nightwatch.conf.js | 4 +- package.json | 3 +- test/endToEnd/addModelToAnalysisTest.js | 102 +++++++++++++++++++----- test/endToEnd/nodeSplitTest.js | 38 +++++---- test/endToEnd/pageTitleTest.js | 36 ++++----- test/endToEnd/refineModelTest.js | 9 +-- test/endToEnd/setBaselineTest.js | 10 +-- webpack.local.js | 24 +++++- 9 files changed, 152 insertions(+), 76 deletions(-) diff --git a/R/r-base/Dockerfile b/R/r-base/Dockerfile index a06bfbc8..d98f2a12 100644 --- a/R/r-base/Dockerfile +++ b/R/r-base/Dockerfile @@ -13,7 +13,7 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q build-essential libcurl RUN R -e 'install.packages("plyr", repos="http://cran.rstudio.com/"); if (!require("plyr")) quit(save="no", status=8)' RUN R -e 'install.packages("igraph", repos="http://cran.rstudio.com/"); if (!require("igraph")) quit(save="no", status=8)' # Up-to-date meta package requires R >= 3.5.0 -RUN R -e 'install.packages("https://cran.r-project.org/src/contrib/Archive/meta/meta_3.8-0.tar.gz", repos=NULL, type="source"); if (!require("meta")) quit(save="no", status=8)' +RUN R -e 'install.packages("https://cran.r-project.org/src/contrib/Archive/meta/meta_4.9-2.tar.gz", repos=NULL, type="source"); if (!require("meta")) quit(save="no", status=8)' RUN R -e 'install.packages("base64enc", repos="http://cran.rstudio.com/"); if (!require("meta")) quit(save="no", status=8)' RUN R -e 'install.packages("truncnorm", repos="http://cran.rstudio.com/"); if (!require("truncnorm")) quit(save="no", status=8)' diff --git a/nightwatch.conf.js b/nightwatch.conf.js index 1e83c0e0..e3d547dd 100644 --- a/nightwatch.conf.js +++ b/nightwatch.conf.js @@ -4,9 +4,7 @@ const seleniumServer = require('selenium-server'); const geckodriver = require('geckodriver'); module.exports = { - src_folders: [ - 'test/endToEnd' - ], + src_folders: ['test/endToEnd'], selenium: { check_process_delay: 1000, start_process: true, diff --git a/package.json b/package.json index ee5d2cc8..e81dffb5 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "build-dev": "webpack --config webpack.dev.js", "build-prod": "webpack --config webpack.prod.js", "build-local-login": "webpack --config webpack.local.js", - "dev": "webpack --config webpack.dev.js --watch" + "dev": "webpack --config webpack.dev.js --watch", + "test-end-to-end": "nightwatch -c nightwatch.conf.js" }, "repository": { "type": "git", diff --git a/test/endToEnd/addModelToAnalysisTest.js b/test/endToEnd/addModelToAnalysisTest.js index 7e49a6ee..71eab71b 100644 --- a/test/endToEnd/addModelToAnalysisTest.js +++ b/test/endToEnd/addModelToAnalysisTest.js @@ -3,17 +3,20 @@ module.exports = { beforeEach: beforeEach, afterEach: afterEach, - 'Create fixed effect pairwise specific pair model': fixedEffectSpecificPairwiseModel, + 'Create fixed effect pairwise specific pair model': + fixedEffectSpecificPairwiseModel, 'Create fixed effect pairwise model': fixedEffectPairwiseModel, 'Create new network model using relative data': relativeNetworkModel, 'Create new network model': netWorkModel, 'Create new nodesplit specific model': nodesplitSpecificModel, - 'Create new meta regression model': metaRegressionModel, + // 'Create new meta regression model': metaRegressionModel, FIXME re-enable once gemtc package is fixed 'Create new fixed consistency model': fixedConsistencyModel, - 'Create consistency model leaving one specific study out': leaveSpecificStudyOutConsistencyModel, + 'Create consistency model leaving one specific study out': + leaveSpecificStudyOutConsistencyModel, 'Create design adjusted consistency model': designAdjustedConsistencyModel, 'Create model with non-default prior': nonDefaultPriorModel, - 'Create model with non-default run length parameters': nonDefaultRunLengthModel, + 'Create model with non-default run length parameters': + nonDefaultRunLengthModel, 'Extend run length of an existing model': extendRunLenthModel }; @@ -33,9 +36,21 @@ const networkModelSettings = { }; function verifyPairwiseModelContents(browser, modelIndex) { - browser.click('#model-title-' + modelIndex) - .waitForElementVisible('#model-settings-section', constants.MODEL_WAIT_TIME_OUT); - return modelService.verifyCommonContent(browser, constants.MODEL_TITLE, constants.ANALYSIS_TITLE, constants.OUTCOME, 'pairwise', 'fixed') + browser + .click('#model-title-' + modelIndex) + .waitForElementVisible( + '#model-settings-section', + constants.MODEL_WAIT_TIME_OUT + ); + return modelService + .verifyCommonContent( + browser, + constants.MODEL_TITLE, + constants.ANALYSIS_TITLE, + constants.OUTCOME, + 'pairwise', + 'fixed' + ) .assert.containsText('#model-pairwise-comparison', 'Fluoxetine — ') .waitForElementVisible('#relative-effects-table') .waitForElementVisible('#study-effect-forest-plot') @@ -52,7 +67,14 @@ function verifyPairwiseModelContents(browser, modelIndex) { } function verifyMetaRegressionModelContents(browser) { - return modelService.verifyCommonContent(browser, constants.MODEL_TITLE, constants.ANALYSIS_TITLE, constants.OUTCOME, 'regression') + return modelService + .verifyCommonContent( + browser, + constants.MODEL_TITLE, + constants.ANALYSIS_TITLE, + constants.OUTCOME, + 'regression' + ) .waitForElementVisible('#convergence-diagnostics-table') .waitForElementVisible('#covariate-effect-plot') .waitForElementVisible('#meta-regression-table') @@ -65,7 +87,15 @@ function verifyMetaRegressionModelContents(browser) { } function verifyFixedConsistencyModelContents(browser) { - return modelService.verifyCommonContent(browser, constants.MODEL_TITLE, constants.ANALYSIS_TITLE, constants.OUTCOME, 'network', 'fixed') + return modelService + .verifyCommonContent( + browser, + constants.MODEL_TITLE, + constants.ANALYSIS_TITLE, + constants.OUTCOME, + 'network', + 'fixed' + ) .assert.containsText('#model-likelihood', 'binom / logit') .waitForElementVisible('#convergence-diagnostics-table') .waitForElementVisible('#relative-effects-table') @@ -77,7 +107,13 @@ function verifyFixedConsistencyModelContents(browser) { } function verifyLeaveOneOutModelContents(browser) { - return modelService.verifyCommonContent(browser, constants.MODEL_TITLE, constants.ANALYSIS_TITLE, constants.OUTCOME) + return modelService + .verifyCommonContent( + browser, + constants.MODEL_TITLE, + constants.ANALYSIS_TITLE, + constants.OUTCOME + ) .assert.containsText('#model-sub-type', 'leave one out') .waitForElementVisible('#convergence-diagnostics-table') .waitForElementVisible('#random-effects-standard-deviation') @@ -89,7 +125,13 @@ function verifyLeaveOneOutModelContents(browser) { } function verifyDesignAdjustedModelContents(browser) { - return modelService.verifyCommonContent(browser, constants.MODEL_TITLE, constants.ANALYSIS_TITLE, constants.OUTCOME) + return modelService + .verifyCommonContent( + browser, + constants.MODEL_TITLE, + constants.ANALYSIS_TITLE, + constants.OUTCOME + ) .assert.containsText('#model-likelihood', 'normal / identity') .waitForElementVisible('#convergence-diagnostics-table') .waitForElementVisible('#random-effects-standard-deviation') @@ -104,8 +146,7 @@ function verifyDesignAdjustedModelContents(browser) { function beforeEach(browser) { browser.resizeWindow(1366, 728); - loginService.login(browser) - .waitForElementVisible('#analyses-header'); + loginService.login(browser).waitForElementVisible('#analyses-header'); } function afterEach(browser) { @@ -123,9 +164,20 @@ function fixedEffectSpecificPairwiseModel(browser) { analysesService.addDefaultAnalysis(browser); modelService.addModel(browser, modelSettings); - modelService.verifyCommonContent(browser, constants.MODEL_TITLE, constants.ANALYSIS_TITLE, constants.OUTCOME, 'pairwise', 'fixed') + modelService + .verifyCommonContent( + browser, + constants.MODEL_TITLE, + constants.ANALYSIS_TITLE, + constants.OUTCOME, + 'pairwise', + 'fixed' + ) .assert.containsText('#model-pairwise-comparison', pairwiseComparison) - .assert.containsText('#diagnostic-label-0', 'd.2.3 (Fluoxetine, Paroxetine)') + .assert.containsText( + '#diagnostic-label-0', + 'd.2.3 (Fluoxetine, Paroxetine)' + ) .waitForElementVisible('#relative-effects-table') .waitForElementVisible('#study-effect-forest-plot') .waitForElementVisible('#study-effect-funnel-plot') @@ -147,7 +199,8 @@ function fixedEffectPairwiseModel(browser) { }; analysesService.addDefaultAnalysis(browser); - modelService.addModel(browser, modelSettings) + modelService + .addModel(browser, modelSettings) .waitForElementVisible('#model-title-0') .waitForElementVisible('#model-title-1'); verifyPairwiseModelContents(browser, 0); @@ -157,7 +210,8 @@ function fixedEffectPairwiseModel(browser) { function relativeNetworkModel(browser) { analysesService.addAnalysis(browser, '/parkinson-shared.csv'); modelService.addModel(browser, networkModelSettings); - modelService.verifyNetworkModelContents(browser) + modelService + .verifyNetworkModelContents(browser) .waitForElementVisible('#contrast-residual-deviance-table'); } @@ -175,7 +229,8 @@ function nodesplitSpecificModel(browser) { modelSubType: '#node-split-specific-type-radio' }; analysesService.addDefaultAnalysis(browser); - modelService.addModel(browser, modelSettings) + modelService + .addModel(browser, modelSettings) .assert.containsText('#model-label', constants.MODEL_TITLE) .assert.containsText('#model-view-analysis', constants.ANALYSIS_TITLE) .assert.containsText('#model-view-outcome', constants.OUTCOME) @@ -237,8 +292,8 @@ function nonDefaultPriorModel(browser) { function nonDefaultRunLengthModel(browser) { analysesService.addDefaultAnalysis(browser); modelService.addModelWithRunLengthParameters(browser, networkModelSettings); - browser - .assert.containsText('#burn-in-iterations', 1000) + browser.assert + .containsText('#burn-in-iterations', 1000) .assert.containsText('#inference-iterations', 2000) .assert.containsText('#thinning-factor', 2); } @@ -257,9 +312,12 @@ function extendRunLenthModel(browser) { .clearValue('#nr-thinning-factor-input') .setValue('#nr-thinning-factor-input', 2) .click('#submit-add-model-button') - .waitForElementVisible('#model-settings-section', constants.MODEL_WAIT_TIME_OUT) + .waitForElementVisible( + '#model-settings-section', + constants.MODEL_WAIT_TIME_OUT + ) .assert.containsText('#model-label', refinedModelTitle) .assert.containsText('#burn-in-iterations', 1000) .assert.containsText('#inference-iterations', 2000) .assert.containsText('#thinning-factor', 2); -} \ No newline at end of file +} diff --git a/test/endToEnd/nodeSplitTest.js b/test/endToEnd/nodeSplitTest.js index 59f7dec9..f55d95d9 100644 --- a/test/endToEnd/nodeSplitTest.js +++ b/test/endToEnd/nodeSplitTest.js @@ -4,7 +4,8 @@ module.exports = { beforeEach: beforeEach, afterEach: afterEach, 'Create node split model from a consistency model': createNodeSplit, - 'Check missing title when creating nodesplit model from a consistency model': missingtTitleAndCancel, + 'Check missing title when creating nodesplit model from a consistency model': + missingtTitleAndCancel, 'Create consistency model from a node split model': createConsistencyModel }; @@ -16,34 +17,35 @@ const modelService = require('./models/modelService'); const NODE_SPLIT_MODEL_TITLE = 'Nodesplit model (Fluoxetine - Paroxetine)'; function checkNodeSplitOverviewForConsistencyModel(browser) { - modelService.addDefaultModel(browser) + modelService + .addDefaultModel(browser) .click('#node-split-overview-link') .waitForElementVisible('#nodesplit-overview-header'); - browser - .assert.containsText('#analysis-title-header', constants.ANALYSIS_TITLE) + browser.assert + .containsText('#analysis-title-header', constants.ANALYSIS_TITLE) .assert.containsText('#outcome-header', constants.OUTCOME) .assert.containsText('#effects-type', 'random') - .assert.containsText('#imputed-outcome-scale', '1.1321 (imputed)') + .assert.containsText('#imputed-outcome-scale', '1.13') + .assert.containsText('#imputed-outcome-scale', '(imputed)') .assert.containsText('#likelihood-link', 'binom / logit') .assert.containsText('#consistency-model-title', constants.MODEL_TITLE) - .assert.containsText('#random-effects-standard-deviation', '0.3').pause(100) + .assert.containsText('#random-effects-standard-deviation', '0.3') + .pause(100) .assert.containsText('#deviance-information-criterion', '26.'); - browser.click('#create-node-split-model-button-0') + browser + .click('#create-node-split-model-button-0') .waitForElementVisible('#create-model-header'); } function beforeEach(browser) { browser.resizeWindow(1366, 728); - loginService.login(browser) - .waitForElementVisible('#analyses-header'); + loginService.login(browser).waitForElementVisible('#analyses-header'); analysesService.addDefaultAnalysis(browser); } function afterEach(browser) { - analysesService - .deleteFromList(browser) - .end(); + analysesService.deleteFromList(browser).end(); } function createNodeSplit(browser) { @@ -64,8 +66,8 @@ function createNodeSplit(browser) { function missingtTitleAndCancel(browser) { checkNodeSplitOverviewForConsistencyModel(browser); - browser. - clearValue('#title-input') + browser + .clearValue('#title-input') .waitForElementVisible('#missing-title-warning') .click('#close-model-button') .waitForElementVisible('#create-node-split-model-button-0'); @@ -80,7 +82,8 @@ function createConsistencyModel(browser) { }; const networkModelTitle = 'Network model'; - modelService.addModel(browser, modelSettings) + modelService + .addModel(browser, modelSettings) .click('#node-split-overview-link') .waitForElementVisible('#nodesplit-overview-header'); browser @@ -88,6 +91,9 @@ function createConsistencyModel(browser) { .click('#confirm-create-model-button') .assert.containsText('#consistency-model-title', networkModelTitle) .click('#run-network-model-button') - .waitForElementVisible('#model-settings-section', constants.MODEL_WAIT_TIME_OUT); + .waitForElementVisible( + '#model-settings-section', + constants.MODEL_WAIT_TIME_OUT + ); modelService.verifyNetworkModelContents(browser, networkModelTitle); } diff --git a/test/endToEnd/pageTitleTest.js b/test/endToEnd/pageTitleTest.js index 30db69a4..89c83498 100644 --- a/test/endToEnd/pageTitleTest.js +++ b/test/endToEnd/pageTitleTest.js @@ -18,8 +18,7 @@ const modelService = require('./models/modelService'); const errorService = require('./util/errorService'); function addAnalysisAndModel(browser) { - loginService.login(browser) - .waitForElementVisible('#analyses-header'); + loginService.login(browser).waitForElementVisible('#analyses-header'); analysesService.addDefaultAnalysis(browser); modelService.addDefaultModel(browser); return browser; @@ -37,43 +36,42 @@ function loginPage(browser) { browser .url(constants.TEST_URL) .waitForElementVisible('#signinButton') - .getTitle(function(title) { + .getTitle(function (title) { browser.assert.equal(title, 'gemtc.drugis.org'); }); errorService.isErrorBarNotPresent(browser); } function analysesView(browser) { - loginService.login(browser) + loginService + .login(browser) .waitForElementVisible('#analyses-header') - .getTitle(function(title) { + .getTitle(function (title) { browser.assert.equal(title, 'Analyses'); }); errorService.isErrorBarHidden(browser); } function modelsView(browser) { - loginService.login(browser) - .waitForElementVisible('#analyses-header'); - analysesService.addDefaultAnalysis(browser) - .getTitle(function(title) { - browser.assert.equal(title, constants.ANALYSIS_TITLE); - analysesService.deleteFromList(browser); - }); + loginService.login(browser).waitForElementVisible('#analyses-header'); + analysesService.addDefaultAnalysis(browser).getTitle(function (title) { + browser.assert.equal(title, constants.ANALYSIS_TITLE); + analysesService.deleteFromList(browser); + }); } function modeltitlesView(browser) { - addAnalysisAndModel(browser) - .getTitle(function(title) { - browser.assert.equal(title, constants.MODEL_TITLE); - analysesService.deleteFromList(browser); - }); + addAnalysisAndModel(browser).getTitle(function (title) { + browser.assert.equal(title, constants.MODEL_TITLE); + analysesService.deleteFromList(browser); + }); } function RefineModelView(browser) { addAnalysisAndModel(browser) .click('#refine-model-button') - .getTitle(function(title) { + .waitForElementVisible('#create-model-header') + .getTitle(function (title) { browser.assert.equal(title, 'Refine model'); analysesService.deleteFromList(browser); }); @@ -82,7 +80,7 @@ function RefineModelView(browser) { function NodesplitOverview(browser) { addAnalysisAndModel(browser) .click('#node-split-overview-link') - .getTitle(function(title) { + .getTitle(function (title) { browser.assert.equal(title, constants.MODEL_TITLE); analysesService.deleteFromList(browser); }); diff --git a/test/endToEnd/refineModelTest.js b/test/endToEnd/refineModelTest.js index f5b2c38d..d846f8aa 100644 --- a/test/endToEnd/refineModelTest.js +++ b/test/endToEnd/refineModelTest.js @@ -13,16 +13,13 @@ const modelService = require('./models/modelService'); function beforeEach(browser) { browser.resizeWindow(1366, 728); - loginService.login(browser) - .waitForElementVisible('#analyses-header'); + loginService.login(browser).waitForElementVisible('#analyses-header'); analysesService.addDefaultAnalysis(browser); modelService.addDefaultModel(browser); } function afterEach(browser) { - analysesService - .deleteFromList(browser) - .end(); + analysesService.deleteFromList(browser).end(); } function refineModel(browser) { @@ -32,7 +29,7 @@ function refineModel(browser) { .waitForElementVisible('#create-model-header') .setValue('#title-input', newModelTitle) .click('#submit-add-model-button') - .waitForElementVisible('#model-settings-section', 10000) + .waitForElementVisible('#model-settings-section', 20000) .click('#breadcrumbs-analysis') .waitForElementVisible('#analysis-header') .assert.containsText('#model-0', constants.MODEL_TITLE) diff --git a/test/endToEnd/setBaselineTest.js b/test/endToEnd/setBaselineTest.js index 47607115..a2795754 100644 --- a/test/endToEnd/setBaselineTest.js +++ b/test/endToEnd/setBaselineTest.js @@ -13,17 +13,14 @@ const analysesService = require('./analyses/analysesService'); const modelService = require('./models/modelService'); function beforeEach(browser) { - browser.resizeWindow(1366, 728); - loginService.login(browser) - .waitForElementVisible('#analyses-header'); + browser.resizeWindow(1366, 1000); + loginService.login(browser).waitForElementVisible('#analyses-header'); analysesService.addDefaultAnalysis(browser); modelService.addDefaultModel(browser); } function afterEach(browser) { - analysesService - .deleteFromList(browser) - .end(); + analysesService.deleteFromList(browser).end(); } function setBaseline(browser) { @@ -31,6 +28,7 @@ function setBaseline(browser) { .waitForElementVisible('#no-baseline-warning') .click('#set-baseline-distribution-button') .waitForElementVisible('#set-baseline-header') + .waitForElementVisible('#confirm-set-baseline-button:enabled') .click('#confirm-set-baseline-button') .waitForElementVisible('#absolute-effects-table'); } diff --git a/webpack.local.js b/webpack.local.js index 56044da1..eddeca7d 100644 --- a/webpack.local.js +++ b/webpack.local.js @@ -1,11 +1,31 @@ 'use strict'; const {merge} = require('webpack-merge'); -const dev = require('./webpack.dev'); +const common = require('./webpack.common'); const HtmlWebpackPlugin = require('html-webpack-plugin'); let fs = require('fs'); -module.exports = merge(dev, { +module.exports = merge(common, { + mode: 'development', + devtool: 'inline-source-map', + module: { + rules: [ + { + test: /\.css$/, + loader: 'style-loader', + options: { + esModule: false + } + }, + { + test: /\.css$/, + loader: 'css-loader', + options: { + esModule: false + } + } + ] + }, plugins: [ new HtmlWebpackPlugin({ filename: 'signin.html',