added files

This commit is contained in:
Your Name
2026-08-26 02:02:24 +05:30
parent 58ee8a276a
commit 3419cfba0c
200 changed files with 22132 additions and 0 deletions
@@ -0,0 +1,32 @@
package com.meesho.stages
import com.lesfurets.jenkins.unit.BasePipelineTest
import org.junit.Before
import org.junit.Test
import static org.junit.Assert.assertFalse
import static org.junit.Assert.assertTrue
class BuildNodeTest extends BasePipelineTest {
def script
@Override
@Before
void setUp() {
super.setUp()
script = loadScript('src/com/meesho/stages/buildNode.groovy')
}
@Test
void shouldSkipPm2Metrics_returnsTrue_whenExplicitlyEnabled() {
assertTrue(script.shouldSkipPm2Metrics([skip_pm2_metrics: true]))
}
@Test
void shouldSkipPm2Metrics_returnsFalse_whenAbsentOrDisabled() {
assertFalse(script.shouldSkipPm2Metrics([:]))
assertFalse(script.shouldSkipPm2Metrics([skip_pm2_metrics: false]))
assertFalse(script.shouldSkipPm2Metrics([skip_pm2_metrics: 'false']))
}
}
@@ -0,0 +1,165 @@
package com.meesho.stages
import com.lesfurets.jenkins.unit.BasePipelineTest
import org.junit.Before
import org.junit.Test
import static org.junit.Assert.*
/**
* Unit tests for buildObjHelper.groovy — the build tool dispatch router.
*
* Stage classes (buildMaven, buildGo, etc.) are replaced with minimal stubs
* placed in test/unit/stubs/ so the script can be compiled without pulling
* in the full Jenkins API dependency chain. The stubs directory is prepended
* to scriptRoots so it takes precedence over the real src/ implementations.
*/
class BuildObjHelperTest extends BasePipelineTest {
def script
@Override
@Before
void setUp() {
super.setUp()
helper.registerAllowedMethod('echo', [String]) { /* no-op */ }
// The catch block in run() uses env, log, and currentBuild — register them
binding.setProperty('env', [msg: '', FAILURE: 'FAILURE'])
binding.setProperty('log', [error: { msg -> /* no-op */ }])
binding.setProperty('currentBuild', [result: null])
// defaultBuild() is called for unrecognised build_tool values
helper.registerAllowedMethod('defaultBuild', []) { null }
script = loadScript('src/com/meesho/stages/buildObjHelper.groovy')
}
// ────────────────────────────────
// Exact-string routes
// ────────────────────────────────
@Test
void run_maven_routesToBuildMaven() {
assertEquals('buildMaven', script.run('maven').class.simpleName)
}
@Test
void run_docker_routesToBuildDocker() {
assertEquals('buildDocker', script.run('docker').class.simpleName)
}
@Test
void run_gradle_routesToBuildGradle() {
assertEquals('buildGradle', script.run('gradle').class.simpleName)
}
@Test
void run_php_routesToBuildPhp() {
assertEquals('buildPhp', script.run('php').class.simpleName)
}
// ────────────────────────────────
// Pattern routes (~/^prefix-.*/)
// ────────────────────────────────
@Test
void run_maven21_routesToBuildMaven() {
assertEquals('buildMaven', script.run('maven-21').class.simpleName)
}
@Test
void run_maven17_routesToBuildMaven() {
assertEquals('buildMaven', script.run('maven-17').class.simpleName)
}
@Test
void run_python311_routesToBuildPython() {
assertEquals('buildPython', script.run('python-3.11').class.simpleName)
}
@Test
void run_python39_routesToBuildPython() {
assertEquals('buildPython', script.run('python-3.9').class.simpleName)
}
@Test
void run_node20_routesToBuildNode() {
assertEquals('buildNode', script.run('node-20').class.simpleName)
}
@Test
void run_node18_routesToBuildNode() {
assertEquals('buildNode', script.run('node-18').class.simpleName)
}
@Test
void run_go122_routesToBuildGo() {
assertEquals('buildGo', script.run('go-1.22').class.simpleName)
}
@Test
void run_go121_routesToBuildGo() {
assertEquals('buildGo', script.run('go-1.21').class.simpleName)
}
@Test
void run_go_bare_routesToBuildGo() {
assertEquals('buildGo', script.run('go').class.simpleName)
}
@Test
void run_rust180_routesToBuildRust() {
assertEquals('buildRust', script.run('rust-1.80').class.simpleName)
}
@Test
void run_rust_bare_routesToBuildRust() {
assertEquals('buildRust', script.run('rust').class.simpleName)
}
// ────────────────────────────────
// Default / unknown inputs
// ────────────────────────────────
@Test
void run_unknownTool_doesNotThrow() {
try {
script.run('unknown-tool')
} catch (Exception e) {
fail("Unknown build_tool must not throw — got: ${e.message}")
}
}
@Test
void run_emptyString_doesNotThrow() {
try {
script.run('')
} catch (Exception e) {
fail("Empty build_tool must not throw — got: ${e.message}")
}
}
// ────────────────────────────────
// Pattern boundary guards
// ────────────────────────────────
@Test
void run_mavenWithoutHyphen_fallsToDefault() {
// 'mavenx' matches neither exact 'maven' nor ~/^maven-.*/ — falls through
try {
script.run('mavenx')
} catch (Exception e) {
fail("'mavenx' should reach defaultBuild, not throw: ${e.message}")
}
}
@Test
void run_nodeWithoutHyphen_fallsToDefault() {
try {
script.run('nodex')
} catch (Exception e) {
fail("'nodex' should reach defaultBuild, not throw: ${e.message}")
}
}
}
@@ -0,0 +1,70 @@
package com.meesho.stages
import com.lesfurets.jenkins.unit.BasePipelineTest
import groovy.text.SimpleTemplateEngine
import org.junit.Before
import org.junit.Test
import static org.junit.Assert.assertEquals
import static org.junit.Assert.fail
class BuildRustTest extends BasePipelineTest {
def script
@Override
@Before
void setUp() {
super.setUp()
script = loadScript('src/com/meesho/stages/buildRust.groovy')
}
@Test
void getSystemPackages_returnsEmptyList_whenPackageKeyIsAbsent() {
assertEquals([], script.getSystemPackages([:], 'build_packages'))
}
@Test
void getSystemPackages_returnsDistinctValidPackageNames_whenConfigured() {
assertEquals(
['libpq-dev', 'libmariadb-dev'],
script.getSystemPackages([build_packages: ['libpq-dev', 'libmariadb-dev', 'libpq-dev']], 'build_packages')
)
}
@Test
void getSystemPackages_rejectsNonListPackageConfiguration() {
assertInvalid([build_packages: 'libpq-dev'], 'must be a YAML list')
}
@Test
void getSystemPackages_rejectsBlankAndUnsafePackageNames() {
assertInvalid([build_packages: ['libpq-dev', '']], 'contains an invalid system package name')
assertInvalid([build_packages: ['libpq-dev; rm -rf /']], 'contains an invalid system package name')
}
@Test
void rustDockerfile_rendersConfiguredBuildAndRuntimePackages() {
def template = new File('resources/com/meesho/rust-Dockerfile').text
def rendered = new SimpleTemplateEngine().createTemplate(template).make([
buildRegistry: 'registry.example',
version: '1.85',
binary_name: 'example-service',
build_packages: ['libpq-dev'],
runtime_packages: ['libpq5'],
add_files: []
]).toString()
assert rendered.contains('libpq-dev')
assert rendered.contains('libpq5')
}
private void assertInvalid(Map config, String expectedMessage) {
try {
script.getSystemPackages(config, 'build_packages')
fail('Expected invalid package configuration to throw IllegalArgumentException')
} catch (IllegalArgumentException exception) {
assert exception.message.contains(expectedMessage)
}
}
}
@@ -0,0 +1,207 @@
package com.meesho.utilities
import com.lesfurets.jenkins.unit.BasePipelineTest
import org.junit.Before
import org.junit.Test
import static org.junit.Assert.*
class BuTeamMappingTest extends BasePipelineTest {
def script
@Override
@Before
void setUp() {
super.setUp()
script = loadScript('src/com/meesho/utilities/buTeamMapping.groovy')
}
// ────────────────────────────────
// validate()
// ────────────────────────────────
@Test
void validate_returnsNull_whenBuIsNull() {
assertNull(script.validate(null, 'devops'))
}
@Test
void validate_returnsNull_whenTeamIsNull() {
assertNull(script.validate('central', null))
}
@Test
void validate_returnsNull_whenBothArgsAreNull() {
assertNull(script.validate(null, null))
}
@Test
void validate_returnsTrue_forValidSupplyTeams() {
assertTrue(script.validate('supply', 'experience'))
assertTrue(script.validate('supply', 'fulfilment'))
assertTrue(script.validate('supply', 'cataloging'))
assertTrue(script.validate('supply', 'payout'))
assertTrue(script.validate('supply', 'returns'))
assertTrue(script.validate('supply', 'supplier-service'))
assertTrue(script.validate('supply', 'display-ads'))
assertTrue(script.validate('supply', 'supplier-live-commerce'))
}
@Test
void validate_returnsTrue_forValidDemandTeams() {
assertTrue(script.validate('demand', 'search'))
assertTrue(script.validate('demand', 'web'))
assertTrue(script.validate('demand', 'communications'))
assertTrue(script.validate('demand', 'discovery-platform'))
assertTrue(script.validate('demand', 'live-commerce'))
}
@Test
void validate_returnsTrue_forValidCentralTeams() {
assertTrue(script.validate('central', 'devops'))
assertTrue(script.validate('central', 'shared'))
assertTrue(script.validate('central', 'psec'))
assertTrue(script.validate('central', 'dbe'))
}
@Test
void validate_returnsTrue_forValidDataenggTeams() {
assertTrue(script.validate('dataengg', 'data-platform'))
assertTrue(script.validate('dataengg', 'data-intelligence'))
assertTrue(script.validate('dataengg', 'data-platform-nrt'))
assertTrue(script.validate('dataengg', 'data-platform-experimentation'))
}
@Test
void validate_returnsTrue_forValidDatascienceTeams() {
assertTrue(script.validate('datascience', 'ml-platform'))
assertTrue(script.validate('datascience', 'for-you'))
assertTrue(script.validate('datascience', 'recommendation'))
assertTrue(script.validate('datascience', 'advertisement'))
}
@Test
void validate_returnsTrue_forValidMcacheTeams() {
assertTrue(script.validate('mcache', 'mcache'))
assertTrue(script.validate('mcache', 'mcache-shared'))
assertTrue(script.validate('mcache', 'supplier-service'))
}
@Test
void validate_returnsTrue_forValidInfraTeams() {
assertTrue(script.validate('infra', 'devops'))
assertTrue(script.validate('infra', 'dbe'))
}
@Test
void validate_returnsFalse_whenTeamDoesNotBelongToBu() {
assertFalse(script.validate('supply', 'ml-platform'))
assertFalse(script.validate('demand', 'data-platform'))
assertFalse(script.validate('infra', 'search'))
assertFalse(script.validate('central', 'fulfilment'))
assertFalse(script.validate('dataengg', 'devops'))
}
@Test
void validate_isCaseSensitive() {
// 'Supply' vs 'supply' — map key is lowercase only
try {
def result = script.validate('Supply', 'experience')
// Unknown bu key returns null → NullPointerException from .contains()
assertTrue("Expected null or NPE for wrong-case bu", result == null || result == false)
} catch (NullPointerException expected) {
// Acceptable: unknown bu key → null entry → NPE on .contains()
}
}
// ────────────────────────────────
// get_bu_initials()
// ────────────────────────────────
@Test
void getBuInitials_returnsNull_forNullInput() {
assertNull(script.get_bu_initials(null))
}
@Test
void getBuInitials_returnsNull_forUnknownBu() {
assertNull(script.get_bu_initials('unknown-bu'))
}
@Test
void getBuInitials_returnsCorrect4LetterCodes_forAllKnownBUs() {
assertEquals('supl', script.get_bu_initials('supply'))
assertEquals('dmnd', script.get_bu_initials('demand'))
assertEquals('farm', script.get_bu_initials('farmiso'))
assertEquals('admn', script.get_bu_initials('admin'))
assertEquals('cntr', script.get_bu_initials('central'))
assertEquals('deng', script.get_bu_initials('dataengg'))
assertEquals('dsci', script.get_bu_initials('datascience'))
assertEquals('mche', script.get_bu_initials('mcache'))
assertEquals('infr', script.get_bu_initials('infra'))
}
// ────────────────────────────────
// get_team_initials()
// ────────────────────────────────
@Test
void getTeamInitials_returnsNull_forNullInput() {
assertNull(script.get_team_initials(null))
}
@Test
void getTeamInitials_returnsNull_forUnknownTeam() {
assertNull(script.get_team_initials('no-such-team'))
}
@Test
void getTeamInitials_returnsCorrectCodes_forRepresentativeTeams() {
assertEquals('devop', script.get_team_initials('devops'))
assertEquals('srch', script.get_team_initials('search'))
assertEquals('ml', script.get_team_initials('ml-platform'))
assertEquals('xp', script.get_team_initials('experience'))
assertEquals('fnf', script.get_team_initials('fulfilment'))
assertEquals('dp', script.get_team_initials('data-platform'))
assertEquals('ds', script.get_team_initials('data-science'))
assertEquals('comms', script.get_team_initials('communications'))
assertEquals('web', script.get_team_initials('web'))
assertEquals('mche', script.get_team_initials('mcache'))
assertEquals('pay', script.get_team_initials('payout'))
assertEquals('retrn', script.get_team_initials('returns'))
assertEquals('dplay', script.get_team_initials('display-ads'))
assertEquals('drank', script.get_team_initials('discovery-ranking'))
assertEquals('slcom', script.get_team_initials('supplier-live-commerce'))
}
// ────────────────────────────────
// get_initials() — dispatch
// ────────────────────────────────
@Test
void getInitials_dispatchesToBuInitialsMap() {
assertEquals('supl', script.get_initials('bu_initials', 'supply'))
assertEquals('cntr', script.get_initials('bu_initials', 'central'))
assertEquals('infr', script.get_initials('bu_initials', 'infra'))
}
@Test
void getInitials_dispatchesToTeamInitialsMap() {
assertEquals('devop', script.get_initials('team_initials', 'devops'))
assertEquals('srch', script.get_initials('team_initials', 'search'))
}
@Test
void getInitials_returnsUndefinedOption_forUnknownTargetMap() {
assertEquals('Undefined option', script.get_initials('typo_map', 'supply'))
}
@Test
void getInitials_returnsNull_whenTargetStringIsNull() {
assertNull(script.get_initials('bu_initials', null))
assertNull(script.get_initials('team_initials', null))
// Unknown map with null targetString also returns null (null guard fires first)
assertNull(script.get_initials('unknown_map', null))
}
}
@@ -0,0 +1,269 @@
package com.meesho.utilities
import com.lesfurets.jenkins.unit.BasePipelineTest
import org.junit.Before
import org.junit.Test
import static org.junit.Assert.*
/**
* Unit tests for constructParam.groovy policy-enforcement methods.
*
* Strategy: Jenkins DSL steps (git, readYaml, dir) are registered as no-op mocks.
* readYaml is overridden per-test to return controlled whitelist data.
* This isolates each method's branch-decision logic from the live GitHub clone.
*/
class ConstructParamTest extends BasePipelineTest {
def script
// Controlled whitelist sets — each test overrides as needed via helper.registerAllowedMethod
Set<String> sonarWhitelist = [] as Set
Set<String> appConfigDisabledWhitelist = [] as Set
Set<String> allowedNonDevelopWhitelist = [] as Set
Set<String> validateCacWhitelist = [] as Set
Set<String> multizoneDeployables = [] as Set
@Override
@Before
void setUp() {
super.setUp()
// No-op Jenkins DSL steps
helper.registerAllowedMethod('dir', [String, Closure]) { path, body -> body() }
helper.registerAllowedMethod('git', [Map]) { /* no-op clone */ }
helper.registerAllowedMethod('echo', [String]) { /* no-op */ }
// readYaml returns whitelists driven by the test's set fields
helper.registerAllowedMethod('readYaml', [Map]) { args ->
String file = args.file as String
if (file.contains('skip-sonar-whitelist')) return [repos: sonarWhitelist.toList()]
if (file.contains('app-config-disabled')) return [repos: appConfigDisabledWhitelist.toList()]
if (file.contains('allowedNonDevelopPrDeploymentToInt')) return [repos: allowedNonDevelopWhitelist.toList()]
if (file.contains('ValidateCacConfig')) return [repos: validateCacWhitelist.toList()]
if (file.contains('multizone-enabled-repos')) return [multizone_enabled_deployables: multizoneDeployables.toList()]
return [repos: []]
}
script = loadScript('src/com/meesho/utilities/constructParam.groovy')
}
// ────────────────────────────────
// skipSonarCheckForbidden()
// ────────────────────────────────
@Test
void skipSonarCheckForbidden_returnsFalse_forNonMavenBuilds() {
binding.setProperty('env', [BRANCH_NAME: 'main'])
def config = [dockerBuildVersion: 'go-1.22', repo_name: 'my-service', skip_sonar: true]
assertFalse(script.skipSonarCheckForbidden(config, ['main': 'prd']))
}
@Test
void skipSonarCheckForbidden_returnsFalse_forNodeBuild() {
binding.setProperty('env', [BRANCH_NAME: 'main'])
def config = [dockerBuildVersion: 'node-20', repo_name: 'my-service', skip_sonar: true]
assertFalse(script.skipSonarCheckForbidden(config, ['main': 'prd']))
}
@Test
void skipSonarCheckForbidden_returnsFalse_forHotfixBranch() {
binding.setProperty('env', [BRANCH_NAME: 'hotfix/fix-login'])
def config = [dockerBuildVersion: 'maven-21', repo_name: 'my-service', skip_sonar: true]
assertFalse(script.skipSonarCheckForbidden(config, ['main': 'prd']))
}
@Test
void skipSonarCheckForbidden_returnsFalse_forStgEnvironment() {
binding.setProperty('env', [BRANCH_NAME: 'develop'])
def config = [dockerBuildVersion: 'maven-21', repo_name: 'my-service', skip_sonar: true]
assertFalse(script.skipSonarCheckForbidden(config, ['develop': 'stg']))
}
@Test
void skipSonarCheckForbidden_returnsFalse_forIntEnvironment() {
binding.setProperty('env', [BRANCH_NAME: 'feature/xyz'])
def config = [dockerBuildVersion: 'maven-21', repo_name: 'my-service', skip_sonar: true]
// branch not in map → defaults to "int"
assertFalse(script.skipSonarCheckForbidden(config, ['main': 'prd']))
}
@Test
void skipSonarCheckForbidden_returnsFalse_whenRepoIsInSonarWhitelist() {
binding.setProperty('env', [BRANCH_NAME: 'main'])
sonarWhitelist = ['whitelisted-service'] as Set
def config = [dockerBuildVersion: 'maven-21', repo_name: 'whitelisted-service', skip_sonar: true]
assertFalse(script.skipSonarCheckForbidden(config, ['main': 'prd']))
}
@Test
void skipSonarCheckForbidden_returnsTrue_whenSkipSonarTrue_onMavenPrdBuild() {
binding.setProperty('env', [BRANCH_NAME: 'main'])
sonarWhitelist = [] as Set
def config = [dockerBuildVersion: 'maven-21', repo_name: 'my-service', skip_sonar: true]
assertTrue(script.skipSonarCheckForbidden(config, ['main': 'prd']))
}
@Test
void skipSonarCheckForbidden_returnsFalse_whenSkipSonarFalse_onMavenPrdBuild() {
binding.setProperty('env', [BRANCH_NAME: 'main'])
sonarWhitelist = [] as Set
def config = [dockerBuildVersion: 'maven-21', repo_name: 'my-service', skip_sonar: false]
assertFalse(script.skipSonarCheckForbidden(config, ['main': 'prd']))
}
@Test
void skipSonarCheckForbidden_returnsTrue_forMaven17PrdBuildWithSkipSonar() {
binding.setProperty('env', [BRANCH_NAME: 'main'])
sonarWhitelist = [] as Set
def config = [dockerBuildVersion: 'maven-17', repo_name: 'my-service', skip_sonar: true]
assertTrue(script.skipSonarCheckForbidden(config, ['main': 'prd']))
}
// ────────────────────────────────
// appConfigDisabledForbidden()
// ────────────────────────────────
@Test
void appConfigDisabledForbidden_returnsFalse_whenEnvironmentIsNotStg() {
binding.setProperty('env', [CHANGE_TARGET: 'main'])
assertFalse(script.appConfigDisabledForbidden(false, 'my-service', 'prd', 'maven-21'))
}
@Test
void appConfigDisabledForbidden_returnsFalse_whenEnvironmentIsInt() {
binding.setProperty('env', [CHANGE_TARGET: 'main'])
assertFalse(script.appConfigDisabledForbidden(false, 'my-service', 'int', 'maven-21'))
}
@Test
void appConfigDisabledForbidden_returnsFalse_whenBuildIsGo() {
binding.setProperty('env', [CHANGE_TARGET: 'develop'])
assertFalse(script.appConfigDisabledForbidden(false, 'my-service', 'stg', 'go-1.22'))
}
@Test
void appConfigDisabledForbidden_returnsFalse_whenBuildIsNode() {
binding.setProperty('env', [CHANGE_TARGET: 'develop'])
assertFalse(script.appConfigDisabledForbidden(false, 'my-service', 'stg', 'node-20'))
}
@Test
void appConfigDisabledForbidden_returnsFalse_whenRepoIsInWhitelist() {
binding.setProperty('env', [CHANGE_TARGET: 'develop'])
appConfigDisabledWhitelist = ['legacy-service'] as Set
assertFalse(script.appConfigDisabledForbidden(false, 'legacy-service', 'stg', 'maven-21'))
}
@Test
void appConfigDisabledForbidden_returnsTrue_forMavenStgBuildWithAppConfigDisabled() {
binding.setProperty('env', [CHANGE_TARGET: 'develop'])
appConfigDisabledWhitelist = [] as Set
assertTrue(script.appConfigDisabledForbidden(false, 'my-service', 'stg', 'maven-21'))
}
@Test
void appConfigDisabledForbidden_returnsFalse_forMavenStgBuildWithAppConfigEnabled() {
binding.setProperty('env', [CHANGE_TARGET: 'develop'])
appConfigDisabledWhitelist = [] as Set
assertFalse(script.appConfigDisabledForbidden(true, 'my-service', 'stg', 'maven-21'))
}
@Test
void appConfigDisabledForbidden_returnsTrue_forGradleStgBuildWithAppConfigDisabled() {
binding.setProperty('env', [CHANGE_TARGET: 'develop'])
appConfigDisabledWhitelist = [] as Set
assertTrue(script.appConfigDisabledForbidden(false, 'my-service', 'stg', 'gradle'))
}
// ────────────────────────────────
// allowedNonDevelopPrDeploymentToIntRepos()
// ────────────────────────────────
@Test
void allowedNonDevelopPr_returnsFalse_whenRepoNotInWhitelist() {
allowedNonDevelopWhitelist = [] as Set
assertFalse(script.allowedNonDevelopPrDeploymentToIntRepos('my-service'))
}
@Test
void allowedNonDevelopPr_returnsTrue_whenRepoIsInWhitelist() {
allowedNonDevelopWhitelist = ['allowed-service'] as Set
assertTrue(script.allowedNonDevelopPrDeploymentToIntRepos('allowed-service'))
}
@Test
void allowedNonDevelopPr_isCaseSensitive() {
allowedNonDevelopWhitelist = ['My-Service'] as Set
assertFalse(script.allowedNonDevelopPrDeploymentToIntRepos('my-service'))
}
@Test
void allowedNonDevelopPr_returnsFalse_forEmptyRepoName() {
allowedNonDevelopWhitelist = [] as Set
assertFalse(script.allowedNonDevelopPrDeploymentToIntRepos(''))
}
// ────────────────────────────────
// ValidateCacConfigForRepo()
// ────────────────────────────────
@Test
void validateCacConfig_returnsTrue_whenRepoIsInWhitelist() {
binding.setProperty('env', [CHANGE_TARGET: 'develop'])
validateCacWhitelist = ['cac-enabled-service'] as Set
assertTrue(script.ValidateCacConfigForRepo(false, 'cac-enabled-service'))
}
@Test
void validateCacConfig_returnsPassedInValue_whenRepoNotInWhitelist() {
binding.setProperty('env', [CHANGE_TARGET: 'develop'])
validateCacWhitelist = [] as Set
assertTrue(script.ValidateCacConfigForRepo(true, 'my-service'))
assertFalse(script.ValidateCacConfigForRepo(false, 'my-service'))
}
@Test
void validateCacConfig_whitelistOverridesFalseValidateConfig() {
binding.setProperty('env', [CHANGE_TARGET: 'develop'])
validateCacWhitelist = ['forced-service'] as Set
assertTrue(script.ValidateCacConfigForRepo(false, 'forced-service'))
}
@Test
void validateCacConfig_whitelistDoesNotOverrideTrueValidateConfig() {
// If repo is NOT in whitelist but ValidateConfig=true, it should still return true
binding.setProperty('env', [CHANGE_TARGET: 'develop'])
validateCacWhitelist = [] as Set
assertTrue(script.ValidateCacConfigForRepo(true, 'my-service'))
}
// ────────────────────────────────
// isMultizoneEnabled()
// ────────────────────────────────
@Test
void isMultizoneEnabled_returnsFalse_whenDeployableNotInList() {
multizoneDeployables = [] as Set
assertFalse(script.isMultizoneEnabled('my-deployable'))
}
@Test
void isMultizoneEnabled_returnsTrue_whenDeployableIsInList() {
multizoneDeployables = ['critical-app'] as Set
assertTrue(script.isMultizoneEnabled('critical-app'))
}
@Test
void isMultizoneEnabled_isExactMatch_prefixNotSufficient() {
multizoneDeployables = ['critical-app'] as Set
assertFalse(script.isMultizoneEnabled('critical'))
assertFalse(script.isMultizoneEnabled('critical-app-v2'))
}
@Test
void isMultizoneEnabled_isCaseSensitive() {
multizoneDeployables = ['Critical-App'] as Set
assertFalse(script.isMultizoneEnabled('critical-app'))
}
}