summaryrefslogtreecommitdiffhomepage
path: root/packages/tool-web-search/src/validate.test.ts
blob: ca1aa7f2e7e8cf503e8740326cab9482fa7588c1 (plain)
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");
  });
});