Skip to content

Commit

Permalink
some more tests & refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
codezninja committed Sep 23, 2020
1 parent 6ec359f commit b238ede
Show file tree
Hide file tree
Showing 2 changed files with 139 additions and 47 deletions.
35 changes: 22 additions & 13 deletions src/ParameterStoreBuildWrapperPlugin.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import static TerraformEnvironmentStage.APPLY

class ParameterStoreBuildWrapperPlugin implements TerraformValidateStagePlugin, TerraformEnvironmentStagePlugin {
private static globalPathPattern
private static ArrayList<Map> globalParameterOptions = []
private static List globalParameterOptions = []
private static defaultPathPattern = { options -> "/${options['organization']}/${options['repoName']}/${options['environment']}/" }

public static void init() {
Expand All @@ -31,18 +31,27 @@ class ParameterStoreBuildWrapperPlugin implements TerraformValidateStagePlugin,

@Override
public void apply(TerraformEnvironmentStage stage) {
def environment = stage.getEnvironment()
ArrayList<Map> allParameterOptions = []
def environment = stage.getEnvironment()
List options = getParameterOptions(environment)

allParameterOptions << getEnvironmentParameterOptions(environment)
allParameterOptions.addAll(globalParameterOptions)

allParameterOptions.each { apo ->
stage.decorate(PLAN, addParameterStoreBuildWrapper(apo))
stage.decorate(APPLY, addParameterStoreBuildWrapper(apo))
options.each { option ->
stage.decorate(PLAN, addParameterStoreBuildWrapper(option))
stage.decorate(APPLY, addParameterStoreBuildWrapper(option))
}
}

List getParameterOptions(String environment) {
List options = []
options.add(getEnvironmentParameterOptions(environment))
options.addAll(getGlobalParameterOptions())

return options
}

List getGlobalParameterOptions() {
return this.globalParameterOptions
}

Map getEnvironmentParameterOptions(String environment) {
return [
path: pathForEnvironment(environment),
Expand All @@ -52,10 +61,10 @@ class ParameterStoreBuildWrapperPlugin implements TerraformValidateStagePlugin,

String pathForEnvironment(String environment) {
String organization = Jenkinsfile.instance.getOrganization()
String repoName = Jenkinsfile.instance.getRepoName()
def patternOptions = [ environment: environment,
repoName: repoName,
organization: organization ]
String repoName = Jenkinsfile.instance.getRepoName()
def patternOptions = [ environment: environment,
repoName: repoName,
organization: organization ]

def pathPattern = globalPathPattern ?: defaultPathPattern

Expand Down
151 changes: 117 additions & 34 deletions test/ParameterStoreBuildWrapperPluginTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -89,47 +89,53 @@ class ParameterStoreBuildWrapperPluginTest {

class WithTerraformEnvironmentStage {
@Test
void decorateTheTerraformEnvironmentStageIfGlobalParametersNotSet() {
String organization = "MyOrg"
String repoName = "MyRepo"
String environment = "MyEnv"
Map apo = [path: "/${organization}/${repoName}/${environment}/", credentialsId: "${environment.toUpperCase()}_PARAMETER_STORE_ACCESS"]
def expectedClosure = { -> }
configureJenkins(repoName: repoName, organization: organization)

void doesNotDecorateTheTerraformEnvironmentStageIfNoOptionsSet() {
def expectedClosure = { -> }
String environment = "MyEnv"
List options = []
TerraformEnvironmentStage stage = mock(TerraformEnvironmentStage.class)
ParameterStoreBuildWrapperPlugin plugin = spy(new ParameterStoreBuildWrapperPlugin())

doReturn(environment).when(stage).getEnvironment()
doReturn(apo).when(plugin).getEnvironmentParameterOptions(environment)
doReturn(expectedClosure).when(plugin).addParameterStoreBuildWrapper(apo)
doReturn(options).when(plugin).getParameterOptions(environment)

plugin.apply(stage)

verify(stage, times(2)).decorate(anyString(), eq(expectedClosure))
verify(stage, never()).decorate(expectedClosure)
}

@Test
void decorateTheTerraformEnvironmentStageWhenGlobalParametersSet() {
String organization = "MyOrg"
String repoName = "MyRepo"
String environment = "MyEnv"
String path = '/someOtherPath/'
Map apo = [path: "/${organization}/${repoName}/${environment}/", credentialsId: "${environment.toUpperCase()}_PARAMETER_STORE_ACCESS"]
Map gp = [path: path]
def firstClosure = { -> }
def secondClosure = { -> }
configureJenkins(repoName: repoName, organization: organization)
void decorateTheTerraformEnvironmentStageWhenSingleOptionsSet() {
def expectedClosure = { -> }
String environment = "MyEnv"
List options = [[someKey: "someValue"]]
TerraformEnvironmentStage stage = mock(TerraformEnvironmentStage.class)
ParameterStoreBuildWrapperPlugin plugin = spy(new ParameterStoreBuildWrapperPlugin())

doReturn(environment).when(stage).getEnvironment()
doReturn(options).when(plugin).getParameterOptions(environment)
doReturn(expectedClosure).when(plugin).addParameterStoreBuildWrapper(options[0])

plugin.apply(stage)

verify(stage).decorate(TerraformEnvironmentStage.PLAN, expectedClosure)
verify(stage).decorate(TerraformEnvironmentStage.APPLY, expectedClosure)
}

@Test
void decorateTheTerraformEnvironmentStageWhenMultipleOptionsSet() {
def firstClosure = { -> }
def secondClosure = { -> }
String environment = "MyEnv"
List options = [[someKey: "someValue"], [someOtherKey: "someOtherValue"]]
TerraformEnvironmentStage stage = mock(TerraformEnvironmentStage.class)
ParameterStoreBuildWrapperPlugin plugin = spy(new ParameterStoreBuildWrapperPlugin())

doReturn(environment).when(stage).getEnvironment()
doReturn(apo).when(plugin).getEnvironmentParameterOptions(environment)
doReturn(firstClosure).when(plugin).addParameterStoreBuildWrapper(gp)
doReturn(secondClosure).when(plugin).addParameterStoreBuildWrapper(apo)
doReturn(options).when(plugin).getParameterOptions(environment)
doReturn(firstClosure).when(plugin).addParameterStoreBuildWrapper(options[0])
doReturn(secondClosure).when(plugin).addParameterStoreBuildWrapper(options[1])

plugin.withGlobalParameter(path)
plugin.apply(stage)

verify(stage, times(2)).decorate(anyString(), eq(firstClosure))
Expand All @@ -138,6 +144,85 @@ class ParameterStoreBuildWrapperPluginTest {
}
}

class GetParameterOptions {
@After
public void reset() {
Jenkinsfile.instance = null
ParameterStoreBuildWrapperPlugin.reset()
}

private configureJenkins(Map config = [:]) {
Jenkinsfile.instance = mock(Jenkinsfile.class)
when(Jenkinsfile.instance.getStandardizedRepoSlug()).thenReturn(config.repoSlug)
when(Jenkinsfile.instance.getRepoName()).thenReturn(config.repoName ?: 'repo')
when(Jenkinsfile.instance.getOrganization()).thenReturn(config.organization ?: 'org')
when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
}

@Test
void returnsNoOptionsWhenNotSet() {
String environment = "MyEnv"
Map option = [:]
List expected = [ option ]
ParameterStoreBuildWrapperPlugin plugin = spy(new ParameterStoreBuildWrapperPlugin())

doReturn(option).when(plugin).getEnvironmentParameterOptions(environment)

List actual = plugin.getParameterOptions(environment)

assertEquals(expected, actual)
}

@Test
void returnsEnvironmentOptionWhenSet() {
String environment = "MyEnv"
Map option = [ key: "value" ]
List expected = [ option ]
ParameterStoreBuildWrapperPlugin plugin = spy(new ParameterStoreBuildWrapperPlugin())

doReturn(option).when(plugin).getEnvironmentParameterOptions(environment)

List actual = plugin.getParameterOptions(environment)

assertEquals(expected, actual)
}

@Test
void returnsSingleGlobalOptionsAndEnvironmentOptionWhenSet() {
String environment = "MyEnv"
Map environmentOption = [ env: "envValue" ]
Map globalOption1 = [ global: "globalValue" ]
List globalOptions = [ globalOption1 ]
List expected = [ environmentOption ] + globalOptions
ParameterStoreBuildWrapperPlugin plugin = spy(new ParameterStoreBuildWrapperPlugin())

doReturn(environmentOption).when(plugin).getEnvironmentParameterOptions(environment)
doReturn(globalOptions).when(plugin).getGlobalParameterOptions()

List actual = plugin.getParameterOptions(environment)

assertEquals(expected, actual)
}

@Test
void returnsMultipleGlobalOptionsAndEnvironmentOptionWhenSet() {
String environment = "MyEnv"
Map environmentOption = [ env: "envValue" ]
Map globalOption1 = [ global: "globalValue" ]
Map globalOption2 = [ global2: "globalValue2" ]
List globalOptions = [ globalOption1, globalOption2 ]
List expected = [ environmentOption ] + globalOptions
ParameterStoreBuildWrapperPlugin plugin = spy(new ParameterStoreBuildWrapperPlugin())

doReturn(environmentOption).when(plugin).getEnvironmentParameterOptions(environment)
doReturn(globalOptions).when(plugin).getGlobalParameterOptions()

List actual = plugin.getParameterOptions(environment)

assertEquals(expected, actual)
}
}

public class GetEnvironmentParameterOptions {
@After
public void reset() {
Expand Down Expand Up @@ -254,10 +339,9 @@ class ParameterStoreBuildWrapperPluginTest {

@Test
void addGlobalParameterWithEmptyOptions() {
Map options = [:]
String path = '/path/'
ArrayList<Map> expected = []
expected << [path: path] + options
Map options = [:]
String path = '/path/'
List expected = [[path: path] + options]

def result = ParameterStoreBuildWrapperPlugin.withGlobalParameter(path, options)

Expand All @@ -266,10 +350,9 @@ class ParameterStoreBuildWrapperPluginTest {

@Test
void addGlobalParameterWithOptions() {
Map options = [recursive: true, basename: 'relative']
String path = '/path/'
ArrayList<Map> expected = []
expected << [path: path] + options
Map options = [recursive: true, basename: 'relative']
String path = '/path/'
List expected = [[path: path] + options]

def result = ParameterStoreBuildWrapperPlugin.withGlobalParameter(path, options)

Expand All @@ -278,7 +361,7 @@ class ParameterStoreBuildWrapperPluginTest {

@Test
void addMulitpleGlobalParameters() {
ArrayList<Map> expected = []
List expected = []
def result = ParameterStoreBuildWrapperPlugin.withGlobalParameter('/path/')
.withGlobalParameter('/path2/', [:])
.withGlobalParameter('/path3/', [recursive: true])
Expand Down

0 comments on commit b238ede

Please sign in to comment.