|
8 | 8 | import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test"; |
9 | 9 | import { |
10 | 10 | enrichDashboardError, |
| 11 | + normalizeDataset, |
11 | 12 | parseDashboardListArgs, |
12 | 13 | parseDashboardPositionalArgs, |
13 | 14 | resolveDashboardId, |
14 | 15 | resolveOrgFromTarget, |
| 16 | + validateWidgetEnums, |
15 | 17 | } from "../../../src/commands/dashboard/resolve.js"; |
16 | 18 | // biome-ignore lint/performance/noNamespaceImport: needed for spyOn mocking |
17 | 19 | import * as apiClient from "../../../src/lib/api-client.js"; |
@@ -542,3 +544,82 @@ describe("enrichDashboardError", () => { |
542 | 544 | ).toThrow(apiErr); |
543 | 545 | }); |
544 | 546 | }); |
| 547 | + |
| 548 | +// --------------------------------------------------------------------------- |
| 549 | +// normalizeDataset + validateWidgetEnums |
| 550 | +// --------------------------------------------------------------------------- |
| 551 | + |
| 552 | +describe("normalizeDataset", () => { |
| 553 | + test("returns undefined for undefined input", () => { |
| 554 | + expect(normalizeDataset(undefined)).toBeUndefined(); |
| 555 | + }); |
| 556 | + |
| 557 | + test("lowercases canonical values (pass-through)", () => { |
| 558 | + expect(normalizeDataset("spans")).toBe("spans"); |
| 559 | + expect(normalizeDataset("error-events")).toBe("error-events"); |
| 560 | + expect(normalizeDataset("transaction-like")).toBe("transaction-like"); |
| 561 | + expect(normalizeDataset("tracemetrics")).toBe("tracemetrics"); |
| 562 | + expect(normalizeDataset("logs")).toBe("logs"); |
| 563 | + expect(normalizeDataset("issue")).toBe("issue"); |
| 564 | + expect(normalizeDataset("discover")).toBe("discover"); |
| 565 | + }); |
| 566 | + |
| 567 | + test("resolves error/errors aliases", () => { |
| 568 | + expect(normalizeDataset("errors")).toBe("error-events"); |
| 569 | + expect(normalizeDataset("error")).toBe("error-events"); |
| 570 | + }); |
| 571 | + |
| 572 | + test("resolves transaction/transactions aliases", () => { |
| 573 | + expect(normalizeDataset("transactions")).toBe("transaction-like"); |
| 574 | + expect(normalizeDataset("transaction")).toBe("transaction-like"); |
| 575 | + }); |
| 576 | + |
| 577 | + test("resolves metrics and metricsEnhanced aliases", () => { |
| 578 | + expect(normalizeDataset("metrics")).toBe("tracemetrics"); |
| 579 | + expect(normalizeDataset("metricsEnhanced")).toBe("tracemetrics"); |
| 580 | + }); |
| 581 | + |
| 582 | + test("resolves log alias", () => { |
| 583 | + expect(normalizeDataset("log")).toBe("logs"); |
| 584 | + }); |
| 585 | + |
| 586 | + test("case-insensitive matching", () => { |
| 587 | + expect(normalizeDataset("Errors")).toBe("error-events"); |
| 588 | + expect(normalizeDataset("ERRORS")).toBe("error-events"); |
| 589 | + expect(normalizeDataset("SPANS")).toBe("spans"); |
| 590 | + expect(normalizeDataset("MetricsEnhanced")).toBe("tracemetrics"); |
| 591 | + }); |
| 592 | + |
| 593 | + test("returns lowercased unknown input unchanged for validator to reject", () => { |
| 594 | + expect(normalizeDataset("unknown-dataset")).toBe("unknown-dataset"); |
| 595 | + expect(normalizeDataset("DoesNotExist")).toBe("doesnotexist"); |
| 596 | + }); |
| 597 | +}); |
| 598 | + |
| 599 | +describe("validateWidgetEnums (with normalizeDataset)", () => { |
| 600 | + test("accepts a normalized alias without error", () => { |
| 601 | + // Pipeline: caller runs normalizeDataset first, then passes the canonical |
| 602 | + // value to validateWidgetEnums. This simulates the wiring in add/edit. |
| 603 | + expect(() => |
| 604 | + validateWidgetEnums("bar", normalizeDataset("errors")) |
| 605 | + ).not.toThrow(); |
| 606 | + }); |
| 607 | + |
| 608 | + test("rejects an unresolved alias when passed un-normalized", () => { |
| 609 | + // Guard: forgetting to normalize surfaces as a ValidationError listing |
| 610 | + // canonical values, not silent success. |
| 611 | + expect(() => validateWidgetEnums("bar", "errors")).toThrow(ValidationError); |
| 612 | + }); |
| 613 | + |
| 614 | + test("rejects unknown datasets (no such alias)", () => { |
| 615 | + expect(() => validateWidgetEnums(undefined, "bogus-dataset")).toThrow( |
| 616 | + ValidationError |
| 617 | + ); |
| 618 | + }); |
| 619 | + |
| 620 | + test("rejects unknown display types", () => { |
| 621 | + expect(() => validateWidgetEnums("pie-chart", undefined)).toThrow( |
| 622 | + ValidationError |
| 623 | + ); |
| 624 | + }); |
| 625 | +}); |
0 commit comments