Skip to content

Commit

Permalink
feat: request vars, bru.getRequestVar function (usebruno#2541)
Browse files Browse the repository at this point in the history
  • Loading branch information
lohxt1 authored and jwetzell committed Aug 2, 2024
1 parent c783056 commit f68bc99
Show file tree
Hide file tree
Showing 9 changed files with 35 additions and 26 deletions.
11 changes: 1 addition & 10 deletions packages/bruno-electron/src/ipc/network/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -316,23 +316,14 @@ const registerNetworkIpc = (mainWindow) => {
const preRequestVars = get(request, 'vars.req', []);
if (preRequestVars?.length) {
const varsRuntime = new VarsRuntime();
const result = varsRuntime.runPreRequestVars(
varsRuntime.runPreRequestVars(
preRequestVars,
request,
envVars,
collectionVariables,
collectionPath,
processEnvVars
);

if (result) {
mainWindow.webContents.send('main:script-environment-update', {
envVariables: result.envVariables,
collectionVariables: result.collectionVariables,
requestUid,
collectionUid
});
}
}

// run pre-request script
Expand Down
2 changes: 2 additions & 0 deletions packages/bruno-electron/src/ipc/network/interpolate-vars.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const getContentType = (headers = {}) => {
};

const interpolateVars = (request, envVars = {}, collectionVariables = {}, processEnvVars = {}) => {
const requestVariables = request?.requestVariables || {};
// we clone envVars because we don't want to modify the original object
envVars = cloneDeep(envVars);

Expand All @@ -36,6 +37,7 @@ const interpolateVars = (request, envVars = {}, collectionVariables = {}, proces
// collectionVariables take precedence over envVars
const combinedVars = {
...envVars,
...requestVariables,
...collectionVariables,
process: {
env: {
Expand Down
8 changes: 4 additions & 4 deletions packages/bruno-electron/src/ipc/network/prepare-request.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ const mergeFolderLevelVars = (request, requestTreePath) => {
const mergeFolderLevelScripts = (request, requestTreePath) => {
let folderCombinedPreReqScript = [];
let folderCombinedPostResScript = [];
let folderCombinedTests = '';
let folderCombinedTests = [];
for (let i of requestTreePath) {
if (i.type === 'folder') {
let preReqScript = get(i, 'root.request.script.req', '');
Expand All @@ -136,8 +136,8 @@ const mergeFolderLevelScripts = (request, requestTreePath) => {
}

let tests = get(i, 'root.request.tests', '');
if (tests?.trim?.() !== '') {
folderCombinedTests = `${folderCombinedTests} \n ${tests} \n`;
if (tests && tests?.trim?.() !== '') {
folderCombinedTests.push(tests);
}
}
}
Expand All @@ -151,7 +151,7 @@ const mergeFolderLevelScripts = (request, requestTreePath) => {
}

if (folderCombinedTests.length) {
request.tests = `${request?.tests} \n ${folderCombinedTests}`;
request.tests = compact([request?.tests || '', ...folderCombinedTests.reverse()]).join(os.EOL);
}
};

Expand Down
8 changes: 7 additions & 1 deletion packages/bruno-js/src/bru.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ const { interpolate } = require('@usebruno/common');
const variableNameRegex = /^[\w-.]*$/;

class Bru {
constructor(envVariables, collectionVariables, processEnvVars, collectionPath) {
constructor(envVariables, collectionVariables, processEnvVars, collectionPath, requestVariables) {
this.envVariables = envVariables || {};
this.collectionVariables = collectionVariables || {};
this.processEnvVars = cloneDeep(processEnvVars || {});
this.requestVariables = requestVariables || {};
this.collectionPath = collectionPath;
}

Expand All @@ -18,6 +19,7 @@ class Bru {

const combinedVars = {
...this.envVariables,
...this.requestVariables,
...this.collectionVariables,
process: {
env: {
Expand Down Expand Up @@ -79,6 +81,10 @@ class Bru {
return this._interpolate(this.collectionVariables[key]);
}

getRequestVar(key) {
return this._interpolate(this.requestVariables[key]);
}

setNextRequest(nextRequest) {
this.nextRequest = nextRequest;
}
Expand Down
6 changes: 5 additions & 1 deletion packages/bruno-js/src/interpolate-string.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
const { interpolate } = require('@usebruno/common');

const interpolateString = (str, { envVariables = {}, collectionVariables = {}, processEnvVars = {} }) => {
const interpolateString = (
str,
{ envVariables = {}, collectionVariables = {}, processEnvVars = {}, requestVariables = {} }
) => {
if (!str || !str.length || typeof str !== 'string') {
return str;
}

const combinedVars = {
...envVariables,
...requestVariables,
...collectionVariables,
process: {
env: {
Expand Down
5 changes: 4 additions & 1 deletion packages/bruno-js/src/runtime/assert-runtime.js
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ const evaluateRhsOperand = (rhsOperand, operator, context) => {
}

const interpolationContext = {
requestVariables: context.bru.requestVariables,
collectionVariables: context.bru.collectionVariables,
envVariables: context.bru.envVariables,
processEnvVars: context.bru.processEnvVars
Expand Down Expand Up @@ -204,12 +205,13 @@ const evaluateRhsOperand = (rhsOperand, operator, context) => {

class AssertRuntime {
runAssertions(assertions, request, response, envVariables, collectionVariables, processEnvVars) {
const requestVariables = request?.requestVariables || {};
const enabledAssertions = _.filter(assertions, (a) => a.enabled);
if (!enabledAssertions.length) {
return [];
}

const bru = new Bru(envVariables, collectionVariables, processEnvVars);
const bru = new Bru(envVariables, collectionVariables, processEnvVars, undefined, requestVariables);
const req = new BrunoRequest(request);
const res = createResponseParser(response);

Expand All @@ -221,6 +223,7 @@ class AssertRuntime {

const context = {
...envVariables,
...requestVariables,
...collectionVariables,
...processEnvVars,
...bruContext
Expand Down
6 changes: 4 additions & 2 deletions packages/bruno-js/src/runtime/script-runtime.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ class ScriptRuntime {
processEnvVars,
scriptingConfig
) {
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath);
const requestVariables = request?.requestVariables || {};
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath, requestVariables);
const req = new BrunoRequest(request);
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []);
Expand Down Expand Up @@ -141,7 +142,8 @@ class ScriptRuntime {
processEnvVars,
scriptingConfig
) {
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath);
const requestVariables = request?.requestVariables || {};
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath, requestVariables);
const req = new BrunoRequest(request);
const res = new BrunoResponse(response);
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
Expand Down
3 changes: 2 additions & 1 deletion packages/bruno-js/src/runtime/test-runtime.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ class TestRuntime {
processEnvVars,
scriptingConfig
) {
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath);
const requestVariables = request?.requestVariables || {};
const bru = new Bru(envVariables, collectionVariables, processEnvVars, collectionPath, requestVariables);
const req = new BrunoRequest(request);
const res = new BrunoResponse(response);
const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false);
Expand Down
12 changes: 6 additions & 6 deletions packages/bruno-js/src/runtime/vars-runtime.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ const { evaluateJsTemplateLiteral, evaluateJsExpression, createResponseParser }

class VarsRuntime {
runPreRequestVars(vars, request, envVariables, collectionVariables, collectionPath, processEnvVars) {
if (!request?.requestVariables) {
request.requestVariables = {};
}
const enabledVars = _.filter(vars, (v) => v.enabled);
if (!enabledVars.length) {
return;
Expand All @@ -26,21 +29,18 @@ class VarsRuntime {

_.each(enabledVars, (v) => {
const value = evaluateJsTemplateLiteral(v.value, context);
bru.setVar(v.name, value);
request?.requestVariables && (request.requestVariables[v.name] = value);
});

return {
collectionVariables
};
}

runPostResponseVars(vars, request, response, envVariables, collectionVariables, collectionPath, processEnvVars) {
const requestVariables = request?.requestVariables || {};
const enabledVars = _.filter(vars, (v) => v.enabled);
if (!enabledVars.length) {
return;
}

const bru = new Bru(envVariables, collectionVariables, processEnvVars);
const bru = new Bru(envVariables, collectionVariables, processEnvVars, undefined, requestVariables);
const req = new BrunoRequest(request);
const res = createResponseParser(response);

Expand Down

0 comments on commit f68bc99

Please sign in to comment.