From 2852c07ec7c547fd386414cb836852ace045ce7f Mon Sep 17 00:00:00 2001 From: Pooja Belaramani <109731557+poojabela@users.noreply.github.com> Date: Wed, 7 May 2025 17:44:29 +0530 Subject: [PATCH] feat: support tv4 as a inbuilt lib (#4589) --- packages/bruno-js/package.json | 1 + .../bruno-js/src/runtime/script-runtime.js | 3 ++ packages/bruno-js/src/runtime/test-runtime.js | 2 + .../bruno-js/src/sandbox/bundle-libraries.js | 5 ++- .../scripting/inbuilt modules/tv4/folder.bru | 3 ++ .../scripting/inbuilt modules/tv4/tv4.bru | 39 +++++++++++++++++++ 6 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 packages/bruno-tests/collection/scripting/inbuilt modules/tv4/folder.bru create mode 100644 packages/bruno-tests/collection/scripting/inbuilt modules/tv4/tv4.bru diff --git a/packages/bruno-js/package.json b/packages/bruno-js/package.json index d9b4e16e9..c040244a3 100644 --- a/packages/bruno-js/package.json +++ b/packages/bruno-js/package.json @@ -35,6 +35,7 @@ "node-vault": "^0.10.2", "path": "^0.12.7", "quickjs-emscripten": "^0.29.2", + "tv4": "^1.3.0", "uuid": "^9.0.0", "xml2js": "^0.6.2" }, diff --git a/packages/bruno-js/src/runtime/script-runtime.js b/packages/bruno-js/src/runtime/script-runtime.js index 2a8d02a87..bbb0476f5 100644 --- a/packages/bruno-js/src/runtime/script-runtime.js +++ b/packages/bruno-js/src/runtime/script-runtime.js @@ -30,6 +30,7 @@ const CryptoJS = require('crypto-js'); const NodeVault = require('node-vault'); const xml2js = require('xml2js'); const cheerio = require('cheerio'); +const tv4 = require('tv4'); const { executeQuickJsVmAsync } = require('../sandbox/quickjs'); class ScriptRuntime { @@ -151,6 +152,7 @@ class ScriptRuntime { 'crypto-js': CryptoJS, 'xml2js': xml2js, cheerio, + tv4, ...whitelistedModules, fs: allowScriptFilesystemAccess ? fs : undefined, 'node-vault': NodeVault @@ -285,6 +287,7 @@ class ScriptRuntime { 'crypto-js': CryptoJS, 'xml2js': xml2js, cheerio, + tv4, ...whitelistedModules, fs: allowScriptFilesystemAccess ? fs : undefined, 'node-vault': NodeVault diff --git a/packages/bruno-js/src/runtime/test-runtime.js b/packages/bruno-js/src/runtime/test-runtime.js index e2d1f4865..f1a5ef572 100644 --- a/packages/bruno-js/src/runtime/test-runtime.js +++ b/packages/bruno-js/src/runtime/test-runtime.js @@ -32,6 +32,7 @@ const CryptoJS = require('crypto-js'); const NodeVault = require('node-vault'); const xml2js = require('xml2js'); const cheerio = require('cheerio'); +const tv4 = require('tv4'); const { executeQuickJsVmAsync } = require('../sandbox/quickjs'); const getResultsSummary = (results) => { @@ -209,6 +210,7 @@ class TestRuntime { 'crypto-js': CryptoJS, 'xml2js': xml2js, cheerio, + tv4, ...whitelistedModules, fs: allowScriptFilesystemAccess ? fs : undefined, 'node-vault': NodeVault diff --git a/packages/bruno-js/src/sandbox/bundle-libraries.js b/packages/bruno-js/src/sandbox/bundle-libraries.js index 30d6c7c03..1545ef5cd 100644 --- a/packages/bruno-js/src/sandbox/bundle-libraries.js +++ b/packages/bruno-js/src/sandbox/bundle-libraries.js @@ -12,6 +12,7 @@ const bundleLibraries = async () => { import btoa from "btoa"; import atob from "atob"; import * as CryptoJS from "@usebruno/crypto-js"; + import tv4 from "tv4"; globalThis.expect = expect; globalThis.assert = assert; globalThis.moment = moment; @@ -19,6 +20,7 @@ const bundleLibraries = async () => { globalThis.atob = atob; globalThis.Buffer = Buffer; globalThis.CryptoJS = CryptoJS; + globalThis.tv4 = tv4; globalThis.requireObject = { ...(globalThis.requireObject || {}), 'chai': { expect, assert }, @@ -26,7 +28,8 @@ const bundleLibraries = async () => { 'buffer': { Buffer }, 'btoa': btoa, 'atob': atob, - 'crypto-js': CryptoJS + 'crypto-js': CryptoJS, + 'tv4': tv4 }; `; diff --git a/packages/bruno-tests/collection/scripting/inbuilt modules/tv4/folder.bru b/packages/bruno-tests/collection/scripting/inbuilt modules/tv4/folder.bru new file mode 100644 index 000000000..4fd4bb1d2 --- /dev/null +++ b/packages/bruno-tests/collection/scripting/inbuilt modules/tv4/folder.bru @@ -0,0 +1,3 @@ +meta { + name: tv4 +} diff --git a/packages/bruno-tests/collection/scripting/inbuilt modules/tv4/tv4.bru b/packages/bruno-tests/collection/scripting/inbuilt modules/tv4/tv4.bru new file mode 100644 index 000000000..820a7a3b8 --- /dev/null +++ b/packages/bruno-tests/collection/scripting/inbuilt modules/tv4/tv4.bru @@ -0,0 +1,39 @@ +meta { + name: tv4 + type: http + seq: 1 +} + +post { + url: {{host}}/api/echo/json + body: json + auth: inherit +} + +body:json { + { + "name": "John", + "age": 30 + } +} + +tests { + const tv4 = require("tv4") + + const schema = { + type: 'object', + properties: { + name: { type: 'string' }, + age: { type: 'number' } + } + }; + + let responseData = res.getBody(); + + let isValid = tv4.validate(responseData, schema); + + test("Response body matches expected schema", function () { + expect(isValid, tv4.error ? tv4.error.message : "").to.be.true; + }); + +}