diff --git a/package.json b/package.json index fd4f3641..e2a6c854 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ "@adobe/aio-lib-ims": "^4.1.0", "@adobe/aio-lib-runtime": "^1.0.0-0", "@adobe/aio-lib-web": "^4.0.0", - "@adobe/generator-aio-app": "^1.7.0", - "@adobe/generator-aio-console": "^1.1.1", + "@adobe/generator-aio-app": "^1.9.0", + "@adobe/generator-aio-console": "^1.2.0", "@oclif/command": "^1.5.11", "@oclif/config": "^1.12.9", "@oclif/plugin-help": "^2.2.3", diff --git a/src/commands/app/add/action.js b/src/commands/app/add/action.js index 62f8abeb..7b68a243 100644 --- a/src/commands/app/add/action.js +++ b/src/commands/app/add/action.js @@ -14,6 +14,7 @@ const yeoman = require('yeoman-environment') const aioLogger = require('@adobe/aio-lib-core-logging')('@adobe/aio-cli-plugin-app:add:action', { provider: 'debug' }) const { flags } = require('@oclif/command') +const { servicesToGeneratorInput } = require('../../../lib/app-helper') const config = require('@adobe/aio-lib-core-config') class AddActionCommand extends BaseCommand { @@ -22,7 +23,11 @@ class AddActionCommand extends BaseCommand { aioLogger.debug(`adding component ${args.component} to the project, using flags: ${flags}`) - const services = (config.get('services') || config.get('project.workspace.details.services') || []).map(s => s.code).join(',') + const workspaceServices = + config.get('services') || // legacy + config.get('project.workspace.details.services') || + [] + const supportedOrgServices = config.get('project.org.details.services') || [] const generator = '@adobe/generator-aio-app/generators/add-action' const env = yeoman.createEnv() @@ -30,7 +35,8 @@ class AddActionCommand extends BaseCommand { const res = await env.run('gen', { 'skip-install': flags['skip-install'], 'skip-prompt': flags.yes, - 'adobe-services': services + 'adobe-services': servicesToGeneratorInput(workspaceServices), + 'supported-adobe-services': servicesToGeneratorInput(supportedOrgServices) }) return res } diff --git a/src/commands/app/init.js b/src/commands/app/init.js index 4247338f..60858b49 100644 --- a/src/commands/app/init.js +++ b/src/commands/app/init.js @@ -15,9 +15,10 @@ const path = require('path') const fs = require('fs-extra') const aioLogger = require('@adobe/aio-lib-core-logging')('@adobe/aio-cli-plugin-app:init', { provider: 'debug' }) const { flags } = require('@oclif/command') -const { loadAndValidateConfigFile, importConfigJson, writeAio } = require('../../lib/import') +const { loadAndValidateConfigFile, importConfigJson } = require('../../lib/import') const { getCliInfo } = require('../../lib/app-helper') const chalk = require('chalk') +const { servicesToGeneratorInput } = require('../../lib/app-helper') const SERVICE_API_KEY_ENV = 'SERVICE_API_KEY' @@ -42,8 +43,10 @@ class InitCommand extends BaseCommand { // default project name and services let projectName = path.basename(process.cwd()) - // list of supported service templates - let services = 'AdobeTargetSDK,AdobeAnalyticsSDK,CampaignSDK,McDataServicesSdk,AudienceManagerCustomerSDK,AssetComputeSDK' + // list of services added to the workspace + let workspaceServices = [] + // list of services supported by the organization + let supportedServices = [] // client id of the console's workspace jwt credentials let serviceClientId = '' @@ -74,9 +77,11 @@ class InitCommand extends BaseCommand { if (flags.import) { const { values: config } = loadAndValidateConfigFile(flags.import) - projectName = config.project.name - services = config.project.workspace.details.services.map(s => s.code).join(',') || '' - const jwtConfig = config.project.workspace.details.credentials && config.project.workspace.details.credentials.find(c => c.jwt) + const project = config.project + projectName = project.name + workspaceServices = project.workspace.details.services + supportedServices = project.org.details.services + const jwtConfig = project.workspace.details.credentials && project.workspace.details.credentials.find(c => c.jwt) serviceClientId = (jwtConfig && jwtConfig.jwt.client_id) || serviceClientId // defaults to '' } @@ -88,7 +93,8 @@ class InitCommand extends BaseCommand { 'skip-install': flags['skip-install'], 'skip-prompt': flags.yes, 'project-name': projectName, - 'adobe-services': services + 'adobe-services': servicesToGeneratorInput(workspaceServices), + 'supported-adobe-services': servicesToGeneratorInput(supportedServices) }) // config import @@ -100,11 +106,6 @@ class InitCommand extends BaseCommand { if (deleteConsoleCredentials) { fs.unlinkSync(flags.import) } - } else { - // write default services value to .aio - await writeAio({ - services: services.split(',').map(code => ({ code })) - }, process.cwd(), { merge, interactive }) } // finalize configuration data diff --git a/src/commands/app/use.js b/src/commands/app/use.js index 2a921035..1b7a5124 100644 --- a/src/commands/app/use.js +++ b/src/commands/app/use.js @@ -77,7 +77,8 @@ class Use extends BaseCommand { } const { values: config } = loadAndValidateConfigFile(filePath) - const jwtConfig = config.project.workspace.details.credentials && config.project.workspace.details.credentials.find(c => c.jwt) + const project = config.project + const jwtConfig = project.workspace.details.credentials && project.workspace.details.credentials.find(c => c.jwt) const serviceClientId = (jwtConfig && jwtConfig.jwt.client_id) || '' const extraEnvVars = { [SERVICE_API_KEY_ENV]: serviceClientId } diff --git a/src/lib/app-helper.js b/src/lib/app-helper.js index e9353716..ef10ed97 100644 --- a/src/lib/app-helper.js +++ b/src/lib/app-helper.js @@ -341,6 +341,17 @@ function saveAndReplaceDotEnvCredentials (dotenvFile, saveFile, apihost, namespa fs.writeFileSync(dotenvFile, envContent) } +/** + * + * Converts a service array to an input string that can be consumed by generator-aio-app + * + * @param {Array} services array of services [{ code: 'xxx', name: 'xxx' }, ...] + * @returns {string} 'code1,code2,code3' + */ +function servicesToGeneratorInput (services) { + return services.map(s => s.code).filter(s => s).join(',') +} + module.exports = { isNpmInstalled, isGitInstalled, @@ -359,5 +370,6 @@ module.exports = { writeConfig, downloadOWJar, runOpenWhiskJar, - saveAndReplaceDotEnvCredentials + saveAndReplaceDotEnvCredentials, + servicesToGeneratorInput } diff --git a/src/lib/import.js b/src/lib/import.js index 7965b012..ce792e91 100644 --- a/src/lib/import.js +++ b/src/lib/import.js @@ -298,7 +298,7 @@ function mergeJson (oldData, newData) { */ function mergeData (oldData, newData, fileFormat) { aioLogger.debug(`mergeData - oldData: ${oldData}`) - aioLogger.debug(`mergeData - newData:${newData}`) + aioLogger.debug(`mergeData - newData: ${newData}`) if (fileFormat === FILE_FORMAT_ENV) { return mergeEnv(oldData, newData) @@ -329,7 +329,7 @@ async function writeFile (destination, data, flags = {}) { if (interactive) { answer = await checkFileConflict(destination) - aioLogger.debug(`writeEnv - answer (interactive): ${JSON.stringify(answer)}`) + aioLogger.debug(`writeFile - answer (interactive): ${JSON.stringify(answer)}`) } if (answer.abort) { diff --git a/test/commands/app/add/action.test.js b/test/commands/app/add/action.test.js index fb129a5d..6fa41324 100644 --- a/test/commands/app/add/action.test.js +++ b/test/commands/app/add/action.test.js @@ -68,7 +68,8 @@ describe('good flags', () => { expect(mockRun).toHaveBeenCalledWith(genName, { 'skip-prompt': true, 'skip-install': false, - 'adobe-services': '' + 'adobe-services': '', + 'supported-adobe-services': '' }) }) @@ -81,7 +82,8 @@ describe('good flags', () => { expect(mockRun).toHaveBeenCalledWith(genName, { 'skip-prompt': true, 'skip-install': true, - 'adobe-services': '' + 'adobe-services': '', + 'supported-adobe-services': '' }) }) @@ -94,7 +96,8 @@ describe('good flags', () => { expect(mockRun).toHaveBeenCalledWith(genName, { 'skip-prompt': false, 'skip-install': true, - 'adobe-services': '' + 'adobe-services': '', + 'supported-adobe-services': '' }) }) test('no flags', async () => { @@ -106,12 +109,22 @@ describe('good flags', () => { expect(mockRun).toHaveBeenCalledWith(genName, { 'skip-prompt': false, 'skip-install': false, - 'adobe-services': '' + 'adobe-services': '', + 'supported-adobe-services': '' }) }) test('pass services config codes to generator-aio-app', async () => { - config.get.mockReturnValue([{ code: 'CampaignSDK' }, { code: 'AdobeAnalyticsSDK' }]) + config.get.mockImplementation(c => { + if (c === 'project.org.details.services') { + // supported services + return [{ code: 'CampaignSDK' }, { code: 'AdobeAnalyticsSDK' }, { code: 'AnotherOneSDK' }] + } else if (c === 'project.workspace.details.services') { + // added to workspace + return [{ code: 'CampaignSDK' }, { code: 'AdobeAnalyticsSDK' }] + } + return undefined + }) await TheCommand.run([]) @@ -121,17 +134,21 @@ describe('good flags', () => { expect(mockRun).toHaveBeenCalledWith(genName, { 'skip-prompt': false, 'skip-install': false, - 'adobe-services': 'CampaignSDK,AdobeAnalyticsSDK' + 'adobe-services': 'CampaignSDK,AdobeAnalyticsSDK', + 'supported-adobe-services': 'CampaignSDK,AdobeAnalyticsSDK,AnotherOneSDK' }) }) - test('pass services config codes from imported config to generator-aio-app', async () => { - config.get.mockImplementation((key) => { - if (key === 'services') { - return undefined - } else if (key === 'project.workspace.details.services') { + test('pass services config codes from legacy service config key to generator-aio-app', async () => { + config.get.mockImplementation(c => { + if (c === 'project.org.details.services') { + // supported services + return [{ code: 'CampaignSDK' }, { code: 'AdobeAnalyticsSDK' }, { code: 'AnotherOneSDK' }] + } else if (c === 'services') { + // added to workspace return [{ code: 'CampaignSDK' }, { code: 'AdobeAnalyticsSDK' }] } + return undefined }) await TheCommand.run([]) @@ -142,7 +159,8 @@ describe('good flags', () => { expect(mockRun).toHaveBeenCalledWith(genName, { 'skip-prompt': false, 'skip-install': false, - 'adobe-services': 'CampaignSDK,AdobeAnalyticsSDK' + 'adobe-services': 'CampaignSDK,AdobeAnalyticsSDK', + 'supported-adobe-services': 'CampaignSDK,AdobeAnalyticsSDK,AnotherOneSDK' }) }) }) diff --git a/test/commands/app/init.test.js b/test/commands/app/init.test.js index 32c9a8c1..948bb505 100644 --- a/test/commands/app/init.test.js +++ b/test/commands/app/init.test.js @@ -96,15 +96,6 @@ describe('template module cannot be registered', () => { }) }) -const fullServicesJson = [ - { code: 'AdobeTargetSDK' }, - { code: 'AdobeAnalyticsSDK' }, - { code: 'CampaignSDK' }, - { code: 'McDataServicesSdk' }, - { code: 'AudienceManagerCustomerSDK' }, - { code: 'AssetComputeSDK' } -] - const fakeCredentials = [ { id: '1', @@ -115,18 +106,48 @@ const fakeCredentials = [ jwt: { client_id: 'fakeId123' } } ] -/** @private */ -function getFullServicesList () { - return fullServicesJson.map(s => s.code).join(',') -} + +const fakeWorkspaceServices = [ + { + code: 'service1SDK', + name: 'the first fake service' + }, + { + code: 'service2SDK', + name: 'the second fake service' + } +] +const fakeSupportedServices = [ + { + code: 'service1SDK', + name: 'the first fake service' + }, + { + code: 'service2SDK', + name: 'the second fake service' + }, + { + code: 'service3SDK', + name: 'the third fake service' + }, + { + code: 'service4SDK', + name: 'the fourth fake service' + } +] /** @private */ -function mockValidConfig ({ name = 'lifeisgood', services = fullServicesJson, credentials = fakeCredentials } = {}) { +function mockValidConfig ({ name = 'lifeisgood', workspaceServices = fakeWorkspaceServices, supportedServices = fakeSupportedServices, credentials = fakeCredentials } = {}) { const project = { name, + org: { + details: { + services: supportedServices + } + }, workspace: { details: { - services, + services: workspaceServices, credentials } } @@ -173,7 +194,8 @@ describe('run', () => { 'skip-prompt': true, 'skip-install': false, 'project-name': appFolder, - 'adobe-services': getFullServicesList() + 'adobe-services': '', + 'supported-adobe-services': '' }) expect(fs.ensureDirSync).toHaveBeenCalledWith(expect.stringContaining('some-path')) expect(spyChdir).toHaveBeenCalledWith(expect.stringContaining('some-path')) @@ -193,7 +215,8 @@ describe('run', () => { 'skip-prompt': true, 'skip-install': true, 'project-name': appFolder, - 'adobe-services': getFullServicesList() + 'adobe-services': '', + 'supported-adobe-services': '' }) expect(fs.ensureDirSync).toHaveBeenCalledWith(expect.stringContaining('some-path')) expect(spyChdir).toHaveBeenCalledWith(expect.stringContaining('some-path')) @@ -212,7 +235,8 @@ describe('run', () => { 'skip-prompt': true, 'skip-install': false, 'project-name': project.name, - 'adobe-services': getFullServicesList() + 'adobe-services': '', + 'supported-adobe-services': '' }) expect(fs.ensureDirSync).not.toHaveBeenCalled() expect(spyChdir).not.toHaveBeenCalled() @@ -231,7 +255,8 @@ describe('run', () => { 'skip-prompt': false, 'skip-install': false, 'project-name': project.name, - 'adobe-services': getFullServicesList() + 'adobe-services': '', + 'supported-adobe-services': '' }) expect(fs.ensureDirSync).not.toHaveBeenCalled() expect(spyChdir).not.toHaveBeenCalled() @@ -250,7 +275,8 @@ describe('run', () => { 'skip-prompt': true, 'skip-install': true, 'project-name': project.name, - 'adobe-services': getFullServicesList() + 'adobe-services': '', + 'supported-adobe-services': '' }) expect(fs.ensureDirSync).not.toHaveBeenCalled() expect(spyChdir).not.toHaveBeenCalled() @@ -274,7 +300,8 @@ describe('run', () => { 'skip-prompt': false, 'skip-install': true, 'project-name': project.name, - 'adobe-services': getFullServicesList() + 'adobe-services': 'service1SDK,service2SDK', + 'supported-adobe-services': 'service1SDK,service2SDK,service3SDK,service4SDK' }) expect(fs.ensureDirSync).not.toHaveBeenCalled() expect(spyChdir).not.toHaveBeenCalled() @@ -295,7 +322,8 @@ describe('run', () => { 'skip-prompt': false, 'skip-install': true, 'project-name': project.name, - 'adobe-services': getFullServicesList() + 'adobe-services': '', + 'supported-adobe-services': '' }) expect(fs.ensureDirSync).not.toHaveBeenCalled() expect(spyChdir).not.toHaveBeenCalled() @@ -322,7 +350,86 @@ describe('run', () => { 'skip-prompt': false, 'skip-install': false, 'project-name': project.name, - 'adobe-services': getFullServicesList() + 'adobe-services': 'service1SDK,service2SDK', + 'supported-adobe-services': 'service1SDK,service2SDK,service3SDK,service4SDK' + }) + expect(fs.unlinkSync).toHaveBeenCalledWith('console.json') + }) + + test('no path, no supported services in console config file', async () => { + const project = mockValidConfig({ supportedServices: [] }) + await TheCommand.run([]) + + expect(fs.ensureDirSync).not.toHaveBeenCalled() + expect(spyChdir).not.toHaveBeenCalled() + + expect(yeoman.createEnv).toHaveBeenCalled() + expect(mockRegister).toHaveBeenCalledTimes(2) + const genConsole = mockRegister.mock.calls[0][1] + expect(mockRun).toHaveBeenNthCalledWith(1, genConsole, { + 'access-token': mockAccessToken, + 'destination-file': 'console.json', + 'ims-env': 'prod' + }) + const genApp = mockRegister.mock.calls[1][1] + expect(mockRun).toHaveBeenNthCalledWith(2, genApp, { + 'skip-prompt': false, + 'skip-install': false, + 'project-name': project.name, + 'adobe-services': 'service1SDK,service2SDK', + 'supported-adobe-services': '' + }) + expect(fs.unlinkSync).toHaveBeenCalledWith('console.json') + }) + + test('no path, no workspace services in console config file', async () => { + const project = mockValidConfig({ workspaceServices: [] }) + await TheCommand.run([]) + + expect(fs.ensureDirSync).not.toHaveBeenCalled() + expect(spyChdir).not.toHaveBeenCalled() + + expect(yeoman.createEnv).toHaveBeenCalled() + expect(mockRegister).toHaveBeenCalledTimes(2) + const genConsole = mockRegister.mock.calls[0][1] + expect(mockRun).toHaveBeenNthCalledWith(1, genConsole, { + 'access-token': mockAccessToken, + 'destination-file': 'console.json', + 'ims-env': 'prod' + }) + const genApp = mockRegister.mock.calls[1][1] + expect(mockRun).toHaveBeenNthCalledWith(2, genApp, { + 'skip-prompt': false, + 'skip-install': false, + 'project-name': project.name, + 'adobe-services': '', + 'supported-adobe-services': 'service1SDK,service2SDK,service3SDK,service4SDK' + }) + expect(fs.unlinkSync).toHaveBeenCalledWith('console.json') + }) + + test('no path, no services at all in console config file', async () => { + const project = mockValidConfig({ workspaceServices: [], supportedServices: [] }) + await TheCommand.run([]) + + expect(fs.ensureDirSync).not.toHaveBeenCalled() + expect(spyChdir).not.toHaveBeenCalled() + + expect(yeoman.createEnv).toHaveBeenCalled() + expect(mockRegister).toHaveBeenCalledTimes(2) + const genConsole = mockRegister.mock.calls[0][1] + expect(mockRun).toHaveBeenNthCalledWith(1, genConsole, { + 'access-token': mockAccessToken, + 'destination-file': 'console.json', + 'ims-env': 'prod' + }) + const genApp = mockRegister.mock.calls[1][1] + expect(mockRun).toHaveBeenNthCalledWith(2, genApp, { + 'skip-prompt': false, + 'skip-install': false, + 'project-name': project.name, + 'adobe-services': '', + 'supported-adobe-services': '' }) expect(fs.unlinkSync).toHaveBeenCalledWith('console.json') }) @@ -347,7 +454,8 @@ describe('run', () => { 'skip-prompt': false, 'skip-install': false, 'project-name': project.name, - 'adobe-services': getFullServicesList() + 'adobe-services': 'service1SDK,service2SDK', + 'supported-adobe-services': 'service1SDK,service2SDK,service3SDK,service4SDK' }) // we changed dir, console.json is in cwd @@ -377,13 +485,9 @@ describe('run', () => { 'skip-prompt': false, 'skip-install': false, 'project-name': project.name, - 'adobe-services': getFullServicesList() + 'adobe-services': '', + 'supported-adobe-services': '' }) - expect(importLib.writeAio).toHaveBeenCalledWith( - { services: fullServicesJson }, - process.cwd(), - { interactive: false, merge: true } - ) expect(fs.unlinkSync).not.toHaveBeenCalled() }) @@ -395,7 +499,7 @@ describe('run', () => { test('no-path --import file={name: lifeisgood, services:AdobeTargetSDK,CampaignSDK, credentials:fake,jwt}', async () => { const project = mockValidConfig({ name: 'lifeisgood', - services: [{ code: 'AdobeTargetSDK' }, { code: 'CampaignSDK' }] + workspaceServices: [{ code: 'AdobeTargetSDK' }, { code: 'CampaignSDK' }] }) await TheCommand.run(['--import', 'config.json']) @@ -410,7 +514,8 @@ describe('run', () => { 'skip-prompt': false, 'skip-install': false, 'project-name': project.name, - 'adobe-services': 'AdobeTargetSDK,CampaignSDK' + 'adobe-services': 'AdobeTargetSDK,CampaignSDK', + 'supported-adobe-services': 'service1SDK,service2SDK,service3SDK,service4SDK' }) expect(importLib.importConfigJson).toHaveBeenCalledWith(path.resolve('config.json'), @@ -420,10 +525,10 @@ describe('run', () => { expect(fs.unlinkSync).not.toHaveBeenCalled() }) - test('no-path --import file={name: lifeisgood, services:AdobeTargetSDK,CampaignSDK, credentials:fake}', async () => { + test('no-path --import file={name: lifeisgood, workspaceServices:AdobeTargetSDK,CampaignSDK, credentials:fake}', async () => { const project = mockValidConfig({ name: 'lifeisgood', - services: [{ code: 'AdobeTargetSDK' }, { code: 'CampaignSDK' }], + workspaceServices: [{ code: 'AdobeTargetSDK' }, { code: 'CampaignSDK' }], credentials: [{ id: '1', fake: { client_id: 'notjwtId' } }] }) await TheCommand.run(['--import', 'config.json']) @@ -439,7 +544,8 @@ describe('run', () => { 'skip-prompt': false, 'skip-install': false, 'project-name': project.name, - 'adobe-services': 'AdobeTargetSDK,CampaignSDK' + 'adobe-services': 'AdobeTargetSDK,CampaignSDK', + 'supported-adobe-services': 'service1SDK,service2SDK,service3SDK,service4SDK' }) expect(importLib.importConfigJson).toHaveBeenCalledWith(path.resolve('config.json'), @@ -449,10 +555,10 @@ describe('run', () => { expect(fs.unlinkSync).not.toHaveBeenCalled() }) - test('no-path --import file={name: lifeisgood, services:AdobeTargetSDK,CampaignSDK, credentials:null}', async () => { + test('no-path --import file={name: lifeisgood, workspaceServices:AdobeTargetSDK,CampaignSDK, credentials:null}', async () => { const project = mockValidConfig({ name: 'lifeisgood', - services: [{ code: 'AdobeTargetSDK' }, { code: 'CampaignSDK' }], + workspaceServices: [{ code: 'AdobeTargetSDK' }, { code: 'CampaignSDK' }], credentials: null }) await TheCommand.run(['--import', 'config.json']) @@ -468,7 +574,8 @@ describe('run', () => { 'skip-prompt': false, 'skip-install': false, 'project-name': project.name, - 'adobe-services': 'AdobeTargetSDK,CampaignSDK' + 'adobe-services': 'AdobeTargetSDK,CampaignSDK', + 'supported-adobe-services': 'service1SDK,service2SDK,service3SDK,service4SDK' }) expect(importLib.importConfigJson).toHaveBeenCalledWith(path.resolve('config.json'), @@ -478,10 +585,10 @@ describe('run', () => { expect(fs.unlinkSync).not.toHaveBeenCalled() }) - test('no-path --yes --import file={name: lifeisgood, services:AdobeTargetSDK,CampaignSDK, credentials:fake,jwt}', async () => { + test('no-path --yes --import file={name: lifeisgood, supportedServices:AdobeTargetSDK,CampaignSDK, credentials:fake,jwt}', async () => { const project = mockValidConfig({ name: 'lifeisgood', - services: [{ code: 'AdobeTargetSDK' }, { code: 'CampaignSDK' }] + supportedServices: [{ code: 'AdobeTargetSDK' }, { code: 'CampaignSDK' }] }) await TheCommand.run(['--yes', '--import', 'config.json']) @@ -496,7 +603,8 @@ describe('run', () => { 'skip-prompt': true, 'skip-install': false, 'project-name': project.name, - 'adobe-services': 'AdobeTargetSDK,CampaignSDK' + 'adobe-services': 'service1SDK,service2SDK', + 'supported-adobe-services': 'AdobeTargetSDK,CampaignSDK' }) expect(importLib.importConfigJson).toHaveBeenCalledWith(path.resolve('config.json'), process.cwd(), @@ -505,31 +613,6 @@ describe('run', () => { expect(fs.unlinkSync).not.toHaveBeenCalled() }) - test('some-path --import file={name: lifeisgood, services:undefined, credentials:fake,jwt}', async () => { - const project = mockValidConfig({ name: 'lifeisgood', services: [] }) - await TheCommand.run(['some-path', '--import', 'config.json']) - - // no args.path - expect(fs.ensureDirSync).toHaveBeenCalledWith(expect.stringContaining('some-path')) - expect(spyChdir).toHaveBeenCalledWith(expect.stringContaining('some-path')) - - expect(yeoman.createEnv).toHaveBeenCalled() - expect(mockRegister).toHaveBeenCalledTimes(1) - const genName = mockRegister.mock.calls[0][1] - expect(mockRun).toHaveBeenCalledWith(genName, { - 'skip-prompt': false, - 'skip-install': false, - 'project-name': project.name, - 'adobe-services': '' - }) - - // Note here path.resolve uses another cwd than the mocked process.cwd - expect(importLib.importConfigJson).toHaveBeenCalledWith(path.resolve('config.json'), - process.cwd(), - { interactive: false, merge: true }, - { SERVICE_API_KEY: 'fakeId123' }) - }) - test('some-path --import ../fake/config.json', async () => { await TheCommand.run(['some-path', '--import', '../fake/config.json']) // Note here path.resolve uses another cwd than the mocked process.cwd