1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
import { describe, expect, it } from "vitest";
import {
type CrawlArgs,
type MapArgs,
type ScrapeArgs,
type SearchArgs,
validateArgs,
} from "./validate.js";
describe("validateArgs", () => {
it("mode defaults to search when query present", () => {
const result = validateArgs({ query: "hello" });
expect("error" in result).toBe(false);
if ("error" in result) return;
expect(result.mode).toBe("search");
expect((result as SearchArgs).query).toBe("hello");
});
it("mode defaults to scrape when url present (no query)", () => {
const result = validateArgs({ url: "http://example.com" });
expect("error" in result).toBe(false);
if ("error" in result) return;
expect(result.mode).toBe("scrape");
expect((result as ScrapeArgs).url).toBe("http://example.com");
});
it("explicit mode overrides defaults", () => {
const result = validateArgs({ query: "hello", url: "http://x", mode: "map" });
expect("error" in result).toBe(false);
if ("error" in result) return;
expect(result.mode).toBe("map");
expect((result as MapArgs).url).toBe("http://x");
});
it("search mode requires query", () => {
const result = validateArgs({ mode: "search" });
expect(result).toHaveProperty("error");
});
it("scrape/crawl/map modes require url", () => {
expect(validateArgs({ mode: "scrape" })).toHaveProperty("error");
expect(validateArgs({ mode: "crawl" })).toHaveProperty("error");
expect(validateArgs({ mode: "map" })).toHaveProperty("error");
});
it("limit clamped to max 10", () => {
const result = validateArgs({ query: "hello", limit: 50 });
expect("error" in result).toBe(false);
if ("error" in result) return;
expect((result as SearchArgs).limit).toBe(10);
});
it("limit defaults to 7 (search) / 3 (crawl)", () => {
const search = validateArgs({ query: "hello" });
expect("error" in search).toBe(false);
if ("error" in search) return;
expect((search as SearchArgs).limit).toBe(7);
const crawl = validateArgs({ url: "http://x", mode: "crawl" });
expect("error" in crawl).toBe(false);
if ("error" in crawl) return;
expect((crawl as CrawlArgs).limit).toBe(3);
});
it("format defaults to markdown", () => {
const result = validateArgs({ query: "hello" });
expect("error" in result).toBe(false);
if ("error" in result) return;
expect(result.format).toBe("markdown");
});
it("rejects invalid mode", () => {
const result = validateArgs({ mode: "invalid" });
expect(result).toHaveProperty("error");
if (!("error" in result)) return;
expect(result.error).toContain("Invalid mode");
});
it("rejects invalid format", () => {
const result = validateArgs({ url: "http://x", format: "pdf" });
expect(result).toHaveProperty("error");
if (!("error" in result)) return;
expect(result.error).toContain("Invalid format");
});
it("returns error for null/non-object args", () => {
expect(validateArgs(null)).toHaveProperty("error");
expect(validateArgs(undefined)).toHaveProperty("error");
expect(validateArgs("string")).toHaveProperty("error");
expect(validateArgs(42)).toHaveProperty("error");
});
});
|