From 364fb45e973d45a49362b8a3e85d8780d3155d2e Mon Sep 17 00:00:00 2001 From: Pooja Date: Wed, 11 Jun 2025 22:38:58 +0530 Subject: [PATCH] add: pre and post tests in runner (#4878) --- .../src/components/RunnerResults/index.jsx | 97 ++++++++++++++----- .../ReduxStore/slices/collections/index.js | 10 ++ .../bruno-electron/src/ipc/network/index.js | 26 ++++- 3 files changed, 105 insertions(+), 28 deletions(-) diff --git a/packages/bruno-app/src/components/RunnerResults/index.jsx b/packages/bruno-app/src/components/RunnerResults/index.jsx index cfe3c0f1a..cbf099e5b 100644 --- a/packages/bruno-app/src/components/RunnerResults/index.jsx +++ b/packages/bruno-app/src/components/RunnerResults/index.jsx @@ -16,6 +16,28 @@ const getDisplayName = (fullPath, pathname, name = '') => { return path.join(dir, name); }; +const getTestStatus = (results) => { + if (!results || !results.length) return 'pass'; + const failed = results.filter((result) => result.status === 'fail'); + return failed.length ? 'fail' : 'pass'; +}; + +const allTestsPassed = (item) => { + return item.status !== 'error' && + item.testStatus === 'pass' && + item.assertionStatus === 'pass' && + item.preRequestTestStatus === 'pass' && + item.postResponseTestStatus === 'pass'; +}; + +const anyTestFailed = (item) => { + return item.status === 'error' || + item.testStatus === 'fail' || + item.assertionStatus === 'fail' || + item.preRequestTestStatus === 'fail' || + item.postResponseTestStatus === 'fail'; +}; + export default function RunnerResults({ collection }) { const dispatch = useDispatch(); const [selectedItem, setSelectedItem] = useState(null); @@ -56,19 +78,10 @@ export default function RunnerResults({ collection }) { displayName: getDisplayName(collection.pathname, info.pathname, info.name) }; 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'; - } else { - newItem.testStatus = 'pass'; - } - - if (newItem.assertionResults) { - const failed = newItem.assertionResults.filter((result) => result.status === 'fail'); - newItem.assertionStatus = failed.length ? 'fail' : 'pass'; - } else { - newItem.assertionStatus = 'pass'; - } + newItem.testStatus = getTestStatus(newItem.testResults); + newItem.assertionStatus = getTestStatus(newItem.assertionResults); + newItem.preRequestTestStatus = getTestStatus(newItem.preRequestTestResults); + newItem.postResponseTestStatus = getTestStatus(newItem.postResponseTestResults); } return newItem; }) @@ -95,12 +108,8 @@ export default function RunnerResults({ collection }) { }; const totalRequestsInCollection = getTotalRequestCountInCollection(collectionCopy); - const passedRequests = items.filter((item) => { - return item.status !== 'error' && item.testStatus === 'pass' && item.assertionStatus === 'pass'; - }); - const failedRequests = items.filter((item) => { - return (item.status !== 'error' && item.testStatus === 'fail') || item.assertionStatus === 'fail'; - }); + const passedRequests = items.filter(allTestsPassed); + const failedRequests = items.filter(anyTestFailed); const skippedRequests = items.filter((item) => { return item.status === 'skipped'; @@ -176,18 +185,18 @@ export default function RunnerResults({ collection }) {
- {item.testStatus === 'pass' && item.assertionStatus === 'pass' ? + {allTestsPassed(item) ? : null} {item.status === 'skipped' ? :null} - {item.status === 'error' || item.testStatus === 'fail' || item.assertionStatus === 'fail' ? + {anyTestFailed(item) ? :null} {item.displayName} @@ -208,6 +217,46 @@ export default function RunnerResults({ collection }) { {item.status == 'error' ?
{item.error}
: null}
    + {item.preRequestTestResults + ? item.preRequestTestResults.map((result) => ( +
  • + {result.status === 'pass' ? ( + + + {result.description} + + ) : ( + <> + + + {result.description} + + {result.error} + + )} +
  • + )) + : null} + {item.postResponseTestResults + ? item.postResponseTestResults.map((result) => ( +
  • + {result.status === 'pass' ? ( + + + {result.description} + + ) : ( + <> + + + {result.description} + + {result.error} + + )} +
  • + )) + : null} {item.testResults ? item.testResults.map((result) => (
  • @@ -271,10 +320,10 @@ export default function RunnerResults({ collection }) {
    {selectedItem.displayName} - {selectedItem.testStatus === 'pass' && selectedItem.assertionStatus === 'pass' ? + {allTestsPassed(selectedItem) ? : null} - {selectedItem.status === 'error' || selectedItem.testStatus === 'fail' || selectedItem.assertionStatus === 'fail' ? + {anyTestFailed(selectedItem) ? : null} {selectedItem.status === 'skipped' ? 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 15ce34f62..64a72a43a 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -2081,6 +2081,16 @@ export const collectionsSlice = createSlice({ item.testResults = action.payload.testResults; } + if (type === 'test-results-pre-request') { + const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); + item.preRequestTestResults = action.payload.preRequestTestResults; + } + + if (type === 'test-results-post-response') { + const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); + item.postResponseTestResults = action.payload.postResponseTestResults; + } + if (type === 'assertion-results') { const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); item.assertionResults = action.payload.assertionResults; diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 674cb5754..4b4937d52 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -1018,6 +1018,15 @@ const registerNetworkIpc = (mainWindow) => { stopRunnerExecution = true; } + // Send pre-request test results if available + if (preRequestScriptResult?.results) { + mainWindow.webContents.send('main:run-folder-event', { + type: 'test-results-pre-request', + preRequestTestResults: preRequestScriptResult.results, + ...eventData + }); + } + if (preRequestScriptResult?.skipRequest) { mainWindow.webContents.send('main:run-folder-event', { type: 'runner-request-skipped', @@ -1149,7 +1158,7 @@ const registerNetworkIpc = (mainWindow) => { } } - const postRequestScriptResult = await runPostResponse( + const postResponseScriptResult = await runPostResponse( request, response, requestUid, @@ -1163,14 +1172,23 @@ const registerNetworkIpc = (mainWindow) => { runRequestByItemPathname ); - if (postRequestScriptResult?.nextRequestName !== undefined) { - nextRequestName = postRequestScriptResult.nextRequestName; + if (postResponseScriptResult?.nextRequestName !== undefined) { + nextRequestName = postResponseScriptResult.nextRequestName; } - if (postRequestScriptResult?.stopExecution) { + if (postResponseScriptResult?.stopExecution) { stopRunnerExecution = true; } + // Send post-response test results if available + if (postResponseScriptResult?.results) { + mainWindow.webContents.send('main:run-folder-event', { + type: 'test-results-post-response', + postResponseTestResults: postResponseScriptResult.results, + ...eventData + }); + } + // run assertions const assertions = get(item, 'request.assertions'); if (assertions) {