95 lines
2.8 KiB
TypeScript
95 lines
2.8 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { describe, it } from "node:test";
|
|
|
|
import { buildSearchUrl, parseCliRequest, runCli } from "../src/cli.js";
|
|
|
|
function createOutput() {
|
|
let stdout = "";
|
|
let stderr = "";
|
|
return {
|
|
stdout: { write: (chunk: string) => { stdout += chunk; return true; } },
|
|
stderr: { write: (chunk: string) => { stderr += chunk; return true; } },
|
|
get stdoutText() { return stdout; },
|
|
get stderrText() { return stderr; }
|
|
};
|
|
}
|
|
|
|
describe("amazon-shopping CLI", () => {
|
|
it("prints help", async () => {
|
|
const output = createOutput();
|
|
const code = await runCli(["--help"], output);
|
|
|
|
assert.equal(code, 0);
|
|
assert.match(output.stdoutText, /scripts\/search-products/);
|
|
assert.match(output.stdoutText, /--dry-run/);
|
|
});
|
|
|
|
it("defaults to 15 results and two search pages", () => {
|
|
const request = parseCliRequest(["usb c cable"]);
|
|
|
|
assert.equal(request.query, "usb c cable");
|
|
assert.equal(request.limit, 15);
|
|
assert.equal(request.maxSearchPages, 2);
|
|
assert.equal(request.output, "json");
|
|
});
|
|
|
|
it("maps kebab-case CLI filters into the request contract", () => {
|
|
const request = parseCliRequest([
|
|
"--query",
|
|
"100w led bulbs",
|
|
"--min-rating",
|
|
"4.5",
|
|
"--min-reviews",
|
|
"200",
|
|
"--max-unit-price",
|
|
"4",
|
|
"--max-search-pages",
|
|
"3",
|
|
"--skip-details",
|
|
"--dry-run"
|
|
]);
|
|
|
|
assert.equal(request.query, "100w led bulbs");
|
|
assert.equal(request.filters.minRating, 4.5);
|
|
assert.equal(request.filters.minReviews, 200);
|
|
assert.equal(request.filters.maxUnitPrice, 4);
|
|
assert.equal(request.maxSearchPages, 3);
|
|
assert.equal(request.skipDetails, true);
|
|
assert.equal(request.dryRun, true);
|
|
});
|
|
|
|
it("maps output modes", () => {
|
|
assert.equal(parseCliRequest(["usb c cable", "--json"]).output, "json");
|
|
assert.equal(parseCliRequest(["usb c cable", "--markdown"]).output, "markdown");
|
|
assert.equal(parseCliRequest(["usb c cable", "--json", "--markdown"]).output, "both");
|
|
});
|
|
|
|
it("rejects limits below one", () => {
|
|
assert.throws(
|
|
() => parseCliRequest(["usb c cable", "--limit", "0"]),
|
|
/limit must be an integer greater than 0/
|
|
);
|
|
});
|
|
|
|
it("rejects unsafe large limits unless explicitly allowed", () => {
|
|
assert.throws(
|
|
() => parseCliRequest(["usb c cable", "--limit", "31"]),
|
|
/require --allow-large-limit/
|
|
);
|
|
});
|
|
|
|
it("rejects search page caps above five", () => {
|
|
assert.throws(
|
|
() => parseCliRequest(["usb c cable", "--max-search-pages", "6"]),
|
|
/max-search-pages must be 5 or less/
|
|
);
|
|
});
|
|
|
|
it("builds the Amazon search URL without live network access", () => {
|
|
assert.equal(
|
|
buildSearchUrl("100w led bulbs"),
|
|
"https://www.amazon.com/s?k=100w%20led%20bulbs"
|
|
);
|
|
});
|
|
});
|