69 lines
2.9 KiB
TypeScript
69 lines
2.9 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { describe, it } from "node:test";
|
|
|
|
import { parseNaturalLanguageRequest } from "../src/query-parser.js";
|
|
|
|
describe("parseNaturalLanguageRequest", () => {
|
|
it("extracts the target LED bulb filters from natural language", () => {
|
|
const parsed = parseNaturalLanguageRequest(
|
|
"100w led bulbs that cost less than $4 each and have over 200 reviews with a review score of more than 4.5 stars"
|
|
);
|
|
|
|
assert.equal(parsed.query, "100w led bulbs");
|
|
assert.equal(parsed.filters.maxUnitPrice, 4);
|
|
assert.equal(parsed.filters.minReviews, 200);
|
|
assert.equal(parsed.filters.reviewCountComparison, "gt");
|
|
assert.equal(parsed.filters.minRating, 4.5);
|
|
assert.equal(parsed.filters.ratingComparison, "gt");
|
|
});
|
|
|
|
it("distinguishes inclusive review and rating phrasing", () => {
|
|
const parsed = parseNaturalLanguageRequest("usb c charger at least 500 reviews and 4.3 stars or better");
|
|
|
|
assert.equal(parsed.query, "usb c charger");
|
|
assert.equal(parsed.filters.minReviews, 500);
|
|
assert.equal(parsed.filters.reviewCountComparison, "gte");
|
|
assert.equal(parsed.filters.minRating, 4.3);
|
|
assert.equal(parsed.filters.ratingComparison, "gte");
|
|
});
|
|
|
|
it("cleans rating filter phrases from search query text", () => {
|
|
const parsed = parseNaturalLanguageRequest("usb c cable with over 1000 reviews and rating over 4 stars");
|
|
|
|
assert.equal(parsed.query, "usb c cable");
|
|
assert.equal(parsed.filters.minReviews, 1000);
|
|
assert.equal(parsed.filters.minRating, 4);
|
|
});
|
|
|
|
it("extracts limit and max product price phrases", () => {
|
|
const parsed = parseNaturalLanguageRequest("return 5 wireless mouse under $30");
|
|
|
|
assert.equal(parsed.query, "wireless mouse");
|
|
assert.equal(parsed.limit, 5);
|
|
assert.equal(parsed.filters.maxPrice, 30);
|
|
});
|
|
|
|
it("extracts sofa width, Prime, and delivery urgency filters", () => {
|
|
const parsed = parseNaturalLanguageRequest(
|
|
"sofa bed of 77inches or wider in width, review score of 4 stars and higher, 200+ reviews and shipped with prime, color beige if possible, delivery by tomorrow"
|
|
);
|
|
|
|
assert.equal(parsed.query, "sofa bed color beige if possible");
|
|
assert.equal(parsed.filters.minWidthInches, 77);
|
|
assert.equal(parsed.filters.minRating, 4);
|
|
assert.equal(parsed.filters.ratingComparison, "gte");
|
|
assert.equal(parsed.filters.minReviews, 200);
|
|
assert.equal(parsed.filters.reviewCountComparison, "gte");
|
|
assert.equal(parsed.filters.requirePrime, true);
|
|
assert.equal(parsed.filters.deliveryBy, "tomorrow");
|
|
});
|
|
|
|
it("extracts overnight delivery requests", () => {
|
|
const parsed = parseNaturalLanguageRequest("queen sleeper sofa with overnight shipping and Prime");
|
|
|
|
assert.equal(parsed.query, "queen sleeper sofa");
|
|
assert.equal(parsed.filters.requirePrime, true);
|
|
assert.equal(parsed.filters.deliveryBy, "overnight");
|
|
});
|
|
});
|