const { recorder, event } = require("codeceptjs"); const Container = require("codeceptjs/lib/container"); const defaultConfig = { defaultFeatureFlags: {}, }; const supportedHelpers = ["Playwright"]; /** * This plugin will listen for setting feature flags and apply them at the moment of page loading. * In this case set feature flags will affect the whole code including models initialization, * and other similar parts that will run on the the scripts load. */ module.exports = (config) => { const helpers = Container.helpers(); let helper; for (const helperName of supportedHelpers) { if (Object.keys(helpers).indexOf(helperName) > -1) { helper = helpers[helperName]; } } if (!helper) { console.error(`Feature flags is only supported in ${supportedHelpers.join(", ")}`); return; } const options = Object.assign({}, defaultConfig, helper.options, config); if (options.enable) return; let defaultValue; let ffs = {}; function hasStepName(name, step) { return step && (name === step.name || hasStepName(name, step.metaStep)); } event.dispatcher.on(event.test.before, async () => { ffs = { ...options.defaultFeatureFlags }; }); event.dispatcher.on(event.step.before, async (step) => { if (hasStepName("amOnPage", step)) { recorder.add("set feature flags", async () => { try { helper.page.once("requestfinished", () => { helper.page.evaluate( (config) => { if (!window.APP_SETTINGS) window.APP_SETTINGS = {}; if (!window.APP_SETTINGS.feature_flags) window.APP_SETTINGS.feature_flags = {}; window.APP_SETTINGS.feature_flags = { ...window.APP_SETTINGS.feature_flags, ...config.feature_flags, }; if (typeof config.feature_flags_default_value === "boolean") { window.APP_SETTINGS.feature_flags_default_value = config.feature_flags_default_value; } }, { feature_flags: ffs, feature_flags_default_value: defaultValue }, ); }); } catch (err) { console.error(err); } }); } if (hasStepName("setFeatureFlags", step)) { recorder.add("remember feature flags", async () => { try { ffs = { ...ffs, ...step.args[1], }; } catch (err) { console.error(err); } }); } if (hasStepName("setFeatureFlagsDefaultValue", step)) { recorder.add("remember feature flags default value", async () => { try { defaultValue = step.args[1]; } catch (err) { console.error(err); } }); } }); };