chore: ebay parser fix
Signed-off-by: Dmytro Stanchiev <git@dmytros.dev>
This commit is contained in:
@@ -29,6 +29,7 @@ const originalWarn = console.warn;
|
||||
|
||||
describe("eBay Scraper Cookie Handling", () => {
|
||||
beforeEach(() => {
|
||||
delete process.env.EBAY_COOKIE;
|
||||
global.fetch = mock(() =>
|
||||
Promise.resolve({
|
||||
ok: true,
|
||||
@@ -210,6 +211,81 @@ describe("eBay Scraper Cookie Handling", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
test("parses current eBay s-card markup with unquoted item links", async () => {
|
||||
global.fetch = mock(() =>
|
||||
Promise.resolve({
|
||||
ok: true,
|
||||
text: () =>
|
||||
Promise.resolve(`
|
||||
<html><body>
|
||||
<div class="s-card s-card--horizontal">
|
||||
<div class=su-card-container__header>
|
||||
<a class=s-card__link href=https://ebay.com/itm/1234567890?itmmeta=abc>
|
||||
<div role=heading aria-level=3 class=s-card__title>
|
||||
<span class="su-styled-text primary default">Apple MacBook Air M1 2020 8GB 256GB</span>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class=su-card-container__attributes>
|
||||
<span class="su-styled-text primary bold large-1 s-card__price">CA $599.00</span>
|
||||
</div>
|
||||
</div>
|
||||
</body></html>
|
||||
`),
|
||||
}),
|
||||
) as unknown as typeof fetch;
|
||||
|
||||
const results = await fetchEbayItems("macbook", 1000);
|
||||
|
||||
expect(results).toEqual([
|
||||
expect.objectContaining({
|
||||
title: "Apple MacBook Air M1 2020 8GB 256GB",
|
||||
url: "https://ebay.com/itm/1234567890?itmmeta=abc",
|
||||
listingPrice: expect.objectContaining({ cents: 59_900 }),
|
||||
}),
|
||||
]);
|
||||
});
|
||||
|
||||
test("parses embedded eBay payload listings before HTML fallback", async () => {
|
||||
const payload = encodeURIComponent(
|
||||
JSON.stringify({
|
||||
searchResults: [
|
||||
{
|
||||
title: "Apple MacBook Air M1 API Result",
|
||||
itemWebUrl: "https://www.ebay.ca/itm/9876543210?hash=item987",
|
||||
price: { value: "550.00", currency: "CAD" },
|
||||
},
|
||||
],
|
||||
}),
|
||||
);
|
||||
|
||||
global.fetch = mock(() =>
|
||||
Promise.resolve({
|
||||
ok: true,
|
||||
text: () =>
|
||||
Promise.resolve(`
|
||||
<html><body>
|
||||
<script data-inlinepayload="${payload}"></script>
|
||||
</body></html>
|
||||
`),
|
||||
}),
|
||||
) as unknown as typeof fetch;
|
||||
|
||||
const results = await fetchEbayItems("macbook", 1000);
|
||||
|
||||
expect(results).toEqual([
|
||||
expect.objectContaining({
|
||||
title: "Apple MacBook Air M1 API Result",
|
||||
url: "https://www.ebay.ca/itm/9876543210?hash=item987",
|
||||
listingPrice: expect.objectContaining({
|
||||
amountFormatted: "CAD 550.00",
|
||||
cents: 55_000,
|
||||
currency: "CAD",
|
||||
}),
|
||||
}),
|
||||
]);
|
||||
});
|
||||
|
||||
test("treats US dollar prices as USD", async () => {
|
||||
global.fetch = mock(() =>
|
||||
Promise.resolve({
|
||||
|
||||
@@ -70,6 +70,7 @@ describe("Facebook Marketplace Scraper Core Tests", () => {
|
||||
expect(result[0]).toEqual({
|
||||
name: "c_user",
|
||||
value: "123456789",
|
||||
rawValue: "123456789",
|
||||
domain: ".facebook.com",
|
||||
path: "/",
|
||||
secure: true,
|
||||
@@ -80,6 +81,7 @@ describe("Facebook Marketplace Scraper Core Tests", () => {
|
||||
expect(result[1]).toEqual({
|
||||
name: "xs",
|
||||
value: "abcdef123456",
|
||||
rawValue: "abcdef123456",
|
||||
domain: ".facebook.com",
|
||||
path: "/",
|
||||
secure: true,
|
||||
@@ -97,6 +99,16 @@ describe("Facebook Marketplace Scraper Core Tests", () => {
|
||||
expect(result[1]?.value).toBe("abc=def");
|
||||
});
|
||||
|
||||
test("should preserve raw encoded values when formatting cookie headers", () => {
|
||||
const cookieString = "c_user=123%2B456; xs=abc%3Ddef";
|
||||
const result = formatCookiesForHeader(
|
||||
parseFacebookCookieString(cookieString),
|
||||
"www.facebook.com",
|
||||
);
|
||||
|
||||
expect(result).toBe(cookieString);
|
||||
});
|
||||
|
||||
test("should filter out malformed cookies", () => {
|
||||
const cookieString = "c_user=123; invalid; xs=abc; =empty";
|
||||
const result = parseFacebookCookieString(cookieString);
|
||||
|
||||
Reference in New Issue
Block a user