added files
This commit is contained in:
@@ -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'))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user