Files
OmniRoute/tests/unit/batch-list-limit-validation.test.ts
Praveen K Palaniswamy 65e81158ab fix(ollama): route models by advertised capability (#11088)
Landed with the design call resolved per the owner's pick — **option 1**: the synced store is now endpoint-agnostic (persistDiscoveredModels and managedModelImport no longer drop non-chat models at write time), and chat selectability moved to read time (auto-pool expansion in autoStrategy applies filterChatSelectableModels; the models-route projection already had its chatOnly filter). Your discovery test now passes end-to-end (3/3): /api/show capabilities persist per connection and image/embedding requests route through the advertising host.

Reconciliation notes: conflicted areas merged onto the current tip (adobe discovery import, requestedModel preflight signature, resolvedProvider fast-path coexists with the synced-route override — explicit resolution wins); carried base-red drains (#10055 memoization, #11071 test variants) dropped as already-landed; the managed-model-import exclusion test was propagated to the new contract (image/video models persist; the read filter still hides them from chat pickers — pinned by a new assertion). Full battery: 205/206 focused (the one red is a confirmed periodic-timer timing flake on the loaded devbox — 20/20 isolated), autoCombo vitest 30/30, combo suites 46/46, gates + typecheck clean.

Thank you @yourspraveen — the capability probe + routing design was right; it just needed the store contract opened up. Fixes #11087.
2026-08-23 11:45:01 -03:00

47 lines
1.8 KiB
TypeScript

import { describe, test } from "node:test";
import assert from "node:assert/strict";
import {
parseBatchListLimit,
DEFAULT_BATCH_LIST_LIMIT,
MAX_BATCH_LIST_LIMIT,
} from "../../src/app/api/v1/batches/parseListLimit.ts";
describe("parseBatchListLimit", () => {
test("absent or empty limit falls back to the default", () => {
assert.deepEqual(parseBatchListLimit(null), { ok: true, limit: DEFAULT_BATCH_LIST_LIMIT });
assert.deepEqual(parseBatchListLimit(""), { ok: true, limit: DEFAULT_BATCH_LIST_LIMIT });
});
test("valid in-range integers are accepted", () => {
assert.deepEqual(parseBatchListLimit("1"), { ok: true, limit: 1 });
assert.deepEqual(parseBatchListLimit("20"), { ok: true, limit: 20 });
assert.deepEqual(parseBatchListLimit("50"), { ok: true, limit: 50 });
assert.deepEqual(parseBatchListLimit(String(MAX_BATCH_LIST_LIMIT)), {
ok: true,
limit: MAX_BATCH_LIST_LIMIT,
});
});
test("non-numeric limit is rejected instead of reaching the DB (no more 500 on ?limit=abc)", () => {
const r = parseBatchListLimit("abc");
assert.equal(r.ok, false);
assert.match((r as { message: string }).message, /between 1 and 100/);
});
test("negative and zero limits are rejected (no more incoherent has_more)", () => {
assert.equal(parseBatchListLimit("-1").ok, false);
assert.equal(parseBatchListLimit("0").ok, false);
});
test("above-max limit is rejected (bounds the read)", () => {
assert.equal(parseBatchListLimit("101").ok, false);
assert.equal(parseBatchListLimit("999999999").ok, false);
// Number("1e9") === 1e9, which parseInt would have truncated to 1 — also out of range.
assert.equal(parseBatchListLimit("1e9").ok, false);
});
test("non-integer numeric limits are rejected", () => {
assert.equal(parseBatchListLimit("20.5").ok, false);
});
});