// coerceLimit — pagination clamp for security-audit item L8 [DIRECT-DEV, no DB].
//
// Proves the bound holds across the shapes a query string actually delivers: a normal value
// passes through, an over-large value is clamped to `max`, junk / missing / non-positive fall
// back to the default, and floats are floored. Run standalone: `npx tsx --test tests/pagination.test.ts`.

import { test, describe } from "node:test";
import assert from "node:assert/strict";
import { coerceLimit } from "../server/lib/pagination.js";

describe("coerceLimit", () => {
  test("passes a valid in-range value through", () => {
    assert.equal(coerceLimit("20"), 20);
    assert.equal(coerceLimit(20), 20);
  });

  test("clamps over-large values to max (default 500)", () => {
    assert.equal(coerceLimit("1000000"), 500);
    assert.equal(coerceLimit(999999), 500);
    assert.equal(coerceLimit("300", 50, 200), 200);
  });

  test("falls back to default on junk / missing / non-positive", () => {
    assert.equal(coerceLimit(undefined), 50);
    assert.equal(coerceLimit(null), 50);
    assert.equal(coerceLimit(""), 50);
    assert.equal(coerceLimit("abc"), 50);
    assert.equal(coerceLimit("0"), 50);
    assert.equal(coerceLimit("-5"), 50);
    assert.equal(coerceLimit(NaN), 50);
    assert.equal(coerceLimit("10", 25), 10); // custom fallback unused when value is valid
    assert.equal(coerceLimit("bad", 25), 25); // custom fallback used on junk
  });

  test("floors floats", () => {
    assert.equal(coerceLimit("10.9"), 10);
    assert.equal(coerceLimit(10.9), 10);
  });
});
