From 8cfee4dc73507980f332ce71fa12ab004d55b16e Mon Sep 17 00:00:00 2001 From: dallinjsevy Date: Fri, 12 Jun 2026 14:08:55 -0600 Subject: [PATCH] feat: Add config-manager push connector-mappings command --- package-lock.json | 56 +- .../config-manager-push-connector-mappings.ts | 59 ++ .../config-manager-push.ts | 2 + .../FrConfigConnectorMappingOps.ts | 82 ++- ...nager-push-connector-mappings.test.js.snap | 27 + .../config-manager-push.test.js.snap | 1 + ...ig-manager-push-connector-mappings.test.js | 10 + ...r-push-connector-mappings.e2e.test.js.snap | 15 + ...anager-push-connector-mappings.e2e.test.js | 82 +++ .../UserToUserGroovySync.json | 451 +++++++++++++ ...rToUserJavascriptSync.correlationScript.js | 1 + .../UserToUserJavascriptSync.json | 453 +++++++++++++ ...UserToUserJavascriptSync.linkQualifiers.js | 3 + .../UserToUserJavascriptSync.null.js | 1 + .../UserToUserJavascriptSync.onCreate.js | 1 + .../UserToUserJavascriptSync.onDelete.js | 1 + .../UserToUserJavascriptSync.onLink.js | 1 + .../UserToUserJavascriptSync.onUnlink.js | 1 + .../UserToUserJavascriptSync.onUpdate.js | 1 + .../UserToUserJavascriptSync.result.js | 1 + .../UserToUserJavascriptSync.validSource.js | 1 + .../UserToUserJavascriptSync.validTarget.js | 1 + .../am_1076162899/recording.har | 631 ++++++++++++++++++ .../oauth2_393036114/recording.har | 289 ++++++++ .../openidm_3290118515/recording.har | 171 +++++ .../am_1076162899/recording.har | 631 ++++++++++++++++++ .../oauth2_393036114/recording.har | 289 ++++++++ .../openidm_3290118515/recording.har | 316 +++++++++ 28 files changed, 3549 insertions(+), 29 deletions(-) create mode 100644 src/cli/config-manager/config-manager-push/config-manager-push-connector-mappings.ts create mode 100644 test/client_cli/en/__snapshots__/config-manager-push-connector-mappings.test.js.snap create mode 100644 test/client_cli/en/config-manager-push-connector-mappings.test.js create mode 100644 test/e2e/__snapshots__/config-manager-push-connector-mappings.e2e.test.js.snap create mode 100644 test/e2e/config-manager-push-connector-mappings.e2e.test.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserGroovySync/UserToUserGroovySync.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.correlationScript.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.linkQualifiers.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.null.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onCreate.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onDelete.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onLink.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onUnlink.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onUpdate.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.result.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.validSource.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.validTarget.js create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/openidm_3290118515/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/openidm_3290118515/recording.har diff --git a/package-lock.json b/package-lock.json index b3b8a8ae4..f1ab57cb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1120,9 +1120,9 @@ } }, "node_modules/@hono/node-server": { - "version": "1.19.12", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.12.tgz", - "integrity": "sha512-txsUW4SQ1iilgE0l9/e9VQWmELXifEFvmdA1j6WFh/aFPj99hIntrSsq/if0UWyGVkmrRPKA1wCeP+UCr1B9Uw==", + "version": "1.19.14", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", + "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", "dev": true, "license": "MIT", "engines": { @@ -3457,9 +3457,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -5318,13 +5318,13 @@ } }, "node_modules/express-rate-limit": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.2.tgz", - "integrity": "sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", + "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", "dev": true, "license": "MIT", "dependencies": { - "ip-address": "10.1.0" + "ip-address": "^10.2.0" }, "engines": { "node": ">= 16" @@ -5402,9 +5402,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -6057,9 +6057,9 @@ } }, "node_modules/hono": { - "version": "4.12.9", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.9.tgz", - "integrity": "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==", + "version": "4.12.25", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.25.tgz", + "integrity": "sha512-2NFaIyNVgJmBs/ecmtGzlmluTFs5cHEWGTdu0t1HBwYzoGXOL5nUQBRMXsXWla5i4KkG//QMzVP88m1+I3fdAQ==", "dev": true, "license": "MIT", "engines": { @@ -6272,9 +6272,9 @@ } }, "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", "dev": true, "license": "MIT", "engines": { @@ -9103,9 +9103,9 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10451,9 +10451,9 @@ } }, "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", "dev": true, "license": "MIT", "engines": { @@ -11028,9 +11028,9 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-connector-mappings.ts b/src/cli/config-manager/config-manager-push/config-manager-push-connector-mappings.ts new file mode 100644 index 000000000..90465eb4e --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-connector-mappings.ts @@ -0,0 +1,59 @@ +import { frodo } from '@rockcarver/frodo-lib'; +import { Option } from 'commander'; + +import { configManagerImportMappings } from '../../../configManagerOps/FrConfigConnectorMappingOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { printMessage, verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; + +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager push connector-mappings', + [], + deploymentTypes + ); + + program + .description('Import connector mappings.') + .addOption( + new Option( + '-n, --name ', + 'Connector mapping name; imports only the connector mapping with the specified name.' + ) + ) + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + + if (await getTokens(false, true, deploymentTypes)) { + verboseMessage('Importing connector mappings'); + const outcome = await configManagerImportMappings(options.name); + if (!outcome) process.exitCode = 1; + } + // unrecognized combination of options or no options + else { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + program.help(); + 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 cf423832d..b12ca0f97 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 @@ -3,6 +3,7 @@ import AccessConfig from './config-manager-push-access-config'; import Audit from './config-manager-push-audit'; import Authentication from './config-manager-push-authentication'; import ConnectorDefinitions from './config-manager-push-connector-definitions'; +import ConnectorMappings from './config-manager-push-connector-mappings'; import CookieDomains from './config-manager-push-cookie-domain'; import EmailProvider from './config-manager-push-email-provider'; import EmailTemplates from './config-manager-push-email-templates'; @@ -43,6 +44,7 @@ export default function setup() { program.addCommand(UiConfig().name('ui-config')); program.addCommand(Authentication().name('authentication')); program.addCommand(ConnectorDefinitions().name('connector-definitions')); + program.addCommand(ConnectorMappings().name('connector-mappings')); return program; } diff --git a/src/configManagerOps/FrConfigConnectorMappingOps.ts b/src/configManagerOps/FrConfigConnectorMappingOps.ts index cf7031358..0004a170a 100644 --- a/src/configManagerOps/FrConfigConnectorMappingOps.ts +++ b/src/configManagerOps/FrConfigConnectorMappingOps.ts @@ -1,10 +1,13 @@ import { frodo } from '@rockcarver/frodo-lib'; +import fs from 'fs'; +import path from 'path'; import { extractFrConfigDataToFile } from '../utils/Config'; import { printError } from '../utils/Console'; const { getFilePath, saveJsonToFile } = frodo.utils; -const { readConfigEntity } = frodo.idm.config; +const { readConfigEntity, importConfigEntities, importSubConfigEntity } = + frodo.idm.config; function processMappings(mapping, targetDir, name) { try { @@ -58,3 +61,80 @@ export async function configManagerExportMappings(): Promise { } return false; } + +/** + * Helper that recursively reads in extracted files and stores them back in the connector + * @param {Record} obj The connector configuration + * @param {string} connectorMappingDirectory The directory where the connector resides + */ +function getExtractedFiles(obj: any, connectorMappingDirectory: string): void { + if (!obj || typeof obj !== 'object') return; + for (const key of Object.keys(obj)) { + const value = obj[key]; + if (value?.type === 'text/javascript' && value.file) { + const scriptPath = path.join(connectorMappingDirectory, value.file); + if (fs.existsSync(scriptPath)) { + value.source = fs.readFileSync(scriptPath, { encoding: 'utf-8' }); + delete value.file; + } + } else if (typeof value === 'object') { + getExtractedFiles(value, connectorMappingDirectory); + } + } +} + +/** + * Helper that returns the import data for a connector mapping given the file where it is saved + * @param {string} file The file where the connector mapping is saved + * @returns {object} The connector mapping data from the file, including data from any extracted files + */ +function getConnectorMappingImportData(file: string): object { + const readManagedObject = fs.readFileSync(file, 'utf-8'); + const importData = JSON.parse(readManagedObject); + const connectorMappingDirectory = path.dirname(file); + getExtractedFiles(importData, connectorMappingDirectory); + return importData; +} + +/** + * Import all mappings in fr-config-manager format + * @param {string} name optional connector name to import + * @returns {Promise} true if successful, false otherwise + */ +export async function configManagerImportMappings( + name?: string +): Promise { + try { + if (name) { + const jsonFilePath = getFilePath(`sync/mappings/${name}/${name}.json`); + const importData = getConnectorMappingImportData(jsonFilePath) as any; + await importSubConfigEntity('sync', importData); + return true; + } else { + const mappingDir = getFilePath('sync/mappings'); + const mappingFiles = fs.readdirSync(mappingDir); + const importMappingData = { + idm: { sync: { _id: 'sync', mappings: [] as any } }, + }; + for (const mappingFile of mappingFiles) { + const jsonFilePath = getFilePath( + `sync/mappings/${mappingFile}/${mappingFile}.json` + ); + const importData = getConnectorMappingImportData(jsonFilePath) as any; + if (importData.file) { + const scriptPath = getFilePath( + `sync/mappings/${mappingFile}/${importData.file}` + ); + importData.source = fs.readFileSync(scriptPath, 'utf8'); + delete importData.file; + } + importMappingData.idm.sync.mappings.push(importData); + } + await importConfigEntities(importMappingData); + } + return true; + } catch (error) { + printError(error, `Error importing mappings from files`); + } + return false; +} diff --git a/test/client_cli/en/__snapshots__/config-manager-push-connector-mappings.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-connector-mappings.test.js.snap new file mode 100644 index 000000000..5ce031574 --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-connector-mappings.test.js.snap @@ -0,0 +1,27 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push connector-mappings' should be expected english 1`] = ` +"Usage: frodo config-manager push connector-mappings [options] [host] [realm] [username] [password] + +[Experimental] Import connector mappings. + +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. + password Password. + +Options: + -n, --name Connector mapping name; imports only the connector mapping + with the specified name. + -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 c079ca13f..d1228552c 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 @@ -17,6 +17,7 @@ Commands: audit [Experimental] Import audit configuration. authentication [Experimental] Import authentication objects. connector-definitions [Experimental] Import connector definitions. + connector-mappings [Experimental] Import connector mappings. cookie-domains [Experimental] Import cookie domains. email-provider [Experimental] Import email provider configuration. email-templates [Experimental] Import email template objects. diff --git a/test/client_cli/en/config-manager-push-connector-mappings.test.js b/test/client_cli/en/config-manager-push-connector-mappings.test.js new file mode 100644 index 000000000..296d08667 --- /dev/null +++ b/test/client_cli/en/config-manager-push-connector-mappings.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 connector-mappings --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push connector-mappings' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); diff --git a/test/e2e/__snapshots__/config-manager-push-connector-mappings.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-connector-mappings.e2e.test.js.snap new file mode 100644 index 000000000..23ca7931e --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-connector-mappings.e2e.test.js.snap @@ -0,0 +1,15 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`frodo config-manager push connector mappings "frodo config-manager push connector-mappings -D test/e2e/exports/fr-config-manager/forgeops -m forgeops ": should import the connector mappings into forgeops" 1`] = `""`; + +exports[`frodo config-manager push connector mappings "frodo config-manager push connector-mappings -D test/e2e/exports/fr-config-manager/forgeops -m forgeops ": should import the connector mappings into forgeops" 2`] = ` +"Experimental feature in use: 'frodo config-manager push connector-mappings'. This feature may change without notice. +" +`; + +exports[`frodo config-manager push connector mappings "frodo config-manager push connector-mappings -n UserToUserJavascriptSync -D test/e2e/exports/fr-config-manager/forgeops -m forgeops ": should import a specific connector mapping by name into forgeops" 1`] = `""`; + +exports[`frodo config-manager push connector mappings "frodo config-manager push connector-mappings -n UserToUserJavascriptSync -D test/e2e/exports/fr-config-manager/forgeops -m forgeops ": should import a specific connector mapping by name into forgeops" 2`] = ` +"Experimental feature in use: 'frodo config-manager push connector-mappings'. This feature may change without notice. +" +`; diff --git a/test/e2e/config-manager-push-connector-mappings.e2e.test.js b/test/e2e/config-manager-push-connector-mappings.e2e.test.js new file mode 100644 index 000000000..edbf6c37e --- /dev/null +++ b/test/e2e/config-manager-push-connector-mappings.e2e.test.js @@ -0,0 +1,82 @@ +/** + * 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. + */ + +/* +// ForgeOps +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/am frodo config-manager push connector-mappings -D test/e2e/exports/fr-config-manager/forgeops -m forgeops +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/am frodo config-manager push connector-mappings -n UserToUserJavascriptSync -D test/e2e/exports/fr-config-manager/forgeops -m forgeops +*/ + +import cp from 'child_process'; +import { promisify } from 'util'; +import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { forgeops_connection as fc } from './utils/TestConfig'; + +const exec = promisify(cp.exec); + +process.env['FRODO_MOCK'] = '1'; +process.env['FRODO_NO_CACHE'] = '1'; + +const forgeopsEnv = getEnv(fc); + +const allDirectory = "test/e2e/exports/fr-config-manager/forgeops"; + +describe('frodo config-manager push connector mappings', () => { + test(`"frodo config-manager push connector-mappings -D ${allDirectory} -m forgeops ": should import the connector mappings into forgeops"`, async () => { + const CMD = `frodo config-manager push connector-mappings -D ${allDirectory} -m forgeops `; + const { stdout, stderr } = await exec(CMD, forgeopsEnv); + expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + }); + test(`"frodo config-manager push connector-mappings -n UserToUserJavascriptSync -D ${allDirectory} -m forgeops ": should import a specific connector mapping by name into forgeops"`, async () => { + const CMD = `frodo config-manager push connector-mappings -n UserToUserJavascriptSync -D ${allDirectory} -m forgeops `; + const { stdout, stderr } = await exec(CMD, forgeopsEnv); + expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + }); +}); \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserGroovySync/UserToUserGroovySync.json b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserGroovySync/UserToUserGroovySync.json new file mode 100644 index 000000000..6d48fadf4 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserGroovySync/UserToUserGroovySync.json @@ -0,0 +1,451 @@ +{ + "_id": "sync/UserToUserGroovySync", + "correlationScript": { + "globals": { + "test": null + }, + "source": "['test', 'default']", + "type": "groovy" + }, + "displayName": "User Test Groovy Sync", + "linkQualifiers": { + "globals": { + "test": null + }, + "source": "// Hello there!\n// This is a test comment\n[]", + "type": "groovy" + }, + "name": "UserToUserGroovySync", + "null": { + "globals": { + "test": null + }, + "source": "// other", + "type": "groovy" + }, + "onCreate": { + "globals": { + "test": null + }, + "source": "// onCreate", + "type": "groovy" + }, + "onDelete": { + "globals": { + "test": null + }, + "source": "// onDelete", + "type": "groovy" + }, + "onLink": { + "globals": { + "test": null + }, + "source": "// onLink", + "type": "groovy" + }, + "onUnlink": { + "globals": { + "test": null + }, + "source": "// onUnlink", + "type": "groovy" + }, + "onUpdate": { + "globals": { + "test": null + }, + "source": "// onUpdate", + "type": "groovy" + }, + "policies": [ + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform ambiguous", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When ambiguous", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete ambiguous", + "type": "groovy" + }, + "situation": "AMBIGUOUS" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform source missing", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When source missing", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete source missing", + "type": "groovy" + }, + "situation": "SOURCE_MISSING" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform missing", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When missing", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete missing", + "type": "groovy" + }, + "situation": "MISSING" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform found already linked", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When found already linked", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete found already linked", + "type": "groovy" + }, + "situation": "FOUND_ALREADY_LINKED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform unqualified", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When unqualified", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete unqualified", + "type": "groovy" + }, + "situation": "UNQUALIFIED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform unassigned", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When unassigned", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete unassigned", + "type": "groovy" + }, + "situation": "UNASSIGNED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform link_only", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When link_only", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete link_only", + "type": "groovy" + }, + "situation": "LINK_ONLY" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform target_ignored", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When target_ignored", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete target_ignored", + "type": "groovy" + }, + "situation": "TARGET_IGNORED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform source_ignored", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When source_ignored", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete source_ignored", + "type": "groovy" + }, + "situation": "SOURCE_IGNORED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform all_gone", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When all_gone", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete all_gone", + "type": "groovy" + }, + "situation": "ALL_GONE" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform confirmed", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When confirmed", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete confirmed", + "type": "groovy" + }, + "situation": "CONFIRMED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform found", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When found", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete found", + "type": "groovy" + }, + "situation": "FOUND" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform absent", + "type": "groovy" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When absent", + "type": "groovy" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete absent", + "type": "groovy" + }, + "situation": "ABSENT" + } + ], + "properties": [ + { + "source": "mail", + "target": "mail" + }, + { + "condition": { + "globals": {}, + "source": "true;", + "type": "groovy" + }, + "default": "test", + "source": "", + "target": "sn", + "transform": { + "globals": { + "test": null + }, + "source": "source.sn.toLowerCase();", + "type": "groovy" + } + }, + { + "condition": { + "globals": { + "test": null + }, + "source": "true;", + "type": "groovy" + }, + "default": "test", + "source": "givenName", + "target": "givenName", + "transform": { + "globals": { + "test": null + }, + "source": "source.toLowerCase();", + "type": "groovy" + } + }, + { + "condition": "(/object/_id eq \"hello\" and (/object/_id co \"test\" or /object/activeDate sw \"bye\"))", + "target": "userName" + } + ], + "result": { + "globals": { + "test": null + }, + "source": "// Recon script", + "type": "groovy" + }, + "source": "managed/user", + "sourceQuery": { + "_queryFilter": "_id co \"1\"" + }, + "syncAfter": [], + "target": "managed/user", + "targetQuery": { + "_queryFilter": "_id sw \"2\"" + }, + "validSource": { + "globals": { + "test": null + }, + "source": "// Validate source script", + "type": "groovy" + }, + "validTarget": { + "globals": { + "validate": null + }, + "source": "// Validate source script", + "type": "groovy" + } +} diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.correlationScript.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.correlationScript.js new file mode 100644 index 000000000..d974c581d --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.correlationScript.js @@ -0,0 +1 @@ +['test', 'default'] diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.json b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.json new file mode 100644 index 000000000..da6271abf --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.json @@ -0,0 +1,453 @@ +{ + "_id": "sync/UserToUserJavascriptSync", + "correlationScript": { + "file": "UserToUserJavascriptSync.correlationScript.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "displayName": "User Test Javascript Sync", + "linkQualifiers": { + "file": "UserToUserJavascriptSync.linkQualifiers.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "name": "UserToUserJavascriptSync", + "null": { + "file": "UserToUserJavascriptSync.null.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "onCreate": { + "file": "UserToUserJavascriptSync.onCreate.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "onDelete": { + "file": "UserToUserJavascriptSync.onDelete.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "onLink": { + "file": "UserToUserJavascriptSync.onLink.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "onUnlink": { + "file": "UserToUserJavascriptSync.onUnlink.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "onUpdate": { + "file": "UserToUserJavascriptSync.onUpdate.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "policies": [ + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform ambiguous", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When ambiguous", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete ambiguous", + "type": "text/javascript" + }, + "situation": "AMBIGUOUS" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform source missing", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When source missing", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete source missing", + "type": "text/javascript" + }, + "situation": "SOURCE_MISSING" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform missing", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When missing", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete missing", + "type": "text/javascript" + }, + "situation": "MISSING" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform found already linked", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When found already linked", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete found already linked", + "type": "text/javascript" + }, + "situation": "FOUND_ALREADY_LINKED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform unqualified", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When unqualified", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete unqualified", + "type": "text/javascript" + }, + "situation": "UNQUALIFIED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform unassigned", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When unassigned", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete unassigned", + "type": "text/javascript" + }, + "situation": "UNASSIGNED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform link_only", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When link_only", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete link_only", + "type": "text/javascript" + }, + "situation": "LINK_ONLY" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform target_ignored", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When target_ignored", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete target_ignored", + "type": "text/javascript" + }, + "situation": "TARGET_IGNORED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform source_ignored", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When source_ignored", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete source_ignored", + "type": "text/javascript" + }, + "situation": "SOURCE_IGNORED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform all_gone", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When all_gone", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete all_gone", + "type": "text/javascript" + }, + "situation": "ALL_GONE" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform confirmed", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When confirmed", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete confirmed", + "type": "text/javascript" + }, + "situation": "CONFIRMED" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform found", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When found", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete found", + "type": "text/javascript" + }, + "situation": "FOUND" + }, + { + "action": { + "globals": { + "test": null + }, + "source": "// Perform absent", + "type": "text/javascript" + }, + "condition": { + "globals": { + "test": null + }, + "source": "// When absent", + "type": "text/javascript" + }, + "postAction": { + "globals": { + "test": null + }, + "source": "// Complete absent", + "type": "text/javascript" + }, + "situation": "ABSENT" + } + ], + "properties": [ + { + "source": "mail", + "target": "mail" + }, + { + "condition": { + "globals": {}, + "source": "true;", + "type": "text/javascript" + }, + "default": "test", + "source": "", + "target": "sn", + "transform": { + "globals": { + "test": null + }, + "source": "source.sn.toLowerCase();", + "type": "text/javascript" + } + }, + { + "condition": { + "globals": { + "test": null + }, + "source": "true;", + "type": "text/javascript" + }, + "default": "test", + "source": "givenName", + "target": "givenName", + "transform": { + "globals": { + "test": null + }, + "source": "source.toLowerCase();", + "type": "text/javascript" + } + }, + { + "condition": "(/object/_id eq \"hello\" and (/object/_id co \"test\" or /object/activeDate sw \"bye\"))", + "target": "userName" + } + ], + "result": { + "file": "UserToUserJavascriptSync.result.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "source": "managed/user", + "sourceQuery": { + "_queryFilter": "_id co \"1\"" + }, + "syncAfter": [ + "UserToUserGroovySync" + ], + "target": "managed/user", + "targetQuery": { + "_queryFilter": "_id sw \"2\"" + }, + "validSource": { + "file": "UserToUserJavascriptSync.validSource.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "validTarget": { + "file": "UserToUserJavascriptSync.validTarget.js", + "globals": { + "validate": null + }, + "type": "text/javascript" + } +} diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.linkQualifiers.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.linkQualifiers.js new file mode 100644 index 000000000..142da9d1a --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.linkQualifiers.js @@ -0,0 +1,3 @@ +// Hello there! +// This is a test comment +[] diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.null.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.null.js new file mode 100644 index 000000000..140eea35f --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.null.js @@ -0,0 +1 @@ +// other diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onCreate.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onCreate.js new file mode 100644 index 000000000..d8777e1d2 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onCreate.js @@ -0,0 +1 @@ +// onCreate diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onDelete.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onDelete.js new file mode 100644 index 000000000..b467963a5 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onDelete.js @@ -0,0 +1 @@ +// onDelete diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onLink.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onLink.js new file mode 100644 index 000000000..cc4bdb1dc --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onLink.js @@ -0,0 +1 @@ +// onLink diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onUnlink.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onUnlink.js new file mode 100644 index 000000000..ad5abd076 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onUnlink.js @@ -0,0 +1 @@ +// onUnlink diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onUpdate.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onUpdate.js new file mode 100644 index 000000000..e4afb0636 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.onUpdate.js @@ -0,0 +1 @@ +// onUpdate diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.result.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.result.js new file mode 100644 index 000000000..228969a5a --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.result.js @@ -0,0 +1 @@ +// Recon script diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.validSource.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.validSource.js new file mode 100644 index 000000000..89ae0f671 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.validSource.js @@ -0,0 +1 @@ +// Validate source script diff --git a/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.validTarget.js b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.validTarget.js new file mode 100644 index 000000000..89ae0f671 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/sync/mappings/UserToUserJavascriptSync/UserToUserJavascriptSync.validTarget.js @@ -0,0 +1 @@ +// Validate source script diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/am_1076162899/recording.har new file mode 100644 index 000000000..467f6403f --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/am_1076162899/recording.har @@ -0,0 +1,631 @@ +{ + "log": { + "_recordingName": "config-manager/push/connector-mappings/0_D_m/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": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6d7f2019-69de-401c-a533-971107e89501" + }, + { + "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": 370, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 587, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 587, + "text": "{\"_id\":\"*\",\"_rev\":\"2075994313\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"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\":[],\"nodeDesignerXuiEnabled\":true}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:00:21 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "587" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2075994313\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:00:21.680Z", + "time": 41, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 41 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6d7f2019-69de-401c-a533-971107e89501" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "41ghjnKpNFAFU/HXw82HbFbitYNOOJ0g" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 497, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 167, + "content": { + "mimeType": "application/json", + "size": 167, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:00:21 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "167" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 693, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:00:21.732Z", + "time": 44, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 44 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 128, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6d7f2019-69de-401c-a533-971107e89501" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "128" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "https://platform.dev.trivir.com/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 289, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 289, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,ou=am-config\",\"realm\":\"/\",\"latestAccessTime\":\"2026-04-06T21:00:21Z\",\"maxIdleExpirationTime\":\"2026-04-06T21:30:21Z\",\"maxSessionExpirationTime\":\"2026-04-06T23:00:20Z\",\"properties\":{\"AMCtxId\":\"3e0f2007-073f-43c2-8d92-acd98238383a-387\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:00:21 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "289" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 610, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:00:21.784Z", + "time": 13, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 13 + } + }, + { + "_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": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6d7f2019-69de-401c-a533-971107e89501" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 520, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 257, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 257, + "text": "{\"_id\":\"version\",\"_rev\":\"-466575464\",\"version\":\"8.0.1\",\"fullVersion\":\"ForgeRock Access Management 8.0.1 Build b59bc0908346197b0c33afcb9e733d0400feeea1 (2025-April-15 11:37)\",\"revision\":\"b59bc0908346197b0c33afcb9e733d0400feeea1\",\"date\":\"2025-April-15 11:37\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:00:21 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "257" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-466575464\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:00:21.805Z", + "time": 11, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 11 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/oauth2_393036114/recording.har new file mode 100644 index 000000000..0a388bd53 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/oauth2_393036114/recording.har @@ -0,0 +1,289 @@ +{ + "log": { + "_recordingName": "config-manager/push/connector-mappings/0_D_m/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "a684e2f67fd67a4263878c3124af167a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 365, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6d7f2019-69de-401c-a533-971107e89501" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "content-length", + "value": "365" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 565, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&scope=fr:idm:* openid&response_type=code&client_id=idm-admin-ui&csrf=4MZYHySa6zYpF2lC9Gteq0nWiv0.*AAJTSQACMDIAAlNLABxGcVk1NkpYVWhpUE9rMDFma09yNVN0K1JzYzA9AAR0eXBlAANDVFMAAlMxAAIwMQ..*&decision=allow&code_challenge=Cliak3TDJqUu_XJdGEGzirVXwfnRJk-LER-BZqdO9YI&code_challenge_method=S256" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/authorize" + }, + "response": { + "bodySize": 0, + "content": { + "mimeType": "text/plain", + "size": 0 + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "expires": "1970-01-01T00:00:00.000Z", + "httpOnly": true, + "name": "OAUTH_REQUEST_ATTRIBUTES", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:00:21 GMT" + }, + { + "name": "content-length", + "value": "0" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "OAUTH_REQUEST_ATTRIBUTES=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "location", + "value": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=ZiAJxiTEV4z0oHisDSsLSo3Kvx0&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 673, + "httpVersion": "HTTP/1.1", + "redirectURL": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=ZiAJxiTEV4z0oHisDSsLSo3Kvx0&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui", + "status": 302, + "statusText": "Found" + }, + "startedDateTime": "2026-04-06T21:00:21.825Z", + "time": 39, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 39 + } + }, + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 224, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6d7f2019-69de-401c-a533-971107e89501" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "224" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "client_id=idm-admin-ui&redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&grant_type=authorization_code&code=ZiAJxiTEV4z0oHisDSsLSo3Kvx0&code_verifier=h7Ht8QEQTAsUcgwdluVXq8Fxlp80Vvz0cHhRccxVxBg" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1246, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1246, + "text": "{\"access_token\":\"\",\"scope\":\"openid fr:idm:*\",\"id_token\":\"\",\"token_type\":\"Bearer\",\"expires_in\":239}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:00:21 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1246" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 405, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:00:21.870Z", + "time": 108, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 108 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/openidm_3290118515/recording.har new file mode 100644 index 000000000..1d5d4acc7 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_D_m_314327836/openidm_3290118515/recording.har @@ -0,0 +1,171 @@ +{ + "log": { + "_recordingName": "config-manager/push/connector-mappings/0_D_m/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "d16951db0c99c25b96ee9837e48a4fe2", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 11569, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-6d7f2019-69de-401c-a533-971107e89501" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "11569" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 409, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"sync\",\"mappings\":[{\"_id\":\"sync/UserToUserGroovySync\",\"correlationScript\":{\"globals\":{\"test\":null},\"source\":\"['test', 'default']\",\"type\":\"groovy\"},\"displayName\":\"User Test Groovy Sync\",\"linkQualifiers\":{\"globals\":{\"test\":null},\"source\":\"// Hello there!\\n// This is a test comment\\n[]\",\"type\":\"groovy\"},\"name\":\"UserToUserGroovySync\",\"null\":{\"globals\":{\"test\":null},\"source\":\"// other\",\"type\":\"groovy\"},\"onCreate\":{\"globals\":{\"test\":null},\"source\":\"// onCreate\",\"type\":\"groovy\"},\"onDelete\":{\"globals\":{\"test\":null},\"source\":\"// onDelete\",\"type\":\"groovy\"},\"onLink\":{\"globals\":{\"test\":null},\"source\":\"// onLink\",\"type\":\"groovy\"},\"onUnlink\":{\"globals\":{\"test\":null},\"source\":\"// onUnlink\",\"type\":\"groovy\"},\"onUpdate\":{\"globals\":{\"test\":null},\"source\":\"// onUpdate\",\"type\":\"groovy\"},\"policies\":[{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform ambiguous\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When ambiguous\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete ambiguous\",\"type\":\"groovy\"},\"situation\":\"AMBIGUOUS\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source missing\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source missing\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source missing\",\"type\":\"groovy\"},\"situation\":\"SOURCE_MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform missing\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When missing\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete missing\",\"type\":\"groovy\"},\"situation\":\"MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found already linked\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found already linked\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found already linked\",\"type\":\"groovy\"},\"situation\":\"FOUND_ALREADY_LINKED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unqualified\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unqualified\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unqualified\",\"type\":\"groovy\"},\"situation\":\"UNQUALIFIED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unassigned\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unassigned\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unassigned\",\"type\":\"groovy\"},\"situation\":\"UNASSIGNED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform link_only\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When link_only\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete link_only\",\"type\":\"groovy\"},\"situation\":\"LINK_ONLY\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform target_ignored\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When target_ignored\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete target_ignored\",\"type\":\"groovy\"},\"situation\":\"TARGET_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source_ignored\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source_ignored\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source_ignored\",\"type\":\"groovy\"},\"situation\":\"SOURCE_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform all_gone\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When all_gone\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete all_gone\",\"type\":\"groovy\"},\"situation\":\"ALL_GONE\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform confirmed\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When confirmed\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete confirmed\",\"type\":\"groovy\"},\"situation\":\"CONFIRMED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found\",\"type\":\"groovy\"},\"situation\":\"FOUND\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform absent\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When absent\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete absent\",\"type\":\"groovy\"},\"situation\":\"ABSENT\"}],\"properties\":[{\"source\":\"mail\",\"target\":\"mail\"},{\"condition\":{\"globals\":{},\"source\":\"true;\",\"type\":\"groovy\"},\"default\":\"test\",\"source\":\"\",\"target\":\"sn\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.sn.toLowerCase();\",\"type\":\"groovy\"}},{\"condition\":{\"globals\":{\"test\":null},\"source\":\"true;\",\"type\":\"groovy\"},\"default\":\"test\",\"source\":\"givenName\",\"target\":\"givenName\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.toLowerCase();\",\"type\":\"groovy\"}},{\"condition\":\"(/object/_id eq \\\"hello\\\" and (/object/_id co \\\"test\\\" or /object/activeDate sw \\\"bye\\\"))\",\"target\":\"userName\"}],\"result\":{\"globals\":{\"test\":null},\"source\":\"// Recon script\",\"type\":\"groovy\"},\"source\":\"managed/user\",\"sourceQuery\":{\"_queryFilter\":\"_id co \\\"1\\\"\"},\"syncAfter\":[],\"target\":\"managed/user\",\"targetQuery\":{\"_queryFilter\":\"_id sw \\\"2\\\"\"},\"validSource\":{\"globals\":{\"test\":null},\"source\":\"// Validate source script\",\"type\":\"groovy\"},\"validTarget\":{\"globals\":{\"validate\":null},\"source\":\"// Validate source script\",\"type\":\"groovy\"}},{\"_id\":\"sync/UserToUserJavascriptSync\",\"correlationScript\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"['test', 'default']\\n\"},\"displayName\":\"User Test Javascript Sync\",\"linkQualifiers\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Hello there!\\n// This is a test comment\\n[]\\n\"},\"name\":\"UserToUserJavascriptSync\",\"null\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// other\\n\"},\"onCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onCreate\\n\"},\"onDelete\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onDelete\\n\"},\"onLink\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onLink\\n\"},\"onUnlink\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onUnlink\\n\"},\"onUpdate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onUpdate\\n\"},\"policies\":[{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform ambiguous\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When ambiguous\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete ambiguous\",\"type\":\"text/javascript\"},\"situation\":\"AMBIGUOUS\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source missing\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source missing\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source missing\",\"type\":\"text/javascript\"},\"situation\":\"SOURCE_MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform missing\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When missing\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete missing\",\"type\":\"text/javascript\"},\"situation\":\"MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found already linked\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found already linked\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found already linked\",\"type\":\"text/javascript\"},\"situation\":\"FOUND_ALREADY_LINKED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unqualified\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unqualified\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unqualified\",\"type\":\"text/javascript\"},\"situation\":\"UNQUALIFIED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unassigned\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unassigned\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unassigned\",\"type\":\"text/javascript\"},\"situation\":\"UNASSIGNED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform link_only\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When link_only\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete link_only\",\"type\":\"text/javascript\"},\"situation\":\"LINK_ONLY\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform target_ignored\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When target_ignored\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete target_ignored\",\"type\":\"text/javascript\"},\"situation\":\"TARGET_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source_ignored\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source_ignored\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source_ignored\",\"type\":\"text/javascript\"},\"situation\":\"SOURCE_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform all_gone\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When all_gone\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete all_gone\",\"type\":\"text/javascript\"},\"situation\":\"ALL_GONE\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform confirmed\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When confirmed\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete confirmed\",\"type\":\"text/javascript\"},\"situation\":\"CONFIRMED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found\",\"type\":\"text/javascript\"},\"situation\":\"FOUND\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform absent\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When absent\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete absent\",\"type\":\"text/javascript\"},\"situation\":\"ABSENT\"}],\"properties\":[{\"source\":\"mail\",\"target\":\"mail\"},{\"condition\":{\"globals\":{},\"source\":\"true;\",\"type\":\"text/javascript\"},\"default\":\"test\",\"source\":\"\",\"target\":\"sn\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.sn.toLowerCase();\",\"type\":\"text/javascript\"}},{\"condition\":{\"globals\":{\"test\":null},\"source\":\"true;\",\"type\":\"text/javascript\"},\"default\":\"test\",\"source\":\"givenName\",\"target\":\"givenName\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.toLowerCase();\",\"type\":\"text/javascript\"}},{\"condition\":\"(/object/_id eq \\\"hello\\\" and (/object/_id co \\\"test\\\" or /object/activeDate sw \\\"bye\\\"))\",\"target\":\"userName\"}],\"result\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Recon script\\n\"},\"source\":\"managed/user\",\"sourceQuery\":{\"_queryFilter\":\"_id co \\\"1\\\"\"},\"syncAfter\":[\"UserToUserGroovySync\"],\"target\":\"managed/user\",\"targetQuery\":{\"_queryFilter\":\"_id sw \\\"2\\\"\"},\"validSource\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Validate source script\\n\"},\"validTarget\":{\"globals\":{\"validate\":null},\"type\":\"text/javascript\",\"source\":\"// Validate source script\\n\"}}]}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/config/sync" + }, + "response": { + "bodySize": 11569, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 11569, + "text": "{\"_id\":\"sync\",\"mappings\":[{\"_id\":\"sync/UserToUserGroovySync\",\"correlationScript\":{\"globals\":{\"test\":null},\"source\":\"['test', 'default']\",\"type\":\"groovy\"},\"displayName\":\"User Test Groovy Sync\",\"linkQualifiers\":{\"globals\":{\"test\":null},\"source\":\"// Hello there!\\n// This is a test comment\\n[]\",\"type\":\"groovy\"},\"name\":\"UserToUserGroovySync\",\"null\":{\"globals\":{\"test\":null},\"source\":\"// other\",\"type\":\"groovy\"},\"onCreate\":{\"globals\":{\"test\":null},\"source\":\"// onCreate\",\"type\":\"groovy\"},\"onDelete\":{\"globals\":{\"test\":null},\"source\":\"// onDelete\",\"type\":\"groovy\"},\"onLink\":{\"globals\":{\"test\":null},\"source\":\"// onLink\",\"type\":\"groovy\"},\"onUnlink\":{\"globals\":{\"test\":null},\"source\":\"// onUnlink\",\"type\":\"groovy\"},\"onUpdate\":{\"globals\":{\"test\":null},\"source\":\"// onUpdate\",\"type\":\"groovy\"},\"policies\":[{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform ambiguous\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When ambiguous\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete ambiguous\",\"type\":\"groovy\"},\"situation\":\"AMBIGUOUS\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source missing\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source missing\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source missing\",\"type\":\"groovy\"},\"situation\":\"SOURCE_MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform missing\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When missing\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete missing\",\"type\":\"groovy\"},\"situation\":\"MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found already linked\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found already linked\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found already linked\",\"type\":\"groovy\"},\"situation\":\"FOUND_ALREADY_LINKED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unqualified\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unqualified\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unqualified\",\"type\":\"groovy\"},\"situation\":\"UNQUALIFIED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unassigned\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unassigned\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unassigned\",\"type\":\"groovy\"},\"situation\":\"UNASSIGNED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform link_only\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When link_only\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete link_only\",\"type\":\"groovy\"},\"situation\":\"LINK_ONLY\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform target_ignored\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When target_ignored\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete target_ignored\",\"type\":\"groovy\"},\"situation\":\"TARGET_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source_ignored\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source_ignored\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source_ignored\",\"type\":\"groovy\"},\"situation\":\"SOURCE_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform all_gone\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When all_gone\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete all_gone\",\"type\":\"groovy\"},\"situation\":\"ALL_GONE\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform confirmed\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When confirmed\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete confirmed\",\"type\":\"groovy\"},\"situation\":\"CONFIRMED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found\",\"type\":\"groovy\"},\"situation\":\"FOUND\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform absent\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When absent\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete absent\",\"type\":\"groovy\"},\"situation\":\"ABSENT\"}],\"properties\":[{\"source\":\"mail\",\"target\":\"mail\"},{\"condition\":{\"globals\":{},\"source\":\"true;\",\"type\":\"groovy\"},\"default\":\"test\",\"source\":\"\",\"target\":\"sn\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.sn.toLowerCase();\",\"type\":\"groovy\"}},{\"condition\":{\"globals\":{\"test\":null},\"source\":\"true;\",\"type\":\"groovy\"},\"default\":\"test\",\"source\":\"givenName\",\"target\":\"givenName\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.toLowerCase();\",\"type\":\"groovy\"}},{\"condition\":\"(/object/_id eq \\\"hello\\\" and (/object/_id co \\\"test\\\" or /object/activeDate sw \\\"bye\\\"))\",\"target\":\"userName\"}],\"result\":{\"globals\":{\"test\":null},\"source\":\"// Recon script\",\"type\":\"groovy\"},\"source\":\"managed/user\",\"sourceQuery\":{\"_queryFilter\":\"_id co \\\"1\\\"\"},\"syncAfter\":[],\"target\":\"managed/user\",\"targetQuery\":{\"_queryFilter\":\"_id sw \\\"2\\\"\"},\"validSource\":{\"globals\":{\"test\":null},\"source\":\"// Validate source script\",\"type\":\"groovy\"},\"validTarget\":{\"globals\":{\"validate\":null},\"source\":\"// Validate source script\",\"type\":\"groovy\"}},{\"_id\":\"sync/UserToUserJavascriptSync\",\"correlationScript\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"['test', 'default']\\n\"},\"displayName\":\"User Test Javascript Sync\",\"linkQualifiers\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Hello there!\\n// This is a test comment\\n[]\\n\"},\"name\":\"UserToUserJavascriptSync\",\"null\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// other\\n\"},\"onCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onCreate\\n\"},\"onDelete\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onDelete\\n\"},\"onLink\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onLink\\n\"},\"onUnlink\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onUnlink\\n\"},\"onUpdate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onUpdate\\n\"},\"policies\":[{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform ambiguous\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When ambiguous\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete ambiguous\",\"type\":\"text/javascript\"},\"situation\":\"AMBIGUOUS\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source missing\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source missing\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source missing\",\"type\":\"text/javascript\"},\"situation\":\"SOURCE_MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform missing\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When missing\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete missing\",\"type\":\"text/javascript\"},\"situation\":\"MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found already linked\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found already linked\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found already linked\",\"type\":\"text/javascript\"},\"situation\":\"FOUND_ALREADY_LINKED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unqualified\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unqualified\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unqualified\",\"type\":\"text/javascript\"},\"situation\":\"UNQUALIFIED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unassigned\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unassigned\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unassigned\",\"type\":\"text/javascript\"},\"situation\":\"UNASSIGNED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform link_only\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When link_only\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete link_only\",\"type\":\"text/javascript\"},\"situation\":\"LINK_ONLY\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform target_ignored\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When target_ignored\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete target_ignored\",\"type\":\"text/javascript\"},\"situation\":\"TARGET_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source_ignored\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source_ignored\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source_ignored\",\"type\":\"text/javascript\"},\"situation\":\"SOURCE_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform all_gone\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When all_gone\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete all_gone\",\"type\":\"text/javascript\"},\"situation\":\"ALL_GONE\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform confirmed\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When confirmed\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete confirmed\",\"type\":\"text/javascript\"},\"situation\":\"CONFIRMED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found\",\"type\":\"text/javascript\"},\"situation\":\"FOUND\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform absent\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When absent\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete absent\",\"type\":\"text/javascript\"},\"situation\":\"ABSENT\"}],\"properties\":[{\"source\":\"mail\",\"target\":\"mail\"},{\"condition\":{\"globals\":{},\"source\":\"true;\",\"type\":\"text/javascript\"},\"default\":\"test\",\"source\":\"\",\"target\":\"sn\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.sn.toLowerCase();\",\"type\":\"text/javascript\"}},{\"condition\":{\"globals\":{\"test\":null},\"source\":\"true;\",\"type\":\"text/javascript\"},\"default\":\"test\",\"source\":\"givenName\",\"target\":\"givenName\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.toLowerCase();\",\"type\":\"text/javascript\"}},{\"condition\":\"(/object/_id eq \\\"hello\\\" and (/object/_id co \\\"test\\\" or /object/activeDate sw \\\"bye\\\"))\",\"target\":\"userName\"}],\"result\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Recon script\\n\"},\"source\":\"managed/user\",\"sourceQuery\":{\"_queryFilter\":\"_id co \\\"1\\\"\"},\"syncAfter\":[\"UserToUserGroovySync\"],\"target\":\"managed/user\",\"targetQuery\":{\"_queryFilter\":\"_id sw \\\"2\\\"\"},\"validSource\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Validate source script\\n\"},\"validTarget\":{\"globals\":{\"validate\":null},\"type\":\"text/javascript\",\"source\":\"// Validate source script\\n\"}}]}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:00:21 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "location", + "value": "https://platform.dev.trivir.com/openidm/config/sync" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 707, + "httpVersion": "HTTP/1.1", + "redirectURL": "https://platform.dev.trivir.com/openidm/config/sync", + "status": 201, + "statusText": "Created" + }, + "startedDateTime": "2026-04-06T21:00:21.990Z", + "time": 80, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 80 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/am_1076162899/recording.har new file mode 100644 index 000000000..d3ad8afdb --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/am_1076162899/recording.har @@ -0,0 +1,631 @@ +{ + "log": { + "_recordingName": "config-manager/push/connector-mappings/0_n_D_m/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": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-83f3241d-9450-4a3c-ab56-0b237c483cc2" + }, + { + "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": 370, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 587, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 587, + "text": "{\"_id\":\"*\",\"_rev\":\"2075994313\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"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\":[],\"nodeDesignerXuiEnabled\":true}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:01:05 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "587" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2075994313\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 630, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:01:05.650Z", + "time": 51, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 51 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-83f3241d-9450-4a3c-ab56-0b237c483cc2" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "41ghjnKpNFAFU/HXw82HbFbitYNOOJ0g" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 497, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 167, + "content": { + "mimeType": "application/json", + "size": 167, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:01:05 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "167" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 693, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:01:05.711Z", + "time": 37, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 37 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 128, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-83f3241d-9450-4a3c-ab56-0b237c483cc2" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "128" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "https://platform.dev.trivir.com/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 289, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 289, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,ou=am-config\",\"realm\":\"/\",\"latestAccessTime\":\"2026-04-06T21:01:05Z\",\"maxIdleExpirationTime\":\"2026-04-06T21:31:05Z\",\"maxSessionExpirationTime\":\"2026-04-06T23:01:04Z\",\"properties\":{\"AMCtxId\":\"3e0f2007-073f-43c2-8d92-acd98238383a-482\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:01:05 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "289" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 610, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:01:05.757Z", + "time": 11, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 11 + } + }, + { + "_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": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-83f3241d-9450-4a3c-ab56-0b237c483cc2" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 520, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 257, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 257, + "text": "{\"_id\":\"version\",\"_rev\":\"-466575464\",\"version\":\"8.0.1\",\"fullVersion\":\"ForgeRock Access Management 8.0.1 Build b59bc0908346197b0c33afcb9e733d0400feeea1 (2025-April-15 11:37)\",\"revision\":\"b59bc0908346197b0c33afcb9e733d0400feeea1\",\"date\":\"2025-April-15 11:37\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:01:05 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "257" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-466575464\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:01:05.777Z", + "time": 11, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 11 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/oauth2_393036114/recording.har new file mode 100644 index 000000000..e2cbefb90 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/oauth2_393036114/recording.har @@ -0,0 +1,289 @@ +{ + "log": { + "_recordingName": "config-manager/push/connector-mappings/0_n_D_m/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "a684e2f67fd67a4263878c3124af167a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 365, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-83f3241d-9450-4a3c-ab56-0b237c483cc2" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "content-length", + "value": "365" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 565, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&scope=fr:idm:* openid&response_type=code&client_id=idm-admin-ui&csrf=usjoR2naxdTD_2l5iQjj-Xu9HVI.*AAJTSQACMDIAAlNLABxkSkVYd1Z5Y2g0MlpQTUpvMFF3SXJ5WGo3SUk9AAR0eXBlAANDVFMAAlMxAAIwMQ..*&decision=allow&code_challenge=KmvDx-UJVWqPJ3BOJOEE_9apaZuo0ofFoUZ_MNmGmjw&code_challenge_method=S256" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/authorize" + }, + "response": { + "bodySize": 0, + "content": { + "mimeType": "text/plain", + "size": 0 + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "expires": "1970-01-01T00:00:00.000Z", + "httpOnly": true, + "name": "OAUTH_REQUEST_ATTRIBUTES", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:01:05 GMT" + }, + { + "name": "content-length", + "value": "0" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "OAUTH_REQUEST_ATTRIBUTES=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "location", + "value": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=h4fYOXSX1nv21BQReS_n841EGbw&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 673, + "httpVersion": "HTTP/1.1", + "redirectURL": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=h4fYOXSX1nv21BQReS_n841EGbw&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui", + "status": 302, + "statusText": "Found" + }, + "startedDateTime": "2026-04-06T21:01:05.797Z", + "time": 40, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 40 + } + }, + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 224, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-83f3241d-9450-4a3c-ab56-0b237c483cc2" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "224" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "client_id=idm-admin-ui&redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&grant_type=authorization_code&code=h4fYOXSX1nv21BQReS_n841EGbw&code_verifier=EBnMxSDOQuyG16Bl2hHdpL0QNOdjtTeV4FltFjyCCUM" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1246, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1246, + "text": "{\"access_token\":\"\",\"scope\":\"openid fr:idm:*\",\"id_token\":\"\",\"token_type\":\"Bearer\",\"expires_in\":239}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:01:05 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1246" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 405, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:01:05.846Z", + "time": 91, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 91 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/openidm_3290118515/recording.har new file mode 100644 index 000000000..b694e4f56 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/connector-mappings_3036125768/0_n_D_m_1348920437/openidm_3290118515/recording.har @@ -0,0 +1,316 @@ +{ + "log": { + "_recordingName": "config-manager/push/connector-mappings/0_n_D_m/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "4c1fef66c916c8940b0315dddc564b06", + "_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": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-83f3241d-9450-4a3c-ab56-0b237c483cc2" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 386, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/config/sync" + }, + "response": { + "bodySize": 1660, + "content": { + "encoding": "base64", + "mimeType": "application/json;charset=utf-8", + "size": 1660, + "text": "[\"H4sIAAAAAAAA/82ab2/qNhTGv0qWN72Vqou2l90rLlDGRsPKn01XpYpMYqjvHDu1E+5Q1e8+Owk0rCF2sMMmVRXYzu+c89ROTh711fVR6N66fEcC98aNQBwjsuHu7eNraaaz4JDNqfw9ZJRud7N8eUAZgxgkiJJZwFCcuLev7gbTFcBcfkwgF0MkxfjtxuU0ZQEUxMcrOX5141yFcA1SnFw9CVayi+XkJuO7Yn2IeIzBzgORHJexnbm4zskzcIoUMCJ/PaQAozWCjGvF73ScXyDG1EmeIYM/LIkYmD8j7ogf4MhrnIBGESTJkjxWpkbec6pQRcbTTYTKHKpCUNJjECRQG7RfX8nqQwybsIr1layxUFyflK2u5CwIbkQq1lez4rCRVsX6ClZMMQoQzE8ACOTW1sX+DtmassgB0QptUpryKn5ASYiaUP98hqQeGVOedBtl2qNRLP/A9VyOkhTkWLd7/2U0XEwWMzFxri75mBMhzsU9xp44aq6BQmp4WabZZDHtDfz70Ww28oYGWlkXqR11NGUx12NNUxI6AIt7XLhz5I0AhvbE0aUbKKUboizb3WTh9f3ueDro9r/645H326BvoGFKXooHpUXpFFADxRTkslAL72HRHY/uRob6ALGbN8SuPHVMI3XqwMfidMXpG3pG2sgN61OCd/akqUUaKFPLLQsjD5Q/8cZfDXRJANvAxBd/CMps7hs110AhNbws07w7HQ7mvthBk6nRHsrH7Gul5ho//3W1Kp7/5loBjP0NJZUt6pktZA3RpIOswR41kOOxP5x4AwNNRN1rxCKbW6cWaaBKLbcsS2/i3Y2m90Z7JWstLDdDbXQ/Wu2OyZlZcfHObvHEnOSZnJeT0KPT8mU28Obu25OIxWgMWbJ/JT1AI4CwxGT38v13Kd6JYssJJSyFP1d6LrkhI5fISkqXlENxIr8xQLjUXUuC/MNnTj4ndEy/Q9YDHH66rkiipoQT7DOq2aAtJJmzVCrraPCc6hqW5n7q0NU3GCQdH4UOfHGW7rP0pZauA8S7wtFsQMWsDC4mKXP2U/KgbGEfyAfVd7FitYNL9/q6XFXKIcuKkpuJQZ4Jordpp1Bk6/Dc2avase97kYANDDsy1kHmhxSyneT7L/LTHcKJmL11D+X8uHQzyo4E3XU29/h0tKGPoPl4HTRT4KccuhVvDuGsyE+v2j/kJeD9lf903Rl8XuR5BN8WDKMAcptUeq+/gi3ILzrHfy2iJPDvpPPtQCqfigpjdknqrNj3hJrbsep0mvm0eaYfnNkPmqncWa28Mts2j6hj1OoxC9Aeq/ZsNbE5aI9V2beaUInZI9VOriY0Bx2wSlNXF5uBcmw7/u6/M7Bp9Faw7Tq+FQEuZf1a061BgBbMYIWC7bnC1vRrWbimirVtGFvTrXGY1ixkhaKX8JKtqapLt+0uKzRsz2a2qJwW3LLxrNStHQfammp6bLuetEKzNs1pa7o1CNCCXa1QsHXf2nLz0raMDaJcyNK21zXroK2a3KqeuRW325peemy7/rdCsRaMcLtNXqtdXbM2zqJHbu8IqsEWXXPV8buofV6RzH/oo3/IxthQb1TfZZ11VbH/S4tdy7Uqe++5c2Xfba/+B9ZLe/BaclR757kwDex4w1hvT2//APIxNgoxLQAA\"]" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:01:05 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Accept-Encoding, Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-encoding", + "value": "gzip" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 685, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:01:05.946Z", + "time": 48, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 48 + } + }, + { + "_id": "d16951db0c99c25b96ee9837e48a4fe2", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 11569, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-83f3241d-9450-4a3c-ab56-0b237c483cc2" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "11569" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 409, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"sync\",\"mappings\":[{\"_id\":\"sync/UserToUserGroovySync\",\"correlationScript\":{\"globals\":{\"test\":null},\"source\":\"['test', 'default']\",\"type\":\"groovy\"},\"displayName\":\"User Test Groovy Sync\",\"linkQualifiers\":{\"globals\":{\"test\":null},\"source\":\"// Hello there!\\n// This is a test comment\\n[]\",\"type\":\"groovy\"},\"name\":\"UserToUserGroovySync\",\"null\":{\"globals\":{\"test\":null},\"source\":\"// other\",\"type\":\"groovy\"},\"onCreate\":{\"globals\":{\"test\":null},\"source\":\"// onCreate\",\"type\":\"groovy\"},\"onDelete\":{\"globals\":{\"test\":null},\"source\":\"// onDelete\",\"type\":\"groovy\"},\"onLink\":{\"globals\":{\"test\":null},\"source\":\"// onLink\",\"type\":\"groovy\"},\"onUnlink\":{\"globals\":{\"test\":null},\"source\":\"// onUnlink\",\"type\":\"groovy\"},\"onUpdate\":{\"globals\":{\"test\":null},\"source\":\"// onUpdate\",\"type\":\"groovy\"},\"policies\":[{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform ambiguous\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When ambiguous\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete ambiguous\",\"type\":\"groovy\"},\"situation\":\"AMBIGUOUS\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source missing\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source missing\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source missing\",\"type\":\"groovy\"},\"situation\":\"SOURCE_MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform missing\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When missing\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete missing\",\"type\":\"groovy\"},\"situation\":\"MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found already linked\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found already linked\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found already linked\",\"type\":\"groovy\"},\"situation\":\"FOUND_ALREADY_LINKED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unqualified\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unqualified\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unqualified\",\"type\":\"groovy\"},\"situation\":\"UNQUALIFIED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unassigned\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unassigned\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unassigned\",\"type\":\"groovy\"},\"situation\":\"UNASSIGNED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform link_only\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When link_only\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete link_only\",\"type\":\"groovy\"},\"situation\":\"LINK_ONLY\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform target_ignored\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When target_ignored\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete target_ignored\",\"type\":\"groovy\"},\"situation\":\"TARGET_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source_ignored\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source_ignored\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source_ignored\",\"type\":\"groovy\"},\"situation\":\"SOURCE_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform all_gone\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When all_gone\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete all_gone\",\"type\":\"groovy\"},\"situation\":\"ALL_GONE\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform confirmed\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When confirmed\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete confirmed\",\"type\":\"groovy\"},\"situation\":\"CONFIRMED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found\",\"type\":\"groovy\"},\"situation\":\"FOUND\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform absent\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When absent\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete absent\",\"type\":\"groovy\"},\"situation\":\"ABSENT\"}],\"properties\":[{\"source\":\"mail\",\"target\":\"mail\"},{\"condition\":{\"globals\":{},\"source\":\"true;\",\"type\":\"groovy\"},\"default\":\"test\",\"source\":\"\",\"target\":\"sn\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.sn.toLowerCase();\",\"type\":\"groovy\"}},{\"condition\":{\"globals\":{\"test\":null},\"source\":\"true;\",\"type\":\"groovy\"},\"default\":\"test\",\"source\":\"givenName\",\"target\":\"givenName\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.toLowerCase();\",\"type\":\"groovy\"}},{\"condition\":\"(/object/_id eq \\\"hello\\\" and (/object/_id co \\\"test\\\" or /object/activeDate sw \\\"bye\\\"))\",\"target\":\"userName\"}],\"result\":{\"globals\":{\"test\":null},\"source\":\"// Recon script\",\"type\":\"groovy\"},\"source\":\"managed/user\",\"sourceQuery\":{\"_queryFilter\":\"_id co \\\"1\\\"\"},\"syncAfter\":[],\"target\":\"managed/user\",\"targetQuery\":{\"_queryFilter\":\"_id sw \\\"2\\\"\"},\"validSource\":{\"globals\":{\"test\":null},\"source\":\"// Validate source script\",\"type\":\"groovy\"},\"validTarget\":{\"globals\":{\"validate\":null},\"source\":\"// Validate source script\",\"type\":\"groovy\"}},{\"_id\":\"sync/UserToUserJavascriptSync\",\"correlationScript\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"['test', 'default']\\n\"},\"displayName\":\"User Test Javascript Sync\",\"linkQualifiers\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Hello there!\\n// This is a test comment\\n[]\\n\"},\"name\":\"UserToUserJavascriptSync\",\"null\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// other\\n\"},\"onCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onCreate\\n\"},\"onDelete\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onDelete\\n\"},\"onLink\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onLink\\n\"},\"onUnlink\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onUnlink\\n\"},\"onUpdate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onUpdate\\n\"},\"policies\":[{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform ambiguous\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When ambiguous\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete ambiguous\",\"type\":\"text/javascript\"},\"situation\":\"AMBIGUOUS\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source missing\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source missing\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source missing\",\"type\":\"text/javascript\"},\"situation\":\"SOURCE_MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform missing\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When missing\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete missing\",\"type\":\"text/javascript\"},\"situation\":\"MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found already linked\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found already linked\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found already linked\",\"type\":\"text/javascript\"},\"situation\":\"FOUND_ALREADY_LINKED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unqualified\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unqualified\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unqualified\",\"type\":\"text/javascript\"},\"situation\":\"UNQUALIFIED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unassigned\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unassigned\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unassigned\",\"type\":\"text/javascript\"},\"situation\":\"UNASSIGNED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform link_only\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When link_only\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete link_only\",\"type\":\"text/javascript\"},\"situation\":\"LINK_ONLY\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform target_ignored\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When target_ignored\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete target_ignored\",\"type\":\"text/javascript\"},\"situation\":\"TARGET_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source_ignored\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source_ignored\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source_ignored\",\"type\":\"text/javascript\"},\"situation\":\"SOURCE_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform all_gone\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When all_gone\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete all_gone\",\"type\":\"text/javascript\"},\"situation\":\"ALL_GONE\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform confirmed\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When confirmed\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete confirmed\",\"type\":\"text/javascript\"},\"situation\":\"CONFIRMED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found\",\"type\":\"text/javascript\"},\"situation\":\"FOUND\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform absent\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When absent\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete absent\",\"type\":\"text/javascript\"},\"situation\":\"ABSENT\"}],\"properties\":[{\"source\":\"mail\",\"target\":\"mail\"},{\"condition\":{\"globals\":{},\"source\":\"true;\",\"type\":\"text/javascript\"},\"default\":\"test\",\"source\":\"\",\"target\":\"sn\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.sn.toLowerCase();\",\"type\":\"text/javascript\"}},{\"condition\":{\"globals\":{\"test\":null},\"source\":\"true;\",\"type\":\"text/javascript\"},\"default\":\"test\",\"source\":\"givenName\",\"target\":\"givenName\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.toLowerCase();\",\"type\":\"text/javascript\"}},{\"condition\":\"(/object/_id eq \\\"hello\\\" and (/object/_id co \\\"test\\\" or /object/activeDate sw \\\"bye\\\"))\",\"target\":\"userName\"}],\"result\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Recon script\\n\"},\"source\":\"managed/user\",\"sourceQuery\":{\"_queryFilter\":\"_id co \\\"1\\\"\"},\"syncAfter\":[\"UserToUserGroovySync\"],\"target\":\"managed/user\",\"targetQuery\":{\"_queryFilter\":\"_id sw \\\"2\\\"\"},\"validSource\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Validate source script\\n\"},\"validTarget\":{\"globals\":{\"validate\":null},\"type\":\"text/javascript\",\"source\":\"// Validate source script\\n\"}}]}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/config/sync" + }, + "response": { + "bodySize": 11569, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 11569, + "text": "{\"_id\":\"sync\",\"mappings\":[{\"_id\":\"sync/UserToUserGroovySync\",\"correlationScript\":{\"globals\":{\"test\":null},\"source\":\"['test', 'default']\",\"type\":\"groovy\"},\"displayName\":\"User Test Groovy Sync\",\"linkQualifiers\":{\"globals\":{\"test\":null},\"source\":\"// Hello there!\\n// This is a test comment\\n[]\",\"type\":\"groovy\"},\"name\":\"UserToUserGroovySync\",\"null\":{\"globals\":{\"test\":null},\"source\":\"// other\",\"type\":\"groovy\"},\"onCreate\":{\"globals\":{\"test\":null},\"source\":\"// onCreate\",\"type\":\"groovy\"},\"onDelete\":{\"globals\":{\"test\":null},\"source\":\"// onDelete\",\"type\":\"groovy\"},\"onLink\":{\"globals\":{\"test\":null},\"source\":\"// onLink\",\"type\":\"groovy\"},\"onUnlink\":{\"globals\":{\"test\":null},\"source\":\"// onUnlink\",\"type\":\"groovy\"},\"onUpdate\":{\"globals\":{\"test\":null},\"source\":\"// onUpdate\",\"type\":\"groovy\"},\"policies\":[{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform ambiguous\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When ambiguous\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete ambiguous\",\"type\":\"groovy\"},\"situation\":\"AMBIGUOUS\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source missing\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source missing\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source missing\",\"type\":\"groovy\"},\"situation\":\"SOURCE_MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform missing\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When missing\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete missing\",\"type\":\"groovy\"},\"situation\":\"MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found already linked\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found already linked\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found already linked\",\"type\":\"groovy\"},\"situation\":\"FOUND_ALREADY_LINKED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unqualified\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unqualified\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unqualified\",\"type\":\"groovy\"},\"situation\":\"UNQUALIFIED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unassigned\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unassigned\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unassigned\",\"type\":\"groovy\"},\"situation\":\"UNASSIGNED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform link_only\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When link_only\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete link_only\",\"type\":\"groovy\"},\"situation\":\"LINK_ONLY\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform target_ignored\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When target_ignored\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete target_ignored\",\"type\":\"groovy\"},\"situation\":\"TARGET_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source_ignored\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source_ignored\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source_ignored\",\"type\":\"groovy\"},\"situation\":\"SOURCE_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform all_gone\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When all_gone\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete all_gone\",\"type\":\"groovy\"},\"situation\":\"ALL_GONE\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform confirmed\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When confirmed\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete confirmed\",\"type\":\"groovy\"},\"situation\":\"CONFIRMED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found\",\"type\":\"groovy\"},\"situation\":\"FOUND\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform absent\",\"type\":\"groovy\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When absent\",\"type\":\"groovy\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete absent\",\"type\":\"groovy\"},\"situation\":\"ABSENT\"}],\"properties\":[{\"source\":\"mail\",\"target\":\"mail\"},{\"condition\":{\"globals\":{},\"source\":\"true;\",\"type\":\"groovy\"},\"default\":\"test\",\"source\":\"\",\"target\":\"sn\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.sn.toLowerCase();\",\"type\":\"groovy\"}},{\"condition\":{\"globals\":{\"test\":null},\"source\":\"true;\",\"type\":\"groovy\"},\"default\":\"test\",\"source\":\"givenName\",\"target\":\"givenName\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.toLowerCase();\",\"type\":\"groovy\"}},{\"condition\":\"(/object/_id eq \\\"hello\\\" and (/object/_id co \\\"test\\\" or /object/activeDate sw \\\"bye\\\"))\",\"target\":\"userName\"}],\"result\":{\"globals\":{\"test\":null},\"source\":\"// Recon script\",\"type\":\"groovy\"},\"source\":\"managed/user\",\"sourceQuery\":{\"_queryFilter\":\"_id co \\\"1\\\"\"},\"syncAfter\":[],\"target\":\"managed/user\",\"targetQuery\":{\"_queryFilter\":\"_id sw \\\"2\\\"\"},\"validSource\":{\"globals\":{\"test\":null},\"source\":\"// Validate source script\",\"type\":\"groovy\"},\"validTarget\":{\"globals\":{\"validate\":null},\"source\":\"// Validate source script\",\"type\":\"groovy\"}},{\"_id\":\"sync/UserToUserJavascriptSync\",\"correlationScript\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"['test', 'default']\\n\"},\"displayName\":\"User Test Javascript Sync\",\"linkQualifiers\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Hello there!\\n// This is a test comment\\n[]\\n\"},\"name\":\"UserToUserJavascriptSync\",\"null\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// other\\n\"},\"onCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onCreate\\n\"},\"onDelete\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onDelete\\n\"},\"onLink\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onLink\\n\"},\"onUnlink\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onUnlink\\n\"},\"onUpdate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// onUpdate\\n\"},\"policies\":[{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform ambiguous\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When ambiguous\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete ambiguous\",\"type\":\"text/javascript\"},\"situation\":\"AMBIGUOUS\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source missing\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source missing\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source missing\",\"type\":\"text/javascript\"},\"situation\":\"SOURCE_MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform missing\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When missing\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete missing\",\"type\":\"text/javascript\"},\"situation\":\"MISSING\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found already linked\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found already linked\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found already linked\",\"type\":\"text/javascript\"},\"situation\":\"FOUND_ALREADY_LINKED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unqualified\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unqualified\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unqualified\",\"type\":\"text/javascript\"},\"situation\":\"UNQUALIFIED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform unassigned\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When unassigned\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete unassigned\",\"type\":\"text/javascript\"},\"situation\":\"UNASSIGNED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform link_only\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When link_only\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete link_only\",\"type\":\"text/javascript\"},\"situation\":\"LINK_ONLY\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform target_ignored\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When target_ignored\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete target_ignored\",\"type\":\"text/javascript\"},\"situation\":\"TARGET_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform source_ignored\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When source_ignored\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete source_ignored\",\"type\":\"text/javascript\"},\"situation\":\"SOURCE_IGNORED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform all_gone\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When all_gone\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete all_gone\",\"type\":\"text/javascript\"},\"situation\":\"ALL_GONE\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform confirmed\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When confirmed\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete confirmed\",\"type\":\"text/javascript\"},\"situation\":\"CONFIRMED\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform found\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When found\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete found\",\"type\":\"text/javascript\"},\"situation\":\"FOUND\"},{\"action\":{\"globals\":{\"test\":null},\"source\":\"// Perform absent\",\"type\":\"text/javascript\"},\"condition\":{\"globals\":{\"test\":null},\"source\":\"// When absent\",\"type\":\"text/javascript\"},\"postAction\":{\"globals\":{\"test\":null},\"source\":\"// Complete absent\",\"type\":\"text/javascript\"},\"situation\":\"ABSENT\"}],\"properties\":[{\"source\":\"mail\",\"target\":\"mail\"},{\"condition\":{\"globals\":{},\"source\":\"true;\",\"type\":\"text/javascript\"},\"default\":\"test\",\"source\":\"\",\"target\":\"sn\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.sn.toLowerCase();\",\"type\":\"text/javascript\"}},{\"condition\":{\"globals\":{\"test\":null},\"source\":\"true;\",\"type\":\"text/javascript\"},\"default\":\"test\",\"source\":\"givenName\",\"target\":\"givenName\",\"transform\":{\"globals\":{\"test\":null},\"source\":\"source.toLowerCase();\",\"type\":\"text/javascript\"}},{\"condition\":\"(/object/_id eq \\\"hello\\\" and (/object/_id co \\\"test\\\" or /object/activeDate sw \\\"bye\\\"))\",\"target\":\"userName\"}],\"result\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Recon script\\n\"},\"source\":\"managed/user\",\"sourceQuery\":{\"_queryFilter\":\"_id co \\\"1\\\"\"},\"syncAfter\":[\"UserToUserGroovySync\"],\"target\":\"managed/user\",\"targetQuery\":{\"_queryFilter\":\"_id sw \\\"2\\\"\"},\"validSource\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// Validate source script\\n\"},\"validTarget\":{\"globals\":{\"validate\":null},\"type\":\"text/javascript\",\"source\":\"// Validate source script\\n\"}}]}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 06 Apr 2026 21:01:05 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 644, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-06T21:01:06.009Z", + "time": 29, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 29 + } + } + ], + "pages": [], + "version": "1.2" + } +}