mirror of
https://github.com/usebruno/bruno.git
synced 2025-08-19 03:06:04 +02:00
Merge pull request #3719 from lohxt1/feat/bru-runner-fns
feat: bru util fns -- skipRequest, stopExecution, getTestResults, getAssertionResults, runRequest
This commit is contained in:
@@ -13,6 +13,17 @@ class Bru {
|
||||
this.requestVariables = requestVariables || {};
|
||||
this.globalEnvironmentVariables = globalEnvironmentVariables || {};
|
||||
this.collectionPath = collectionPath;
|
||||
this.runner = {
|
||||
skipRequest: () => {
|
||||
this.skipRequest = true;
|
||||
},
|
||||
stopExecution: () => {
|
||||
this.stopExecution = true;
|
||||
},
|
||||
setNextRequest: (nextRequest) => {
|
||||
this.nextRequest = nextRequest;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
_interpolate = (str) => {
|
||||
|
@@ -408,6 +408,8 @@ class AssertRuntime {
|
||||
}
|
||||
}
|
||||
|
||||
request.assertionResults = assertionResults;
|
||||
|
||||
return assertionResults;
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@@ -32,6 +32,25 @@ const CryptoJS = require('crypto-js');
|
||||
const NodeVault = require('node-vault');
|
||||
const { executeQuickJsVmAsync } = require('../sandbox/quickjs');
|
||||
|
||||
const getResultsSummary = (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;
|
||||
}
|
||||
|
||||
|
||||
class TestRuntime {
|
||||
constructor(props) {
|
||||
this.runtime = props?.runtime || 'vm2';
|
||||
@@ -46,12 +65,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 +96,7 @@ class TestRuntime {
|
||||
}
|
||||
|
||||
const __brunoTestResults = new TestResults();
|
||||
|
||||
const test = Test(__brunoTestResults, chai);
|
||||
|
||||
if (!testsFile || !testsFile.length) {
|
||||
@@ -88,6 +110,36 @@ class TestRuntime {
|
||||
};
|
||||
}
|
||||
|
||||
bru.getTestResults = async () => {
|
||||
let results = await __brunoTestResults.getResults();
|
||||
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 () => {
|
||||
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 = {
|
||||
test,
|
||||
bru,
|
||||
@@ -113,6 +165,10 @@ class TestRuntime {
|
||||
};
|
||||
}
|
||||
|
||||
if(runRequestByItemPathname) {
|
||||
context.bru.runRequest = runRequestByItemPathname;
|
||||
}
|
||||
|
||||
if (this.runtime === 'quickjs') {
|
||||
await executeQuickJsVmAsync({
|
||||
script: testsFile,
|
||||
|
@@ -1,7 +1,9 @@
|
||||
const { cleanJson } = require('../../../utils');
|
||||
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);
|
||||
@@ -93,6 +95,24 @@ 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 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));
|
||||
});
|
||||
@@ -123,6 +143,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();
|
||||
@@ -134,6 +218,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();
|
||||
};
|
||||
|
Reference in New Issue
Block a user