From dff7e7bba0da3710384789c28da0da3abc039cc1 Mon Sep 17 00:00:00 2001 From: Dallin Sevy Date: Thu, 18 Jun 2026 10:20:52 -0600 Subject: [PATCH 1/4] feat: Add config-manager push variables --- src/cli/FrodoCommand.ts | 65 +++- .../config-manager-pull-access-config.ts | 2 +- .../config-manager-pull-audit.ts | 2 +- .../config-manager-pull-kba.ts | 2 +- .../config-manager-pull-remote-servers.ts | 2 +- .../config-manager-pull-uiConfig.ts | 2 +- .../config-manager-push-variables.ts | 48 +++ .../config-manager-push.ts | 2 + src/cli/idm/idm-export.ts | 6 +- src/cli/idm/idm-import.ts | 17 +- src/cli/idm/idm-schema-object-export.ts | 4 - src/cli/idm/idm-schema-object-import.ts | 12 +- src/cli/promote/promote.ts | 2 +- .../FrConfigAccessConfigOps.ts | 17 +- src/configManagerOps/FrConfigAuditOps.ts | 17 +- src/configManagerOps/FrConfigEntityOps.ts | 17 +- src/configManagerOps/FrConfigKbaOps.ts | 17 +- .../FrConfigPasswordPolicyOps.ts | 24 +- .../FrConfigRemoteServersOps.ts | 19 +- src/configManagerOps/FrConfigUiConfigOps.ts | 17 +- src/configManagerOps/FrConfigVariableOps.ts | 103 +++++- src/ops/IdmOps.ts | 72 +--- ...config-manager-push-variables.test.js.snap | 33 ++ .../config-manager-push.test.js.snap | 1 + .../en/__snapshots__/idm-export.test.js.snap | 3 +- .../en/__snapshots__/idm-import.test.js.snap | 3 +- .../idm-schema-object-export.test.js.snap | 1 - .../idm-schema-object-import.test.js.snap | 43 ++- .../en/__snapshots__/promote.test.js.snap | 2 +- .../en/config-manager-push-variables.test.js | 10 + ...ig-manager-push-variables.e2e.test.js.snap | 47 +++ .../__snapshots__/idm-export.e2e.test.js.snap | 12 +- .../__snapshots__/idm-import.e2e.test.js.snap | 83 +++-- .../__snapshots__/promote.e2e.test.js.snap | 16 +- .../config-manager-push-variables.e2e.test.js | 89 +++++ .../esvs/variables/esv-fr-var-test-2.json | 6 + .../cloud/esvs/variables/esv-fr-var-test.json | 6 + .../fr-config-manager/cloud/fr-test-2.env | 2 + .../fr-config-manager/cloud/fr-test.env | 1 + test/e2e/idm-export.e2e.test.js | 12 +- test/e2e/idm-import.e2e.test.js | 46 +-- .../am_1076162899/recording.har | 312 ++++++++++++++++ .../environment_1072573434/recording.har | 349 ++++++++++++++++++ .../oauth2_393036114/recording.har | 146 ++++++++ .../openidm_3290118515/recording.har | 310 ++++++++++++++++ .../am_1076162899/recording.har | 312 ++++++++++++++++ .../environment_1072573434/recording.har | 349 ++++++++++++++++++ .../oauth2_393036114/recording.har | 146 ++++++++ .../openidm_3290118515/recording.har | 310 ++++++++++++++++ .../am_1076162899/recording.har | 312 ++++++++++++++++ .../environment_1072573434/recording.har | 237 ++++++++++++ .../oauth2_393036114/recording.har | 146 ++++++++ .../openidm_3290118515/recording.har | 310 ++++++++++++++++ .../am_1076162899/recording.har | 312 ++++++++++++++++ .../environment_1072573434/recording.har | 237 ++++++++++++ .../oauth2_393036114/recording.har | 146 ++++++++ .../openidm_3290118515/recording.har | 310 ++++++++++++++++ .../am_1076162899/recording.har | 0 .../oauth2_393036114/recording.har | 0 .../openidm_3290118515/recording.har | 0 .../am_1076162899/recording.har | 0 .../environment_1072573434/recording.har | 0 .../oauth2_393036114/recording.har | 0 .../openidm_3290118515/recording.har | 0 .../am_1076162899/recording.har | 0 .../oauth2_393036114/recording.har | 0 .../openidm_3290118515/recording.har | 0 .../am_1076162899/recording.har | 0 .../oauth2_393036114/recording.har | 0 .../openidm_3290118515/recording.har | 0 test/e2e/promote.e2e.test.js | 70 ++-- test/e2e/utils/TestUtils.js | 2 +- 72 files changed, 4855 insertions(+), 346 deletions(-) create mode 100644 src/cli/config-manager/config-manager-push/config-manager-push-variables.ts create mode 100644 test/client_cli/en/__snapshots__/config-manager-push-variables.test.js.snap create mode 100644 test/client_cli/en/config-manager-push-variables.test.js create mode 100644 test/e2e/__snapshots__/config-manager-push-variables.e2e.test.js.snap create mode 100644 test/e2e/config-manager-push-variables.e2e.test.js create mode 100644 test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test-2.json create mode 100644 test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test.json create mode 100644 test/e2e/exports/fr-config-manager/cloud/fr-test-2.env create mode 100644 test/e2e/exports/fr-config-manager/cloud/fr-test.env create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/environment_1072573434/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/openidm_3290118515/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/environment_1072573434/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/openidm_3290118515/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/environment_1072573434/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/openidm_3290118515/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/environment_1072573434/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/openidm_3290118515/recording.har rename test/e2e/mocks/idm_2060434423/export_4211608755/{0_all_file_E_e_no-metadata_3984143702 => 0_all_file_e_env-file_no-metadata_4172037059}/am_1076162899/recording.har (100%) rename test/e2e/mocks/idm_2060434423/export_4211608755/{0_all_file_E_e_no-metadata_3984143702 => 0_all_file_e_env-file_no-metadata_4172037059}/oauth2_393036114/recording.har (100%) rename test/e2e/mocks/idm_2060434423/export_4211608755/{0_all_file_E_e_no-metadata_3984143702 => 0_all_file_e_env-file_no-metadata_4172037059}/openidm_3290118515/recording.har (100%) rename test/e2e/mocks/idm_2060434423/export_4211608755/{0_xi_e_f_63146838 => 0_xi_env-file_f_4253575053}/am_1076162899/recording.har (100%) rename test/e2e/mocks/idm_2060434423/export_4211608755/{0_xi_e_f_63146838 => 0_xi_env-file_f_4253575053}/environment_1072573434/recording.har (100%) rename test/e2e/mocks/idm_2060434423/export_4211608755/{0_xi_e_f_63146838 => 0_xi_env-file_f_4253575053}/oauth2_393036114/recording.har (100%) rename test/e2e/mocks/idm_2060434423/export_4211608755/{0_xi_e_f_63146838 => 0_xi_env-file_f_4253575053}/openidm_3290118515/recording.har (100%) rename test/e2e/mocks/idm_2060434423/import_288002260/{0_af_e_E_441438335 => 0_af_env-file_e_1943040248}/am_1076162899/recording.har (100%) rename test/e2e/mocks/idm_2060434423/import_288002260/{0_af_e_E_441438335 => 0_af_env-file_e_1943040248}/oauth2_393036114/recording.har (100%) rename test/e2e/mocks/idm_2060434423/import_288002260/{0_af_e_E_441438335 => 0_af_env-file_e_1943040248}/openidm_3290118515/recording.har (100%) rename test/e2e/mocks/idm_2060434423/import_288002260/{0_i_e_f_D_1269151941 => 0_i_env-file_f_D_814928654}/am_1076162899/recording.har (100%) rename test/e2e/mocks/idm_2060434423/import_288002260/{0_i_e_f_D_1269151941 => 0_i_env-file_f_D_814928654}/oauth2_393036114/recording.har (100%) rename test/e2e/mocks/idm_2060434423/import_288002260/{0_i_e_f_D_1269151941 => 0_i_env-file_f_D_814928654}/openidm_3290118515/recording.har (100%) diff --git a/src/cli/FrodoCommand.ts b/src/cli/FrodoCommand.ts index b72d67b45..524aa1a6d 100644 --- a/src/cli/FrodoCommand.ts +++ b/src/cli/FrodoCommand.ts @@ -2,6 +2,7 @@ import { frodo, FrodoError, state } from '@rockcarver/frodo-lib'; import { RetryStrategy } from '@rockcarver/frodo-lib/types/api/BaseApi.js'; import { AddHelpTextContext, Argument, Command, Help, Option } from 'commander'; import fs from 'fs'; +import propertiesReader from 'properties-reader'; import { cleanupProgressIndicators, @@ -427,6 +428,19 @@ function cloneArgument(argument: Argument): Argument { return cloned; } +/** + * Option that collects repeated values into an array. + */ +export class ListOption extends Option { + constructor(flags: string, description?: string) { + super(flags, description); + this.argParser((value: string, previous: string[] = []) => { + previous.push(value); + return previous; + }).default([]); + } +} + export const hostArgument = new Argument( '[host]', 'AM base URL, e.g.: https://cdk.iam.example.com/am. To use a connection profile, just specify a unique substring or alias.' @@ -523,6 +537,22 @@ const directoryOption = withHelpGroup( RUNTIME_OPTIONS_HEADING ); +const envOption = withHelpGroup( + new ListOption( + '-E, --env ', + 'Set an environment variable for placeholder resolution. May be specified multiple times. Overrides values from --env-file.' + ), + RUNTIME_OPTIONS_HEADING +); + +const envFileOption = withHelpGroup( + new ListOption( + '--env-file ', + 'Read environment variables from a file for placeholder resolution. May be specified multiple times; later files override earlier ones.' + ), + RUNTIME_OPTIONS_HEADING +); + const insecureOption = withHelpGroup( new Option( '-k, --insecure', @@ -631,6 +661,8 @@ const defaultOpts = [ flushCacheOption, retryOption, useRealmPrefixOnManagedObjects, + envOption, + envFileOption, ]; /** @@ -715,6 +747,31 @@ const stateMap = { [retryOption.attributeName()]: (strategy: RetryStrategy) => { state.setAxiosRetryStrategy(strategy); }, + [envFileOption.attributeName()]: (files: string[]) => { + for (const filePath of files) { + try { + propertiesReader(filePath).each((key: string, value: string) => { + state.setEnv(key, value); + }); + } catch (error) { + throw new FrodoError(`Error parsing env file ${filePath}`, error); + } + } + }, + [envOption.attributeName()]: (envs: string[]) => { + for (const env of envs) { + const separatorIndex = env.indexOf('='); + if (separatorIndex < 0) { + throw new FrodoError( + `Invalid env format; expected "key=value" but got "${env}"` + ); + } + state.setEnv( + env.substring(0, separatorIndex), + env.substring(separatorIndex + 1) + ); + } + }, }; /** @@ -2449,7 +2506,13 @@ export class FrodoCommand extends FrodoStubCommand { } // handle options - for (const [k, v] of Object.entries(options)) { + for (const [k, v] of Object.entries(options).sort(([k1], [k2]) => { + if (k1 === envFileOption.attributeName()) return -1; + if (k2 === envFileOption.attributeName()) return 1; + if (k1 === envOption.attributeName()) return -1; + if (k2 === envOption.attributeName()) return 1; + return 0; + })) { // handle only default options if (Object.keys(stateMap).includes(k)) { debugMessage( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts index e02521a55..c9b9d75e5 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts @@ -34,7 +34,7 @@ export default function setup() { if (await getTokens(false, true, deploymentTypes)) { verboseMessage('Exporting config entity access-config'); - const outcome = await configManagerExportAccessConfig(options.envFile); + const outcome = await configManagerExportAccessConfig(); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts index cef4b6e9f..ef6827166 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts @@ -34,7 +34,7 @@ export default function setup() { if (await getTokens(false, true, deploymentTypes)) { verboseMessage('Exporting config entity audit'); - const outcome = await configManagerExportAudit(options.envFile); + const outcome = await configManagerExportAudit(); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts index a13aa9152..8ba2bffde 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts @@ -34,7 +34,7 @@ export default function setup() { if (await getTokens(false, true, deploymentTypes)) { verboseMessage('Exporting config entity kba-config'); - const outcome = await configManagerExportKbaConfig(options.envFile); + const outcome = await configManagerExportKbaConfig(); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts index 02caebd42..c5594e476 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts @@ -34,7 +34,7 @@ export default function setup() { if (await getTokens(false, true, deploymentTypes)) { verboseMessage('Exporting config entity remote-servers'); - const outcome = await configManagerExportRemoteServers(options.envFile); + const outcome = await configManagerExportRemoteServers(); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts index 40dafdf17..d57273473 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts @@ -34,7 +34,7 @@ export default function setup() { if (await getTokens(false, true, deploymentTypes)) { verboseMessage('Exporting config entity ui-configuration'); - const outcome = await configManagerExportUiConfig(options.envFile); + const outcome = await configManagerExportUiConfig(); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-variables.ts b/src/cli/config-manager/config-manager-push/config-manager-push-variables.ts new file mode 100644 index 000000000..fb88730cd --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-variables.ts @@ -0,0 +1,48 @@ +import { frodo } from '@rockcarver/frodo-lib'; +import { Option } from 'commander'; + +import { configManagerImportVariables } from '../../../configManagerOps/FrConfigVariableOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; + +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager push variables', + [], + deploymentTypes + ); + program + .description('Import variables.') + .addOption( + new Option( + '-n, --name ', + 'Variable name; import only the specified variable. If omitted, all variables are imported.' + ) + ) + + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + const getTokensIsSuccessful = await getTokens( + false, + true, + deploymentTypes + ); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing variables'); + const outcome = await configManagerImportVariables(options.name); + if (!outcome) process.exitCode = 1; + }); + return program; +} diff --git a/src/cli/config-manager/config-manager-push/config-manager-push.ts b/src/cli/config-manager/config-manager-push/config-manager-push.ts index f900b92d2..542ec2c7e 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push.ts @@ -27,6 +27,7 @@ import ServiceObjects from './config-manager-push-service-objects'; import TermsAndConditions from './config-manager-push-terms-and-conditions'; import Themes from './config-manager-push-themes'; import UiConfig from './config-manager-push-ui-config'; +import Variables from './config-manager-push-variables'; export default function setup() { const program = new FrodoStubCommand('push').description( @@ -60,6 +61,7 @@ export default function setup() { program.addCommand(CSP().name('csp')); program.addCommand(Restart().name('restart')); program.addCommand(Journeys().name('journeys')); + program.addCommand(Variables().name('variables')); return program; } diff --git a/src/cli/idm/idm-export.ts b/src/cli/idm/idm-export.ts index 76ce6cdd3..b4549dac7 100644 --- a/src/cli/idm/idm-export.ts +++ b/src/cli/idm/idm-export.ts @@ -38,11 +38,10 @@ export default function setup() { ) .addOption( new Option( - '-E, --entities-file [entities-file]', + '-e, --entities-file [entities-file]', 'Name of the entity file. Ignored with -i.' ) ) - .addOption(new Option('-e, --env-file [envfile]', 'Name of the env file.')) .addOption( new Option( '-a, --all', @@ -99,7 +98,6 @@ export default function setup() { const outcome = await exportConfigEntityToFile( options.entityId, options.file, - options.envFile, options.metadata, options.extract ); @@ -115,7 +113,6 @@ export default function setup() { const outcome = await exportAllConfigEntitiesToFile( options.file, options.entitiesFile, - options.envFile, options.metadata ); if (!outcome) process.exitCode = 1; @@ -140,7 +137,6 @@ export default function setup() { ); const outcome = await exportAllConfigEntitiesToFiles( options.entitiesFile, - options.envFile, options.metadata, options.extract ); diff --git a/src/cli/idm/idm-import.ts b/src/cli/idm/idm-import.ts index 967e66d0c..a3f0d52e9 100644 --- a/src/cli/idm/idm-import.ts +++ b/src/cli/idm/idm-import.ts @@ -48,11 +48,10 @@ export default function setup() { .addOption(new Option('-f, --file [file]', 'Import file. Ignored with -A.')) .addOption( new Option( - '-E, --entities-file [entities-file]', + '-e, --entities-file [entities-file]', 'Name of the entity file. Ignored with -i.' ) ) - .addOption(new Option('-e, --env-file [envfile]', 'Name of the env file.')) .addOption( new Option( '-a, --all', @@ -103,8 +102,7 @@ export default function setup() { ); const outcome = await importConfigEntityByIdFromFile( options.entityId, - options.file, - options.envFile + options.file ); if (!outcome) process.exitCode = 1; } @@ -119,8 +117,7 @@ export default function setup() { ); const outcome = await importAllConfigEntitiesFromFile( options.file, - options.entitiesFile, - options.envFile + options.entitiesFile ); if (!outcome) process.exitCode = 1; } @@ -132,10 +129,7 @@ export default function setup() { verboseMessage( `Importing first object${envMessage}${fileMessage}...` ); - const outcome = await importFirstConfigEntityFromFile( - options.file, - options.envFile - ); + const outcome = await importFirstConfigEntityFromFile(options.file); if (!outcome) process.exitCode = 1; } // require --directory -D for all-separate functions @@ -156,8 +150,7 @@ export default function setup() { `Importing IDM configuration objects${entitiesMessage}${envMessage}${directoryMessage}` ); const outcome = await importAllConfigEntitiesFromFiles( - options.entitiesFile, - options.envFile + options.entitiesFile ); if (!outcome) process.exitCode = 1; } diff --git a/src/cli/idm/idm-schema-object-export.ts b/src/cli/idm/idm-schema-object-export.ts index 559402c38..04cbea003 100644 --- a/src/cli/idm/idm-schema-object-export.ts +++ b/src/cli/idm/idm-schema-object-export.ts @@ -51,7 +51,6 @@ export default function setup() { 'Export file if -x or -a are included. Ignored with -A.' ) ) - .addOption(new Option('-e, --env-file [envfile]', 'Name of the env file.')) .addOption( new Option( '-N, --no-metadata', @@ -93,7 +92,6 @@ export default function setup() { const outcome = await exportManagedObjectToFile( options.individualObject, options.file, - options.envFile, options.extract ); if (!outcome) process.exitCode = 1; @@ -108,7 +106,6 @@ export default function setup() { const outcome = await exportConfigEntityToFile( 'managed', options.file, - options.envFile, options.metadata, false ); @@ -124,7 +121,6 @@ export default function setup() { const outcome = await exportConfigEntityToFile( 'managed', options.file, - options.envFile, options.metadata, true ); diff --git a/src/cli/idm/idm-schema-object-import.ts b/src/cli/idm/idm-schema-object-import.ts index eaf8a175d..22e343122 100644 --- a/src/cli/idm/idm-schema-object-import.ts +++ b/src/cli/idm/idm-schema-object-import.ts @@ -28,7 +28,6 @@ export default function setup() { program .description('Import IDM configuration managed objects.') .addOption(new Option('-f, --file [file]', 'Import file.')) - .addOption(new Option('-e, --env-file [envfile]', 'Name of the env file.')) .addOption( new Option( '-i, --individual-object', @@ -73,8 +72,7 @@ export default function setup() { ); const outcome = await importManagedObjectFromFile( options.file, - undefined, - options.envFile + undefined ); if (!outcome) process.exitCode = 1; } else if ( @@ -86,8 +84,7 @@ export default function setup() { ); const outcome = await importConfigEntityByIdFromFile( 'managed', - options.file, - options.envFile + options.file ); if (!outcome) process.exitCode = 1; } else if ( @@ -97,10 +94,7 @@ export default function setup() { verboseMessage( `Importing IDM configuration objects ${envMessage}${directoryMessage}` ); - const outcome = await importAllConfigEntitiesFromFiles( - undefined, - options.envFile - ); + const outcome = await importAllConfigEntitiesFromFiles(undefined); if (!outcome) process.exitCode = 1; } // unrecognized combination of options or no options diff --git a/src/cli/promote/promote.ts b/src/cli/promote/promote.ts index 1c7dd09e2..e7ab814d4 100644 --- a/src/cli/promote/promote.ts +++ b/src/cli/promote/promote.ts @@ -37,7 +37,7 @@ export default function setup() { ) .addOption( new Option( - '-E, --frodo-export-dir ', + '-e, --frodo-export-dir ', 'The directory where the frodo export is located.' ) ) diff --git a/src/configManagerOps/FrConfigAccessConfigOps.ts b/src/configManagerOps/FrConfigAccessConfigOps.ts index 5dbcb81ed..a4252b4d6 100644 --- a/src/configManagerOps/FrConfigAccessConfigOps.ts +++ b/src/configManagerOps/FrConfigAccessConfigOps.ts @@ -1,29 +1,18 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportAccessConfig( - envFile?: string -): Promise { +export async function configManagerExportAccessConfig(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('access', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['access']; - + const exportData = await readConfigEntity('access'); saveJsonToFile( exportData, getFilePath('access-config/access.json', true), diff --git a/src/configManagerOps/FrConfigAuditOps.ts b/src/configManagerOps/FrConfigAuditOps.ts index 3d794f007..d64e5f4bb 100644 --- a/src/configManagerOps/FrConfigAuditOps.ts +++ b/src/configManagerOps/FrConfigAuditOps.ts @@ -1,29 +1,18 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportAudit( - envFile?: string -): Promise { +export async function configManagerExportAudit(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('audit', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['audit']; - + const exportData = await readConfigEntity('audit'); saveJsonToFile(exportData, getFilePath('audit/audit.json', true), false); return true; } catch (error) { diff --git a/src/configManagerOps/FrConfigEntityOps.ts b/src/configManagerOps/FrConfigEntityOps.ts index e74a22960..b3743c12d 100644 --- a/src/configManagerOps/FrConfigEntityOps.ts +++ b/src/configManagerOps/FrConfigEntityOps.ts @@ -1,28 +1,17 @@ import { frodo } from '@rockcarver/frodo-lib'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity } = frodo.idm.config; +const { readConfigEntity } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportConfigEntity( - envFile?: string -): Promise { +export async function configManagerExportConfigEntity(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('ui/configuration', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['ui/configuration']; - + const exportData = await readConfigEntity('ui/configuration'); saveJsonToFile( exportData, getFilePath('ui-configuration.json', true), diff --git a/src/configManagerOps/FrConfigKbaOps.ts b/src/configManagerOps/FrConfigKbaOps.ts index 79d8e7daa..4fb9f3a4a 100644 --- a/src/configManagerOps/FrConfigKbaOps.ts +++ b/src/configManagerOps/FrConfigKbaOps.ts @@ -1,29 +1,18 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportKbaConfig( - envFile?: string -): Promise { +export async function configManagerExportKbaConfig(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('selfservice.kba', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['selfservice.kba']; - + const exportData = await readConfigEntity('selfservice.kba'); saveJsonToFile( exportData, getFilePath('kba/selfservice.kba.json', true), diff --git a/src/configManagerOps/FrConfigPasswordPolicyOps.ts b/src/configManagerOps/FrConfigPasswordPolicyOps.ts index 78d84d94f..9f9d9f78c 100644 --- a/src/configManagerOps/FrConfigPasswordPolicyOps.ts +++ b/src/configManagerOps/FrConfigPasswordPolicyOps.ts @@ -1,43 +1,31 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; import { realmList } from '../utils/FrConfig'; const { getFilePath, saveJsonToFile } = frodo.utils; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; /** * Export IDM password policy configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function configManagerExportPasswordPolicy( - realm?: string, - envFile?: string + realm?: string ): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); if (realm && realm !== '__default__realm__') { - const realmData = ( - await exportConfigEntity(`fieldPolicy/${realm}_user`, { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm[`fieldPolicy/${realm}_user`]; + const realmData = await readConfigEntity(`fieldPolicy/${realm}_user`); const fileName = `realms/${realm}/password-policy/${realm}_user-password-policy.json`; saveJsonToFile(realmData, getFilePath(fileName, true), false, true); } else { for (const realmName of await realmList()) { // fr-config-manager doesn't support root themes if (realmName === '/') continue; - const realmData = ( - await exportConfigEntity(`fieldPolicy/${realmName}_user`, { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm[`fieldPolicy/${realmName}_user`]; + const realmData = await readConfigEntity( + `fieldPolicy/${realmName}_user` + ); const fileName = `realms/${realmName}/password-policy/${realmName}_user-password-policy.json`; saveJsonToFile(realmData, getFilePath(fileName, true), false, true); } diff --git a/src/configManagerOps/FrConfigRemoteServersOps.ts b/src/configManagerOps/FrConfigRemoteServersOps.ts index 4a140c5de..e540a96b4 100644 --- a/src/configManagerOps/FrConfigRemoteServersOps.ts +++ b/src/configManagerOps/FrConfigRemoteServersOps.ts @@ -1,29 +1,20 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportRemoteServers( - envFile?: string -): Promise { +export async function configManagerExportRemoteServers(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('provisioner.openicf.connectorinfoprovider', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['provisioner.openicf.connectorinfoprovider']; - + const exportData = await readConfigEntity( + 'provisioner.openicf.connectorinfoprovider' + ); saveJsonToFile( exportData, getFilePath( diff --git a/src/configManagerOps/FrConfigUiConfigOps.ts b/src/configManagerOps/FrConfigUiConfigOps.ts index c2aecb87f..70fd9318c 100644 --- a/src/configManagerOps/FrConfigUiConfigOps.ts +++ b/src/configManagerOps/FrConfigUiConfigOps.ts @@ -1,29 +1,18 @@ import { frodo } from '@rockcarver/frodo-lib'; import fs from 'fs'; -import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity, importConfigEntities } = frodo.idm.config; +const { readConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {Promise} a promise that resolves to true if successful, false otherwise */ -export async function configManagerExportUiConfig( - envFile?: string -): Promise { +export async function configManagerExportUiConfig(): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = ( - await exportConfigEntity('ui/configuration', { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }) - ).idm['ui/configuration']; - + const exportData = await readConfigEntity('ui/configuration'); saveJsonToFile( exportData, getFilePath('ui/ui-configuration.json', true), diff --git a/src/configManagerOps/FrConfigVariableOps.ts b/src/configManagerOps/FrConfigVariableOps.ts index b4ed54637..4b550edb0 100644 --- a/src/configManagerOps/FrConfigVariableOps.ts +++ b/src/configManagerOps/FrConfigVariableOps.ts @@ -1,16 +1,18 @@ import { frodo } from '@rockcarver/frodo-lib'; import { VariableSkeleton } from '@rockcarver/frodo-lib/types/api/cloud/VariablesApi'; +import fs from 'fs'; import { createProgressIndicator, printError, + printMessage, stopProgressIndicator, updateProgressIndicator, } from '../utils/Console'; import { escapePlaceholders, esvToEnv } from '../utils/FrConfig'; -const { getFilePath, saveJsonToFile } = frodo.utils; -const { readVariables } = frodo.cloud.variable; +const { getFilePath, saveJsonToFile, readJsonFile } = frodo.utils; +const { readVariables, importVariables } = frodo.cloud.variable; /** * Export all variables to seperate files @@ -71,3 +73,100 @@ export async function configManagerExportVariables(): Promise { } return false; } + +/** + * Import variables to tenant + * @param { string } variableName name of the variable to import + * @returns {Promise} true if successful, false otherwise + */ +export async function configManagerImportVariables( + variableName?: string +): Promise { + let indicatorId: string; + + const spinnerId = createProgressIndicator( + 'indeterminate', + 0, + `Reading variables...` + ); + + try { + const variablesDir = getFilePath(`esvs/variables`); + if (!fs.existsSync(variablesDir)) { + stopProgressIndicator(spinnerId, `No variables directory found`, 'fail'); + return false; + } + + const fileNames = fs + .readdirSync(variablesDir) + .filter((name) => name.toLowerCase().endsWith('.json')) + .filter((name) => !variableName || name === `${variableName}.json`); + + if (fileNames.length === 0) { + stopProgressIndicator( + spinnerId, + variableName + ? `No matching variable found for ${variableName}` + : 'No variables found to import', + 'fail' + ); + return false; + } + + stopProgressIndicator( + spinnerId, + `Successfully read ${fileNames.length} variables.`, + 'success' + ); + + indicatorId = createProgressIndicator( + 'determinate', + fileNames.length, + 'Importing variables' + ); + + const importData = { + variable: Object.fromEntries( + fileNames.map((fileName) => { + const variable = readJsonFile( + `${variablesDir}/${fileName}` + ) as VariableSkeleton; + // valueBase64 will not be encoded by this point, so set value so it encodes on import + variable.value = variable.valueBase64; + return [variable._id, variable]; + }) + ), + }; + + const imported = await importVariables(importData); + + let unchanged = 0; + let updated = 0; + + for (const v of imported) { + if (v.loaded) { + printMessage(`Variable ${v._id} unchanged`); + unchanged++; + } else { + printMessage(`Variable ${v._id} updated`); + updated++; + } + } + + stopProgressIndicator( + indicatorId, + `${imported.length} variables imported.` + ); + + printMessage( + updated > 0 + ? `Changes made to variables: ${updated} updated, ${unchanged} unchanged` + : `No changes, (${unchanged} variable(s) already up to date)` + ); + return true; + } catch (error) { + stopProgressIndicator(indicatorId, `Error importing variables`, 'fail'); + printError(error); + return false; + } +} diff --git a/src/ops/IdmOps.ts b/src/ops/IdmOps.ts index 139334a3c..7f0131785 100644 --- a/src/ops/IdmOps.ts +++ b/src/ops/IdmOps.ts @@ -7,7 +7,6 @@ import { } from '@rockcarver/frodo-lib/types/ops/MappingOps'; import fs from 'fs'; import path from 'path'; -import propertiesReader from 'properties-reader'; import { extractDataToFile, @@ -104,7 +103,6 @@ export type ManagedSkeleton = IdObjectSkeletonInterface & { * Export an IDM configuration object. * @param {string} id the desired configuration object * @param {string} file optional export file name (or directory name if exporting mappings separately) - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true * @param {boolean} extract true to extract idm scripts, false otherwise. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise @@ -112,16 +110,11 @@ export type ManagedSkeleton = IdObjectSkeletonInterface & { export async function exportConfigEntityToFile( id: string, file?: string, - envFile?: string, includeMeta: boolean = true, extract: boolean = false ): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = await exportConfigEntity(id, { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - }); + const exportData = await exportConfigEntity(id); if (!extract) { const fileName = file || getTypedFilename(`${id}`, 'idm'); saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta); @@ -157,22 +150,19 @@ export async function exportConfigEntityToFile( * Export an IDM configuration managed object. * @param {string} name the desired configuration object * @param {string} file optional export file name - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} extract true to extract idm scripts, false otherwise. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function exportManagedObjectToFile( name: string, file?: string, - envFile?: string, extract: boolean = false ): Promise { try { - const options = getIdmImportExportOptions(undefined, envFile); - const exportData = (await readSubConfigEntity('managed', name, { - envReplaceParams: options.envReplaceParams, - entitiesToExport: undefined, - })) as ObjectSkeleton; + const exportData = (await readSubConfigEntity( + 'managed', + name + )) as ObjectSkeleton; if (extract && extractManagedObjectScriptsToDirectory(exportData)) { const fileName = getTypedFilename(name, 'managed'); saveJsonToFile( @@ -195,21 +185,18 @@ export async function exportManagedObjectToFile( * Export all IDM configuration objects * @param {string} file file to export to * @param {string} entitiesFile JSON file that specifies the config entities to export/import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function exportAllConfigEntitiesToFile( file?: string, entitiesFile?: string, - envFile?: string, includeMeta: boolean = true ): Promise { try { - const options = getIdmImportExportOptions(entitiesFile, envFile); + const options = getIdmImportExportOptions(entitiesFile); const exportData = await exportConfigEntities( { - envReplaceParams: options.envReplaceParams, entitiesToExport: options.entitiesToExportOrImport, }, errorHandler @@ -229,23 +216,20 @@ export async function exportAllConfigEntitiesToFile( /** * Export all IDM configuration objects to separate files * @param {string} entitiesFile JSON file that specifies the config entities to export/import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true * @param {boolean} extract true to extract idm scripts, false otherwise. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function exportAllConfigEntitiesToFiles( entitiesFile?: string, - envFile?: string, includeMeta: boolean = true, extract: boolean = false ): Promise { const errors: Error[] = []; try { - const options = getIdmImportExportOptions(entitiesFile, envFile); + const options = getIdmImportExportOptions(entitiesFile); const exportData = await exportConfigEntities( { - envReplaceParams: options.envReplaceParams, entitiesToExport: options.entitiesToExportOrImport, }, errorHandler @@ -309,14 +293,12 @@ export async function exportAllConfigEntitiesToFiles( * Import an IDM configuration object by id from file. * @param {string} entityId the configuration object to import * @param {string} file optional file to import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} validate True to validate script hooks. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function importConfigEntityByIdFromFile( entityId: string, file?: string, - envFile?: string, validate: boolean = false ): Promise { try { @@ -356,13 +338,11 @@ export async function importConfigEntityByIdFromFile( importData.idm[entityId] = entity; } } - const options = getIdmImportExportOptions(undefined, envFile); await importConfigEntities( importData, entityId, { - envReplaceParams: options.envReplaceParams, entitiesToImport: undefined, validate, }, @@ -402,13 +382,11 @@ export async function deleteConfigEntityById( /** * Import first IDM configuration object from file. * @param {string} file optional file to import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} validate True to validate script hooks. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function importFirstConfigEntityFromFile( file: string, - envFile?: string, validate: boolean = false ): Promise { const filePath = getFilePath(file); @@ -463,13 +441,10 @@ export async function importFirstConfigEntityFromFile( ]); } - const options = getIdmImportExportOptions(undefined, envFile); - await importConfigEntities( importData, entityId, { - envReplaceParams: options.envReplaceParams, entitiesToImport: undefined, validate, }, @@ -492,14 +467,12 @@ export async function importFirstConfigEntityFromFile( * Import all IDM configuration objects from a single file * @param {string} file the file with the configuration objects * @param {string} entitiesFile JSON file that specifies the config entities to export/import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} validate True to validate script hooks. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function importAllConfigEntitiesFromFile( file: string, entitiesFile?: string, - envFile?: string, validate: boolean = false ): Promise { let indicatorId: string; @@ -514,13 +487,12 @@ export async function importAllConfigEntitiesFromFile( 0, `Importing config entities from ${filePath}...` ); - const options = getIdmImportExportOptions(entitiesFile, envFile); + const options = getIdmImportExportOptions(entitiesFile); await importConfigEntities( importData as ConfigEntityExportInterface, undefined, { entitiesToImport: options.entitiesToExportOrImport, - envReplaceParams: options.envReplaceParams, validate, }, errorHandler @@ -541,13 +513,11 @@ export async function importAllConfigEntitiesFromFile( /** * Import an individual managed object from a file * @param {string} file the file containing the managed object - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} validate True to validate script hooks. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function importManagedObjectFromFile( file: string, - envFile?: string, validate: boolean = false ): Promise { let indicatorId: string; @@ -563,10 +533,9 @@ export async function importManagedObjectFromFile( 0, `Importing config managed object from ${filePath}...` ); - const options = getIdmImportExportOptions(undefined, envFile); + const options = getIdmImportExportOptions(undefined); await importSubConfigEntity('managed', importData, { entitiesToImport: options.entitiesToExportOrImport, - envReplaceParams: options.envReplaceParams, validate, }); @@ -589,13 +558,11 @@ export async function importManagedObjectFromFile( /** * Import all IDM configuration objects from working directory * @param {string} entitiesFile JSON file that specifies the config entities to export/import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @param {boolean} validate True to validate script hooks. Default: false * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function importAllConfigEntitiesFromFiles( entitiesFile?: string, - envFile?: string, validate: boolean = false ): Promise { let indicatorId: string; @@ -607,13 +574,12 @@ export async function importAllConfigEntitiesFromFiles( 0, `Importing config entities from ${baseDirectory}...` ); - const options = getIdmImportExportOptions(entitiesFile, envFile); + const options = getIdmImportExportOptions(entitiesFile); await importConfigEntities( importData as ConfigEntityExportInterface, undefined, { entitiesToImport: options.entitiesToExportOrImport, - envReplaceParams: options.envReplaceParams, validate, }, errorHandler @@ -721,14 +687,9 @@ export function resolveAllExtractedScriptsForImport( /** * Helper that returns options for exporting/importing IDM config entities * @param {string} entitiesFile JSON file that specifies the config entities to export/import - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import * @return {ConfigEntityExportOptions} the config export options */ -export function getIdmImportExportOptions( - entitiesFile?: string, - envFile?: string -): { - envReplaceParams: string[][]; +export function getIdmImportExportOptions(entitiesFile?: string): { entitiesToExportOrImport: string[]; } { // read list of entities to export/import @@ -738,19 +699,8 @@ export function getIdmImportExportOptions( const entriesData = JSON.parse(data); entitiesToExportOrImport = entriesData.idm; } - - // read list of configs to parameterize for environment specific values - const envReplaceParams: string[][] = []; - if (envFile) { - const envParams = propertiesReader(envFile); - envParams.each((key: string, value: string) => { - envReplaceParams.push([key, value]); - }); - } - return { entitiesToExportOrImport, - envReplaceParams, }; } diff --git a/test/client_cli/en/__snapshots__/config-manager-push-variables.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-variables.test.js.snap new file mode 100644 index 000000000..1a1e0ed0f --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-variables.test.js.snap @@ -0,0 +1,33 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push variables' should be expected english 1`] = ` +"Usage: frodo config-manager push variables [options] [host] [realm] [username] [password] + +[Experimental] Import variables. + +Arguments: + host AM base URL, e.g.: https://cdk.iam.example.com/am. To use a + connection profile, just specify a unique substring or + alias. + realm Realm. Specify realm as '/' for the root realm or 'realm' + or '/parent/child' otherwise. (default: "alpha" for + Identity Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication journeys/trees. + If given without a password, and it matches the username + already stored in the connection profile for the target + host, frodo uses that profile's stored password instead of + requiring it on the command line. + password Password. + +Deployment: Cloud-only + +Options: + -n, --name Variable name; import only the specified variable. If + omitted, all variables are imported. + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and usage + examples. +" +`; diff --git a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap index 7e4d9ecd6..e0c932fb4 100644 --- a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap @@ -44,5 +44,6 @@ Commands: iga-workflows [Experimental] Import iga-workflows. restart [Experimental] Restart the environment. secret-mappings [Experimental] Import secret mappings. + variables [Experimental] Import variables. " `; diff --git a/test/client_cli/en/__snapshots__/idm-export.test.js.snap b/test/client_cli/en/__snapshots__/idm-export.test.js.snap index 4b31d1097..3445850fc 100644 --- a/test/client_cli/en/__snapshots__/idm-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/idm-export.test.js.snap @@ -31,8 +31,7 @@ Options: -A, --all-separate Export all IDM configuration objects into separate JSON files in directory -D. Ignored with -i, and -a. - -e, --env-file [envfile] Name of the env file. - -E, --entities-file [entities-file] Name of the entity file. Ignored with -i. + -e, --entities-file [entities-file] Name of the entity file. Ignored with -i. -f, --file [file] Export file if -x or -a is provided. Ignored with -A. -i, --entity-id Config entity id/name. E.g. "managed", diff --git a/test/client_cli/en/__snapshots__/idm-import.test.js.snap b/test/client_cli/en/__snapshots__/idm-import.test.js.snap index 01e5bb60d..328ec7217 100644 --- a/test/client_cli/en/__snapshots__/idm-import.test.js.snap +++ b/test/client_cli/en/__snapshots__/idm-import.test.js.snap @@ -31,8 +31,7 @@ Options: -A, --all-separate Import all IDM configuration objects from separate files in directory -D. Ignored with -i, and -a. - -e, --env-file [envfile] Name of the env file. - -E, --entities-file [entities-file] Name of the entity file. Ignored with -i. + -e, --entities-file [entities-file] Name of the entity file. Ignored with -i. -f, --file [file] Import file. Ignored with -A. -i, --entity-id Config entity id/name. E.g. "managed", "sync", "provisioner-", diff --git a/test/client_cli/en/__snapshots__/idm-schema-object-export.test.js.snap b/test/client_cli/en/__snapshots__/idm-schema-object-export.test.js.snap index 4801d9e1a..89a9d3534 100644 --- a/test/client_cli/en/__snapshots__/idm-schema-object-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/idm-schema-object-export.test.js.snap @@ -29,7 +29,6 @@ Options: into a single file in directory -D. -A, --all-separate Export all IDM configuration managed objects into separate JSON files in directory -D. - -e, --env-file [envfile] Name of the env file. -f, --file [file] Export file if -x or -a are included. Ignored with -A. -i, --individual-object Export an individual managed object by diff --git a/test/client_cli/en/__snapshots__/idm-schema-object-import.test.js.snap b/test/client_cli/en/__snapshots__/idm-schema-object-import.test.js.snap index 07c27130c..7b351e7bf 100644 --- a/test/client_cli/en/__snapshots__/idm-schema-object-import.test.js.snap +++ b/test/client_cli/en/__snapshots__/idm-schema-object-import.test.js.snap @@ -6,29 +6,28 @@ exports[`CLI help interface for 'idm schema object import' should be expected en Import IDM configuration managed objects. Arguments: - host AM base URL, e.g.: https://cdk.iam.example.com/am. - To use a connection profile, just specify a unique - substring or alias. - realm Realm. Specify realm as '/' for the root realm or - 'realm' or '/parent/child' otherwise. (default: - "alpha" for Identity Cloud tenants, "/" otherwise.) - username Username to login with. Must be an admin user with - appropriate rights to manage authentication - journeys/trees. If given without a password, and it - matches the username already stored in the - connection profile for the target host, frodo uses - that profile's stored password instead of requiring - it on the command line. - password Password. + host AM base URL, e.g.: https://cdk.iam.example.com/am. To + use a connection profile, just specify a unique + substring or alias. + realm Realm. Specify realm as '/' for the root realm or + 'realm' or '/parent/child' otherwise. (default: + "alpha" for Identity Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication + journeys/trees. If given without a password, and it + matches the username already stored in the connection + profile for the target host, frodo uses that + profile's stored password instead of requiring it on + the command line. + password Password. Options: - -e, --env-file [envfile] Name of the env file. - -f, --file [file] Import file. - -i, --individual-object Import an individual object. Requires the use of the - -f to specify the file. - -h, --help Help - -hh, --help-more Help with all options. - -hhh, --help-all Help with all options, environment variables, and - usage examples. + -f, --file [file] Import file. + -i, --individual-object Import an individual object. Requires the use of the + -f to specify the file. + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and + usage examples. " `; diff --git a/test/client_cli/en/__snapshots__/promote.test.js.snap b/test/client_cli/en/__snapshots__/promote.test.js.snap index f0f30f450..c8f87961f 100644 --- a/test/client_cli/en/__snapshots__/promote.test.js.snap +++ b/test/client_cli/en/__snapshots__/promote.test.js.snap @@ -25,7 +25,7 @@ Arguments: password Password. Options: - -E, --frodo-export-dir The directory where the frodo export is + -e, --frodo-export-dir The directory where the frodo export is located. -M, --master-dir The directory where the master configurations is located. diff --git a/test/client_cli/en/config-manager-push-variables.test.js b/test/client_cli/en/config-manager-push-variables.test.js new file mode 100644 index 000000000..65246a5ee --- /dev/null +++ b/test/client_cli/en/config-manager-push-variables.test.js @@ -0,0 +1,10 @@ +import cp from 'child_process'; +import { promisify } from 'util'; + +const exec = promisify(cp.exec); +const CMD = 'frodo config-manager push variables --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push variables' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); \ No newline at end of file diff --git a/test/e2e/__snapshots__/config-manager-push-variables.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-variables.e2e.test.js.snap new file mode 100644 index 000000000..4ae6c901e --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-variables.e2e.test.js.snap @@ -0,0 +1,47 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Should import variables into cloud "frodo config-manager push variables --env-file test/e2e/exports/fr-config-manager/cloud/fr-test-2.env --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud ": should import two variables into cloud" 1`] = `""`; + +exports[`Should import variables into cloud "frodo config-manager push variables --env-file test/e2e/exports/fr-config-manager/cloud/fr-test-2.env --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud ": should import two variables into cloud" 2`] = ` +"Experimental feature in use: 'frodo config-manager push variables'. This feature may change without notice. +✔ Successfully read 2 variables. +Variable esv-fr-var-test-2 updated +Variable esv-fr-var-test updated +• 2 variables imported. +Changes made to variables: 2 updated, 0 unchanged +" +`; + +exports[`Should import variables into cloud "frodo config-manager push variables --name esv-fr-var-test --env ESV_FR_VAR_TEST="test2" --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud ": should import the specified variable into cloud" 1`] = `""`; + +exports[`Should import variables into cloud "frodo config-manager push variables --name esv-fr-var-test --env ESV_FR_VAR_TEST="test2" --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud ": should import the specified variable into cloud" 2`] = ` +"Experimental feature in use: 'frodo config-manager push variables'. This feature may change without notice. +✔ Successfully read 1 variables. +Variable esv-fr-var-test updated +• 1 variables imported. +Changes made to variables: 1 updated, 0 unchanged +" +`; + +exports[`Should import variables into cloud "frodo config-manager push variables -E ESV_FR_VAR_TEST_2="20" -E ESV_FR_VAR_TEST='this is a test' -D test/e2e/exports/fr-config-manager/cloud ": should import two variables into cloud" 1`] = `""`; + +exports[`Should import variables into cloud "frodo config-manager push variables -E ESV_FR_VAR_TEST_2="20" -E ESV_FR_VAR_TEST='this is a test' -D test/e2e/exports/fr-config-manager/cloud ": should import two variables into cloud" 2`] = ` +"Experimental feature in use: 'frodo config-manager push variables'. This feature may change without notice. +✔ Successfully read 2 variables. +Variable esv-fr-var-test-2 updated +Variable esv-fr-var-test updated +• 2 variables imported. +Changes made to variables: 2 updated, 0 unchanged +" +`; + +exports[`Should import variables into cloud "frodo config-manager push variables -n esv-fr-var-test-2 --env ESV_FR_VAR_TEST_2=20-D test/e2e/exports/fr-config-manager/cloud ": should import the specified variable into cloud" 1`] = `""`; + +exports[`Should import variables into cloud "frodo config-manager push variables -n esv-fr-var-test-2 --env ESV_FR_VAR_TEST_2=20-D test/e2e/exports/fr-config-manager/cloud ": should import the specified variable into cloud" 2`] = ` +"Experimental feature in use: 'frodo config-manager push variables'. This feature may change without notice. +✔ Successfully read 1 variables. +Variable esv-fr-var-test-2 updated +• 1 variables imported. +Changes made to variables: 1 updated, 0 unchanged +" +`; diff --git a/test/e2e/__snapshots__/idm-export.e2e.test.js.snap b/test/e2e/__snapshots__/idm-export.e2e.test.js.snap index 3ba4ff75e..017620312 100644 --- a/test/e2e/__snapshots__/idm-export.e2e.test.js.snap +++ b/test/e2e/__snapshots__/idm-export.e2e.test.js.snap @@ -1,10 +1,10 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -E test/e2e/env/testEntitiesFile.json -e test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json 1`] = `0`; +exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -e test/e2e/env/testEntitiesFile.json --env-file test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json 1`] = `0`; -exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -E test/e2e/env/testEntitiesFile.json -e test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json 2`] = `""`; +exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -e test/e2e/env/testEntitiesFile.json --env-file test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json 2`] = `""`; -exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -E test/e2e/env/testEntitiesFile.json -e test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json: allIdmTestFile.json 1`] = ` +exports[`frodo idm export "frodo idm export --all --file allIdmTestFile.json -e test/e2e/env/testEntitiesFile.json --env-file test/e2e/env/testEnvFile.env --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json: allIdmTestFile.json 1`] = ` { "idm": { "repo.ds": { @@ -67167,11 +67167,11 @@ println "Hello World!" } `; -exports[`frodo idm export "frodo idm export -xi script -e test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json 1`] = `0`; +exports[`frodo idm export "frodo idm export -xi script --env-file test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json 1`] = `0`; -exports[`frodo idm export "frodo idm export -xi script -e test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json 2`] = `""`; +exports[`frodo idm export "frodo idm export -xi script --env-file test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json 2`] = `""`; -exports[`frodo idm export "frodo idm export -xi script -e test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json: my-script.idm.json 1`] = ` +exports[`frodo idm export "frodo idm export -xi script --env-file test/e2e/env/testEnvFile.env -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json: my-script.idm.json 1`] = ` { "idm": { "script": { diff --git a/test/e2e/__snapshots__/idm-import.e2e.test.js.snap b/test/e2e/__snapshots__/idm-import.e2e.test.js.snap index c2dd6ef6e..df972ef28 100644 --- a/test/e2e/__snapshots__/idm-import.e2e.test.js.snap +++ b/test/e2e/__snapshots__/idm-import.e2e.test.js.snap @@ -1,21 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`frodo idm import "frodo idm import --all --file all.idm.json -D test/e2e/exports/all": Should import all configs from the file 'all.idm.json' in directory 'test/e2e/exports/all'" 1`] = ` -"Error updating config entity bravoOrgPrivileges - Network error: - URL: https://openam-frodo-dev.forgeblocks.com/openidm/config/bravoOrgPrivileges - Status: 403 - Code: ERR_BAD_REQUEST - Reason: Forbidden - Message: Access denied -✔ Imported config entities -" -`; - -exports[`frodo idm import "frodo idm import --all-separate --directory test/e2e/exports/all-separate/cloud/global/idm --env-file test/e2e/env/testEnvFile.env --entities-file test/e2e/env/testEntitiesFile.json": Should import all configs from the directory 'test/e2e/exports/all-separate/cloud/global/idm' according to the env and entity files" 1`] = `""`; - -exports[`frodo idm import "frodo idm import --entity-id script --file test/e2e/exports/all-separate/cloud/global/idm/script.idm.json": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 1`] = `""`; - exports[`frodo idm import "frodo idm import --entity-id sync -f test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 1`] = `""`; exports[`frodo idm import "frodo idm import --entity-id sync -f test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 2`] = `""`; @@ -27,7 +11,47 @@ exports[`frodo idm import "frodo idm import --file test/e2e/exports/all-separate " `; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/cloud/global/idm": Should import all configs from the directory 'test/e2e/exports/all-separate/cloud/global/idm'" 1`] = ` +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 1`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 2`] = ` +"✔ Imported script from test/e2e/exports/all-separate/cloud/global/idm/script.idm.json. +" +`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 3`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 4`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 5`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 6`] = ` +"✔ Imported config entities +" +`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 7`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 8`] = ` +"✔ Imported config entities +" +`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 9`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 10`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 11`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 12`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 13`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 14`] = ` +"✔ Imported config entities +" +`; + +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 1`] = ` "Error updating config entity endpoint/Test Network error: URL: https://openam-frodo-dev.forgeblocks.com/openidm/config/endpoint/Test @@ -46,20 +70,25 @@ Error updating config entity endpoint/testEndpoint2 " `; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 1`] = `""`; +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 2`] = `1`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 2`] = ` -"✔ Imported config entities +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 3`] = ` +"Error updating config entity bravoOrgPrivileges + Network error: + URL: https://openam-frodo-dev.forgeblocks.com/openidm/config/bravoOrgPrivileges + Status: 403 + Code: ERR_BAD_REQUEST + Reason: Forbidden + Message: Access denied +✔ Imported config entities " `; -exports[`frodo idm import "frodo idm import -af test/e2e/exports/all/all.idm.json -e test/e2e/env/testEnvFile.env -E test/e2e/env/testEntitiesFile.json": Should import all configs from the file 'test/e2e/exports/all/all.idm.json' according to the env and entity files" 1`] = `""`; +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 4`] = `1`; -exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/cloud/global/idm/script.idm.json": should import the idm config from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 1`] = `""`; +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 5`] = `""`; -exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 1`] = `""`; - -exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 2`] = ` +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 6`] = ` "✔ Imported endpoint/Groovy from test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json. " `; @@ -78,7 +107,3 @@ exports[`frodo idm import "frodo idm import -i endpoint/Groovy -f test/e2e/expor exports[`frodo idm import "frodo idm import -i managed -f test/e2e/exports/all-separate/forgeops/global/idm/managed/managed.idm.json --type forgeops": Should import idm configuration 'managed'. 1`] = `""`; exports[`frodo idm import "frodo idm import -i managed -f test/e2e/exports/all-separate/forgeops/global/idm/managed/managed.idm.json --type forgeops": Should import idm configuration 'managed'. 2`] = `""`; - -exports[`frodo idm import "frodo idm import -i script -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the directory test/e2e/exports/all-separate/cloud/global/idm" 1`] = `""`; - -exports[`frodo idm import "frodo idm import -i script -e test/e2e/env/testEnvFile.env -f script.idm.json -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 1`] = `""`; diff --git a/test/e2e/__snapshots__/promote.e2e.test.js.snap b/test/e2e/__snapshots__/promote.e2e.test.js.snap index 2e700bd1e..ba7943ef7 100644 --- a/test/e2e/__snapshots__/promote.e2e.test.js.snap +++ b/test/e2e/__snapshots__/promote.e2e.test.js.snap @@ -1,20 +1,20 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "authentication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on authentication changes 1`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "authentication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on authentication changes 1`] = `""`; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "authentication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on authentication changes 2`] = ` +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "authentication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on authentication changes 2`] = ` "✔ Imported alpha realm authentication settings. ✔ Imported bravo realm authentication settings. " `; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on managedapplication changes 1`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on managedapplication changes 1`] = `""`; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on managedapplication changes 2`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on managedapplication changes 2`] = `""`; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "mapping frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on mapping changes 1`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "mapping frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on mapping changes 1`] = `""`; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "mapping frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on mapping changes 2`] = ` +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "mapping frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on mapping changes 2`] = ` "✖ Error importing mapping undefined Invalid mapping id undefined. Must start with 'sync/' or 'mapping/' ✖ Error importing mapping undefined @@ -24,6 +24,6 @@ Error deleting mapping undefined " `; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "variable frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on variable changes 1`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "variable frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on variable changes 1`] = `""`; -exports[`frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-* "variable frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on variable changes 2`] = `""`; +exports[`frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-* "variable frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on variable changes 2`] = `""`; diff --git a/test/e2e/config-manager-push-variables.e2e.test.js b/test/e2e/config-manager-push-variables.e2e.test.js new file mode 100644 index 000000000..d6893409c --- /dev/null +++ b/test/e2e/config-manager-push-variables.e2e.test.js @@ -0,0 +1,89 @@ +/** + * Follow this process to write e2e tests for the CLI project: + * + * 1. Test if all the necessary mocks for your tests already exist. + * In mock mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=1 frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * If your command completes without errors and with the expected results, + * all the required mocks already exist and you are good to write your + * test and skip to step #4. + * + * If, however, your command fails and you see errors like the one below, + * you know you need to record the mock responses first: + * + * [Polly] [adapter:node-http] Recording for the following request is not found and `recordIfMissing` is `false`. + * + * 2. Record mock responses for your exact command. + * In mock record mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=record frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * Wait until you see all the Polly instances (mock recording adapters) have + * shutdown before you try to run step #1 again. + * Messages like these indicate mock recording adapters shutting down: + * + * Polly instance 'conn/4' stopping in 3s... + * Polly instance 'conn/4' stopping in 2s... + * Polly instance 'conn/save/3' stopping in 3s... + * Polly instance 'conn/4' stopping in 1s... + * Polly instance 'conn/save/3' stopping in 2s... + * Polly instance 'conn/4' stopped. + * Polly instance 'conn/save/3' stopping in 1s... + * Polly instance 'conn/save/3' stopped. + * + * 3. Validate your freshly recorded mock responses are complete and working. + * Re-run the exact command you want to test in mock mode (see step #1). + * + * 4. Write your test. + * Make sure to use the exact command including number of arguments and params. + * + * 5. Commit both your test and your new recordings to the repository. + * Your tests are likely going to reside outside the frodo-lib project but + * the recordings must be committed to the frodo-lib project. + */ + +/* +// Cloud +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push variables -E ESV_FR_VAR_TEST_2="20" -E ESV_FR_VAR_TEST='this is a test' -D test/e2e/exports/fr-config-manager/cloud +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push variables --env-file test/e2e/exports/fr-config-manager/cloud/fr-test-2.env --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push variables -n esv-fr-var-test-2 --env ESV_FR_VAR_TEST_2=20 -D test/e2e/exports/fr-config-manager/cloud +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push variables --name esv-fr-var-test --env ESV_FR_VAR_TEST="test2" --env-file test/e2e/exports/fr-config-manager/cloud/fr-test.env -D test/e2e/exports/fr-config-manager/cloud + +*/ + +import { getEnv, testSuccess } from './utils/TestUtils'; +import { connection as c } from './utils/TestConfig'; + +process.env['FRODO_MOCK'] = '1'; +const cloudEnv = getEnv(c); + +const allDirectory = "test/e2e/exports/fr-config-manager/cloud"; +const envDir1 = "test/e2e/exports/fr-config-manager/cloud/fr-test.env" +const envDir2 = "test/e2e/exports/fr-config-manager/cloud/fr-test-2.env" + +describe('Should import variables into cloud', () => { + test(`"frodo config-manager push variables -E ESV_FR_VAR_TEST_2="20" -E ESV_FR_VAR_TEST='this is a test' -D ${allDirectory} ": should import two variables into cloud"`, async () => { + const CMD = `frodo config-manager push variables -E ESV_FR_VAR_TEST_2="20" -E ESV_FR_VAR_TEST='this is a test' -D ${allDirectory} `; + await testSuccess(CMD, cloudEnv); + + }); + test(`"frodo config-manager push variables --env-file ${envDir2} --env-file ${envDir1} -D ${allDirectory} ": should import two variables into cloud"`, async () => { + const CMD = `frodo config-manager push variables --env-file ${envDir2} --env-file ${envDir1} -D ${allDirectory} `; + await testSuccess(CMD, cloudEnv); + + }); + test(`"frodo config-manager push variables -n esv-fr-var-test-2 --env ESV_FR_VAR_TEST_2=20-D ${allDirectory} ": should import the specified variable into cloud"`, async () => { + const CMD = `frodo config-manager push variables -n esv-fr-var-test-2 --env ESV_FR_VAR_TEST_2=20 -D ${allDirectory} `; + await testSuccess(CMD, cloudEnv); + + }); + test(`"frodo config-manager push variables --name esv-fr-var-test --env ESV_FR_VAR_TEST="test2" --env-file ${envDir1} -D ${allDirectory} ": should import the specified variable into cloud"`, async () => { + const CMD = `frodo config-manager push variables --name esv-fr-var-test --env ESV_FR_VAR_TEST="test2" --env-file ${envDir1} -D ${allDirectory} `; + await testSuccess(CMD, cloudEnv); + + }); +}); \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test-2.json b/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test-2.json new file mode 100644 index 000000000..470671f0d --- /dev/null +++ b/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test-2.json @@ -0,0 +1,6 @@ +{ + "_id": "esv-fr-var-test-2", + "description": "", + "expressionType": "int", + "valueBase64": "${ESV_FR_VAR_TEST_2}" +} diff --git a/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test.json b/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test.json new file mode 100644 index 000000000..a2688a23a --- /dev/null +++ b/test/e2e/exports/fr-config-manager/cloud/esvs/variables/esv-fr-var-test.json @@ -0,0 +1,6 @@ +{ + "_id": "esv-fr-var-test", + "description": "", + "expressionType": "string", + "valueBase64": "${ESV_FR_VAR_TEST}" +} diff --git a/test/e2e/exports/fr-config-manager/cloud/fr-test-2.env b/test/e2e/exports/fr-config-manager/cloud/fr-test-2.env new file mode 100644 index 000000000..13e60a35d --- /dev/null +++ b/test/e2e/exports/fr-config-manager/cloud/fr-test-2.env @@ -0,0 +1,2 @@ +# test.env +ESV_FR_VAR_TEST_2=30 diff --git a/test/e2e/exports/fr-config-manager/cloud/fr-test.env b/test/e2e/exports/fr-config-manager/cloud/fr-test.env new file mode 100644 index 000000000..6995b3bbf --- /dev/null +++ b/test/e2e/exports/fr-config-manager/cloud/fr-test.env @@ -0,0 +1 @@ +ESV_FR_VAR_TEST=test3 \ No newline at end of file diff --git a/test/e2e/idm-export.e2e.test.js b/test/e2e/idm-export.e2e.test.js index a655f74c7..436091a37 100644 --- a/test/e2e/idm-export.e2e.test.js +++ b/test/e2e/idm-export.e2e.test.js @@ -49,11 +49,11 @@ /* // Cloud FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export --entity-id script -FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -xi script -e test/e2e/env/testEnvFile.env -f my-script.idm.json +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -xi script --env-file test/e2e/env/testEnvFile.env -f my-script.idm.json FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -i script -D testDir4 FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -xNi sync FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -a -FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export --all --file allIdmTestFile.json -E test/e2e/env/testEntitiesFile.json -e test/e2e/env/testEnvFile.env --no-metadata +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export --all --file allIdmTestFile.json -e test/e2e/env/testEntitiesFile.json --env-file test/e2e/env/testEnvFile.env --no-metadata FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm export -AD testDir1 // ForgeOps @@ -88,9 +88,9 @@ describe('frodo idm export', () => { await testExport(CMD, env, type, exportFile, undefined, false); }); - test(`"frodo idm export -xi script -e ${envFile} -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json`, async () => { + test(`"frodo idm export -xi script --env-file ${envFile} -f my-script.idm.json": should export the idm config entity with idm id "script" into file named my-script.idm.json`, async () => { const exportFile = 'my-script.idm.json'; - const CMD = `frodo idm export -xi script -e ${envFile} -f ${exportFile}`; + const CMD = `frodo idm export -xi script --env-file ${envFile} -f ${exportFile}`; await testExport(CMD, env, type, exportFile, undefined, false); }); @@ -111,9 +111,9 @@ describe('frodo idm export', () => { await testExport(CMD, env, type, exportFile); }); - test(`"frodo idm export --all --file allIdmTestFile.json -E ${entitiesFile} -e ${envFile} --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json`, async () => { + test(`"frodo idm export --all --file allIdmTestFile.json -e ${entitiesFile} --env-file ${envFile} --no-metadata": should export all idm config entities to a single file named allIdmTestFile.json`, async () => { const exportFile = 'allIdmTestFile.json'; - const CMD = `frodo idm export --all --file ${exportFile} -E ${entitiesFile} -e ${envFile} --no-metadata`; + const CMD = `frodo idm export --all --file ${exportFile} -e ${entitiesFile} --env-file ${envFile} --no-metadata`; await testExport(CMD, env, type, exportFile, undefined, false); }); diff --git a/test/e2e/idm-import.e2e.test.js b/test/e2e/idm-import.e2e.test.js index edf93b3f2..5e767f6cb 100644 --- a/test/e2e/idm-import.e2e.test.js +++ b/test/e2e/idm-import.e2e.test.js @@ -50,8 +50,8 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -i script -D test/e2e/exports/all-separate/cloud/global/idm FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -f test/e2e/exports/all-separate/cloud/global/idm/script.idm.json FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import --entity-id script --file test/e2e/exports/all-separate/cloud/global/idm/script.idm.json -FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -i script -e test/e2e/env/testEnvFile.env -f script.idm.json -D test/e2e/exports/all-separate/cloud/global/idm -FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -af test/e2e/exports/all/all.idm.json -e test/e2e/env/testEnvFile.env -E test/e2e/env/testEntitiesFile.json +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -i script --env-file test/e2e/env/testEnvFile.env -f script.idm.json -D test/e2e/exports/all-separate/cloud/global/idm +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -af test/e2e/exports/all/all.idm.json --env-file test/e2e/env/testEnvFile.env -e test/e2e/env/testEntitiesFile.json FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import --all --file all.idm.json -D test/e2e/exports/all FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import -AD test/e2e/exports/all-separate/cloud/global/idm FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo idm import --all-separate --directory test/e2e/exports/all-separate/cloud/global/idm --env-file test/e2e/env/testEnvFile.env --entities-file test/e2e/env/testEntitiesFile.json @@ -67,7 +67,7 @@ FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/a */ import cp from 'child_process'; import { promisify } from 'util'; -import { getEnv, testSuccess } from './utils/TestUtils'; +import { getEnv, testFail, testSuccess } from './utils/TestUtils'; import { connection as c , forgeops_connection as fc} from './utils/TestConfig'; const exec = promisify(cp.exec); @@ -93,58 +93,42 @@ describe('frodo idm import', () => { test(`"frodo idm import -i script -D ${idmExportDirectory}": should import the idm config with name 'script' from the directory ${idmExportDirectory}"`, async () => { const CMD = `frodo idm import -i script -D ${idmExportDirectory}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + testSuccess(CMD, env); }); test(`"frodo idm import -f ${idmScriptConfigExport}": should import the idm config from the file named '${idmScriptConfigExport}'"`, async () => { const CMD = `frodo idm import -f ${idmScriptConfigExport}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + testSuccess(CMD, env); }); test(`"frodo idm import --entity-id script --file ${idmScriptConfigExport}": should import the idm config with name 'script' from the file named '${idmScriptConfigExport}'"`, async () => { const CMD = `frodo idm import --entity-id script --file ${idmScriptConfigExport}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + testSuccess(CMD, env); }); - test(`"frodo idm import -i script -e ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}": should import the idm config with name 'script' from the file named '${idmScriptConfigExport}'"`, async () => { - const CMD = `frodo idm import -i script -e ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + test(`"frodo idm import -i script --env-file ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}": should import the idm config with name 'script' from the file named '${idmScriptConfigExport}'"`, async () => { + const CMD = `frodo idm import -i script --env-file ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}`; + testSuccess(CMD, env); }); - test(`"frodo idm import -af ${allIdmExport} -e ${testEnvFile} -E ${testEntitiesFile}": Should import all configs from the file '${allIdmExport}' according to the env and entity files"`, async () => { - const CMD = `frodo idm import -af ${allIdmExport} -e ${testEnvFile} -E ${testEntitiesFile}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + test(`"frodo idm import -af ${allIdmExport} --env-file ${testEnvFile} -e ${testEntitiesFile}": Should import all configs from the file '${allIdmExport}' according to the env and entity files"`, async () => { + const CMD = `frodo idm import -af ${allIdmExport} --env-file ${testEnvFile} -e ${testEntitiesFile}`; + testSuccess(CMD, env); }); test(`"frodo idm import --all --file ${allIdmExportFileName} -D ${allIdmExportDirectory}": Should import all configs from the file '${allIdmExportFileName}' in directory '${allIdmExportDirectory}'"`, async () => { const CMD = `frodo idm import --all --file ${allIdmExportFileName} -D ${allIdmExportDirectory}`; - try { - await exec(CMD, env); - fail("Command should've failed"); - } catch (e) { - expect(e.stderr).toMatchSnapshot(); - } + testFail(CMD, env); }); test(`"frodo idm import -AD ${idmExportDirectory}": Should import all configs from the directory '${idmExportDirectory}'"`, async () => { const CMD = `frodo idm import -AD ${idmExportDirectory}`; - try { - await exec(CMD, env); - fail("Command should've failed"); - } catch (e) { - expect(e.stderr).toMatchSnapshot(); - } + testFail(CMD, env); }); test(`"frodo idm import --all-separate --directory ${idmExportDirectory} --env-file ${testEnvFile} --entities-file ${testEntitiesFile}": Should import all configs from the directory '${idmExportDirectory}' according to the env and entity files"`, async () => { const CMD = `frodo idm import --all-separate --directory ${idmExportDirectory} --env-file ${testEnvFile} --entities-file ${testEntitiesFile}`; - const { stdout } = await exec(CMD, env); - expect(stdout).toMatchSnapshot() + testSuccess(CMD, env); }); // Forgeops Tests diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/am_1076162899/recording.har new file mode 100644 index 000000000..de45a9a73 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_E_E_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:41.732Z", + "time": 122, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 122 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1956, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 277, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 277, + "text": "{\"_id\":\"version\",\"_rev\":\"-336779310\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 31557f9c2a8529d455541d8d2b0e552b864189c3 (2026-August-10 11:33)\",\"revision\":\"31557f9c2a8529d455541d8d2b0e552b864189c3\",\"date\":\"2026-August-10 11:33\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "277" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1200, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:42.021Z", + "time": 92, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 92 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/environment_1072573434/recording.har new file mode 100644 index 000000000..700937287 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/environment_1072573434/recording.har @@ -0,0 +1,349 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_E_E_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1907, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 413, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:42.120Z", + "time": 88, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 88 + } + }, + { + "_id": "3daf558b49299e3222a8d2ba4621a44f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 62, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "62" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1931, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"MjA=\",\"description\":\"\",\"expressionType\":\"int\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test-2" + }, + "response": { + "bodySize": 192, + "content": { + "mimeType": "application/json", + "size": 192, + "text": "{\"_id\":\"esv-fr-var-test-2\",\"description\":\"\",\"expressionType\":\"int\",\"lastChangeDate\":\"2026-08-18T16:21:04.679475Z\",\"lastChangedBy\":\"Frodo-SA-1784660925315\",\"loaded\":false,\"valueBase64\":\"MjA=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "192" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 325, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:42.300Z", + "time": 712, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 712 + } + }, + { + "_id": "727ec25947ab373570117e235c9de3f1", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 81, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "81" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1929, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"dGhpcyBpcyBhIHRlc3Q=\",\"description\":\"\",\"expressionType\":\"string\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test" + }, + "response": { + "bodySize": 204, + "content": { + "mimeType": "application/json", + "size": 204, + "text": "{\"_id\":\"esv-fr-var-test\",\"description\":\"\",\"expressionType\":\"string\",\"lastChangeDate\":\"2026-08-18T15:56:05.379214Z\",\"lastChangedBy\":\"phales@trivir.com\",\"loaded\":false,\"valueBase64\":\"dGhpcyBpcyBhIHRlc3Q=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "204" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 325, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:43.018Z", + "time": 732, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 732 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/oauth2_393036114/recording.har new file mode 100644 index 000000000..e6f6b40b7 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_E_E_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1349, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1349" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1850, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1850, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1850" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 976, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:41.869Z", + "time": 145, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 145 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/openidm_3290118515/recording.har new file mode 100644 index 000000000..591551c76 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_E_E_D_2766623676/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_E_E_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:42.083Z", + "time": 170, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 170 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 683, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:21:42.214Z", + "time": 77, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 77 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/am_1076162899/recording.har new file mode 100644 index 000000000..d33de331d --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_env-file_env-file_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:53.817Z", + "time": 127, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 127 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1956, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 277, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 277, + "text": "{\"_id\":\"version\",\"_rev\":\"-336779310\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 31557f9c2a8529d455541d8d2b0e552b864189c3 (2026-August-10 11:33)\",\"revision\":\"31557f9c2a8529d455541d8d2b0e552b864189c3\",\"date\":\"2026-August-10 11:33\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "277" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:54.160Z", + "time": 105, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 105 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/environment_1072573434/recording.har new file mode 100644 index 000000000..0006b756b --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/environment_1072573434/recording.har @@ -0,0 +1,349 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_env-file_env-file_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1907, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:54.271Z", + "time": 87, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 87 + } + }, + { + "_id": "ba4d1659c53d7693f77ef9e9d7347132", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 62, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "62" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1931, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"MzA=\",\"description\":\"\",\"expressionType\":\"int\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test-2" + }, + "response": { + "bodySize": 195, + "content": { + "mimeType": "application/json", + "size": 195, + "text": "{\"_id\":\"esv-fr-var-test-2\",\"description\":\"\",\"expressionType\":\"int\",\"lastChangeDate\":\"2026-08-18T16:22:55.326263155Z\",\"lastChangedBy\":\"Frodo-SA-1784660925315\",\"loaded\":false,\"valueBase64\":\"MzA=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "195" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 300, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:54.451Z", + "time": 1264, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 1264 + } + }, + { + "_id": "606aeb9ad1f7bba793fc549bdc390f93", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 69, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "69" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1929, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"dGVzdDM=\",\"description\":\"\",\"expressionType\":\"string\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test" + }, + "response": { + "bodySize": 200, + "content": { + "mimeType": "application/json", + "size": 200, + "text": "{\"_id\":\"esv-fr-var-test\",\"description\":\"\",\"expressionType\":\"string\",\"lastChangeDate\":\"2026-08-18T16:22:56.468876525Z\",\"lastChangedBy\":\"Frodo-SA-1784660925315\",\"loaded\":false,\"valueBase64\":\"dGVzdDM=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "200" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 300, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:55.721Z", + "time": 993, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 993 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/oauth2_393036114/recording.har new file mode 100644 index 000000000..b479476b8 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_env-file_env-file_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1349, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1349" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1850, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1850, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1850" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 951, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:53.958Z", + "time": 196, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 196 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/openidm_3290118515/recording.har new file mode 100644 index 000000000..fb9e055c2 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_env-file_env-file_D_2519281046/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_env-file_env-file_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:54.221Z", + "time": 167, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 167 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:22:54.365Z", + "time": 78, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 78 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/am_1076162899/recording.har new file mode 100644 index 000000000..1525829f6 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_n_env_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1200, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.125Z", + "time": 134, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 134 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1956, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 277, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 277, + "text": "{\"_id\":\"version\",\"_rev\":\"-336779310\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 31557f9c2a8529d455541d8d2b0e552b864189c3 (2026-August-10 11:33)\",\"revision\":\"31557f9c2a8529d455541d8d2b0e552b864189c3\",\"date\":\"2026-August-10 11:33\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "277" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1200, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.432Z", + "time": 115, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 115 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/environment_1072573434/recording.har new file mode 100644 index 000000000..1e232eeff --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/environment_1072573434/recording.har @@ -0,0 +1,237 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_n_env_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1907, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 413, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.553Z", + "time": 93, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 93 + } + }, + { + "_id": "3daf558b49299e3222a8d2ba4621a44f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 62, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "62" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1931, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"MjA=\",\"description\":\"\",\"expressionType\":\"int\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test-2" + }, + "response": { + "bodySize": 194, + "content": { + "mimeType": "application/json", + "size": 194, + "text": "{\"_id\":\"esv-fr-var-test-2\",\"description\":\"\",\"expressionType\":\"int\",\"lastChangeDate\":\"2026-08-18T16:23:44.65920969Z\",\"lastChangedBy\":\"Frodo-SA-1784660925315\",\"loaded\":false,\"valueBase64\":\"MjA=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "194" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 325, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.752Z", + "time": 1276, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 1276 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/oauth2_393036114/recording.har new file mode 100644 index 000000000..c2cd3143d --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_n_env_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1349, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1349" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1850, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1850, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1850" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 951, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.273Z", + "time": 154, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 154 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/openidm_3290118515/recording.har new file mode 100644 index 000000000..27212141a --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_n_env_D_1050945785/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_n_env_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.497Z", + "time": 168, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 168 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:23:43.652Z", + "time": 92, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 92 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/am_1076162899/recording.har new file mode 100644 index 000000000..e975d52b0 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_name_env_env-file_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 385, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 636, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 636, + "text": "{\"_id\":\"*\",\"_rev\":\"-660094397\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":true,\"cdkDeployment\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "636" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:06.864Z", + "time": 139, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 139 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1956, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 277, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 277, + "text": "{\"_id\":\"version\",\"_rev\":\"-336779310\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 31557f9c2a8529d455541d8d2b0e552b864189c3 (2026-August-10 11:33)\",\"revision\":\"31557f9c2a8529d455541d8d2b0e552b864189c3\",\"date\":\"2026-August-10 11:33\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com, default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "277" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 1175, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.251Z", + "time": 100, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 100 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/environment_1072573434/recording.har new file mode 100644 index 000000000..0bde1a600 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/environment_1072573434/recording.har @@ -0,0 +1,237 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_name_env_env-file_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1907, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1991, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1991, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:telemetry:*\",\"description\":\"All telemetry APIs\",\"childScopes\":[{\"scope\":\"fr:idc:telemetry:read\",\"description\":\"Read telemetry\"}]},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1991" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.357Z", + "time": 92, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 92 + } + }, + { + "_id": "8c6014bd75cd441b9a022a5e9ad95aef", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 69, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "69" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1929, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"valueBase64\":\"dGVzdDI=\",\"description\":\"\",\"expressionType\":\"string\"}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/variables/esv-fr-var-test" + }, + "response": { + "bodySize": 200, + "content": { + "mimeType": "application/json", + "size": 200, + "text": "{\"_id\":\"esv-fr-var-test\",\"description\":\"\",\"expressionType\":\"string\",\"lastChangeDate\":\"2026-08-18T16:24:08.268417121Z\",\"lastChangedBy\":\"Frodo-SA-1784660925315\",\"loaded\":false,\"valueBase64\":\"dGVzdDI=\"}" + }, + "cookies": [], + "headers": [ + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "" + }, + { + "name": "content-length", + "value": "200" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 300, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.540Z", + "time": 964, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 964 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/oauth2_393036114/recording.har new file mode 100644 index 000000000..5b6e58a16 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_name_env_env-file_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1349, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1349" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 440, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1850, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1850, + "text": "{\"access_token\":\"\",\"scope\":\"fr:am:* fr:idc:esv:* fr:idc:analytics:* fr:idc:telemetry:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "content-security-policy", + "value": "connect-src 'self' https://*.googletagmanager.com https://*.google-analytics.com https://cdn.forgerock.com; form-action 'self' https://*.pingidentity.com; frame-ancestors 'self' https://*.pingidentity.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.googletagmanager.com https://*.google-analytics.com; script-src-elem 'self' 'unsafe-inline' https://*.googletagmanager.com https://*.google-analytics.com" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1850" + }, + { + "name": "date", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 951, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.017Z", + "time": 227, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 227 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/openidm_3290118515/recording.har new file mode 100644 index 000000000..786a0ce7a --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/variables_699097794/0_name_env_env-file_D_2504451047/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/variables/0_name_env_env-file_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 683, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.313Z", + "time": 178, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 178 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1968, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/a4438bd2-3e7f-4924-b422-46d5cb049b21?_fields=%2A" + }, + "response": { + "bodySize": 1394, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1394, + "text": "{\"_id\":\"a4438bd2-3e7f-4924-b422-46d5cb049b21\",\"_rev\":\"fe92e226-481b-4208-a6ef-5b8378e8d937-41244\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1784660925315\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:telemetry:*\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"8GP2_8kFC4G22JXxDAz4RX0ZfNB7LHTgMcrCcpRLKtU\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"5mHyhvq1p_5h8BF8AYjZdx8L812q0ddyNlM9Cfy-upkOAO1Bx5SI8X8WkoHX2r90INRBCIPh5sqOm_vUZIE4fdzX54Bsa35V3z9S8JcHAte0uyM3SkFP3bYwzV3iRDgg5-naUqRPSoaORsj-SxeT3o8n04kuvg9MwwIOWuOx0fKtEQdJXTzeiAhRbUEQUYGlDdAC6Gz-L16OMgLWUhX-eiLHGjarm6wq-brnrfdDZqJ2XfAeZ04QIFpEl7kOh1Mhj7MZMx-LZy7itR7xG1nd_nE-ZP6-O_3mgWxWxISP-3AXjD1MOPl5z7c_T89TYIAM8oHSf-1fkNkWgwA8G0frdh2EKeOFexKGjPQO3aNPeYWBaGJ1NQHij-RmtXstHX3-qiy32NT2sheMgNcSfmlPQqAEhU3Md45JUFyBacgbJEYq6ygQUSvyNGAeQVEMJ8VBWa6jvuqKXGYVIaNvn-7CWYDhJBKHJXtqfhXndGCBf_6VMqpWfEBB2awzpep0knZTKggZp-ppDJAjrm_RntFEgEIOoc69CekpU9oNV9cFFL6nl3oPNq1Qw1tkjtpJSbLwQAYNyo1qy1Z95xWt4TcOe7EvlSRMOUuREUYc0IUOJfvXeJbSe0BcWUXG_7Vi8W3jyjTZIt9KrATt6jx09EbtzzgVfk2IJhWmPd0H3Y-Rohc\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1394" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "" + }, + { + "name": "alt-svc", + "value": "" + } + ], + "headersSize": 658, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-18T16:24:07.456Z", + "time": 74, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 74 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/am_1076162899/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/am_1076162899/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/am_1076162899/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/am_1076162899/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/oauth2_393036114/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/oauth2_393036114/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/oauth2_393036114/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/oauth2_393036114/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/openidm_3290118515/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/openidm_3290118515/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_E_e_no-metadata_3984143702/openidm_3290118515/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_all_file_e_env-file_no-metadata_4172037059/openidm_3290118515/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/am_1076162899/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/am_1076162899/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/am_1076162899/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/am_1076162899/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/environment_1072573434/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/environment_1072573434/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/environment_1072573434/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/environment_1072573434/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/oauth2_393036114/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/oauth2_393036114/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/oauth2_393036114/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/oauth2_393036114/recording.har diff --git a/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/openidm_3290118515/recording.har b/test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/openidm_3290118515/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_e_f_63146838/openidm_3290118515/recording.har rename to test/e2e/mocks/idm_2060434423/export_4211608755/0_xi_env-file_f_4253575053/openidm_3290118515/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/am_1076162899/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/am_1076162899/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/am_1076162899/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/am_1076162899/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/oauth2_393036114/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/oauth2_393036114/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/oauth2_393036114/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/oauth2_393036114/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/openidm_3290118515/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/openidm_3290118515/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_af_e_E_441438335/openidm_3290118515/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_af_env-file_e_1943040248/openidm_3290118515/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/am_1076162899/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/am_1076162899/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/am_1076162899/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/am_1076162899/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/oauth2_393036114/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/oauth2_393036114/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/oauth2_393036114/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/oauth2_393036114/recording.har diff --git a/test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/openidm_3290118515/recording.har b/test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/openidm_3290118515/recording.har similarity index 100% rename from test/e2e/mocks/idm_2060434423/import_288002260/0_i_e_f_D_1269151941/openidm_3290118515/recording.har rename to test/e2e/mocks/idm_2060434423/import_288002260/0_i_env-file_f_D_814928654/openidm_3290118515/recording.har diff --git a/test/e2e/promote.e2e.test.js b/test/e2e/promote.e2e.test.js index 0172f72f6..d6a7d9037 100644 --- a/test/e2e/promote.e2e.test.js +++ b/test/e2e/promote.e2e.test.js @@ -50,23 +50,23 @@ ************* ******* DISCLAMER ******* To re-record these you will need to setup the cloud enviornment each time, you might also need to update the full-export-separate with a new export of the whole config with -AxND flags ************* -FRODO_MOCK=record FRODO_TEST_NAME='emailtemplate' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='journey' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='authentication' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='resourcetype' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='script' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='idm' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='agent' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='policy' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='managedapplication' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='theme' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='application' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='variable' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='sync' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='mapping' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='service' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='journeyPromoteNoPrompt' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote --prune-no-prompt -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] -FRODO_MOCK=record FRODO_TEST_NAME='node' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -E [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='emailtemplate' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='journey' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='authentication' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='resourcetype' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='script' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='idm' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='agent' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='policy' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='managedapplication' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='theme' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='application' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='variable' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='sync' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='mapping' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='service' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='journeyPromoteNoPrompt' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote --prune-no-prompt -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] +FRODO_MOCK=record FRODO_TEST_NAME='node' FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo promote -M ./test/e2e/exports/full-export-separate -e [put dir where you have the export] */ import { getEnv, testPromote } from './utils/TestUtils'; import { connection as c } from './utils/TestConfig'; @@ -75,8 +75,8 @@ process.env['FRODO_MOCK'] = '1'; const env = getEnv(c); const sourceDir = `./test/e2e/exports/full-export-separate` -describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*', () => { - test.skip('"emailtemplate frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on email template changes', async () => { +describe('frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*', () => { + test.skip('"emailtemplate frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on email template changes', async () => { let name = 'emailtemplate'; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -84,7 +84,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"journey frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on journey changes', async () => { + test.skip('"journey frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on journey changes', async () => { let name = "journey"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -92,7 +92,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test('"authentication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on authentication changes', async () => { + test('"authentication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on authentication changes', async () => { let name = "authentication"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -100,7 +100,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"resourcetype frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on resourcetype changes', async () => { + test.skip('"resourcetype frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on resourcetype changes', async () => { let name = "resourcetype"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -108,7 +108,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"script frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on script changes', async () => { + test.skip('"script frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on script changes', async () => { let name = "script"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -116,7 +116,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"idm frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on idm changes', async () => { + test.skip('"idm frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on idm changes', async () => { let name = "idm"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -124,7 +124,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"idp frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on idp changes', async () => { + test.skip('"idp frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on idp changes', async () => { let name = "idp"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -132,7 +132,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"agent frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on agent changes', async () => { + test.skip('"agent frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on agent changes', async () => { let name = "agent"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -140,7 +140,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"policy frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on policy changes', async () => { + test.skip('"policy frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on policy changes', async () => { let name = "policy"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -148,7 +148,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test('"managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on managedapplication changes', async () => { + test('"managedapplication frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on managedapplication changes', async () => { let name = "managedapplication"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -156,7 +156,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"theme frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on theme changes', async () => { + test.skip('"theme frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on theme changes', async () => { let name = "theme"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -164,7 +164,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"application frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on application changes', async () => { + test.skip('"application frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on application changes', async () => { let name = "application"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -172,7 +172,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test('"variable frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on variable changes', async () => { + test('"variable frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on variable changes', async () => { let name = "variable"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -180,7 +180,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"sync frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on sync changes', async () => { + test.skip('"sync frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on sync changes', async () => { let name = "sync"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -188,7 +188,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test('"mapping frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on mapping changes', async () => { + test('"mapping frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on mapping changes', async () => { let name = "mapping"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -196,7 +196,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"service frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on service changes', async () => { + test.skip('"service frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on service changes', async () => { let name = "service"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; @@ -204,7 +204,7 @@ describe('frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp- await testPromote(sourceDir, modifiedDir, referenceSubDirs, env, name) }); - test.skip('"node frodo promote -M ./test/e2e/exports/full-export-separate -E ./tmp/tmp-*": this should run a promote on node changes', async () => { + test.skip('"node frodo promote -M ./test/e2e/exports/full-export-separate -e ./tmp/tmp-*": this should run a promote on node changes', async () => { let name = "node"; env.env.FRODO_TEST_NAME = name let modifiedDir = `./test/e2e/exports/promote/${name}`; diff --git a/test/e2e/utils/TestUtils.js b/test/e2e/utils/TestUtils.js index c93317ae0..df9e12283 100644 --- a/test/e2e/utils/TestUtils.js +++ b/test/e2e/utils/TestUtils.js @@ -331,7 +331,7 @@ export async function testPromote( ) { env.env.FRODO_TEST_NAME = name const tempDir = await copyAndModifyDirectory(sourceDir, modifiedFilesDir, referenceSubDirs) - const CMD = `frodo promote -M ${sourceDir} -E ${tempDir}`; + const CMD = `frodo promote -M ${sourceDir} -e ${tempDir}`; const { stdout, stderr } = await exec(CMD, env); assertNoPollyReplayError(stdout, CMD); assertNoPollyReplayError(stderr, CMD); From b0e9496989e23c973f041a3183849c7691939175 Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Tue, 18 Aug 2026 16:08:34 -0600 Subject: [PATCH 2/4] fix: update @rockcarver/frodo-lib to version 4.4.0 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae20eeb60..e662a8b15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@modelcontextprotocol/client": "^2.0.0", "@modelcontextprotocol/node": "^2.0.0", "@modelcontextprotocol/server": "^2.0.0", - "@rockcarver/frodo-lib": "4.3.3", + "@rockcarver/frodo-lib": "4.4.0", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", @@ -1908,9 +1908,9 @@ } }, "node_modules/@rockcarver/frodo-lib": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.3.3.tgz", - "integrity": "sha512-we+K7ONOTXdIaHSDAhOWp9yPLctUcLqQ23M/nVuHK7GHqBxdNHrBWQlYmiidbP+0t9/EcO/2Ey9tup4ItkDrCg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.4.0.tgz", + "integrity": "sha512-mE8uB+51bKziDjwEyaB/far1Re9wPV+bS1ULeLLpQtKiU4trKcmiMjCFGoEbzKKDInSoJvY1cUiikdCVOlys7Q==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index eb5701c60..857e0f7f0 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "@modelcontextprotocol/client": "^2.0.0", "@modelcontextprotocol/node": "^2.0.0", "@modelcontextprotocol/server": "^2.0.0", - "@rockcarver/frodo-lib": "4.3.3", + "@rockcarver/frodo-lib": "4.4.0", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", From f3e32f09f5a069c490f34c369e868e0f48b44798 Mon Sep 17 00:00:00 2001 From: Preston Hales Date: Tue, 18 Aug 2026 17:04:06 -0600 Subject: [PATCH 3/4] fixup! feat: Add config-manager push variables --- .../__snapshots__/idm-import.e2e.test.js.snap | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/test/e2e/__snapshots__/idm-import.e2e.test.js.snap b/test/e2e/__snapshots__/idm-import.e2e.test.js.snap index df972ef28..89cd444f9 100644 --- a/test/e2e/__snapshots__/idm-import.e2e.test.js.snap +++ b/test/e2e/__snapshots__/idm-import.e2e.test.js.snap @@ -13,14 +13,14 @@ exports[`frodo idm import "frodo idm import --file test/e2e/exports/all-separate exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 1`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 2`] = ` -"✔ Imported script from test/e2e/exports/all-separate/cloud/global/idm/script.idm.json. -" -`; +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 2`] = `""`; exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 3`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 4`] = `""`; +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 4`] = ` +"✔ Imported script from test/e2e/exports/all-separate/cloud/global/idm/script.idm.json. +" +`; exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 5`] = `""`; @@ -31,27 +31,34 @@ exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/fo exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 7`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 8`] = ` -"✔ Imported config entities -" -`; +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 8`] = `""`; exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 9`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 10`] = `""`; +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 10`] = ` +"✔ Imported config entities +" +`; exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 11`] = `""`; exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 12`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 13`] = `""`; - -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 14`] = ` -"✔ Imported config entities +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 13`] = ` +"Error updating config entity bravoOrgPrivileges + Network error: + URL: https://openam-frodo-dev.forgeblocks.com/openidm/config/bravoOrgPrivileges + Status: 403 + Code: ERR_BAD_REQUEST + Reason: Forbidden + Message: Access denied +✔ Imported config entities " `; -exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 1`] = ` +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 14`] = `1`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 15`] = ` "Error updating config entity endpoint/Test Network error: URL: https://openam-frodo-dev.forgeblocks.com/openidm/config/endpoint/Test @@ -70,25 +77,18 @@ Error updating config entity endpoint/testEndpoint2 " `; -exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 2`] = `1`; +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 16`] = `1`; -exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 3`] = ` -"Error updating config entity bravoOrgPrivileges - Network error: - URL: https://openam-frodo-dev.forgeblocks.com/openidm/config/bravoOrgPrivileges - Status: 403 - Code: ERR_BAD_REQUEST - Reason: Forbidden - Message: Access denied -✔ Imported config entities +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 17`] = `""`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 18`] = ` +"✔ Imported config entities " `; -exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 4`] = `1`; - -exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 5`] = `""`; +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 1`] = `""`; -exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 6`] = ` +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 2`] = ` "✔ Imported endpoint/Groovy from test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json. " `; From 5a28650c2f2a6cfa0c12a1843d58d8152a59f93b Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Wed, 19 Aug 2026 08:55:21 -0600 Subject: [PATCH 4/4] fix: add missing await to idm-import cloud tests and update snapshots MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fire-and-forget testSuccess/testFail calls in the cloud test section were leaking async snapshot assertions into concurrent ForgeOps tests, inflating snapshot counters and causing failures against stale entries. Also removes accumulated stale snapshot entries (3–18) and updates the -AD forgeops snap 2 to match the current stderr output. Co-Authored-By: Claude Sonnet 4.6 --- .../__snapshots__/idm-import.e2e.test.js.snap | 90 +++++++++---------- test/e2e/idm-import.e2e.test.js | 16 ++-- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/test/e2e/__snapshots__/idm-import.e2e.test.js.snap b/test/e2e/__snapshots__/idm-import.e2e.test.js.snap index 89cd444f9..cbf3fd022 100644 --- a/test/e2e/__snapshots__/idm-import.e2e.test.js.snap +++ b/test/e2e/__snapshots__/idm-import.e2e.test.js.snap @@ -1,64 +1,42 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`frodo idm import "frodo idm import --entity-id sync -f test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 1`] = `""`; - -exports[`frodo idm import "frodo idm import --entity-id sync -f test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 2`] = `""`; - -exports[`frodo idm import "frodo idm import --file test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 1`] = `""`; - -exports[`frodo idm import "frodo idm import --file test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 2`] = ` -"✔ Imported sync from test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json. +exports[`frodo idm import "frodo idm import --all --file all.idm.json -D test/e2e/exports/all": Should import all configs from the file 'all.idm.json' in directory 'test/e2e/exports/all'" 1`] = ` +"Error updating config entity bravoOrgPrivileges + Network error: + URL: https://openam-frodo-dev.forgeblocks.com/openidm/config/bravoOrgPrivileges + Status: 403 + Code: ERR_BAD_REQUEST + Reason: Forbidden + Message: Access denied +✔ Imported config entities " `; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 1`] = `""`; - -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 2`] = `""`; - -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 3`] = `""`; - -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 4`] = ` -"✔ Imported script from test/e2e/exports/all-separate/cloud/global/idm/script.idm.json. -" -`; +exports[`frodo idm import "frodo idm import --all --file all.idm.json -D test/e2e/exports/all": Should import all configs from the file 'all.idm.json' in directory 'test/e2e/exports/all'" 2`] = `1`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 5`] = `""`; +exports[`frodo idm import "frodo idm import --all-separate --directory test/e2e/exports/all-separate/cloud/global/idm --env-file test/e2e/env/testEnvFile.env --entities-file test/e2e/env/testEntitiesFile.json": Should import all configs from the directory 'test/e2e/exports/all-separate/cloud/global/idm' according to the env and entity files" 1`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 6`] = ` +exports[`frodo idm import "frodo idm import --all-separate --directory test/e2e/exports/all-separate/cloud/global/idm --env-file test/e2e/env/testEnvFile.env --entities-file test/e2e/env/testEntitiesFile.json": Should import all configs from the directory 'test/e2e/exports/all-separate/cloud/global/idm' according to the env and entity files" 2`] = ` "✔ Imported config entities " `; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 7`] = `""`; +exports[`frodo idm import "frodo idm import --entity-id script --file test/e2e/exports/all-separate/cloud/global/idm/script.idm.json": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 1`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 8`] = `""`; +exports[`frodo idm import "frodo idm import --entity-id script --file test/e2e/exports/all-separate/cloud/global/idm/script.idm.json": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 2`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 9`] = `""`; - -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 10`] = ` -"✔ Imported config entities -" -`; +exports[`frodo idm import "frodo idm import --entity-id sync -f test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 1`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 11`] = `""`; +exports[`frodo idm import "frodo idm import --entity-id sync -f test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 2`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 12`] = `""`; +exports[`frodo idm import "frodo idm import --file test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 1`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 13`] = ` -"Error updating config entity bravoOrgPrivileges - Network error: - URL: https://openam-frodo-dev.forgeblocks.com/openidm/config/bravoOrgPrivileges - Status: 403 - Code: ERR_BAD_REQUEST - Reason: Forbidden - Message: Access denied -✔ Imported config entities +exports[`frodo idm import "frodo idm import --file test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json -m forgeops": Should import idm configuration 'sync'. 2`] = ` +"✔ Imported sync from test/e2e/exports/all-separate/forgeops/global/sync/sync.idm.json. " `; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 14`] = `1`; - -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 15`] = ` +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/cloud/global/idm": Should import all configs from the directory 'test/e2e/exports/all-separate/cloud/global/idm'" 1`] = ` "Error updating config entity endpoint/Test Network error: URL: https://openam-frodo-dev.forgeblocks.com/openidm/config/endpoint/Test @@ -77,15 +55,29 @@ Error updating config entity endpoint/testEndpoint2 " `; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 16`] = `1`; +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/cloud/global/idm": Should import all configs from the directory 'test/e2e/exports/all-separate/cloud/global/idm'" 2`] = `1`; + +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 1`] = `""`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 17`] = `""`; +exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 2`] = ` +"✔ Imported config entities +" +`; -exports[`frodo idm import "frodo idm import -AD test/e2e/exports/all-separate/forgeops/global/idm -m forgeops": Should import all config from the directory 'test/e2e/exports/all-separate/forgeops/global/idm'. 18`] = ` +exports[`frodo idm import "frodo idm import -af test/e2e/exports/all/all.idm.json --env-file test/e2e/env/testEnvFile.env -e test/e2e/env/testEntitiesFile.json": Should import all configs from the file 'test/e2e/exports/all/all.idm.json' according to the env and entity files" 1`] = `""`; + +exports[`frodo idm import "frodo idm import -af test/e2e/exports/all/all.idm.json --env-file test/e2e/env/testEnvFile.env -e test/e2e/env/testEntitiesFile.json": Should import all configs from the file 'test/e2e/exports/all/all.idm.json' according to the env and entity files" 2`] = ` "✔ Imported config entities " `; +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/cloud/global/idm/script.idm.json": should import the idm config from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 1`] = `""`; + +exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/cloud/global/idm/script.idm.json": should import the idm config from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 2`] = ` +"✔ Imported script from test/e2e/exports/all-separate/cloud/global/idm/script.idm.json. +" +`; + exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 1`] = `""`; exports[`frodo idm import "frodo idm import -f test/e2e/exports/all-separate/forgeops/global/idm/endpoint/Groovy/Groovy.idm.json -m forgeops": Should import idm configuration 'endpoint/Groovy'. 2`] = ` @@ -107,3 +99,11 @@ exports[`frodo idm import "frodo idm import -i endpoint/Groovy -f test/e2e/expor exports[`frodo idm import "frodo idm import -i managed -f test/e2e/exports/all-separate/forgeops/global/idm/managed/managed.idm.json --type forgeops": Should import idm configuration 'managed'. 1`] = `""`; exports[`frodo idm import "frodo idm import -i managed -f test/e2e/exports/all-separate/forgeops/global/idm/managed/managed.idm.json --type forgeops": Should import idm configuration 'managed'. 2`] = `""`; + +exports[`frodo idm import "frodo idm import -i script --env-file test/e2e/env/testEnvFile.env -f script.idm.json -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 1`] = `""`; + +exports[`frodo idm import "frodo idm import -i script --env-file test/e2e/env/testEnvFile.env -f script.idm.json -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the file named 'test/e2e/exports/all-separate/cloud/global/idm/script.idm.json'" 2`] = `""`; + +exports[`frodo idm import "frodo idm import -i script -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the directory test/e2e/exports/all-separate/cloud/global/idm" 1`] = `""`; + +exports[`frodo idm import "frodo idm import -i script -D test/e2e/exports/all-separate/cloud/global/idm": should import the idm config with name 'script' from the directory test/e2e/exports/all-separate/cloud/global/idm" 2`] = `""`; diff --git a/test/e2e/idm-import.e2e.test.js b/test/e2e/idm-import.e2e.test.js index 5e767f6cb..0523ed62f 100644 --- a/test/e2e/idm-import.e2e.test.js +++ b/test/e2e/idm-import.e2e.test.js @@ -93,42 +93,42 @@ describe('frodo idm import', () => { test(`"frodo idm import -i script -D ${idmExportDirectory}": should import the idm config with name 'script' from the directory ${idmExportDirectory}"`, async () => { const CMD = `frodo idm import -i script -D ${idmExportDirectory}`; - testSuccess(CMD, env); + await testSuccess(CMD, env); }); test(`"frodo idm import -f ${idmScriptConfigExport}": should import the idm config from the file named '${idmScriptConfigExport}'"`, async () => { const CMD = `frodo idm import -f ${idmScriptConfigExport}`; - testSuccess(CMD, env); + await testSuccess(CMD, env); }); test(`"frodo idm import --entity-id script --file ${idmScriptConfigExport}": should import the idm config with name 'script' from the file named '${idmScriptConfigExport}'"`, async () => { const CMD = `frodo idm import --entity-id script --file ${idmScriptConfigExport}`; - testSuccess(CMD, env); + await testSuccess(CMD, env); }); test(`"frodo idm import -i script --env-file ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}": should import the idm config with name 'script' from the file named '${idmScriptConfigExport}'"`, async () => { const CMD = `frodo idm import -i script --env-file ${testEnvFile} -f ${idmScriptConfigFileName} -D ${idmExportDirectory}`; - testSuccess(CMD, env); + await testSuccess(CMD, env); }); test(`"frodo idm import -af ${allIdmExport} --env-file ${testEnvFile} -e ${testEntitiesFile}": Should import all configs from the file '${allIdmExport}' according to the env and entity files"`, async () => { const CMD = `frodo idm import -af ${allIdmExport} --env-file ${testEnvFile} -e ${testEntitiesFile}`; - testSuccess(CMD, env); + await testSuccess(CMD, env); }); test(`"frodo idm import --all --file ${allIdmExportFileName} -D ${allIdmExportDirectory}": Should import all configs from the file '${allIdmExportFileName}' in directory '${allIdmExportDirectory}'"`, async () => { const CMD = `frodo idm import --all --file ${allIdmExportFileName} -D ${allIdmExportDirectory}`; - testFail(CMD, env); + await testFail(CMD, env); }); test(`"frodo idm import -AD ${idmExportDirectory}": Should import all configs from the directory '${idmExportDirectory}'"`, async () => { const CMD = `frodo idm import -AD ${idmExportDirectory}`; - testFail(CMD, env); + await testFail(CMD, env); }); test(`"frodo idm import --all-separate --directory ${idmExportDirectory} --env-file ${testEnvFile} --entities-file ${testEntitiesFile}": Should import all configs from the directory '${idmExportDirectory}' according to the env and entity files"`, async () => { const CMD = `frodo idm import --all-separate --directory ${idmExportDirectory} --env-file ${testEnvFile} --entities-file ${testEntitiesFile}`; - testSuccess(CMD, env); + await testSuccess(CMD, env); }); // Forgeops Tests