prometheus/web/ui/mantine-ui/src/promql/utils.test.ts

156 lines
3.7 KiB
TypeScript
Raw Normal View History

import { describe, expect, it } from "vitest";
import {
getNonParenNodeType,
containsPlaceholders,
nodeValueType,
} from "./utils";
import { nodeType, valueType, binaryOperatorType } from "./ast";
describe("getNonParenNodeType", () => {
it("works for non-paren type", () => {
expect(
getNonParenNodeType({ type: nodeType.numberLiteral, val: "1" })
).toBe(nodeType.numberLiteral);
});
it("works for single parentheses wrapper", () => {
expect(
getNonParenNodeType({
type: nodeType.parenExpr,
expr: {
type: nodeType.numberLiteral,
val: "1",
},
})
).toBe(nodeType.numberLiteral);
});
it("works for multiple parentheses wrappers", () => {
expect(
getNonParenNodeType({
type: nodeType.parenExpr,
expr: {
type: nodeType.parenExpr,
expr: {
type: nodeType.parenExpr,
expr: {
type: nodeType.numberLiteral,
val: "1",
},
},
},
})
).toBe(nodeType.numberLiteral);
});
});
describe("containsPlaceholders", () => {
it("does not find placeholders in complete expressions", () => {
expect(
containsPlaceholders({
type: nodeType.parenExpr,
expr: {
type: nodeType.numberLiteral,
val: "1",
},
})
).toBe(false);
});
it("finds placeholders at the root", () => {
expect(
containsPlaceholders({
type: nodeType.placeholder,
children: [],
})
).toBe(true);
});
it("finds placeholders in nested expressions with placeholders", () => {
expect(
containsPlaceholders({
type: nodeType.parenExpr,
expr: {
type: nodeType.placeholder,
children: [],
},
})
).toBe(true);
});
});
describe("nodeValueType", () => {
it("works for binary expressions with placeholders", () => {
expect(
nodeValueType({
type: nodeType.binaryExpr,
op: binaryOperatorType.add,
lhs: { type: nodeType.placeholder, children: [] },
rhs: { type: nodeType.placeholder, children: [] },
matching: null,
bool: false,
})
).toBeNull();
});
it("works for scalar-scalar binops", () => {
expect(
nodeValueType({
type: nodeType.binaryExpr,
op: binaryOperatorType.add,
lhs: { type: nodeType.numberLiteral, val: "1" },
rhs: { type: nodeType.numberLiteral, val: "1" },
matching: null,
bool: false,
})
).toBe(valueType.scalar);
});
it("works for scalar-vector binops", () => {
expect(
nodeValueType({
type: nodeType.binaryExpr,
op: binaryOperatorType.add,
lhs: {
type: nodeType.vectorSelector,
name: "metric_name",
matchers: [],
offset: 0,
timestamp: null,
startOrEnd: null,
},
rhs: { type: nodeType.numberLiteral, val: "1" },
matching: null,
bool: false,
})
).toBe(valueType.vector);
});
it("works for vector-vector binops", () => {
expect(
nodeValueType({
type: nodeType.binaryExpr,
op: binaryOperatorType.add,
lhs: {
type: nodeType.vectorSelector,
name: "metric_name",
matchers: [],
offset: 0,
timestamp: null,
startOrEnd: null,
},
rhs: {
type: nodeType.vectorSelector,
name: "metric_name",
matchers: [],
offset: 0,
timestamp: null,
startOrEnd: null,
},
matching: null,
bool: false,
})
).toBe(valueType.vector);
});
});