diff --git a/test/groovy/NpmExecuteEndToEndTestsTest.groovy b/test/groovy/NpmExecuteEndToEndTestsTest.groovy index 919b0afb7..5798e2648 100644 --- a/test/groovy/NpmExecuteEndToEndTestsTest.groovy +++ b/test/groovy/NpmExecuteEndToEndTestsTest.groovy @@ -70,17 +70,6 @@ class NpmExecuteEndToEndTestsTest extends BasePiperTest { Utils.metaClass = null } - @Test - void noAppUrl() { - thrown.expect(hudson.AbortException) - thrown.expectMessage('[npmExecuteEndToEndTests] The execution failed, since no appUrls are defined. Please provide appUrls as a list of maps.') - - stepRule.step.npmExecuteEndToEndTests( - script: nullScript, - stageName: "myStage" - ) - } - @Test void appUrlsNoList() { def appUrl = "http://my-url.com" @@ -153,6 +142,54 @@ class NpmExecuteEndToEndTestsTest extends BasePiperTest { assert npmExecuteScriptsRule.hasParameter('scriptOptions', ["--launchUrl=${appUrl.url}"]) } + @Test + void baseUrl() { + + nullScript.commonPipelineEnvironment.configuration = [ + stages: [ + myStage: [ + baseUrl: "http://my-url.com" + ] + ] + ] + + stepRule.step.npmExecuteEndToEndTests( + script: nullScript, + stageName: "myStage" + ) + + assertFalse(executedInParallel) + assert npmExecuteScriptsRule.hasParameter('script', nullScript) + assert npmExecuteScriptsRule.hasParameter('parameters', [dockerOptions: ['--shm-size 512MB']]) + assert npmExecuteScriptsRule.hasParameter('virtualFrameBuffer', true) + assert npmExecuteScriptsRule.hasParameter('runScripts', ["ci-e2e"]) + assert npmExecuteScriptsRule.hasParameter('scriptOptions', ["--baseUrl=http://my-url.com"]) + } + + @Test + void chooseScript() { + + nullScript.commonPipelineEnvironment.configuration = [ + stages: [ + myStage: [ + runScript: "wdio" + ] + ] + ] + + stepRule.step.npmExecuteEndToEndTests( + script: nullScript, + stageName: "myStage" + ) + + assertFalse(executedInParallel) + assert npmExecuteScriptsRule.hasParameter('script', nullScript) + assert npmExecuteScriptsRule.hasParameter('parameters', [dockerOptions: ['--shm-size 512MB']]) + assert npmExecuteScriptsRule.hasParameter('virtualFrameBuffer', true) + assert npmExecuteScriptsRule.hasParameter('runScripts', ["wdio"]) + assert npmExecuteScriptsRule.hasParameter('scriptOptions', []) + } + @Test void oneAppUrlWithCredentials() { def appUrl = [url: "http://my-url.com", credentialId: 'testCred'] diff --git a/vars/npmExecuteEndToEndTests.groovy b/vars/npmExecuteEndToEndTests.groovy index 4b119ac8c..f7387bd3b 100644 --- a/vars/npmExecuteEndToEndTests.groovy +++ b/vars/npmExecuteEndToEndTests.groovy @@ -41,10 +41,18 @@ import static com.sap.piper.Prerequisites.checkScript * @possibleValues `true`, `false` */ 'onlyRunInProductiveBranch', - /** + /** * Docker image on which end to end tests should be executed */ - 'dockerImage' + 'dockerImage', + /** + * Base URL of the application to be tested + */ + 'baseUrl', + /** + * Credentials to access the application to be tested + */ + 'credentialsId' ]) @Field Set PARAMETER_KEYS = STEP_CONFIG_KEYS @@ -81,83 +89,91 @@ void call(Map parameters = [:]) { def npmParameters = [:] npmParameters.dockerOptions = ['--shm-size 512MB'] - if (!config.appUrls) { - error "[${STEP_NAME}] The execution failed, since no appUrls are defined. Please provide appUrls as a list of maps.\n" - - } - if (!(config.appUrls instanceof List)) { + if (config.appUrls && !(config.appUrls instanceof List)) { error "[${STEP_NAME}] The execution failed, since appUrls is not a list. Please provide appUrls as a list of maps. For example:\n" + - "appUrls: \n" + " - url: 'https://my-url.com'\n" + " credentialId: myCreds" - } - if (!config.runScript) { - error "[${STEP_NAME}] No runScript was defined." + "appUrls: \n" + " - url: 'https://my-url.com'\n" + " credentialId: myCreds" + } if (config.onlyRunInProductiveBranch && (config.productiveBranch != env.BRANCH_NAME)) { return } + List credentials = [] - for (int i = 0; i < config.appUrls.size(); i++) { - List credentials = [] - def appUrl = config.appUrls[i] - - if (!(appUrl instanceof Map)) { - error "[${STEP_NAME}] The element ${appUrl} is not of type map. Please provide appUrls as a list of maps. For example:\n" + - "appUrls: \n" + " - url: 'https://my-url.com'\n" + " credentialId: myCreds" - } - if (!appUrl.url) { - error "[${STEP_NAME}] No url property was defined for the following element in appUrls: ${appUrl}" - } - if (appUrl.credentialId) { - credentials.add(usernamePassword(credentialsId: appUrl.credentialId, passwordVariable: 'e2e_password', usernameVariable: 'e2e_username')) - } - - Closure e2eTest = { - Utils utils = new Utils() - utils.unstashStageFiles(script, stageName) - try { - withCredentials(credentials) { - List scriptOptions = ["--launchUrl=${appUrl.url}"] - if (appUrl.parameters) { - if (appUrl.parameters instanceof List) { - scriptOptions = scriptOptions + appUrl.parameters - } else { - error "[${STEP_NAME}] The parameters property is not of type list. Please provide parameters as a list of strings." - } - } - npmExecuteScripts(script: script, parameters: npmParameters, virtualFrameBuffer: true, runScripts: [config.runScript], dockerImage: config.dockerImage, scriptOptions: scriptOptions, buildDescriptorExcludeList: config.buildDescriptorExcludeList) - } - - } catch (Exception e) { - error "[${STEP_NAME}] The execution failed with error: ${e.getMessage()}" - } finally { - List cucumberFiles = findFiles(glob: "**/e2e/*.json") - List junitFiles = findFiles(glob: "**/e2e/*.xml") - - if (cucumberFiles.size() > 0) { - testsPublishResults script: script, cucumber: [active: true, archive: true] - } else if (junitFiles.size() > 0) { - testsPublishResults script: script, junit: [active: true, archive: true] + if (config.appUrls){ + for (int i = 0; i < config.appUrls.size(); i++) { + def appUrl = config.appUrls[i] + if (!(appUrl instanceof Map)) { + error "[${STEP_NAME}] The element ${appUrl} is not of type map. Please provide appUrls as a list of maps. For example:\n" + + "appUrls: \n" + " - url: 'https://my-url.com'\n" + " credentialId: myCreds" + } + if (!appUrl.url) { + error "[${STEP_NAME}] No url property was defined for the following element in appUrls: ${appUrl}" + } + if (appUrl.credentialId) { + credentials.add(usernamePassword(credentialsId: appUrl.credentialId, passwordVariable: 'e2e_password', usernameVariable: 'e2e_username')) + } + List scriptOptions = ["--launchUrl=${appUrl.url}"] + if (appUrl.parameters) { + if (appUrl.parameters instanceof List) { + scriptOptions = scriptOptions + appUrl.parameters } else { - echo "[${STEP_NAME}] No JUnit or cucumber report files found, skipping report visualization." - } - - utils.stashStageFiles(script, stageName) - } - } - e2ETests["E2E Tests ${index > 1 ? index : ''}"] = { - if (env.POD_NAME || env.ON_K8S) { - dockerExecuteOnKubernetes(script: script, containerMap: ContainerMap.instance.getMap().get(stageName) ?: [:]) { - e2eTest.call() - } - } else { - node(env.NODE_NAME) { - e2eTest.call() + error "[${STEP_NAME}] The parameters property is not of type list. Please provide parameters as a list of strings." } } + e2ETests = runTest(scriptOptions, credentials, e2ETests, index, script, config, npmParameters, stageName) + index++ } - index++ + }else{ + if (config.credentialsId) { + credentials.add(usernamePassword(credentialsId: config.credentialsId, passwordVariable: 'e2e_password', usernameVariable: 'e2e_username')) + } + List scriptOptions = [] + if (config.baseUrl){ + scriptOptions = ["--baseUrl=${config.baseUrl}"] + } + e2ETests = runTest(scriptOptions, credentials, e2ETests, index, script, config, npmParameters, stageName) } runClosures(script, e2ETests, config.parallelExecution, "end to end tests") } } + +def runTest(scriptOptions, credentials, e2ETests, index, script, config, npmParameters, stageName){ + Closure e2eTest = { + Utils utils = new Utils() + utils.unstashStageFiles(script, stageName) + try { + withCredentials(credentials) { + npmExecuteScripts(script: script, parameters: npmParameters, virtualFrameBuffer: true, runScripts: [config.runScript], dockerImage: config.dockerImage, scriptOptions: scriptOptions, buildDescriptorExcludeList: config.buildDescriptorExcludeList) + } + + } catch (Exception e) { + error "[${STEP_NAME}] The execution failed with error: ${e.getMessage()}" + } finally { + List cucumberFiles = findFiles(glob: "**/e2e/*.json") + List junitFiles = findFiles(glob: "**/e2e/*.xml") + + if (cucumberFiles.size() > 0) { + testsPublishResults script: script, cucumber: [active: true, archive: true] + } else if (junitFiles.size() > 0) { + testsPublishResults script: script, junit: [active: true, archive: true] + } else { + echo "[${STEP_NAME}] No JUnit or cucumber report files found, skipping report visualization." + } + + utils.stashStageFiles(script, stageName) + } + } + e2ETests["E2E Tests ${index > 1 ? index : ''}"] = { + if (env.POD_NAME || env.ON_K8S) { + dockerExecuteOnKubernetes(script: script, containerMap: ContainerMap.instance.getMap().get(stageName) ?: [:]) { + e2eTest.call() + } + } else { + node(env.NODE_NAME) { + e2eTest.call() + } + } + } + return e2ETests +}