From f72d643e02ee73a751182fc747ddba3be0405033 Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Wed, 18 Dec 2024 18:57:23 +0530 Subject: [PATCH 01/12] feat: updates --- .../src/components/RunnerResults/index.jsx | 8 +- .../ReduxStore/slices/collections/index.js | 6 + .../bruno-electron/src/ipc/network/index.js | 119 ++++++++++++++++-- .../bruno-electron/src/utils/collection.js | 24 +++- packages/bruno-js/src/bru.js | 8 ++ .../bruno-js/src/runtime/assert-runtime.js | 2 + .../bruno-js/src/runtime/script-runtime.js | 30 ++++- packages/bruno-js/src/runtime/test-runtime.js | 17 ++- .../bruno-js/src/sandbox/quickjs/shims/bru.js | 65 ++++++++++ 9 files changed, 254 insertions(+), 25 deletions(-) diff --git a/packages/bruno-app/src/components/RunnerResults/index.jsx b/packages/bruno-app/src/components/RunnerResults/index.jsx index 4b0b68cba..f411404a4 100644 --- a/packages/bruno-app/src/components/RunnerResults/index.jsx +++ b/packages/bruno-app/src/components/RunnerResults/index.jsx @@ -59,7 +59,7 @@ export default function RunnerResults({ collection }) { pathname: info.pathname, relativePath: getRelativePath(collection.pathname, info.pathname) }; - if (newItem.status !== 'error') { + if (newItem.status !== 'error' && newItem.status !== 'skipped') { if (newItem.testResults) { const failed = newItem.testResults.filter((result) => result.status === 'fail'); newItem.testStatus = failed.length ? 'fail' : 'pass'; @@ -169,18 +169,18 @@ export default function RunnerResults({ collection }) {
- {item.status !== 'error' && item.testStatus === 'pass' ? ( + {item.status !== 'error' && item.testStatus === 'pass' && item.status !== 'skipped' ? ( ) : ( )} {item.relativePath} - {item.status !== 'error' && item.status !== 'completed' ? ( + {item.status !== 'error' && item.status !== 'skipped' && item.status !== 'completed' ? ( ) : item.responseReceived?.status ? ( setSelectedItem(item)}> diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js index 2b5a532c3..dc0dd50f6 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -1712,6 +1712,12 @@ export const collectionsSlice = createSlice({ item.responseReceived = action.payload.responseReceived; item.status = 'error'; } + + if (type === 'request-skipped') { + const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); + item.status = 'skipped'; + item.responseReceived = action.payload.responseReceived; + } } }, resetCollectionRunner: (state, action) => { diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 9e37c8289..f3bf6b583 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -39,6 +39,7 @@ const Oauth2Store = require('../../store/oauth2'); const iconv = require('iconv-lite'); const FormData = require('form-data'); const { createFormData } = require('../../utils/form-data'); +const { findItemInCollectionByPathname } = require('../../utils/collection'); const safeStringifyJSON = (data) => { try { @@ -393,7 +394,8 @@ const registerNetworkIpc = (mainWindow) => { collectionUid, runtimeVariables, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ) => { // run pre-request script let scriptResult; @@ -408,7 +410,8 @@ const registerNetworkIpc = (mainWindow) => { collectionPath, onConsoleLog, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ); mainWindow.webContents.send('main:script-environment-update', { @@ -458,7 +461,8 @@ const registerNetworkIpc = (mainWindow) => { collectionUid, runtimeVariables, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ) => { // run post-response vars const postResponseVars = get(request, 'vars.res', []); @@ -506,7 +510,8 @@ const registerNetworkIpc = (mainWindow) => { collectionPath, onConsoleLog, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ); mainWindow.webContents.send('main:script-environment-update', { @@ -523,14 +528,24 @@ const registerNetworkIpc = (mainWindow) => { return scriptResult; }; - // handler for sending http request - ipcMain.handle('send-http-request', async (event, item, collection, environment, runtimeVariables) => { + const runRequest = async ({ item, collection, environment, runtimeVariables, runInBackground = false }) => { const collectionUid = collection.uid; const collectionPath = collection.pathname; const cancelTokenUid = uuid(); const requestUid = uuid(); - mainWindow.webContents.send('main:run-request-event', { + const runRequestByItemPathname = async ({ itemPathname }) => { + return new Promise(async (resolve, reject) => { + const _item = findItemInCollectionByPathname(collection, itemPathname); + if(_item) { + const res = await runRequest({ item: _item, collection, environment, runtimeVariables, runInBackground: true }); + resolve(res); + } + reject(`bru.runRequest: invalid request path - ${itemPathname}`); + }); + } + + !runInBackground && mainWindow.webContents.send('main:run-request-event', { type: 'request-queued', requestUid, collectionUid, @@ -561,7 +576,8 @@ const registerNetworkIpc = (mainWindow) => { collectionUid, runtimeVariables, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ); const axiosInstance = await configureRequest( @@ -573,7 +589,7 @@ const registerNetworkIpc = (mainWindow) => { collectionPath ); - mainWindow.webContents.send('main:run-request-event', { + !runInBackground && mainWindow.webContents.send('main:run-request-event', { type: 'request-sent', requestSent: { url: request.url, @@ -645,7 +661,8 @@ const registerNetworkIpc = (mainWindow) => { collectionUid, runtimeVariables, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ); // run assertions @@ -661,7 +678,7 @@ const registerNetworkIpc = (mainWindow) => { processEnvVars ); - mainWindow.webContents.send('main:run-request-event', { + !runInBackground && mainWindow.webContents.send('main:run-request-event', { type: 'assertion-results', results: results, itemUid: item.uid, @@ -682,10 +699,11 @@ const registerNetworkIpc = (mainWindow) => { collectionPath, onConsoleLog, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ); - mainWindow.webContents.send('main:run-request-event', { + !runInBackground && mainWindow.webContents.send('main:run-request-event', { type: 'test-results', results: testResults.results, itemUid: item.uid, @@ -719,6 +737,11 @@ const registerNetworkIpc = (mainWindow) => { return Promise.reject(error); } + } + + // handler for sending http request + ipcMain.handle('send-http-request', async (event, item, collection, environment, runtimeVariables) => { + return await runRequest({ item, collection, environment, runtimeVariables }); }); ipcMain.handle('send-collection-oauth2-request', async (event, collection, environment, runtimeVariables) => { @@ -996,6 +1019,41 @@ const registerNetworkIpc = (mainWindow) => { nextRequestName = preRequestScriptResult.nextRequestName; } + if (preRequestScriptResult?.stopExecution) { + deleteCancelToken(cancelTokenUid); + mainWindow.webContents.send('main:run-folder-event', { + type: 'response-received', + error: 'Request has been stopped from pre-request script', + responseReceived: { + status: 'terminated', + statusText: 'Request execution stopped!', + data: null + }, + ...eventData + }); + mainWindow.webContents.send('main:run-folder-event', { + type: 'testrun-ended', + collectionUid, + folderUid + }); + break; + } + + if (preRequestScriptResult?.skipRequest) { + mainWindow.webContents.send('main:run-folder-event', { + type: 'request-skipped', + error: 'Request has been skipped from pre-request script', + responseReceived: { + status: 'skipped', + statusText: 'request skipped via pre-request script', + data: null + }, + ...eventData + }); + currentRequestIndex++; + continue; + } + // todo: // i have no clue why electron can't send the request object // without safeParseJSON(safeStringifyJSON(request.data)) @@ -1114,6 +1172,41 @@ const registerNetworkIpc = (mainWindow) => { nextRequestName = postRequestScriptResult.nextRequestName; } + if (postRequestScriptResult?.stopExecution) { + deleteCancelToken(cancelTokenUid); + mainWindow.webContents.send('main:run-folder-event', { + type: 'response-received', + error: 'Request has been stopped from post-response script', + responseReceived: { + status: 'terminated', + statusText: 'Request execution stopped!', + data: null + }, + ...eventData + }); + mainWindow.webContents.send('main:run-folder-event', { + type: 'testrun-ended', + collectionUid, + folderUid + }); + break; + } + + if (postRequestScriptResult?.skipRequest) { + mainWindow.webContents.send('main:run-folder-event', { + type: 'request-skipped', + error: 'Request has been skipped from post-response script', + responseReceived: { + status: 'skipped', + statusText: 'request skipped via post-response script', + data: null + }, + ...eventData + }); + currentRequestIndex++; + continue; + } + // run assertions const assertions = get(item, 'request.assertions'); if (assertions) { diff --git a/packages/bruno-electron/src/utils/collection.js b/packages/bruno-electron/src/utils/collection.js index 5b9c3452e..872321b50 100644 --- a/packages/bruno-electron/src/utils/collection.js +++ b/packages/bruno-electron/src/utils/collection.js @@ -203,9 +203,31 @@ const getTreePathFromCollectionToItem = (collection, _item) => { return path; }; +const slash = (path) => { + const isExtendedLengthPath = /^\\\\\?\\/.test(path); + if (isExtendedLengthPath) { + return path; + } + return path.replace(/\\/g, '/'); +}; + +const findItemByPathname = (items = [], pathname) => { + return find(items, (i) => slash(i.pathname) === slash(pathname)); +}; + +const findItemInCollectionByPathname = (collection, pathname) => { + let flattenedItems = flattenItems(collection.items); + + return findItemByPathname(flattenedItems, pathname); +}; + + module.exports = { mergeHeaders, mergeVars, mergeScripts, - getTreePathFromCollectionToItem + getTreePathFromCollectionToItem, + slash, + findItemByPathname, + findItemInCollectionByPathname } \ No newline at end of file diff --git a/packages/bruno-js/src/bru.js b/packages/bruno-js/src/bru.js index 5a4d69426..946b62480 100644 --- a/packages/bruno-js/src/bru.js +++ b/packages/bruno-js/src/bru.js @@ -13,6 +13,14 @@ class Bru { this.requestVariables = requestVariables || {}; this.globalEnvironmentVariables = globalEnvironmentVariables || {}; this.collectionPath = collectionPath; + this.runner = { + skipRequest: () => { + this.skipRequest = true; + }, + stopExecution: () => { + this.stopExecution = true; + }, + }; } _interpolate = (str) => { diff --git a/packages/bruno-js/src/runtime/assert-runtime.js b/packages/bruno-js/src/runtime/assert-runtime.js index 4132fea9c..558dcaba1 100644 --- a/packages/bruno-js/src/runtime/assert-runtime.js +++ b/packages/bruno-js/src/runtime/assert-runtime.js @@ -408,6 +408,8 @@ class AssertRuntime { } } + request.assertionResults = assertionResults; + return assertionResults; } } diff --git a/packages/bruno-js/src/runtime/script-runtime.js b/packages/bruno-js/src/runtime/script-runtime.js index 0f82114b2..dcde3f27c 100644 --- a/packages/bruno-js/src/runtime/script-runtime.js +++ b/packages/bruno-js/src/runtime/script-runtime.js @@ -45,7 +45,8 @@ class ScriptRuntime { collectionPath, onConsoleLog, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ) { const globalEnvironmentVariables = request?.globalEnvironmentVariables || {}; const collectionVariables = request?.collectionVariables || {}; @@ -92,6 +93,10 @@ class ScriptRuntime { }; } + if(runRequestByItemPathname) { + context.bru.runRequest = runRequestByItemPathname; + } + if (this.runtime === 'quickjs') { await executeQuickJsVmAsync({ script: script, @@ -104,7 +109,9 @@ class ScriptRuntime { envVariables: cleanJson(envVariables), runtimeVariables: cleanJson(runtimeVariables), globalEnvironmentVariables: cleanJson(globalEnvironmentVariables), - nextRequestName: bru.nextRequest + nextRequestName: bru.nextRequest, + skipRequest: bru.skipRequest, + stopExecution: bru.stopExecution }; } @@ -152,7 +159,9 @@ class ScriptRuntime { envVariables: cleanJson(envVariables), runtimeVariables: cleanJson(runtimeVariables), globalEnvironmentVariables: cleanJson(globalEnvironmentVariables), - nextRequestName: bru.nextRequest + nextRequestName: bru.nextRequest, + skipRequest: bru.skipRequest, + stopExecution: bru.stopExecution }; } @@ -165,7 +174,8 @@ class ScriptRuntime { collectionPath, onConsoleLog, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ) { const globalEnvironmentVariables = request?.globalEnvironmentVariables || {}; const collectionVariables = request?.collectionVariables || {}; @@ -209,6 +219,10 @@ class ScriptRuntime { }; } + if(runRequestByItemPathname) { + context.bru.runRequest = runRequestByItemPathname; + } + if (this.runtime === 'quickjs') { await executeQuickJsVmAsync({ script: script, @@ -221,7 +235,9 @@ class ScriptRuntime { envVariables: cleanJson(envVariables), runtimeVariables: cleanJson(runtimeVariables), globalEnvironmentVariables: cleanJson(globalEnvironmentVariables), - nextRequestName: bru.nextRequest + nextRequestName: bru.nextRequest, + skipRequest: bru.skipRequest, + stopExecution: bru.stopExecution }; } @@ -269,7 +285,9 @@ class ScriptRuntime { envVariables: cleanJson(envVariables), runtimeVariables: cleanJson(runtimeVariables), globalEnvironmentVariables: cleanJson(globalEnvironmentVariables), - nextRequestName: bru.nextRequest + nextRequestName: bru.nextRequest, + skipRequest: bru.skipRequest, + stopExecution: bru.stopExecution }; } } diff --git a/packages/bruno-js/src/runtime/test-runtime.js b/packages/bruno-js/src/runtime/test-runtime.js index 5391f7e10..cb68eb5c4 100644 --- a/packages/bruno-js/src/runtime/test-runtime.js +++ b/packages/bruno-js/src/runtime/test-runtime.js @@ -46,12 +46,14 @@ class TestRuntime { collectionPath, onConsoleLog, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ) { const globalEnvironmentVariables = request?.globalEnvironmentVariables || {}; const collectionVariables = request?.collectionVariables || {}; const folderVariables = request?.folderVariables || {}; const requestVariables = request?.requestVariables || {}; + const assertionResults = request?.assertionResults || []; const bru = new Bru(envVariables, runtimeVariables, processEnvVars, collectionPath, collectionVariables, folderVariables, requestVariables, globalEnvironmentVariables); const req = new BrunoRequest(request); const res = new BrunoResponse(response); @@ -75,6 +77,7 @@ class TestRuntime { } const __brunoTestResults = new TestResults(); + const test = Test(__brunoTestResults, chai); if (!testsFile || !testsFile.length) { @@ -88,6 +91,14 @@ class TestRuntime { }; } + bru.getTestResults = async () => { + let results = __brunoTestResults.getResults(); + return results; + } + bru.getAssertionResults = async () => { + return assertionResults + } + const context = { test, bru, @@ -113,6 +124,10 @@ class TestRuntime { }; } + if(runRequestByItemPathname) { + context.bru.runRequest = runRequestByItemPathname; + } + if (this.runtime === 'quickjs') { await executeQuickJsVmAsync({ script: testsFile, diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/bru.js b/packages/bruno-js/src/sandbox/quickjs/shims/bru.js index 297add66a..6797104f3 100644 --- a/packages/bruno-js/src/sandbox/quickjs/shims/bru.js +++ b/packages/bruno-js/src/sandbox/quickjs/shims/bru.js @@ -1,3 +1,4 @@ +const { cleanJson } = require('../../../utils'); const { marshallToVm } = require('../utils'); const addBruShimToContext = (vm, bru) => { @@ -123,6 +124,70 @@ const addBruShimToContext = (vm, bru) => { vm.setProp(bruObject, 'getCollectionVar', getCollectionVar); getCollectionVar.dispose(); + let getTestResults = vm.newFunction('getTestResults', () => { + const promise = vm.newPromise(); + bru.getTestResults() + .then((results) => { + promise.resolve(marshallToVm(cleanJson(results), vm)); + }) + .catch((err) => { + promise.resolve( + marshallToVm( + cleanJson({ + message: err.message + }), + vm + ) + ); + }); + promise.settled.then(vm.runtime.executePendingJobs); + return promise.handle; + }); + getTestResults.consume((handle) => vm.setProp(bruObject, 'getTestResults', handle)); + + let getAssertionResults = vm.newFunction('getAssertionResults', () => { + const promise = vm.newPromise(); + bru.getAssertionResults() + .then((results) => { + promise.resolve(marshallToVm(cleanJson(results), vm)); + }) + .catch((err) => { + promise.resolve( + marshallToVm( + cleanJson({ + message: err.message + }), + vm + ) + ); + }); + promise.settled.then(vm.runtime.executePendingJobs); + return promise.handle; + }); + getAssertionResults.consume((handle) => vm.setProp(bruObject, 'getAssertionResults', handle)); + + let runRequestHandle = vm.newFunction('runRequest', (args) => { + const promise = vm.newPromise(); + bru.runRequest(vm.dump(args)) + .then((response) => { + const { status, headers, data, dataBuffer, size } = response || {}; + promise.resolve(marshallToVm(cleanJson({ status, headers, data, dataBuffer, size }), vm)); + }) + .catch((err) => { + promise.resolve( + marshallToVm( + cleanJson({ + message: err.message + }), + vm + ) + ); + }); + promise.settled.then(vm.runtime.executePendingJobs); + return promise.handle; + }); + runRequestHandle.consume((handle) => vm.setProp(bruObject, 'runRequest', handle)); + const sleep = vm.newFunction('sleep', (timer) => { const t = vm.getString(timer); const promise = vm.newPromise(); From 2a6f6704c337e66fed07d6589ef4c015c384b411 Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Wed, 1 Jan 2025 15:01:26 +0530 Subject: [PATCH 02/12] feat: update skipRequest and stopExecution logic --- .../ResponsePane/ResponseSave/index.js | 2 +- .../components/ResponsePane/Timeline/index.js | 2 +- .../src/components/RunnerResults/index.jsx | 20 +++-- .../ReduxStore/slices/collections/index.js | 5 +- .../bruno-electron/src/ipc/network/index.js | 76 +++++++------------ 5 files changed, 49 insertions(+), 56 deletions(-) diff --git a/packages/bruno-app/src/components/ResponsePane/ResponseSave/index.js b/packages/bruno-app/src/components/ResponsePane/ResponseSave/index.js index 7c183b0a6..dae5bad4d 100644 --- a/packages/bruno-app/src/components/ResponsePane/ResponseSave/index.js +++ b/packages/bruno-app/src/components/ResponsePane/ResponseSave/index.js @@ -11,7 +11,7 @@ const ResponseSave = ({ item }) => { const saveResponseToFile = () => { return new Promise((resolve, reject) => { ipcRenderer - .invoke('renderer:save-response-to-file', response, item.requestSent.url) + .invoke('renderer:save-response-to-file', response, item?.requestSent?.url) .then(resolve) .catch((err) => { toast.error(get(err, 'error.message') || 'Something went wrong!'); diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/index.js index 925b4b77b..9aafb41bb 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/index.js @@ -43,7 +43,7 @@ const Timeline = ({ request, response }) => {
-          {'<'} {response.status} {response.statusText}
+          {'<'} {response.status} - {response.statusText}
         
{responseHeaders.map((h) => { diff --git a/packages/bruno-app/src/components/RunnerResults/index.jsx b/packages/bruno-app/src/components/RunnerResults/index.jsx index f411404a4..4299ef545 100644 --- a/packages/bruno-app/src/components/RunnerResults/index.jsx +++ b/packages/bruno-app/src/components/RunnerResults/index.jsx @@ -59,7 +59,7 @@ export default function RunnerResults({ collection }) { pathname: info.pathname, relativePath: getRelativePath(collection.pathname, info.pathname) }; - if (newItem.status !== 'error' && newItem.status !== 'skipped') { + if (newItem.status !== 'error' && newItem.status !== 'skipped' && newItem.status !== 'terminated') { if (newItem.testResults) { const failed = newItem.testResults.filter((result) => result.status === 'fail'); newItem.testStatus = failed.length ? 'fail' : 'pass'; @@ -142,6 +142,8 @@ export default function RunnerResults({ collection }) { ); } + console.log("results", items); + return (
@@ -163,29 +165,35 @@ export default function RunnerResults({ collection }) {
Total Requests: {items.length}, Passed: {passedRequests.length}, Failed: {failedRequests.length}
+ {runnerInfo?.statusText ? +
+ {runnerInfo?.statusText} +
+ : null} {items.map((item) => { return (
- {item.status !== 'error' && item.testStatus === 'pass' && item.status !== 'skipped' ? ( + {item.status !== 'error' && item.testStatus === 'pass' && item.status !== 'skipped' && item.status !== 'terminated' ? ( ) : ( )} {item.relativePath} - {item.status !== 'error' && item.status !== 'skipped' && item.status !== 'completed' ? ( + {item.status !== 'error' && item.status !== 'skipped' && item.status !== 'terminated' && item.status !== 'completed' ? ( ) : item.responseReceived?.status ? ( setSelectedItem(item)}> - ({item.responseReceived?.status} - {item.responseReceived?.statusText}) + {item.responseReceived?.status} + -  + {item.responseReceived?.statusText} ) : ( setSelectedItem(item)}> diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js index dc0dd50f6..10f552ec5 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -1675,6 +1675,9 @@ export const collectionsSlice = createSlice({ if (type === 'testrun-ended') { const info = collection.runnerResult.info; info.status = 'ended'; + if (action.payload.statusText) { + info.statusText = action.payload.statusText; + } } if (type === 'request-queued') { @@ -1713,7 +1716,7 @@ export const collectionsSlice = createSlice({ item.status = 'error'; } - if (type === 'request-skipped') { + if (type === 'runner-request-skipped') { const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); item.status = 'skipped'; item.responseReceived = action.payload.responseReceived; diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index f3bf6b583..7d35e461f 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -933,6 +933,7 @@ const registerNetworkIpc = (mainWindow) => { const scriptingConfig = get(brunoConfig, 'scripts', {}); scriptingConfig.runtime = getJsSandboxRuntime(collection); const collectionRoot = get(collection, 'root', {}); + let stopRunnerExecution = false; const abortController = new AbortController(); saveCancelToken(cancelTokenUid, abortController); @@ -979,6 +980,8 @@ const registerNetworkIpc = (mainWindow) => { throw error; } + stopRunnerExecution = false; + const item = folderRequests[currentRequestIndex]; let nextRequestName; const itemUid = item.uid; @@ -1020,28 +1023,12 @@ const registerNetworkIpc = (mainWindow) => { } if (preRequestScriptResult?.stopExecution) { - deleteCancelToken(cancelTokenUid); - mainWindow.webContents.send('main:run-folder-event', { - type: 'response-received', - error: 'Request has been stopped from pre-request script', - responseReceived: { - status: 'terminated', - statusText: 'Request execution stopped!', - data: null - }, - ...eventData - }); - mainWindow.webContents.send('main:run-folder-event', { - type: 'testrun-ended', - collectionUid, - folderUid - }); - break; + stopRunnerExecution = true; } if (preRequestScriptResult?.skipRequest) { mainWindow.webContents.send('main:run-folder-event', { - type: 'request-skipped', + type: 'runner-request-skipped', error: 'Request has been skipped from pre-request script', responseReceived: { status: 'skipped', @@ -1173,38 +1160,21 @@ const registerNetworkIpc = (mainWindow) => { } if (postRequestScriptResult?.stopExecution) { - deleteCancelToken(cancelTokenUid); - mainWindow.webContents.send('main:run-folder-event', { - type: 'response-received', - error: 'Request has been stopped from post-response script', - responseReceived: { - status: 'terminated', - statusText: 'Request execution stopped!', - data: null - }, - ...eventData - }); - mainWindow.webContents.send('main:run-folder-event', { - type: 'testrun-ended', - collectionUid, - folderUid - }); - break; + stopRunnerExecution = true; } if (postRequestScriptResult?.skipRequest) { - mainWindow.webContents.send('main:run-folder-event', { - type: 'request-skipped', - error: 'Request has been skipped from post-response script', - responseReceived: { - status: 'skipped', - statusText: 'request skipped via post-response script', - data: null - }, - ...eventData - }); - currentRequestIndex++; - continue; + // mainWindow.webContents.send('main:run-folder-event', { + // type: 'runner-request-skipped', + // error: 'Request has been skipped from post-response script', + // responseReceived: { + // status: 'skipped', + // statusText: 'request skipped via post-response script' + // }, + // ...eventData + // }); + // currentRequestIndex++; + // continue; } // run assertions @@ -1271,6 +1241,18 @@ const registerNetworkIpc = (mainWindow) => { ...eventData }); } + + if (stopRunnerExecution) { + deleteCancelToken(cancelTokenUid); + mainWindow.webContents.send('main:run-folder-event', { + type: 'testrun-ended', + collectionUid, + folderUid, + statusText: 'collection run was terminated!' + }); + break; + } + if (nextRequestName !== undefined) { nJumps++; if (nJumps > 10000) { From 754a15dd5854568a41677f9c3e137efaf5e4dd68 Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Wed, 1 Jan 2025 15:09:47 +0530 Subject: [PATCH 03/12] feat: add runner functions hintwords for codemirror editor --- packages/bruno-app/src/components/CodeEditor/index.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/bruno-app/src/components/CodeEditor/index.js b/packages/bruno-app/src/components/CodeEditor/index.js index aa0238ef0..612e68b17 100644 --- a/packages/bruno-app/src/components/CodeEditor/index.js +++ b/packages/bruno-app/src/components/CodeEditor/index.js @@ -76,7 +76,10 @@ if (!SERVER_RENDERED) { 'bru.getRequestVar(key)', 'bru.sleep(ms)', 'bru.getGlobalEnvVar(key)', - 'bru.setGlobalEnvVar(key, value)' + 'bru.setGlobalEnvVar(key, value)', + 'bru.runner', + 'bru.runner.skipRequest()', + 'bru.runner.stopExecution()' ]; CodeMirror.registerHelper('hint', 'brunoJS', (editor, options) => { const cursor = editor.getCursor(); @@ -98,7 +101,7 @@ if (!SERVER_RENDERED) { if (curWordBru) { hintWords.forEach((h) => { if (h.includes('.') == curWordBru.includes('.') && h.startsWith(curWordBru)) { - result.list.push(curWordBru.includes('.') ? h.split('.')[1] : h); + result.list.push(curWordBru.includes('.') ? h.split('.')?.at(-1) : h); } }); result.list?.sort(); From 75a9959d47b73ae76011e304d80780209d1c8f2c Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Wed, 1 Jan 2025 15:37:42 +0530 Subject: [PATCH 04/12] feat: add quick-js shims for bru runner fns --- packages/bruno-js/src/runtime/test-runtime.js | 2 +- packages/bruno-js/src/sandbox/quickjs/shims/bru.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/bruno-js/src/runtime/test-runtime.js b/packages/bruno-js/src/runtime/test-runtime.js index cb68eb5c4..e7e30fa44 100644 --- a/packages/bruno-js/src/runtime/test-runtime.js +++ b/packages/bruno-js/src/runtime/test-runtime.js @@ -92,7 +92,7 @@ class TestRuntime { } bru.getTestResults = async () => { - let results = __brunoTestResults.getResults(); + let results = await __brunoTestResults.getResults(); return results; } bru.getAssertionResults = async () => { diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/bru.js b/packages/bruno-js/src/sandbox/quickjs/shims/bru.js index 6797104f3..37b715ce8 100644 --- a/packages/bruno-js/src/sandbox/quickjs/shims/bru.js +++ b/packages/bruno-js/src/sandbox/quickjs/shims/bru.js @@ -3,6 +3,7 @@ const { marshallToVm } = require('../utils'); const addBruShimToContext = (vm, bru) => { const bruObject = vm.newObject(); + const bruRunnerObject = vm.newObject(); let cwd = vm.newFunction('cwd', function () { return marshallToVm(bru.cwd(), vm); @@ -94,6 +95,18 @@ const addBruShimToContext = (vm, bru) => { vm.setProp(bruObject, 'setNextRequest', setNextRequest); setNextRequest.dispose(); + let runnerSkipRequest = vm.newFunction('skipRequest', function () { + bru?.runner?.skipRequest(); + }); + vm.setProp(bruRunnerObject, 'skipRequest', runnerSkipRequest); + runnerSkipRequest.dispose(); + + let runnerStopExecution = vm.newFunction('stopExecution', function () { + bru?.runner?.stopExecution(); + }); + vm.setProp(bruRunnerObject, 'stopExecution', runnerStopExecution); + runnerStopExecution.dispose(); + let visualize = vm.newFunction('visualize', function (htmlString) { bru.visualize(vm.dump(htmlString)); }); @@ -199,6 +212,7 @@ const addBruShimToContext = (vm, bru) => { }); sleep.consume((handle) => vm.setProp(bruObject, 'sleep', handle)); + vm.setProp(bruObject, 'runner', bruRunnerObject); vm.setProp(vm.global, 'bru', bruObject); bruObject.dispose(); }; From cd722a2bd9eb932129f56f2c986acd4e756f7b47 Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Wed, 1 Jan 2025 17:12:57 +0530 Subject: [PATCH 05/12] feat: bru.runner.setNextRequest --- packages/bruno-app/src/components/CodeEditor/index.js | 1 + packages/bruno-js/src/bru.js | 3 +++ packages/bruno-js/src/sandbox/quickjs/shims/bru.js | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/packages/bruno-app/src/components/CodeEditor/index.js b/packages/bruno-app/src/components/CodeEditor/index.js index 612e68b17..168a3b02b 100644 --- a/packages/bruno-app/src/components/CodeEditor/index.js +++ b/packages/bruno-app/src/components/CodeEditor/index.js @@ -78,6 +78,7 @@ if (!SERVER_RENDERED) { 'bru.getGlobalEnvVar(key)', 'bru.setGlobalEnvVar(key, value)', 'bru.runner', + 'bru.runner.setNextRequest(requestName)', 'bru.runner.skipRequest()', 'bru.runner.stopExecution()' ]; diff --git a/packages/bruno-js/src/bru.js b/packages/bruno-js/src/bru.js index 946b62480..9fa9d8f0c 100644 --- a/packages/bruno-js/src/bru.js +++ b/packages/bruno-js/src/bru.js @@ -20,6 +20,9 @@ class Bru { stopExecution: () => { this.stopExecution = true; }, + setNextRequest: (nextRequest) => { + this.nextRequest = nextRequest; + } }; } diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/bru.js b/packages/bruno-js/src/sandbox/quickjs/shims/bru.js index 37b715ce8..fa4cbf341 100644 --- a/packages/bruno-js/src/sandbox/quickjs/shims/bru.js +++ b/packages/bruno-js/src/sandbox/quickjs/shims/bru.js @@ -107,6 +107,12 @@ const addBruShimToContext = (vm, bru) => { vm.setProp(bruRunnerObject, 'stopExecution', runnerStopExecution); runnerStopExecution.dispose(); + let runnerSetNextRequest = vm.newFunction('setNextRequest', function (nextRequest) { + bru?.runner?.setNextRequest(vm.dump(nextRequest)); + }); + vm.setProp(bruRunnerObject, 'setNextRequest', runnerSetNextRequest); + runnerSetNextRequest.dispose(); + let visualize = vm.newFunction('visualize', function (htmlString) { bru.visualize(vm.dump(htmlString)); }); From f34711c6e0b6838693fc63dddbb4f504626562b3 Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Wed, 1 Jan 2025 17:50:57 +0530 Subject: [PATCH 06/12] feat: bru.runRequest in collection run context --- .../bruno-electron/src/ipc/network/index.js | 30 ++++++++++++++++--- .../bruno-electron/src/utils/collection.js | 2 +- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 7d35e461f..cb1ae4382 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -534,8 +534,12 @@ const registerNetworkIpc = (mainWindow) => { const cancelTokenUid = uuid(); const requestUid = uuid(); - const runRequestByItemPathname = async ({ itemPathname }) => { + const runRequestByItemPathname = async (relativeItemPathname) => { return new Promise(async (resolve, reject) => { + let itemPathname = path.join(collection?.pathname, relativeItemPathname); + if (itemPathname && !itemPathname?.endsWith('.bru')) { + itemPathname = `${itemPathname}.bru`; + } const _item = findItemInCollectionByPathname(collection, itemPathname); if(_item) { const res = await runRequest({ item: _item, collection, environment, runtimeVariables, runInBackground: true }); @@ -938,6 +942,21 @@ const registerNetworkIpc = (mainWindow) => { const abortController = new AbortController(); saveCancelToken(cancelTokenUid, abortController); + const runRequestByItemPathname = async (relativeItemPathname) => { + return new Promise(async (resolve, reject) => { + let itemPathname = path.join(collection?.pathname, relativeItemPathname); + if (itemPathname && !itemPathname?.endsWith('.bru')) { + itemPathname = `${itemPathname}.bru`; + } + const _item = findItemInCollectionByPathname(collection, itemPathname); + if(_item) { + const res = await runRequest({ item: _item, collection, environment, runtimeVariables, runInBackground: true }); + resolve(res); + } + reject(`bru.runRequest: invalid request path - ${itemPathname}`); + }); + } + if (!folder) { folder = collection; } @@ -1015,7 +1034,8 @@ const registerNetworkIpc = (mainWindow) => { collectionUid, runtimeVariables, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ); if (preRequestScriptResult?.nextRequestName !== undefined) { @@ -1152,7 +1172,8 @@ const registerNetworkIpc = (mainWindow) => { collectionUid, runtimeVariables, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ); if (postRequestScriptResult?.nextRequestName !== undefined) { @@ -1210,7 +1231,8 @@ const registerNetworkIpc = (mainWindow) => { collectionPath, onConsoleLog, processEnvVars, - scriptingConfig + scriptingConfig, + runRequestByItemPathname ); if (testResults?.nextRequestName !== undefined) { diff --git a/packages/bruno-electron/src/utils/collection.js b/packages/bruno-electron/src/utils/collection.js index 872321b50..15d5574e2 100644 --- a/packages/bruno-electron/src/utils/collection.js +++ b/packages/bruno-electron/src/utils/collection.js @@ -208,7 +208,7 @@ const slash = (path) => { if (isExtendedLengthPath) { return path; } - return path.replace(/\\/g, '/'); + return path?.replace?.(/\\/g, '/'); }; const findItemByPathname = (items = [], pathname) => { From ca5fbea7b65ed94eb54cd5f87a6265f3e967cfc6 Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Wed, 1 Jan 2025 17:52:01 +0530 Subject: [PATCH 07/12] chore: removed console log --- packages/bruno-app/src/components/RunnerResults/index.jsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/bruno-app/src/components/RunnerResults/index.jsx b/packages/bruno-app/src/components/RunnerResults/index.jsx index 4299ef545..e1204be3b 100644 --- a/packages/bruno-app/src/components/RunnerResults/index.jsx +++ b/packages/bruno-app/src/components/RunnerResults/index.jsx @@ -142,8 +142,6 @@ export default function RunnerResults({ collection }) { ); } - console.log("results", items); - return (
From 7b86febc87ceaa5976b9ae65cbcd12634084be8f Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Wed, 1 Jan 2025 18:06:13 +0530 Subject: [PATCH 08/12] feat: summarize test and assertion results for getTestResults and getAssertionResults fns --- packages/bruno-js/src/runtime/test-runtime.js | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/bruno-js/src/runtime/test-runtime.js b/packages/bruno-js/src/runtime/test-runtime.js index e7e30fa44..74df8d550 100644 --- a/packages/bruno-js/src/runtime/test-runtime.js +++ b/packages/bruno-js/src/runtime/test-runtime.js @@ -32,6 +32,25 @@ const CryptoJS = require('crypto-js'); const NodeVault = require('node-vault'); const { executeQuickJsVmAsync } = require('../sandbox/quickjs'); +const summarizeResults = (results) => { + const summary = { + total: results.length, + passed: 0, + failed: 0, + skipped: 0, + }; + + results.forEach((r) => { + const passed = r.status === "pass"; + if (passed) summary.passed += 1; + else if (r.status === "fail") summary.failed += 1; + else summary.skipped += 1; + }); + + return { summary, results }; +} + + class TestRuntime { constructor(props) { this.runtime = props?.runtime || 'vm2'; @@ -93,10 +112,10 @@ class TestRuntime { bru.getTestResults = async () => { let results = await __brunoTestResults.getResults(); - return results; + return summarizeResults(results); } bru.getAssertionResults = async () => { - return assertionResults + return summarizeResults(assertionResults); } const context = { From 343e6dae47419de0630f63f829a36a4129a9f469 Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Wed, 1 Jan 2025 19:56:32 +0530 Subject: [PATCH 09/12] chore: updated package lock --- package-lock.json | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 461ab88cc..e9eb38ca0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,6 +50,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -786,6 +787,7 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -816,6 +818,7 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -833,6 +836,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, "node_modules/@babel/generator": { @@ -1106,6 +1110,7 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", @@ -7014,6 +7019,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, "license": "MIT" }, "node_modules/@types/lodash": { @@ -7026,6 +7032,7 @@ "version": "12.2.3", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/linkify-it": "*", @@ -7036,6 +7043,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, "license": "MIT" }, "node_modules/@types/ms": { @@ -8364,15 +8372,6 @@ "node": "*" } }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -10019,6 +10018,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, "license": "MIT" }, "node_modules/cookie": { @@ -11611,6 +11611,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -12630,6 +12631,7 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -15482,15 +15484,6 @@ "node": ">=0.8.0" } }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -23043,7 +23036,7 @@ "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -23943,7 +23936,6 @@ "fs-extra": "^10.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", - "json-bigint": "^1.0.0", "lodash": "^4.17.21", "qs": "^6.11.0", "socks-proxy-agent": "^8.0.2", From 005eb273bf6ddb40ffcf0ad0a20f6e8ba185c23a Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Wed, 1 Jan 2025 20:03:01 +0530 Subject: [PATCH 10/12] chore: fix tests --- package-lock.json | 20 ++++++++++++++++++++ packages/bruno-schema/package.json | 3 +++ 2 files changed, 23 insertions(+) diff --git a/package-lock.json b/package-lock.json index e9eb38ca0..187f2cf99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24157,10 +24157,30 @@ "name": "@usebruno/schema", "version": "0.7.0", "license": "MIT", + "dependencies": { + "nanoid": "3.3.8" + }, "peerDependencies": { "yup": "^0.32.11" } }, + "packages/bruno-schema/node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "packages/bruno-tests": { "name": "@usebruno/tests", "version": "0.0.1", diff --git a/packages/bruno-schema/package.json b/packages/bruno-schema/package.json index 1e91a9a1a..61542cf69 100644 --- a/packages/bruno-schema/package.json +++ b/packages/bruno-schema/package.json @@ -12,5 +12,8 @@ }, "peerDependencies": { "yup": "^0.32.11" + }, + "dependencies": { + "nanoid": "3.3.8" } } From 99302e3a1df673a783eb8690ef2d3abefc7c7204 Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Thu, 2 Jan 2025 17:54:29 +0530 Subject: [PATCH 11/12] fix: pr review updates --- .../src/components/RunnerResults/index.jsx | 8 ++--- packages/bruno-js/src/runtime/test-runtime.js | 30 ++++++++++++++++--- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/packages/bruno-app/src/components/RunnerResults/index.jsx b/packages/bruno-app/src/components/RunnerResults/index.jsx index e1204be3b..f7c1e4d9c 100644 --- a/packages/bruno-app/src/components/RunnerResults/index.jsx +++ b/packages/bruno-app/src/components/RunnerResults/index.jsx @@ -59,7 +59,7 @@ export default function RunnerResults({ collection }) { pathname: info.pathname, relativePath: getRelativePath(collection.pathname, info.pathname) }; - if (newItem.status !== 'error' && newItem.status !== 'skipped' && newItem.status !== 'terminated') { + if (newItem.status !== 'error' && newItem.status !== 'skipped') { if (newItem.testResults) { const failed = newItem.testResults.filter((result) => result.status === 'fail'); newItem.testStatus = failed.length ? 'fail' : 'pass'; @@ -174,18 +174,18 @@ export default function RunnerResults({ collection }) {
- {item.status !== 'error' && item.testStatus === 'pass' && item.status !== 'skipped' && item.status !== 'terminated' ? ( + {item.status !== 'error' && item.testStatus === 'pass' && item.status !== 'skipped' ? ( ) : ( )} {item.relativePath} - {item.status !== 'error' && item.status !== 'skipped' && item.status !== 'terminated' && item.status !== 'completed' ? ( + {item.status !== 'error' && item.status !== 'skipped' && item.status !== 'completed' ? ( ) : item.responseReceived?.status ? ( setSelectedItem(item)}> diff --git a/packages/bruno-js/src/runtime/test-runtime.js b/packages/bruno-js/src/runtime/test-runtime.js index 74df8d550..71db9d83e 100644 --- a/packages/bruno-js/src/runtime/test-runtime.js +++ b/packages/bruno-js/src/runtime/test-runtime.js @@ -32,7 +32,7 @@ const CryptoJS = require('crypto-js'); const NodeVault = require('node-vault'); const { executeQuickJsVmAsync } = require('../sandbox/quickjs'); -const summarizeResults = (results) => { +const getResultsSummary = (results) => { const summary = { total: results.length, passed: 0, @@ -47,7 +47,7 @@ const summarizeResults = (results) => { else summary.skipped += 1; }); - return { summary, results }; + return summary; } @@ -112,10 +112,32 @@ class TestRuntime { bru.getTestResults = async () => { let results = await __brunoTestResults.getResults(); - return summarizeResults(results); + const summary = getResultsSummary(results); + return { + summary, + results: results?.map?.(r => ({ + status: r?.status, + description: r?.description, + expected: r?.expected, + actual: r?.actual, + error: r?.error + })) + }; } bru.getAssertionResults = async () => { - return summarizeResults(assertionResults); + let results = assertionResults; + const summary = getResultsSummary(results); + return { + summary, + results: results?.map?.(r => ({ + status: r?.status, + lhsExpr: r?.lhsExpr, + rhsExpr: r?.rhsExpr, + operator: r?.operator, + rhsOperand: r?.rhsOperand, + error: r?.error + })) + }; } const context = { From c4be6a88e4743ae59824348207916317ec0361ab Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Thu, 2 Jan 2025 17:56:36 +0530 Subject: [PATCH 12/12] fix: removed commented code --- packages/bruno-electron/src/ipc/network/index.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index cb1ae4382..78951b99c 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -1184,20 +1184,6 @@ const registerNetworkIpc = (mainWindow) => { stopRunnerExecution = true; } - if (postRequestScriptResult?.skipRequest) { - // mainWindow.webContents.send('main:run-folder-event', { - // type: 'runner-request-skipped', - // error: 'Request has been skipped from post-response script', - // responseReceived: { - // status: 'skipped', - // statusText: 'request skipped via post-response script' - // }, - // ...eventData - // }); - // currentRequestIndex++; - // continue; - } - // run assertions const assertions = get(item, 'request.assertions'); if (assertions) {