odatafy-parser
Version:
generate odatafy ast from odata query parameters
358 lines (357 loc) • 14.6 kB
JavaScript
"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'
// });
// });
});