fix: harden scraper price parsing
This commit is contained in:
@@ -12,18 +12,14 @@ type IsExact<T, U> =
|
||||
: false;
|
||||
|
||||
const getDefaultEbayItems = async () => fetchEbayItems("laptop");
|
||||
const unstableEbayItemsPromise = fetchEbayItems(
|
||||
"laptop",
|
||||
1000,
|
||||
{},
|
||||
{ hideUnstableResults: true },
|
||||
);
|
||||
const getUnstableEbayItems = async () =>
|
||||
fetchEbayItems("laptop", 1000, {}, { hideUnstableResults: true });
|
||||
type _EbayDefaultReturn = Assert<
|
||||
IsExact<Awaited<ReturnType<typeof getDefaultEbayItems>>, EbayListingDetails[]>
|
||||
>;
|
||||
type _EbayUnstableReturn = Assert<
|
||||
IsExact<
|
||||
Awaited<typeof unstableEbayItemsPromise>,
|
||||
Awaited<ReturnType<typeof getUnstableEbayItems>>,
|
||||
UnstableListingBuckets<EbayListingDetails>
|
||||
>
|
||||
>;
|
||||
@@ -302,6 +298,38 @@ describe("eBay Scraper Cookie Handling", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
test("accepts higher fallback prices without price classes", async () => {
|
||||
global.fetch = mock(() =>
|
||||
Promise.resolve({
|
||||
ok: true,
|
||||
text: () =>
|
||||
Promise.resolve(`
|
||||
<html><body>
|
||||
<li class="s-item">
|
||||
<a href="/itm/123"></a>
|
||||
<h3>Studio Microphone Bundle</h3>
|
||||
<div>CA $2500.00</div>
|
||||
</li>
|
||||
</body></html>
|
||||
`),
|
||||
}),
|
||||
) as typeof fetch;
|
||||
|
||||
const results = await fetchEbayItems("microphone", 1000, {
|
||||
keywords: ["microphone"],
|
||||
});
|
||||
|
||||
expect(results).toEqual([
|
||||
expect.objectContaining({
|
||||
title: "Studio Microphone Bundle",
|
||||
listingPrice: expect.objectContaining({
|
||||
amountFormatted: "CA $2500.00",
|
||||
cents: 250000,
|
||||
}),
|
||||
}),
|
||||
]);
|
||||
});
|
||||
|
||||
test("retains free items when the requested price range includes zero", async () => {
|
||||
global.fetch = mock(() =>
|
||||
Promise.resolve({
|
||||
|
||||
@@ -1613,6 +1613,10 @@ describe("Facebook Marketplace Scraper Core Tests", () => {
|
||||
});
|
||||
|
||||
test("should handle malformed ads gracefully", () => {
|
||||
const originalWarn = console.warn;
|
||||
const warnMock = mock(() => {});
|
||||
console.warn = warnMock;
|
||||
|
||||
const ads = [
|
||||
{
|
||||
node: {
|
||||
@@ -1638,6 +1642,9 @@ describe("Facebook Marketplace Scraper Core Tests", () => {
|
||||
const results = parseFacebookAds(ads);
|
||||
expect(results).toHaveLength(1);
|
||||
expect(results[0].title).toBe("Valid Ad");
|
||||
expect(warnMock).toHaveBeenCalledTimes(1);
|
||||
|
||||
console.warn = originalWarn;
|
||||
});
|
||||
|
||||
test("parses formatted fallback prices with multiple commas", () => {
|
||||
@@ -1667,6 +1674,29 @@ describe("Facebook Marketplace Scraper Core Tests", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
test("does not trust amount_with_offset_in_currency without a parseable formatted price", () => {
|
||||
const ads = [
|
||||
{
|
||||
node: {
|
||||
listing: {
|
||||
id: "bad-offset",
|
||||
marketplace_listing_title: "Broken Price Listing",
|
||||
listing_price: {
|
||||
amount_with_offset_in_currency: "123456789",
|
||||
formatted_amount: "price unavailable",
|
||||
currency: "CAD",
|
||||
},
|
||||
is_live: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
const results = parseFacebookAds(ads);
|
||||
|
||||
expect(results).toEqual([]);
|
||||
});
|
||||
|
||||
test("keeps valid free search listings", () => {
|
||||
const ads = [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user