UNPKG

@player-ui/player

Version:

280 lines (259 loc) 6.95 kB
import { describe, expect, beforeEach, test } from "vitest"; import { BindingParser } from "../../../binding"; import { LocalModel, withParser } from "../../../data"; import { SchemaController } from "../../../schema"; import { NodeType, Parser } from "../index"; import { SwitchPlugin, ApplicabilityPlugin, TemplatePlugin, MultiNodePlugin, AssetPlugin, } from "../.."; import type { Options } from "../../plugins/options"; import { ExpressionEvaluator } from "../../../expressions"; import type { DataModelWithParser } from "../../../data"; const parseBinding = new BindingParser().parse; describe("generates the correct AST", () => { let model: DataModelWithParser; let expressionEvaluator: ExpressionEvaluator; let options: Options; let parser: Parser; beforeEach(() => { model = withParser(new LocalModel(), parseBinding); expressionEvaluator = new ExpressionEvaluator({ model, }); parser = new Parser(); options = { evaluate: expressionEvaluator.evaluate, schema: new SchemaController(), data: { format: (binding, val) => val, formatValue: (val) => val, model, }, }; new AssetPlugin().applyParser(parser); new TemplatePlugin(options).applyParser(parser); new ApplicabilityPlugin().applyParser(parser); new SwitchPlugin(options).applyParser(parser); new MultiNodePlugin().applyParser(parser); }); test("works with basic objects", () => { expect(parser.parseObject({ foo: "bar" })).toStrictEqual({ type: NodeType.Value, value: { foo: "bar", }, }); }); test("works with objects that have symbols", () => { const testSymbol = Symbol("foo"); expect(parser.parseObject({ [testSymbol]: "bar" })).toStrictEqual({ type: NodeType.Value, value: { [testSymbol]: "bar", }, }); }); test("works with applicability things", () => { expect( parser.parseObject({ foo: "bar", applicability: "{{baz}}" }), ).toMatchSnapshot(); expect( parser.parseObject({ asset: { values: [ { applicability: "{{foo}}", value: "foo", }, { value: "bar", }, ], }, }), ).toMatchSnapshot(); expect( parser.parseObject({ asset: { someProp: { applicability: "{{foo}}", label: { value: "label", }, description: { value: "description", }, }, }, }), ).toMatchSnapshot(); expect( parser.parseObject({ asset: { someProp: { asset: { applicability: "{{foo}}", type: "someAsset", }, }, }, }), ).toMatchSnapshot(); }); test("parses an object", () => { expect(parser.parseObject({ asset: { type: "bar" } })).toMatchSnapshot(); }); test("parses an exp array", () => { expect( parser.parseObject( { id: "foo", type: "action", exp: ['{{please}} = "work"'], }, NodeType.Asset, ), ).toMatchSnapshot(); }); test("keeps null values when parsing object", () => { expect(parser.parseObject({ foo: "bar", baz: null })).toStrictEqual({ type: NodeType.Value, value: { foo: "bar", baz: null, }, }); }); }); describe("parseView", () => { let model: DataModelWithParser; let expressionEvaluator: ExpressionEvaluator; let options: Options; let parser: Parser; beforeEach(() => { model = withParser(new LocalModel(), parseBinding); expressionEvaluator = new ExpressionEvaluator({ model, }); parser = new Parser(); options = { evaluate: expressionEvaluator.evaluate, schema: new SchemaController(), data: { format: (binding, val) => val, formatValue: (val) => val, model, }, }; new AssetPlugin().applyParser(parser); new TemplatePlugin(options).applyParser(parser); new ApplicabilityPlugin().applyParser(parser); new MultiNodePlugin().applyParser(parser); new SwitchPlugin(options).applyParser(parser); }); test("parses a simple view", () => { expect( parser.parseView({ id: "foo-view", type: "viewtype", fields: { asset: { id: "foo-asset", type: "collection", values: [ { asset: { id: "text-asset", type: "text", value: "bar", }, }, { asset: { applicability: "foo.bar", id: "input-asset", type: "input", }, }, {}, ], }, }, } as any), ).toMatchSnapshot(); }); }); describe("generates the correct AST when using switch plugin", () => { const toughStaticSwitchView = { id: "toughView", type: "view", title: { staticSwitch: [ { case: "'true'", asset: { id: "businessprofile-tile-screen-yoy-subtitle", type: "text", value: "If it's changed since last year, let us know. Feel free to pick more than one.", }, }, ], }, }; const toughStaticSwitchMultiNodeView = { id: "toughView", type: "view", title: { asset: { id: "someMultiNode", type: "type", values: [ { staticSwitch: [ { case: "'true'", asset: { id: "businessprofile-tile-screen-yoy-subtitle-1", type: "text", value: "If it's changed since last year, let us know. Feel free to pick more than one.", }, }, ], }, { asset: { id: "businessprofile-tile-screen-yoy-subtitle-2", type: "text", value: "More text", }, }, ], }, }, }; const switchPlugin = new SwitchPlugin({ evaluate: () => { return true; }, } as any); const multiNodePlugin = new MultiNodePlugin(); const assetPlugin = new AssetPlugin(); const parser = new Parser(); switchPlugin.applyParser(parser); multiNodePlugin.applyParser(parser); assetPlugin.applyParser(parser); test("works with asset wrapped objects", () => { expect(parser.parseObject(toughStaticSwitchView)).toMatchSnapshot(); }); test("works with objects in a multiNode", () => { expect( parser.parseObject(toughStaticSwitchMultiNodeView), ).toMatchSnapshot(); }); });