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 rating filters without requiring the word of", () => { const parsed = parseNaturalLanguageRequest( "sofa bed, 77 inches or wider, over 50 reviews, rating 4.0 or better, Prime delivery only, sort by price low to high" ); assert.equal(parsed.query, "sofa bed"); assert.equal(parsed.filters.minWidthInches, 77); assert.equal(parsed.filters.widthComparison, "gte"); assert.equal(parsed.filters.minReviews, 50); assert.equal(parsed.filters.reviewCountComparison, "gt"); assert.equal(parsed.filters.minRating, 4); assert.equal(parsed.filters.ratingComparison, "gte"); assert.equal(parsed.filters.requirePrime, true); assert.equal(parsed.filters.sortBy, "price"); }); 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"); }); });