UNPKG

odatafy-parser

Version:

generate odatafy ast from odata query parameters

358 lines (357 loc) 14.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const assert_1 = __importDefault(require("assert")); const expandParser_1 = __importDefault(require("../../src/parsing/expandParser")); const nodes_1 = require("../../src/types/nodes"); function testParsingAndAST(testcase) { it(`should parse ${testcase.type}: ${testcase.input}`, () => { let ast = expandParser_1.default.parse(testcase.input); assert_1.default.deepStrictEqual(ast, testcase.expectedAST); }); } describe("Expand Parser tests", () => { describe("single navigation", () => { [ { type: "single navigation property", input: "Items", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Items", }, ], }, ], }, }, { type: "single navigation property with $ref", input: "Items/$ref", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNodeWithOptions, optionType: "ref", options: {}, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Items", }, ], }, ], }, }, ].forEach(testParsingAndAST); }); describe("multi navigation", () => { [ { type: "multi navigation property", input: "Customer,Items", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Customer", }, ], }, { nodeType: nodes_1.NodeTypes.ExpandPathNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Items", }, ], }, ], }, }, { type: "multi navigation property", input: "Customer/$ref,Items", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNodeWithOptions, optionType: "ref", options: {}, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Customer", }, ], }, { nodeType: nodes_1.NodeTypes.ExpandPathNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Items" }, ], }, ], }, }, { type: "multi navigation property, nested", input: "Customer,Items($expand=Product)", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Customer", }, ], }, { nodeType: nodes_1.NodeTypes.ExpandPathNodeWithOptions, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Items" }, ], options: { expand: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Product", }, ], }, ], }, }, optionType: "default", }, ], }, }, ].forEach(testParsingAndAST); }); describe("options testcases", () => { [ { type: "recursive expansion", input: "Customer($levels=4)", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNodeWithOptions, optionType: "default", options: { levels: 4, }, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Customer", }, ], }, ], }, }, { type: "recursive expansion - no $ prefix", input: "Customer(levels=4)", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNodeWithOptions, optionType: "default", options: { levels: 4, }, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Customer", }, ], }, ], }, }, { type: "Expand - $count", input: "Items($count=true)", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNodeWithOptions, optionType: "default", options: { count: true, }, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Items", }, ], }, ], }, }, { type: "Expand - $filter", input: "Items($filter=Name eq 'Hugo')", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNodeWithOptions, optionType: "default", options: { filter: { nodeType: nodes_1.NodeTypes.OperatorNode, op: nodes_1.OperatorNodeOperators.Eq, left: { nodeType: nodes_1.NodeTypes.SymbolNode, type: nodes_1.SymbolNodeTypes.Identifier, value: "Name", }, right: { nodeType: nodes_1.NodeTypes.ConstantNode, type: nodes_1.ConstantNodeTypes.String, value: "Hugo", }, }, }, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Items", }, ], }, ], }, }, { type: "Expand - $skip", input: "Items($skip=4)", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNodeWithOptions, optionType: "default", options: { skip: 4, }, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Items", }, ], }, ], }, }, { type: "Expand - $top", input: "Items($top=4)", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNodeWithOptions, optionType: "default", options: { top: 4, }, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Items", }, ], }, ], }, }, { type: "Expand - $select", input: "Items($select=Product)", expectedAST: { nodeType: nodes_1.NodeTypes.ExpandNode, value: [ { nodeType: nodes_1.NodeTypes.ExpandPathNodeWithOptions, optionType: "default", options: { select: { nodeType: nodes_1.NodeTypes.SelectNode, value: [ { nodeType: nodes_1.NodeTypes.SelectPathNode, value: [ { nodeType: nodes_1.NodeTypes.SelectIdentifierNode, value: "Product", }, ], }, ], }, }, value: [ { nodeType: nodes_1.NodeTypes.ExpandIdentifierNode, value: "Items", }, ], }, ], }, }, ].forEach(testParsingAndAST); }); // describe("error tests", () => { // [ // { // type: "no $select after $ref", // input: "Customer/$ref($select=Name)" // } // ].forEach(testcase => { // it(`should throw Error because of ${testcase.type}`, () => { // assert.throws( // () => { // expandParser.parse(testcase.input); // }, // { // name: 'peg$SyntaxError', // message: 'Expected "$value", "%2A", "%40", "*", "@", "_", or [a-z,A-Z] but "$" found' // }); // }); });