mirror of
https://github.com/usebruno/bruno.git
synced 2024-12-22 23:02:40 +01:00
Merge pull request #3186 from lohxt1/feat/cli-collection-vars
feat: adds collection/folder/request vars and scripts support to cli
This commit is contained in:
commit
915ebf3387
6557
package-lock.json
generated
6557
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -93,8 +93,68 @@ const printRunSummary = (results) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const createCollectionFromPath = (collectionPath) => {
|
||||||
|
const environmentsPath = `${collectionPath}/environments`;
|
||||||
|
const getFilesInOrder = (collectionPath) => {
|
||||||
|
let collection = {
|
||||||
|
pathname: collectionPath
|
||||||
|
};
|
||||||
|
const traverse = (currentPath) => {
|
||||||
|
const filesInCurrentDir = fs.readdirSync(currentPath);
|
||||||
|
|
||||||
|
if (currentPath.includes('node_modules')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const currentDirItems = [];
|
||||||
|
for (const file of filesInCurrentDir) {
|
||||||
|
const filePath = path.join(currentPath, file);
|
||||||
|
const stats = fs.lstatSync(filePath);
|
||||||
|
if (
|
||||||
|
stats.isDirectory() &&
|
||||||
|
filePath !== environmentsPath &&
|
||||||
|
!filePath.startsWith('.git') &&
|
||||||
|
!filePath.startsWith('node_modules')
|
||||||
|
) {
|
||||||
|
let folderItem = { name: file, pathname: filePath, type: 'folder', items: traverse(filePath) }
|
||||||
|
const folderBruFilePath = path.join(filePath, 'folder.bru');
|
||||||
|
const folderBruFileExists = fs.existsSync(folderBruFilePath);
|
||||||
|
if(folderBruFileExists) {
|
||||||
|
const folderBruContent = fs.readFileSync(folderBruFilePath, 'utf8');
|
||||||
|
let folderBruJson = collectionBruToJson(folderBruContent);
|
||||||
|
folderItem.root = folderBruJson;
|
||||||
|
}
|
||||||
|
currentDirItems.push(folderItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const file of filesInCurrentDir) {
|
||||||
|
if (['collection.bru', 'folder.bru'].includes(file)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const filePath = path.join(currentPath, file);
|
||||||
|
const stats = fs.lstatSync(filePath);
|
||||||
|
|
||||||
|
if (!stats.isDirectory() && path.extname(filePath) === '.bru') {
|
||||||
|
const bruContent = fs.readFileSync(filePath, 'utf8');
|
||||||
|
const bruJson = bruToJson(bruContent);
|
||||||
|
currentDirItems.push({
|
||||||
|
name: file,
|
||||||
|
pathname: filePath,
|
||||||
|
...bruJson
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return currentDirItems
|
||||||
|
};
|
||||||
|
collection.items = traverse(collectionPath);
|
||||||
|
return collection;
|
||||||
|
};
|
||||||
|
return getFilesInOrder(collectionPath);
|
||||||
|
};
|
||||||
|
|
||||||
const getBruFilesRecursively = (dir, testsOnly) => {
|
const getBruFilesRecursively = (dir, testsOnly) => {
|
||||||
const environmentsPath = 'environments';
|
const environmentsPath = 'environments';
|
||||||
|
const collection = {};
|
||||||
|
|
||||||
const getFilesInOrder = (dir) => {
|
const getFilesInOrder = (dir) => {
|
||||||
let bruJsons = [];
|
let bruJsons = [];
|
||||||
@ -359,6 +419,12 @@ const handler = async function (argv) {
|
|||||||
const brunoConfigFile = fs.readFileSync(brunoJsonPath, 'utf8');
|
const brunoConfigFile = fs.readFileSync(brunoJsonPath, 'utf8');
|
||||||
const brunoConfig = JSON.parse(brunoConfigFile);
|
const brunoConfig = JSON.parse(brunoConfigFile);
|
||||||
const collectionRoot = getCollectionRoot(collectionPath);
|
const collectionRoot = getCollectionRoot(collectionPath);
|
||||||
|
let collection = createCollectionFromPath(collectionPath);
|
||||||
|
collection = {
|
||||||
|
brunoConfig,
|
||||||
|
root: collectionRoot,
|
||||||
|
...collection
|
||||||
|
}
|
||||||
|
|
||||||
if (clientCertConfig) {
|
if (clientCertConfig) {
|
||||||
try {
|
try {
|
||||||
@ -584,7 +650,8 @@ const handler = async function (argv) {
|
|||||||
processEnvVars,
|
processEnvVars,
|
||||||
brunoConfig,
|
brunoConfig,
|
||||||
collectionRoot,
|
collectionRoot,
|
||||||
runtime
|
runtime,
|
||||||
|
collection
|
||||||
);
|
);
|
||||||
|
|
||||||
results.push({
|
results.push({
|
||||||
|
@ -13,14 +13,17 @@ const getContentType = (headers = {}) => {
|
|||||||
return contentType;
|
return contentType;
|
||||||
};
|
};
|
||||||
|
|
||||||
const interpolateVars = (request, envVars = {}, runtimeVariables = {}, processEnvVars = {}) => {
|
const interpolateVars = (request, envVariables = {}, runtimeVariables = {}, processEnvVars = {}) => {
|
||||||
|
const collectionVariables = request?.collectionVariables || {};
|
||||||
|
const folderVariables = request?.folderVariables || {};
|
||||||
|
const requestVariables = request?.requestVariables || {};
|
||||||
// we clone envVars because we don't want to modify the original object
|
// we clone envVars because we don't want to modify the original object
|
||||||
envVars = cloneDeep(envVars);
|
envVariables = cloneDeep(envVariables);
|
||||||
|
|
||||||
// envVars can inturn have values as {{process.env.VAR_NAME}}
|
// envVars can inturn have values as {{process.env.VAR_NAME}}
|
||||||
// so we need to interpolate envVars first with processEnvVars
|
// so we need to interpolate envVars first with processEnvVars
|
||||||
forOwn(envVars, (value, key) => {
|
forOwn(envVariables, (value, key) => {
|
||||||
envVars[key] = interpolate(value, {
|
envVariables[key] = interpolate(value, {
|
||||||
process: {
|
process: {
|
||||||
env: {
|
env: {
|
||||||
...processEnvVars
|
...processEnvVars
|
||||||
@ -36,7 +39,10 @@ const interpolateVars = (request, envVars = {}, runtimeVariables = {}, processEn
|
|||||||
|
|
||||||
// runtimeVariables take precedence over envVars
|
// runtimeVariables take precedence over envVars
|
||||||
const combinedVars = {
|
const combinedVars = {
|
||||||
...envVars,
|
...collectionVariables,
|
||||||
|
...envVariables,
|
||||||
|
...folderVariables,
|
||||||
|
...requestVariables,
|
||||||
...runtimeVariables,
|
...runtimeVariables,
|
||||||
process: {
|
process: {
|
||||||
env: {
|
env: {
|
||||||
|
@ -1,24 +1,230 @@
|
|||||||
const { get, each, filter } = require('lodash');
|
const { get, each, filter, find, compact } = require('lodash');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
const os = require('os');
|
||||||
var JSONbig = require('json-bigint');
|
var JSONbig = require('json-bigint');
|
||||||
const decomment = require('decomment');
|
const decomment = require('decomment');
|
||||||
const crypto = require('node:crypto');
|
const crypto = require('node:crypto');
|
||||||
|
|
||||||
const prepareRequest = (request, collectionRoot) => {
|
const mergeHeaders = (collection, request, requestTreePath) => {
|
||||||
const headers = {};
|
let headers = new Map();
|
||||||
let contentTypeDefined = false;
|
|
||||||
|
|
||||||
// collection headers
|
let collectionHeaders = get(collection, 'root.request.headers', []);
|
||||||
each(get(collectionRoot, 'request.headers', []), (h) => {
|
collectionHeaders.forEach((header) => {
|
||||||
if (h.enabled) {
|
if (header.enabled) {
|
||||||
headers[h.name] = h.value;
|
headers.set(header.name, header.value);
|
||||||
if (h.name.toLowerCase() === 'content-type') {
|
|
||||||
contentTypeDefined = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
each(request.headers, (h) => {
|
for (let i of requestTreePath) {
|
||||||
|
if (i.type === 'folder') {
|
||||||
|
let _headers = get(i, 'root.request.headers', []);
|
||||||
|
_headers.forEach((header) => {
|
||||||
|
if (header.enabled) {
|
||||||
|
headers.set(header.name, header.value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const _headers = i?.draft ? get(i, 'draft.request.headers', []) : get(i, 'request.headers', []);
|
||||||
|
_headers.forEach((header) => {
|
||||||
|
if (header.enabled) {
|
||||||
|
headers.set(header.name, header.value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
request.headers = Array.from(headers, ([name, value]) => ({ name, value, enabled: true }));
|
||||||
|
};
|
||||||
|
|
||||||
|
const mergeVars = (collection, request, requestTreePath) => {
|
||||||
|
let reqVars = new Map();
|
||||||
|
let collectionRequestVars = get(collection, 'root.request.vars.req', []);
|
||||||
|
let collectionVariables = {};
|
||||||
|
collectionRequestVars.forEach((_var) => {
|
||||||
|
if (_var.enabled) {
|
||||||
|
reqVars.set(_var.name, _var.value);
|
||||||
|
collectionVariables[_var.name] = _var.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let folderVariables = {};
|
||||||
|
let requestVariables = {};
|
||||||
|
for (let i of requestTreePath) {
|
||||||
|
if (i.type === 'folder') {
|
||||||
|
let vars = get(i, 'root.request.vars.req', []);
|
||||||
|
vars.forEach((_var) => {
|
||||||
|
if (_var.enabled) {
|
||||||
|
reqVars.set(_var.name, _var.value);
|
||||||
|
folderVariables[_var.name] = _var.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const vars = i?.draft ? get(i, 'draft.request.vars.req', []) : get(i, 'request.vars.req', []);
|
||||||
|
vars.forEach((_var) => {
|
||||||
|
if (_var.enabled) {
|
||||||
|
reqVars.set(_var.name, _var.value);
|
||||||
|
requestVariables[_var.name] = _var.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
request.collectionVariables = collectionVariables;
|
||||||
|
request.folderVariables = folderVariables;
|
||||||
|
request.requestVariables = requestVariables;
|
||||||
|
|
||||||
|
if(request?.vars) {
|
||||||
|
request.vars.req = Array.from(reqVars, ([name, value]) => ({
|
||||||
|
name,
|
||||||
|
value,
|
||||||
|
enabled: true,
|
||||||
|
type: 'request'
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
let resVars = new Map();
|
||||||
|
let collectionResponseVars = get(collection, 'root.request.vars.res', []);
|
||||||
|
collectionResponseVars.forEach((_var) => {
|
||||||
|
if (_var.enabled) {
|
||||||
|
resVars.set(_var.name, _var.value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (let i of requestTreePath) {
|
||||||
|
if (i.type === 'folder') {
|
||||||
|
let vars = get(i, 'root.request.vars.res', []);
|
||||||
|
vars.forEach((_var) => {
|
||||||
|
if (_var.enabled) {
|
||||||
|
resVars.set(_var.name, _var.value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const vars = i?.draft ? get(i, 'draft.request.vars.res', []) : get(i, 'request.vars.res', []);
|
||||||
|
vars.forEach((_var) => {
|
||||||
|
if (_var.enabled) {
|
||||||
|
resVars.set(_var.name, _var.value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(request?.vars) {
|
||||||
|
request.vars.res = Array.from(resVars, ([name, value]) => ({
|
||||||
|
name,
|
||||||
|
value,
|
||||||
|
enabled: true,
|
||||||
|
type: 'response'
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const mergeScripts = (collection, request, requestTreePath, scriptFlow) => {
|
||||||
|
let collectionPreReqScript = get(collection, 'root.request.script.req', '');
|
||||||
|
let collectionPostResScript = get(collection, 'root.request.script.res', '');
|
||||||
|
let collectionTests = get(collection, 'root.request.tests', '');
|
||||||
|
|
||||||
|
let combinedPreReqScript = [];
|
||||||
|
let combinedPostResScript = [];
|
||||||
|
let combinedTests = [];
|
||||||
|
for (let i of requestTreePath) {
|
||||||
|
if (i.type === 'folder') {
|
||||||
|
let preReqScript = get(i, 'root.request.script.req', '');
|
||||||
|
if (preReqScript && preReqScript.trim() !== '') {
|
||||||
|
combinedPreReqScript.push(preReqScript);
|
||||||
|
}
|
||||||
|
|
||||||
|
let postResScript = get(i, 'root.request.script.res', '');
|
||||||
|
if (postResScript && postResScript.trim() !== '') {
|
||||||
|
combinedPostResScript.push(postResScript);
|
||||||
|
}
|
||||||
|
|
||||||
|
let tests = get(i, 'root.request.tests', '');
|
||||||
|
if (tests && tests?.trim?.() !== '') {
|
||||||
|
combinedTests.push(tests);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (combinedPreReqScript.length) {
|
||||||
|
request.script.req = compact([collectionPreReqScript, ...combinedPreReqScript, request?.script?.req || '']).join(os.EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (combinedPostResScript.length) {
|
||||||
|
if (scriptFlow === 'sequential') {
|
||||||
|
request.script.res = compact([collectionPostResScript, ...combinedPostResScript, request?.script?.res || '']).join(os.EOL);
|
||||||
|
} else {
|
||||||
|
request.script.res = compact([request?.script?.res || '', ...combinedPostResScript.reverse(), collectionPostResScript]).join(os.EOL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (combinedTests.length) {
|
||||||
|
if (scriptFlow === 'sequential') {
|
||||||
|
request.tests = compact([collectionTests, ...combinedTests, request?.tests || '']).join(os.EOL);
|
||||||
|
} else {
|
||||||
|
request.tests = compact([request?.tests || '', ...combinedTests.reverse(), collectionTests]).join(os.EOL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const findItem = (items = [], pathname) => {
|
||||||
|
return find(items, (i) => i.pathname === pathname);
|
||||||
|
};
|
||||||
|
|
||||||
|
const findItemInCollection = (collection, pathname) => {
|
||||||
|
let flattenedItems = flattenItems(collection.items);
|
||||||
|
|
||||||
|
return findItem(flattenedItems, pathname);
|
||||||
|
};
|
||||||
|
|
||||||
|
const findParentItemInCollection = (collection, pathname) => {
|
||||||
|
let flattenedItems = flattenItems(collection.items);
|
||||||
|
|
||||||
|
return find(flattenedItems, (item) => {
|
||||||
|
return item.items && find(item.items, (i) => i.pathname === pathname);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const flattenItems = (items = []) => {
|
||||||
|
const flattenedItems = [];
|
||||||
|
|
||||||
|
const flatten = (itms, flattened) => {
|
||||||
|
each(itms, (i) => {
|
||||||
|
flattened.push(i);
|
||||||
|
|
||||||
|
if (i.items && i.items.length) {
|
||||||
|
flatten(i.items, flattened);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
flatten(items, flattenedItems);
|
||||||
|
|
||||||
|
return flattenedItems;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getTreePathFromCollectionToItem = (collection, _item) => {
|
||||||
|
let path = [];
|
||||||
|
let item = findItemInCollection(collection, _item.pathname);
|
||||||
|
while (item) {
|
||||||
|
path.unshift(item);
|
||||||
|
item = findParentItemInCollection(collection, item.pathname);
|
||||||
|
}
|
||||||
|
return path;
|
||||||
|
};
|
||||||
|
|
||||||
|
const prepareRequest = (item = {}, collection = {}) => {
|
||||||
|
const request = item?.request;
|
||||||
|
const brunoConfig = get(collection, 'brunoConfig', {});
|
||||||
|
const headers = {};
|
||||||
|
let contentTypeDefined = false;
|
||||||
|
|
||||||
|
const scriptFlow = brunoConfig?.scripts?.flow ?? 'sandwich';
|
||||||
|
const requestTreePath = getTreePathFromCollectionToItem(collection, item);
|
||||||
|
if (requestTreePath && requestTreePath.length > 0) {
|
||||||
|
mergeHeaders(collection, request, requestTreePath);
|
||||||
|
mergeScripts(collection, request, requestTreePath, scriptFlow);
|
||||||
|
mergeVars(collection, request, requestTreePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
each(get(request, 'headers', []), (h) => {
|
||||||
if (h.enabled) {
|
if (h.enabled) {
|
||||||
headers[h.name] = h.value;
|
headers[h.name] = h.value;
|
||||||
if (h.name.toLowerCase() === 'content-type') {
|
if (h.name.toLowerCase() === 'content-type') {
|
||||||
@ -34,7 +240,7 @@ const prepareRequest = (request, collectionRoot) => {
|
|||||||
pathParams: request?.params?.filter((param) => param.type === 'path')
|
pathParams: request?.params?.filter((param) => param.type === 'path')
|
||||||
};
|
};
|
||||||
|
|
||||||
const collectionAuth = get(collectionRoot, 'request.auth');
|
const collectionAuth = get(collection, 'root.request.auth');
|
||||||
if (collectionAuth && request.auth.mode === 'inherit') {
|
if (collectionAuth && request.auth.mode === 'inherit') {
|
||||||
if (collectionAuth.mode === 'basic') {
|
if (collectionAuth.mode === 'basic') {
|
||||||
axiosRequest.auth = {
|
axiosRequest.auth = {
|
||||||
@ -157,10 +363,19 @@ const prepareRequest = (request, collectionRoot) => {
|
|||||||
axiosRequest.data = graphqlQuery;
|
axiosRequest.data = graphqlQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.script && request.script.length) {
|
if (request.script) {
|
||||||
axiosRequest.script = request.script;
|
axiosRequest.script = request.script;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (request.tests) {
|
||||||
|
axiosRequest.tests = request.tests;
|
||||||
|
}
|
||||||
|
|
||||||
|
axiosRequest.vars = request.vars;
|
||||||
|
axiosRequest.collectionVariables = request.collectionVariables;
|
||||||
|
axiosRequest.folderVariables = request.folderVariables;
|
||||||
|
axiosRequest.requestVariables = request.requestVariables;
|
||||||
|
|
||||||
return axiosRequest;
|
return axiosRequest;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -36,13 +36,17 @@ const runSingleRequest = async function (
|
|||||||
processEnvVars,
|
processEnvVars,
|
||||||
brunoConfig,
|
brunoConfig,
|
||||||
collectionRoot,
|
collectionRoot,
|
||||||
runtime
|
runtime,
|
||||||
|
collection
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
let request;
|
let request;
|
||||||
let nextRequestName;
|
let nextRequestName;
|
||||||
|
let item = {
|
||||||
request = prepareRequest(bruJson.request, collectionRoot);
|
pathname: path.join(collectionPath, filename),
|
||||||
|
...bruJson
|
||||||
|
}
|
||||||
|
request = prepareRequest(item, collection);
|
||||||
|
|
||||||
request.__bruno__executionMode = 'cli';
|
request.__bruno__executionMode = 'cli';
|
||||||
|
|
||||||
@ -50,10 +54,7 @@ const runSingleRequest = async function (
|
|||||||
scriptingConfig.runtime = runtime;
|
scriptingConfig.runtime = runtime;
|
||||||
|
|
||||||
// run pre request script
|
// run pre request script
|
||||||
const requestScriptFile = compact([
|
const requestScriptFile = get(request, 'script.req');
|
||||||
get(collectionRoot, 'request.script.req'),
|
|
||||||
get(bruJson, 'request.script.req')
|
|
||||||
]).join(os.EOL);
|
|
||||||
if (requestScriptFile?.length) {
|
if (requestScriptFile?.length) {
|
||||||
const scriptRuntime = new ScriptRuntime({ runtime: scriptingConfig?.runtime });
|
const scriptRuntime = new ScriptRuntime({ runtime: scriptingConfig?.runtime });
|
||||||
const result = await scriptRuntime.runRequestScript(
|
const result = await scriptRuntime.runRequestScript(
|
||||||
@ -291,10 +292,7 @@ const runSingleRequest = async function (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// run post response script
|
// run post response script
|
||||||
const responseScriptFile = compact([
|
const responseScriptFile = get(request, 'script.res');
|
||||||
get(collectionRoot, 'request.script.res'),
|
|
||||||
get(bruJson, 'request.script.res')
|
|
||||||
]).join(os.EOL);
|
|
||||||
if (responseScriptFile?.length) {
|
if (responseScriptFile?.length) {
|
||||||
const scriptRuntime = new ScriptRuntime({ runtime: scriptingConfig?.runtime });
|
const scriptRuntime = new ScriptRuntime({ runtime: scriptingConfig?.runtime });
|
||||||
const result = await scriptRuntime.runResponseScript(
|
const result = await scriptRuntime.runResponseScript(
|
||||||
@ -339,7 +337,7 @@ const runSingleRequest = async function (
|
|||||||
|
|
||||||
// run tests
|
// run tests
|
||||||
let testResults = [];
|
let testResults = [];
|
||||||
const testFile = compact([get(collectionRoot, 'request.tests'), get(bruJson, 'request.tests')]).join(os.EOL);
|
const testFile = get(request, 'tests');
|
||||||
if (typeof testFile === 'string') {
|
if (typeof testFile === 'string') {
|
||||||
const testRuntime = new TestRuntime({ runtime: scriptingConfig?.runtime });
|
const testRuntime = new TestRuntime({ runtime: scriptingConfig?.runtime });
|
||||||
const result = await testRuntime.runTests(
|
const result = await testRuntime.runTests(
|
||||||
|
@ -7,14 +7,14 @@ describe('prepare-request: prepareRequest', () => {
|
|||||||
it('If request body is valid JSON', async () => {
|
it('If request body is valid JSON', async () => {
|
||||||
const body = { mode: 'json', json: '{\n"test": "{{someVar}}" // comment\n}' };
|
const body = { mode: 'json', json: '{\n"test": "{{someVar}}" // comment\n}' };
|
||||||
const expected = { test: '{{someVar}}' };
|
const expected = { test: '{{someVar}}' };
|
||||||
const result = prepareRequest({ body });
|
const result = prepareRequest({ request: { body } });
|
||||||
expect(result.data).toEqual(expected);
|
expect(result.data).toEqual(expected);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('If request body is not valid JSON', async () => {
|
it('If request body is not valid JSON', async () => {
|
||||||
const body = { mode: 'json', json: '{\n"test": {{someVar}} // comment\n}' };
|
const body = { mode: 'json', json: '{\n"test": {{someVar}} // comment\n}' };
|
||||||
const expected = '{\n"test": {{someVar}} \n}';
|
const expected = '{\n"test": {{someVar}} \n}';
|
||||||
const result = prepareRequest({ body });
|
const result = prepareRequest({ request: { body } });
|
||||||
expect(result.data).toEqual(expected);
|
expect(result.data).toEqual(expected);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -14,6 +14,7 @@ auth:bearer {
|
|||||||
vars:pre-request {
|
vars:pre-request {
|
||||||
collection_pre_var: collection_pre_var_value
|
collection_pre_var: collection_pre_var_value
|
||||||
collection_pre_var_token: {{request_pre_var_token}}
|
collection_pre_var_token: {{request_pre_var_token}}
|
||||||
|
collection-var: collection-var-value
|
||||||
}
|
}
|
||||||
|
|
||||||
docs {
|
docs {
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
meta {
|
||||||
|
name: bru
|
||||||
|
}
|
||||||
|
|
||||||
|
vars:pre-request {
|
||||||
|
folder-var: folder-var-value
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
meta {
|
||||||
|
name: getCollectionVar
|
||||||
|
type: http
|
||||||
|
seq: 9
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{host}}/ping
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
tests {
|
||||||
|
test("should get collection var in scripts", function() {
|
||||||
|
const testVar = bru.getCollectionVar("collection-var");
|
||||||
|
expect(testVar).to.equal("collection-var-value");
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
meta {
|
||||||
|
name: getFolderVar
|
||||||
|
type: http
|
||||||
|
seq: 8
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{host}}/ping
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
tests {
|
||||||
|
test("should get folder var in scripts", function() {
|
||||||
|
const testVar = bru.getFolderVar("folder-var");
|
||||||
|
expect(testVar).to.equal("folder-var-value");
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
meta {
|
||||||
|
name: getRequestVar
|
||||||
|
type: http
|
||||||
|
seq: 7
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: {{host}}/ping
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
vars:pre-request {
|
||||||
|
request-var: request-var-value
|
||||||
|
}
|
||||||
|
|
||||||
|
tests {
|
||||||
|
test("should get request var in scripts", function() {
|
||||||
|
const testVar = bru.getRequestVar("request-var");
|
||||||
|
expect(testVar).to.equal("request-var-value");
|
||||||
|
});
|
||||||
|
}
|
12
packages/bruno-tests/sandwich_exec/bruno.json
Normal file
12
packages/bruno-tests/sandwich_exec/bruno.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"version": "1",
|
||||||
|
"name": "sandwich_exec",
|
||||||
|
"type": "collection",
|
||||||
|
"ignore": [
|
||||||
|
"node_modules",
|
||||||
|
".git"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"flow": "sandwich"
|
||||||
|
}
|
||||||
|
}
|
13
packages/bruno-tests/sandwich_exec/collection.bru
Normal file
13
packages/bruno-tests/sandwich_exec/collection.bru
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
script:pre-request {
|
||||||
|
console.log("collection pre");
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
{
|
||||||
|
console.log("collection post");
|
||||||
|
const sequence = bru.getVar('sequence') || [];
|
||||||
|
sequence.push(1);
|
||||||
|
bru.setVar('sequence', sequence);
|
||||||
|
console.log("sequence", bru.getVar('sequence'));
|
||||||
|
}
|
||||||
|
}
|
16
packages/bruno-tests/sandwich_exec/folder/folder.bru
Normal file
16
packages/bruno-tests/sandwich_exec/folder/folder.bru
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
meta {
|
||||||
|
name: folder
|
||||||
|
}
|
||||||
|
|
||||||
|
script:pre-request {
|
||||||
|
console.log("folder pre");
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
{
|
||||||
|
const sequence = bru.getVar('sequence') || [];
|
||||||
|
sequence.push(2);
|
||||||
|
bru.setVar('sequence', sequence);
|
||||||
|
}
|
||||||
|
console.log("folder post");
|
||||||
|
}
|
33
packages/bruno-tests/sandwich_exec/folder/request.bru
Normal file
33
packages/bruno-tests/sandwich_exec/folder/request.bru
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
meta {
|
||||||
|
name: request
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: https://www.example.com
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
script:pre-request {
|
||||||
|
console.log("request pre");
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
{
|
||||||
|
console.log("request post");
|
||||||
|
|
||||||
|
const sequence = bru.getVar('sequence') || [];
|
||||||
|
sequence.push(3);
|
||||||
|
bru.setVar('sequence', sequence);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tests {
|
||||||
|
test("sandwich script execution is proper", function() {
|
||||||
|
const sequence = bru.getVar('sequence');
|
||||||
|
bru.setVar('sequence', null);
|
||||||
|
expect(sequence.toString()).to.equal([3,2,1].toString());
|
||||||
|
});
|
||||||
|
}
|
12
packages/bruno-tests/sequential_exec/bruno.json
Normal file
12
packages/bruno-tests/sequential_exec/bruno.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"version": "1",
|
||||||
|
"name": "sequential_exec",
|
||||||
|
"type": "collection",
|
||||||
|
"ignore": [
|
||||||
|
"node_modules",
|
||||||
|
".git"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"flow": "sequential"
|
||||||
|
}
|
||||||
|
}
|
12
packages/bruno-tests/sequential_exec/collection.bru
Normal file
12
packages/bruno-tests/sequential_exec/collection.bru
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
script:pre-request {
|
||||||
|
console.log("collection pre");
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
{
|
||||||
|
console.log("collection post");
|
||||||
|
const sequence = bru.getVar('sequence') || [];
|
||||||
|
sequence.push(1);
|
||||||
|
bru.setVar('sequence', sequence);
|
||||||
|
}
|
||||||
|
}
|
16
packages/bruno-tests/sequential_exec/folder/folder.bru
Normal file
16
packages/bruno-tests/sequential_exec/folder/folder.bru
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
meta {
|
||||||
|
name: folder
|
||||||
|
}
|
||||||
|
|
||||||
|
script:pre-request {
|
||||||
|
console.log("folder pre");
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
{
|
||||||
|
console.log("folder post");
|
||||||
|
const sequence = bru.getVar('sequence') || [];
|
||||||
|
sequence.push(2);
|
||||||
|
bru.setVar('sequence', sequence);
|
||||||
|
}
|
||||||
|
}
|
34
packages/bruno-tests/sequential_exec/folder/request.bru
Normal file
34
packages/bruno-tests/sequential_exec/folder/request.bru
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
meta {
|
||||||
|
name: request
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get {
|
||||||
|
url: https://www.example.com
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
script:pre-request {
|
||||||
|
console.log("request pre");
|
||||||
|
}
|
||||||
|
|
||||||
|
script:post-response {
|
||||||
|
{
|
||||||
|
console.log("request post");
|
||||||
|
const sequence = bru.getVar('sequence') || [];
|
||||||
|
sequence.push(3);
|
||||||
|
bru.setVar('sequence', sequence);
|
||||||
|
|
||||||
|
console.log("sequence", bru.getVar('sequence'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tests {
|
||||||
|
test("sequential script execution is proper", function() {
|
||||||
|
const sequence = bru.getVar('sequence');
|
||||||
|
bru.setVar('sequence', null);
|
||||||
|
expect(sequence.toString()).to.equal([1,2,3].toString());
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user