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) {