From b238ede8030504151d7aca23a272bbf48f36a28b Mon Sep 17 00:00:00 2001 From: Ezbon Jacob Date: Wed, 23 Sep 2020 16:28:32 -0400 Subject: [PATCH] some more tests & refactoring --- src/ParameterStoreBuildWrapperPlugin.groovy | 35 ++-- ...arameterStoreBuildWrapperPluginTest.groovy | 151 ++++++++++++++---- 2 files changed, 139 insertions(+), 47 deletions(-) diff --git a/src/ParameterStoreBuildWrapperPlugin.groovy b/src/ParameterStoreBuildWrapperPlugin.groovy index cbe05169..feff56f2 100644 --- a/src/ParameterStoreBuildWrapperPlugin.groovy +++ b/src/ParameterStoreBuildWrapperPlugin.groovy @@ -4,7 +4,7 @@ import static TerraformEnvironmentStage.APPLY class ParameterStoreBuildWrapperPlugin implements TerraformValidateStagePlugin, TerraformEnvironmentStagePlugin { private static globalPathPattern - private static ArrayList globalParameterOptions = [] + private static List globalParameterOptions = [] private static defaultPathPattern = { options -> "/${options['organization']}/${options['repoName']}/${options['environment']}/" } public static void init() { @@ -31,18 +31,27 @@ class ParameterStoreBuildWrapperPlugin implements TerraformValidateStagePlugin, @Override public void apply(TerraformEnvironmentStage stage) { - def environment = stage.getEnvironment() - ArrayList 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), @@ -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 diff --git a/test/ParameterStoreBuildWrapperPluginTest.groovy b/test/ParameterStoreBuildWrapperPluginTest.groovy index 0d3e26a0..51758a37 100644 --- a/test/ParameterStoreBuildWrapperPluginTest.groovy +++ b/test/ParameterStoreBuildWrapperPluginTest.groovy @@ -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)) @@ -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() { @@ -254,10 +339,9 @@ class ParameterStoreBuildWrapperPluginTest { @Test void addGlobalParameterWithEmptyOptions() { - Map options = [:] - String path = '/path/' - ArrayList expected = [] - expected << [path: path] + options + Map options = [:] + String path = '/path/' + List expected = [[path: path] + options] def result = ParameterStoreBuildWrapperPlugin.withGlobalParameter(path, options) @@ -266,10 +350,9 @@ class ParameterStoreBuildWrapperPluginTest { @Test void addGlobalParameterWithOptions() { - Map options = [recursive: true, basename: 'relative'] - String path = '/path/' - ArrayList 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) @@ -278,7 +361,7 @@ class ParameterStoreBuildWrapperPluginTest { @Test void addMulitpleGlobalParameters() { - ArrayList expected = [] + List expected = [] def result = ParameterStoreBuildWrapperPlugin.withGlobalParameter('/path/') .withGlobalParameter('/path2/', [:]) .withGlobalParameter('/path3/', [recursive: true])