From c3dbda51dbc3b810eee3fa309f2b6927ff64c772 Mon Sep 17 00:00:00 2001 From: lohit Date: Wed, 10 Jul 2024 11:21:58 +0530 Subject: [PATCH] fix/collection export import (#2601) * pr review changes * collection root object in export json * import environment updates * tests run execution order fix for collection runs * headers schema update, export only required parts of request * update auth in object spread * docs not present in folder level settings * docs not present in folder level settings --------- Co-authored-by: Anoop M D --- .../bruno-app/src/utils/collections/index.js | 119 ++++++++++++++---- .../bruno-electron/src/ipc/network/index.js | 4 +- .../bruno-schema/src/collections/index.js | 8 +- 3 files changed, 101 insertions(+), 30 deletions(-) diff --git a/packages/bruno-app/src/utils/collections/index.js b/packages/bruno-app/src/utils/collections/index.js index 33ef3c1563..ef519d51c7 100644 --- a/packages/bruno-app/src/utils/collections/index.js +++ b/packages/bruno-app/src/utils/collections/index.js @@ -383,17 +383,51 @@ export const transformCollectionToSaveToExportAsFile = (collection, options = {} if (si.type == 'folder' && si?.root) { di.root = { - request: { - headers: si?.root?.request?.headers, - script: si?.root?.request?.script, - vars: si?.root?.request?.vars, - tests: si?.root?.request?.tests - }, - docs: si?.root?.request?.docs, - meta: { - name: si?.root?.meta?.name - } + request: {} }; + + let { request, meta } = si?.root || {}; + let { headers, script, vars, tests } = request || {}; + + // folder level headers + if (headers?.length) { + di.root.request.headers = headers; + } + // folder level script + if (Object.keys(script)?.length) { + di.root.request.script = {}; + if (script?.req?.length) { + di.root.request.script.req = script?.req; + } + if (script?.res?.length) { + di.root.request.script.res = script?.res; + } + } + // folder level vars + if (Object.keys(vars)?.length) { + di.root.request.vars = {}; + if (vars?.req?.length) { + di.root.request.vars.req = vars?.req; + } + if (vars?.res?.length) { + di.root.request.vars.res = vars?.res; + } + } + // folder level tests + if (tests?.length) { + di.root.request.tests = tests; + } + + if (meta?.name) { + di.root.meta = {}; + di.root.meta.name = meta?.name; + } + if (!Object.keys(di.root.request)?.length) { + delete di.root.request; + } + if (!Object.keys(di.root)?.length) { + delete di.root; + } } if (si.type === 'js') { @@ -418,24 +452,59 @@ export const transformCollectionToSaveToExportAsFile = (collection, options = {} collectionToSave.items = []; collectionToSave.activeEnvironmentUid = collection.activeEnvironmentUid; collectionToSave.environments = collection.environments || []; + collectionToSave.root = { - request: { - auth: collection?.root?.request?.auth, - headers: collection?.root?.request?.headers, - script: collection?.root?.request?.script, - vars: collection?.root?.request?.vars, - tests: collection?.root?.request?.tests - }, - docs: collection?.root?.request?.docs, - meta: { - name: collection?.root?.meta?.name || collection?.name - } + request: {} }; - if (!collection?.root?.request?.auth?.mode) { - collectionToSave.root.request.auth = { - mode: 'none' - }; + let { request, docs, meta } = collection?.root || {}; + let { auth, headers, script, vars, tests } = request || {}; + + // collection level auth + if (auth?.mode) { + collectionToSave.root.request.auth = auth; + } + // collection level headers + if (headers?.length) { + collectionToSave.root.request.headers = headers; + } + // collection level script + if (Object.keys(script)?.length) { + collectionToSave.root.request.script = {}; + if (script?.req?.length) { + collectionToSave.root.request.script.req = script?.req; + } + if (script?.res?.length) { + collectionToSave.root.request.script.res = script?.res; + } + } + // collection level vars + if (Object.keys(vars)?.length) { + collectionToSave.root.request.vars = {}; + if (vars?.req?.length) { + collectionToSave.root.request.vars.req = vars?.req; + } + if (vars?.res?.length) { + collectionToSave.root.request.vars.res = vars?.res; + } + } + // collection level tests + if (tests?.length) { + collectionToSave.root.request.tests = tests; + } + // collection level docs + if (docs?.length) { + collectionToSave.root.docs = docs; + } + if (meta?.name) { + collectionToSave.root.meta = {}; + collectionToSave.root.meta.name = meta?.name; + } + if (!Object.keys(collectionToSave.root.request)?.length) { + delete collectionToSave.root.request; + } + if (!Object.keys(collectionToSave.root)?.length) { + delete collectionToSave.root; } collectionToSave.brunoConfig = cloneDeep(collection?.brunoConfig); diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index fa49796783..71b5e40536 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -1030,8 +1030,8 @@ const registerNetworkIpc = (mainWindow) => { // run tests const testFile = compact([ - get(collectionRoot, 'request.tests'), - item.draft ? get(item.draft, 'request.tests') : get(item, 'request.tests') + item.draft ? get(item.draft, 'request.tests') : get(item, 'request.tests'), + get(collectionRoot, 'request.tests') ]).join(os.EOL); if (typeof testFile === 'string') { const testRuntime = new TestRuntime(); diff --git a/packages/bruno-schema/src/collections/index.js b/packages/bruno-schema/src/collections/index.js index 57eafa2f68..b5b1c62d72 100644 --- a/packages/bruno-schema/src/collections/index.js +++ b/packages/bruno-schema/src/collections/index.js @@ -188,7 +188,8 @@ const authSchema = Yup.object({ oauth2: oauth2Schema.nullable() }) .noUnknown(true) - .strict(); + .strict() + .nullable(); const requestParamsSchema = Yup.object({ uid: uidSchema, @@ -233,14 +234,15 @@ const requestSchema = Yup.object({ const folderRootSchema = Yup.object({ request: Yup.object({ - headers: Yup.array().of(keyValueSchema), + headers: Yup.array().of(keyValueSchema).nullable(), auth: authSchema, script: Yup.object({ req: Yup.string().nullable(), res: Yup.string().nullable() }) .noUnknown(true) - .strict(), + .strict() + .nullable(), vars: Yup.object({ req: Yup.array().of(varsSchema).nullable(), res: Yup.array().of(varsSchema).nullable()