From aff6499478a2112c8394bb147f7e849016efd376 Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Wed, 8 Feb 2023 18:17:30 +0530 Subject: [PATCH] feat: assert tab allows any valid js code as keys --- packages/bruno-lang/package.json | 2 +- packages/bruno-lang/v2/src/bruToJson.js | 23 +++++++++++++++++++- packages/bruno-lang/v2/tests/assert.spec.js | 24 +++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 packages/bruno-lang/v2/tests/assert.spec.js diff --git a/packages/bruno-lang/package.json b/packages/bruno-lang/package.json index 5572cdd8..cbe0bf9f 100644 --- a/packages/bruno-lang/package.json +++ b/packages/bruno-lang/package.json @@ -1,6 +1,6 @@ { "name": "@usebruno/lang", - "version": "0.1.0", + "version": "0.1.1", "main": "src/index.js", "files": [ "src", diff --git a/packages/bruno-lang/v2/src/bruToJson.js b/packages/bruno-lang/v2/src/bruToJson.js index 06533b8d..00a6d83f 100644 --- a/packages/bruno-lang/v2/src/bruToJson.js +++ b/packages/bruno-lang/v2/src/bruToJson.js @@ -42,6 +42,13 @@ const grammar = ohm.grammar(`Bru { pair = st* key st* ":" st* value? st* key = ~tagend validkey* value = ~tagend validvalue* + + // Dictionary for Assert Block + assertdictionary = st* "{" assertpairlist? tagend + assertpairlist = optionalnl* assertpair (~tagend stnl* assertpair)* (~tagend space)* + assertpair = st* assertkey st* ":" st* value? st* + assertkey = ~tagend assertvalidkey* + assertvalidkey = ~(":") any // Text Blocks textblock = textline (~tagend nl textline)* @@ -67,7 +74,7 @@ const grammar = ohm.grammar(`Bru { varsandassert = varsreq | varsres | assert varsreq = "vars:pre-request" dictionary varsres = "vars:post-response" dictionary - assert = "assert" dictionary + assert = "assert" assertdictionary body = "body" st* "{" nl* textblock tagend bodyjson = "body:json" st* "{" nl* textblock tagend @@ -148,6 +155,20 @@ const sem = grammar.createSemantics().addAttribute('ast', { value(chars) { return chars.sourceString ? chars.sourceString.trim() : ''; }, + assertdictionary(_1, _2, pairlist, _3) { + return pairlist.ast; + }, + assertpairlist(_1, pair, _2, rest, _3) { + return [pair.ast, ...rest.ast]; + }, + assertpair(_1, key, _2, _3, _4, value, _5) { + let res = {}; + res[key.ast] = _.get(value, 'ast[0]', ''); + return res; + }, + assertkey(chars) { + return chars.sourceString ? chars.sourceString.trim() : ''; + }, textblock(line, _1, rest) { return [line.ast, ...rest.ast].join('\n'); }, diff --git a/packages/bruno-lang/v2/tests/assert.spec.js b/packages/bruno-lang/v2/tests/assert.spec.js new file mode 100644 index 00000000..2aa0ec5a --- /dev/null +++ b/packages/bruno-lang/v2/tests/assert.spec.js @@ -0,0 +1,24 @@ +/** + * This test file is used to test the text parser. + */ +const parser = require("../src/bruToJson"); + +describe("assert parser", () => { + it("should parse assert statement", () => { + const input = ` +assert { + res("data.airports").filter(a => a.code ==="BLR").name: "Bangalore International Airport" +} +`; + + const output = parser(input); + const expected = { + "assert": [{ + name: "res(\"data.airports\").filter(a => a.code ===\"BLR\").name", + value: '"Bangalore International Airport"', + enabled: true + }] + }; + expect(output).toEqual(expected); + }); +});