dashboard-logs-query-utils.test.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { describe, expect, test } from "vitest";
  2. import {
  3. buildLogsUrlQuery,
  4. parseLogsUrlFilters,
  5. } from "@/app/[locale]/dashboard/logs/_utils/logs-query";
  6. describe("dashboard logs url query utils", () => {
  7. test("parses and trims sessionId", () => {
  8. const parsed = parseLogsUrlFilters({ sessionId: " abc " });
  9. expect(parsed.sessionId).toBe("abc");
  10. });
  11. test("array params use the first value", () => {
  12. const parsed = parseLogsUrlFilters({
  13. sessionId: [" abc ", "ignored"],
  14. userId: ["1", "2"],
  15. statusCode: ["!200", "200"],
  16. });
  17. expect(parsed.sessionId).toBe("abc");
  18. expect(parsed.userId).toBe(1);
  19. expect(parsed.excludeStatusCode200).toBe(true);
  20. });
  21. test("statusCode '!200' maps to excludeStatusCode200", () => {
  22. const parsed = parseLogsUrlFilters({ statusCode: "!200" });
  23. expect(parsed.excludeStatusCode200).toBe(true);
  24. expect(parsed.statusCode).toBeUndefined();
  25. });
  26. test("parseIntParam returns undefined for invalid numbers", () => {
  27. const parsed = parseLogsUrlFilters({ userId: "NaN", startTime: "bad" });
  28. expect(parsed.userId).toBeUndefined();
  29. expect(parsed.startTime).toBeUndefined();
  30. });
  31. test("buildLogsUrlQuery omits empty sessionId", () => {
  32. const query = buildLogsUrlQuery({ sessionId: " " });
  33. expect(query.get("sessionId")).toBeNull();
  34. });
  35. test("buildLogsUrlQuery includes sessionId and time range", () => {
  36. const query = buildLogsUrlQuery({ sessionId: "abc", startTime: 1, endTime: 2 });
  37. expect(query.get("sessionId")).toBe("abc");
  38. expect(query.get("startTime")).toBe("1");
  39. expect(query.get("endTime")).toBe("2");
  40. });
  41. test("buildLogsUrlQuery includes startTime/endTime even when 0", () => {
  42. const query = buildLogsUrlQuery({ startTime: 0, endTime: 0 });
  43. expect(query.get("startTime")).toBe("0");
  44. expect(query.get("endTime")).toBe("0");
  45. });
  46. test("parseLogsUrlFilters sanitizes invalid page (<1) to undefined", () => {
  47. expect(parseLogsUrlFilters({ page: "0" }).page).toBeUndefined();
  48. expect(parseLogsUrlFilters({ page: "-1" }).page).toBeUndefined();
  49. expect(parseLogsUrlFilters({ page: "1" }).page).toBe(1);
  50. });
  51. test("buildLogsUrlQuery only includes page when > 1", () => {
  52. expect(buildLogsUrlQuery({ page: 0 }).get("page")).toBeNull();
  53. expect(buildLogsUrlQuery({ page: 1 }).get("page")).toBeNull();
  54. expect(buildLogsUrlQuery({ page: 2 }).get("page")).toBe("2");
  55. });
  56. test("build + parse roundtrip preserves filters", () => {
  57. const original = {
  58. userId: 1,
  59. keyId: 2,
  60. providerId: 3,
  61. sessionId: "abc",
  62. startTime: 10,
  63. endTime: 20,
  64. statusCode: 500,
  65. excludeStatusCode200: false,
  66. model: "m",
  67. endpoint: "/v1/messages",
  68. minRetryCount: 2,
  69. };
  70. const query = buildLogsUrlQuery(original);
  71. const parsed = parseLogsUrlFilters(Object.fromEntries(query.entries()));
  72. expect(parsed).toEqual(expect.objectContaining(original));
  73. });
  74. test("buildLogsUrlQuery includes minRetryCount even when 0", () => {
  75. const query = buildLogsUrlQuery({ minRetryCount: 0 });
  76. expect(query.get("minRetry")).toBe("0");
  77. });
  78. });