1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-12 10:55:20 +02:00
sap-jenkins-library/test/groovy/NpmExecuteEndToEndTestsTest.groovy
Florian Wilhelm efa85a0f0e
Allow npm install in e2e tests (#2281)
Remove hard-coded install: false in npmExecuteScripts call to allow the pipeline to configure the step according to how it is right for that pipeline.
2020-10-30 11:56:29 +01:00

290 lines
9.8 KiB
Groovy

import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.ExpectedException
import org.junit.rules.RuleChain
import util.BasePiperTest
import util.JenkinsCredentialsRule
import util.JenkinsMockStepRule
import util.JenkinsReadYamlRule
import util.JenkinsStepRule
import util.Rules
import com.sap.piper.Utils
import static org.junit.Assert.assertFalse
import static org.junit.Assert.assertTrue
import static org.junit.Assert.assertTrue
class NpmExecuteEndToEndTestsTest extends BasePiperTest {
private JenkinsStepRule stepRule = new JenkinsStepRule(this)
private ExpectedException thrown = ExpectedException.none()
private JenkinsMockStepRule npmExecuteScriptsRule = new JenkinsMockStepRule(this, 'npmExecuteScripts')
private JenkinsCredentialsRule credentialsRule = new JenkinsCredentialsRule(this)
private JenkinsReadYamlRule readYamlRule = new JenkinsReadYamlRule(this)
private boolean executedOnKubernetes = false
private boolean executedOnNode = false
private boolean executedInParallel = false
@Rule
public RuleChain ruleChain = Rules
.getCommonRules(this)
.around(thrown)
.around(readYamlRule)
.around(credentialsRule)
.around(stepRule)
.around(npmExecuteScriptsRule)
@Before
void init() {
helper.registerAllowedMethod("deleteDir", [], null)
helper.registerAllowedMethod('dockerExecuteOnKubernetes', [Map.class, Closure.class], {params, body ->
executedOnKubernetes = true
body()
})
helper.registerAllowedMethod('node', [String.class, Closure.class], {s, body ->
executedOnNode = true
body()
})
helper.registerAllowedMethod("parallel", [Map.class], { map ->
map.each {key, value ->
value()
}
executedInParallel = true
})
helper.registerAllowedMethod('findFiles', [Map.class], {return []})
credentialsRule.reset()
.withCredentials('testCred', 'test_cf', '********')
.withCredentials('testCred2', 'test_other', '**')
Utils.metaClass.echo = { def m -> }
}
@After
public void tearDown() {
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",
runScript: "ci-e2e"
)
}
@Test
void noRunScript() {
def appUrl = [url: "http://my-url.com"]
nullScript.commonPipelineEnvironment.configuration = [stages: [myStage:[
appUrls: [appUrl]
]]]
thrown.expect(hudson.AbortException)
thrown.expectMessage('[npmExecuteEndToEndTests] No runScript was defined.')
stepRule.step.npmExecuteEndToEndTests(
script: nullScript,
stageName: "myStage"
)
}
@Test
void appUrlsNoList() {
def appUrl = "http://my-url.com"
nullScript.commonPipelineEnvironment.configuration = [stages: [myStage:[
appUrls: appUrl
]]]
thrown.expect(hudson.AbortException)
thrown.expectMessage("[npmExecuteEndToEndTests] The execution failed, since appUrls is not a list. Please provide appUrls as a list of maps.")
stepRule.step.npmExecuteEndToEndTests(
script: nullScript,
stageName: "myStage",
runScript: "ci-e2e"
)
}
@Test
void appUrlsNoMap() {
def appUrl = "http://my-url.com"
nullScript.commonPipelineEnvironment.configuration = [stages: [myStage:[
appUrls: [appUrl]
]]]
thrown.expect(hudson.AbortException)
thrown.expectMessage("[npmExecuteEndToEndTests] The element ${appUrl} is not of type map. Please provide appUrls as a list of maps.")
stepRule.step.npmExecuteEndToEndTests(
script: nullScript,
stageName: "myStage",
runScript: "ci-e2e"
)
}
@Test
void appUrlParametersNoList() {
def appUrl = [url: "http://my-url.com", credentialId: 'testCred', parameters: '--tag scenario1']
nullScript.commonPipelineEnvironment.configuration = [stages: [myStage:[
appUrls: [appUrl]
]]]
thrown.expect(hudson.AbortException)
thrown.expectMessage("[npmExecuteEndToEndTests] The parameters property is not of type list. Please provide parameters as a list of strings.")
stepRule.step.npmExecuteEndToEndTests(
script: nullScript,
stageName: "myStage",
runScript: "ci-e2e"
)
}
@Test
void oneAppUrl() {
def appUrl = [url: "http://my-url.com"]
nullScript.commonPipelineEnvironment.configuration = [stages: [myStage:[
appUrls: [appUrl]
]]]
stepRule.step.npmExecuteEndToEndTests(
script: nullScript,
stageName: "myStage",
runScript: "ci-e2e"
)
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', ["--launchUrl=${appUrl.url}"])
}
@Test
void oneAppUrlWithCredentials() {
def appUrl = [url: "http://my-url.com", credentialId: 'testCred']
nullScript.commonPipelineEnvironment.configuration = [stages: [myStage:[
appUrls: [appUrl]
]]]
stepRule.step.npmExecuteEndToEndTests(
script: nullScript,
stageName: "myStage",
runScript: "ci-e2e"
)
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', ["--launchUrl=${appUrl.url}"])
}
@Test
void twoAppUrlsWithCredentials() {
def appUrl = [url: "http://my-url.com", credentialId: 'testCred']
def appUrl2 = [url: "http://my-second-url.com", credentialId: 'testCred2']
nullScript.commonPipelineEnvironment.configuration = [stages: [myStage:[
appUrls: [appUrl, appUrl2]
]]]
stepRule.step.npmExecuteEndToEndTests(
script: nullScript,
stageName: "myStage",
runScript: "ci-e2e"
)
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', ["--launchUrl=${appUrl.url}"])
assert npmExecuteScriptsRule.hasParameter('scriptOptions', ["--launchUrl=${appUrl2.url}"])
}
@Test
void oneAppUrlWithCredentialsAndParameters() {
def appUrl = [url: "http://my-url.com", credentialId: 'testCred', parameters: ['--tag','scenario1', '--NIGHTWATCH_ENV=chrome']]
nullScript.commonPipelineEnvironment.configuration = [stages: [myStage:[
appUrls: [appUrl]
]]]
stepRule.step.npmExecuteEndToEndTests(
script: nullScript,
stageName: "myStage",
buildDescriptorExcludeList: ["path/to/package.json"],
runScript: "ci-e2e"
)
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', ["--launchUrl=${appUrl.url}"] + appUrl.parameters)
assert npmExecuteScriptsRule.hasParameter('buildDescriptorExcludeList', ["path/to/package.json"])
}
@Test
void parallelE2eTest() {
def appUrl = [url: "http://my-url.com", credentialId: 'testCred']
nullScript.commonPipelineEnvironment.configuration = [
general: [parallelExecution: true],
stages: [
myStage:[
appUrls: [appUrl]
]]]
stepRule.step.npmExecuteEndToEndTests(
script: nullScript,
stageName: "myStage",
runScript: "ci-e2e"
)
assertTrue(executedInParallel)
assertTrue(executedOnNode)
assertFalse(executedOnKubernetes)
}
@Test
void parallelE2eTestOnKubernetes() {
def appUrl = [url: "http://my-url.com", credentialId: 'testCred']
binding.variables.env.POD_NAME = "name"
nullScript.commonPipelineEnvironment.configuration = [
general: [parallelExecution: true],
stages: [
myStage:[
appUrls: [appUrl]
]]]
stepRule.step.npmExecuteEndToEndTests(
script: nullScript,
stageName: "myStage",
runScript: "ci-e2e"
)
assertTrue(executedInParallel)
assertFalse(executedOnNode)
assertTrue(executedOnKubernetes)
}
}