Skip to content

Commit 812ad50

Browse files
committed
send correct config when enforce_settings is on
1 parent c7082ee commit 812ad50

File tree

3 files changed

+155
-17
lines changed

3 files changed

+155
-17
lines changed

bin/commands/runs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ module.exports = function run(args, rawArgs) {
302302
if ( !utils.isUndefinedOrFalse(bsConfig.run_settings.enforce_settings) ) {
303303
markBlockStart('setEnforceSettingsConfig');
304304
logger.debug('Started setting the configs');
305-
utils.setEnforceSettingsConfig(bsConfig);
305+
utils.setEnforceSettingsConfig(bsConfig, args);
306306
logger.debug('Completed setting the configs');
307307
markBlockEnd('setEnforceSettingsConfig');
308308
}

bin/helpers/utils.js

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,7 +1319,7 @@ exports.setVideoCliConfig = (bsConfig, videoConfig) => {
13191319
}
13201320

13211321
// set configs if enforce_settings is passed
1322-
exports.setEnforceSettingsConfig = (bsConfig) => {
1322+
exports.setEnforceSettingsConfig = (bsConfig, args) => {
13231323
if ( this.isUndefined(bsConfig) || this.isUndefined(bsConfig.run_settings) ) return;
13241324
let config_args = (bsConfig && bsConfig.run_settings && bsConfig.run_settings.config) ? bsConfig.run_settings.config : undefined;
13251325
if ( this.isUndefined(config_args) || !config_args.includes("video") ) {
@@ -1338,16 +1338,77 @@ exports.setEnforceSettingsConfig = (bsConfig) => {
13381338
// doing this only for cypress 10 and above as --spec is given precedence for cypress 9.
13391339
let specConfigs = bsConfig.run_settings.specs;
13401340
// if multiple specs are passed, convert it into an array.
1341-
if(specConfigs && specConfigs.includes(',')) {
1342-
specConfigs = JSON.stringify(specConfigs.split(','));
1341+
if (specConfigs && !Array.isArray(specConfigs)) {
1342+
if (specConfigs.includes(',')) {
1343+
specConfigs = this.splitStringByCharButIgnoreIfWithinARange(specConfigs, ',', '{', '}');
1344+
} else {
1345+
specConfigs = [specConfigs];
1346+
}
13431347
}
1344-
let spec_pattern_args = `specPattern=${specConfigs}`;
1348+
let ignoreFiles = args.exclude || bsConfig.run_settings.exclude
1349+
let specFilesMatched = [];
1350+
specConfigs.forEach(specPattern => {
1351+
specFilesMatched.push(
1352+
...glob.sync(specPattern, {
1353+
cwd: bsConfig.run_settings.cypressProjectDir, matchBase: true, ignore: ignoreFiles
1354+
})
1355+
);
1356+
});
1357+
logger.debug(`${specFilesMatched && specFilesMatched.length > 0 ? specFilesMatched.length : 0} spec files found with the provided specPattern for enforce_settings`);
1358+
// If spec files were found then lets we'll load the matched spec files
1359+
// If spec files were not found then we'll let cypress decide the loading of spec files
1360+
let spec_pattern_args = `specPattern=${JSON.stringify(specFilesMatched && specFilesMatched.length > 0 ? specFilesMatched : specConfigs)}`;
13451361
config_args = this.isUndefined(config_args) ? spec_pattern_args : config_args + ',' + spec_pattern_args;
13461362
}
13471363
if ( this.isNotUndefined(config_args) ) bsConfig["run_settings"]["config"] = config_args;
13481364
logger.debug(`Setting conifg_args for enforce_settings to ${config_args}`);
13491365
}
13501366

1367+
/**
1368+
* Splits a string by a specified splitChar.
1369+
* If leftLimiter and rightLimiter are specified then string won't be splitted if the splitChar is within the range
1370+
*
1371+
* @param {String} str - the string that needs to be splitted
1372+
* @param {String} splitChar - the split string/char from which the string will be splited
1373+
* @param {String} [leftLimiter] - the starting string/char of the range
1374+
* @param {String} [rightLimiter] - the ending string/char of the range
1375+
*
1376+
* @example Example usage of splitStringByCharButIgnoreIfWithinARange.
1377+
* // returns ["folder/A/B", "folder/{C,D}/E"]
1378+
* utils.splitStringByCharButIgnoreIfWithinARange("folder/A/B,folder/{C,D}/E", ",", "{", "}");
1379+
* @returns String[] | null
1380+
*/
1381+
exports.splitStringByCharButIgnoreIfWithinARange = (str, splitChar, leftLimiter, rightLimiter) => {
1382+
if (typeof(str) !== 'string' || this.isUndefined(splitChar)) return null;
1383+
1384+
if (this.isUndefined(leftLimiter) || this.isUndefined(rightLimiter)) return str.split(splitChar);
1385+
1386+
let result = [];
1387+
let buffer = '';
1388+
let openBraceCount = 0;
1389+
1390+
for (let i = 0; i < str.length; i++) {
1391+
if (str[i] === leftLimiter) {
1392+
openBraceCount++;
1393+
} else if (str[i] === rightLimiter) {
1394+
openBraceCount--;
1395+
}
1396+
1397+
if (str[i] === splitChar && openBraceCount === 0) {
1398+
result.push(buffer);
1399+
buffer = '';
1400+
} else {
1401+
buffer += str[i];
1402+
}
1403+
}
1404+
1405+
if (buffer !== '') {
1406+
result.push(buffer);
1407+
}
1408+
1409+
return result;
1410+
}
1411+
13511412
// blindly send other passed configs with run_settings and handle at backend
13521413
exports.setOtherConfigs = (bsConfig, args) => {
13531414
if(o11yHelpers.isTestObservabilitySession() && process.env.BS_TESTOPS_JWT) {

test/unit/bin/helpers/utils.js

Lines changed: 89 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3098,56 +3098,133 @@ describe('utils', () => {
30983098
describe('setEnforceSettingsConfig', () => {
30993099
it('the video config should be assigned to bsconfig run_settings config', () => {
31003100
let bsConfig = {
3101-
run_settings: { video_config: { video:true, videoUploadOnPasses:true} },
3101+
run_settings: {
3102+
video_config: { video:true, videoUploadOnPasses:true },
3103+
cypressProjectDir: 'cypressProjectDir',
3104+
},
31023105
};
31033106
let args = {
31043107
config: 'video=true,videoUploadOnPasses=true'
31053108
}
3106-
utils.setEnforceSettingsConfig(bsConfig);
3109+
utils.setEnforceSettingsConfig(bsConfig, args);
31073110
expect(args.config).to.be.eql(bsConfig.run_settings.config);
31083111
});
3109-
it('the specPattern config should be assigned as strings for single string to bsconfig run_settings config', () => {
3112+
it('the specPattern config should be assigned as array for single spec string to bsconfig run_settings config', () => {
31103113
let bsConfig = {
3111-
run_settings: { specs: 'somerandomspecs', cypressTestSuiteType: 'CYPRESS_V10_AND_ABOVE_TYPE' },
3114+
run_settings: {
3115+
specs: 'somerandomspecs',
3116+
cypressTestSuiteType: 'CYPRESS_V10_AND_ABOVE_TYPE',
3117+
cypressProjectDir: 'cypressProjectDir',
3118+
},
31123119
};
31133120
let args = {
3114-
config: 'video=false,videoUploadOnPasses=false,specPattern=somerandomspecs'
3121+
exclude: "",
3122+
config: 'video=false,videoUploadOnPasses=false,specPattern=["somerandomspecs"]'
31153123
}
3116-
utils.setEnforceSettingsConfig(bsConfig);
3124+
utils.setEnforceSettingsConfig(bsConfig, args);
31173125
expect(args.config).to.be.eql(bsConfig.run_settings.config);
31183126
});
31193127
it('the specPattern config should be assigned as array for multiple spec strings to bsconfig run_settings config', () => {
31203128
let bsConfig = {
3121-
run_settings: { specs: 'somerandomspecs1,somerandomspecs2', cypressTestSuiteType: 'CYPRESS_V10_AND_ABOVE_TYPE' },
3129+
run_settings: {
3130+
specs: 'somerandomspecs1,somerandomspecs2',
3131+
cypressTestSuiteType: 'CYPRESS_V10_AND_ABOVE_TYPE',
3132+
cypressProjectDir: 'cypressProjectDir',
3133+
},
31223134
};
31233135
let args = {
3136+
exclude: "",
31243137
config: 'video=false,videoUploadOnPasses=false,specPattern=["somerandomspecs1","somerandomspecs2"]'
31253138
}
3126-
utils.setEnforceSettingsConfig(bsConfig);
3139+
utils.setEnforceSettingsConfig(bsConfig, args);
3140+
expect(args.config).to.be.eql(bsConfig.run_settings.config);
3141+
});
3142+
it('the specPattern config should not be assigned just on the basis of "," as array for single spec string to bsconfig run_settings config', () => {
3143+
let bsConfig = {
3144+
run_settings: {
3145+
specs: 'folders/{sample1,sample2}/somerandomspecs',
3146+
cypressTestSuiteType: 'CYPRESS_V10_AND_ABOVE_TYPE',
3147+
cypressProjectDir: 'cypressProjectDir',
3148+
},
3149+
};
3150+
let args = {
3151+
exclude: "",
3152+
config: 'video=false,videoUploadOnPasses=false,specPattern=["folders/{sample1,sample2}/somerandomspecs"]'
3153+
}
3154+
utils.setEnforceSettingsConfig(bsConfig, args);
3155+
expect(args.config).to.be.eql(bsConfig.run_settings.config);
3156+
});
3157+
it('the specPattern config should not be assigned just on the basis of "," as array for multiple spec strings to bsconfig run_settings config', () => {
3158+
let bsConfig = {
3159+
run_settings: {
3160+
specs: 'folders/{sample1,sample2}/somerandomspecs,folders2/sample3/somerandomspecs2',
3161+
cypressTestSuiteType: 'CYPRESS_V10_AND_ABOVE_TYPE',
3162+
cypressProjectDir: 'cypressProjectDir',
3163+
},
3164+
};
3165+
let args = {
3166+
exclude: "",
3167+
config: 'video=false,videoUploadOnPasses=false,specPattern=["folders/{sample1,sample2}/somerandomspecs","folders2/sample3/somerandomspecs2"]'
3168+
}
3169+
utils.setEnforceSettingsConfig(bsConfig, args);
31273170
expect(args.config).to.be.eql(bsConfig.run_settings.config);
31283171
});
31293172
it('the testFiles config should be assigned to bsconfig run_settings config', () => {
31303173
let bsConfig = {
31313174
run_settings: { specs: 'somerandomspecs', cypressTestSuiteType: 'CYPRESS_V9_AND_OLDER_TYPE' },
31323175
};
31333176
let args = {
3134-
config: 'video=false,videoUploadOnPasses=false'
3177+
config: 'video=false,videoUploadOnPasses=false',
3178+
cypressProjectDir: 'cypressProjectDir',
31353179
}
3136-
utils.setEnforceSettingsConfig(bsConfig);
3180+
utils.setEnforceSettingsConfig(bsConfig, args);
31373181
expect(args.config).to.be.eql(bsConfig.run_settings.config);
31383182
});
31393183
it('the baseUrl config should be assigned to bsconfig run_settings config', () => {
31403184
let bsConfig = {
3141-
run_settings: { baseUrl: 'http://localhost:8080' },
3185+
run_settings: {
3186+
baseUrl: 'http://localhost:8080',
3187+
cypressProjectDir: 'cypressProjectDir',
3188+
},
31423189
};
31433190
let args = {
31443191
config: 'video=false,videoUploadOnPasses=false,baseUrl=http://localhost:8080'
31453192
}
3146-
utils.setEnforceSettingsConfig(bsConfig);
3193+
utils.setEnforceSettingsConfig(bsConfig, args);
31473194
expect(args.config).to.be.eql(bsConfig.run_settings.config);
31483195
});
31493196
});
31503197

3198+
describe('splitStringByCharButIgnoreIfWithinARange', () => {
3199+
it('should return null if string is not provided', () => {
3200+
expect(utils.splitStringByCharButIgnoreIfWithinARange()).to.be.eql(null);
3201+
});
3202+
3203+
it('should return null if splitChar is not provided', () => {
3204+
expect(utils.splitStringByCharButIgnoreIfWithinARange("some")).to.be.eql(null);
3205+
});
3206+
3207+
it('should return splitted string even if leftLimiter and rightLimiter is not provided', () => {
3208+
expect(utils.splitStringByCharButIgnoreIfWithinARange("some,random,text", ",")).to.be.eql(["some", "random", "text"]);
3209+
});
3210+
3211+
it('should return splitted string even if leftLimiter is provided but rightLimiter is not provided', () => {
3212+
expect(utils.splitStringByCharButIgnoreIfWithinARange("some,random,{text,here},and,here", ",", "{")).to.be.eql(["some", "random", "{text", "here}", "and", "here"]);
3213+
});
3214+
3215+
it('should return splitted string even if leftLimiter is not provided but rightLimiter is provided', () => {
3216+
expect(utils.splitStringByCharButIgnoreIfWithinARange("some,random,{text,here},and,here", ",", null, "}")).to.be.eql(["some", "random", "{text", "here}", "and", "here"]);
3217+
});
3218+
3219+
it('should return splitted string and ignore splitting if splitChar is withing the leftLimiter and rightLimiter', () => {
3220+
expect(utils.splitStringByCharButIgnoreIfWithinARange("some,random,{text,here},and,here", ",", "{", "}")).to.be.eql(["some", "random", "{text,here}", "and", "here"]);
3221+
});
3222+
3223+
it('should return splitted string and ignore splitting if splitChar is withing the leftLimiter and rightLimiter', () => {
3224+
expect(utils.splitStringByCharButIgnoreIfWithinARange("some,random,{text,here}", ",", "{", "}")).to.be.eql(["some", "random", "{text,here}"]);
3225+
});
3226+
});
3227+
31513228
describe('generateUniqueHash', () => {
31523229
beforeEach(() => {
31533230
let interfaceList = {

0 commit comments

Comments
 (0)