docs: align cookie setup with env-only auth

This commit is contained in:
2026-04-21 21:53:42 -04:00
parent d65d81dbd1
commit b6e9501448
6 changed files with 716 additions and 100 deletions

View File

@@ -11,9 +11,13 @@ mock.module("@marketplace-scrapers/core", () => ({
describe("API routes", () => {
beforeEach(() => {
fetchFacebookItems.mockReset();
fetchFacebookItems.mockImplementation(() => Promise.resolve([{ title: "item" }]));
fetchFacebookItems.mockImplementation(() =>
Promise.resolve([{ title: "item" }]),
);
fetchEbayItems.mockReset();
fetchEbayItems.mockImplementation(() => Promise.resolve([{ title: "item" }]));
fetchEbayItems.mockImplementation(() =>
Promise.resolve([{ title: "item" }]),
);
});
afterEach(() => {
@@ -37,7 +41,9 @@ describe("API routes", () => {
const { ebayRoute } = await import("../src/routes/ebay");
await ebayRoute(
new Request("http://localhost/api/ebay?q=laptop&cookies=s%3D1&buyItNowOnly=true"),
new Request(
"http://localhost/api/ebay?q=laptop&cookies=s%3D1&buyItNowOnly=true",
),
);
expect(fetchEbayItems).toHaveBeenCalledWith("laptop", 1, {

View File

@@ -93,7 +93,10 @@ describe("Facebook Marketplace Scraper Core Tests", () => {
try {
const cookies = await ensureFacebookCookies();
expect(cookies.map((cookie) => cookie.name)).toEqual(["c_user", "xs"]);
expect(cookies.map((cookie) => cookie.name)).toEqual([
"c_user",
"xs",
]);
} finally {
if (previous === undefined) {
delete process.env.FACEBOOK_COOKIE;

View File

@@ -3,24 +3,29 @@ import fetchFacebookItems from "../src/scrapers/facebook";
// Mock fetch globally
const originalFetch = global.fetch;
const facebookCookie = "c_user=12345; xs=abc123";
describe("Facebook Marketplace Scraper Integration Tests", () => {
let previousCookie: string | undefined;
beforeEach(() => {
previousCookie = process.env.FACEBOOK_COOKIE;
process.env.FACEBOOK_COOKIE = facebookCookie;
global.fetch = mock(() => {
throw new Error("fetch should be mocked in individual tests");
});
});
afterEach(() => {
if (previousCookie === undefined) {
delete process.env.FACEBOOK_COOKIE;
} else {
process.env.FACEBOOK_COOKIE = previousCookie;
}
global.fetch = originalFetch;
});
describe("Main Search Function", () => {
const mockCookies = JSON.stringify([
{ name: "c_user", value: "12345", domain: ".facebook.com", path: "/" },
{ name: "xs", value: "abc123", domain: ".facebook.com", path: "/" },
]);
test("should successfully fetch search results", async () => {
const mockSearchData = {
require: [
@@ -99,13 +104,7 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
}),
);
const results = await fetchFacebookItems(
"iPhone",
1,
"toronto",
25,
mockCookies,
);
const results = await fetchFacebookItems("iPhone", 1, "toronto", 25);
expect(results).toHaveLength(2);
expect(results[0].title).toBe("iPhone 13 Pro");
expect(results[1].title).toBe("Samsung Galaxy");
@@ -172,13 +171,7 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
}),
);
const results = await fetchFacebookItems(
"test",
1,
"toronto",
25,
mockCookies,
);
const results = await fetchFacebookItems("test", 1, "toronto", 25);
expect(results).toHaveLength(1);
expect(results[0].title).toBe("With Price");
});
@@ -233,13 +226,7 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
}),
);
const results = await fetchFacebookItems(
"test",
1,
"toronto",
5,
mockCookies,
);
const results = await fetchFacebookItems("test", 1, "toronto", 5);
expect(results).toHaveLength(5);
});
@@ -285,7 +272,6 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
1,
"toronto",
25,
mockCookies,
);
expect(results).toEqual([]);
});
@@ -302,13 +288,7 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
}),
);
const results = await fetchFacebookItems(
"test",
1,
"toronto",
25,
mockCookies,
);
const results = await fetchFacebookItems("test", 1, "toronto", 25);
expect(results).toEqual([]);
});
@@ -316,7 +296,7 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
global.fetch = mock(() => Promise.reject(new Error("Network error")));
await expect(
fetchFacebookItems("test", 1, "toronto", 25, mockCookies),
fetchFacebookItems("test", 1, "toronto", 25),
).rejects.toThrow("Network error");
});
@@ -386,24 +366,13 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
});
});
const results = await fetchFacebookItems(
"test",
1,
"toronto",
25,
mockCookies,
);
const results = await fetchFacebookItems("test", 1, "toronto", 25);
expect(attempts).toBe(2);
expect(results).toHaveLength(1);
});
});
describe("Vehicle Listing Integration", () => {
const mockCookies = JSON.stringify([
{ name: "c_user", value: "12345", domain: ".facebook.com", path: "/" },
{ name: "xs", value: "abc123", domain: ".facebook.com", path: "/" },
]);
test("should correctly identify and parse vehicle listings", async () => {
const mockSearchData = {
require: [
@@ -470,13 +439,7 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
}),
);
const results = await fetchFacebookItems(
"cars",
1,
"toronto",
25,
mockCookies,
);
const results = await fetchFacebookItems("cars", 1, "toronto", 25);
expect(results).toHaveLength(2);
// Both should be classified as "item" type in search results (vehicle detection is for item details)
expect(results[0].title).toBe("2006 Honda Civic");
@@ -485,11 +448,6 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
});
describe("Different Categories", () => {
const mockCookies = JSON.stringify([
{ name: "c_user", value: "12345", domain: ".facebook.com", path: "/" },
{ name: "xs", value: "abc123", domain: ".facebook.com", path: "/" },
]);
test("should handle electronics listings", async () => {
const mockSearchData = {
require: [
@@ -555,7 +513,6 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
1,
"toronto",
25,
mockCookies,
);
expect(results).toHaveLength(1);
expect(results[0].title).toBe("Nintendo Switch");
@@ -622,13 +579,7 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
}),
);
const results = await fetchFacebookItems(
"table",
1,
"toronto",
25,
mockCookies,
);
const results = await fetchFacebookItems("table", 1, "toronto", 25);
expect(results).toHaveLength(1);
expect(results[0].title).toBe("Dining Table");
expect(results[0].categoryId).toBe("1569171756675761");
@@ -636,11 +587,6 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
});
describe("Error Scenarios", () => {
const mockCookies = JSON.stringify([
{ name: "c_user", value: "12345", domain: ".facebook.com", path: "/" },
{ name: "xs", value: "abc123", domain: ".facebook.com", path: "/" },
]);
test("should handle malformed HTML responses", async () => {
global.fetch = mock(() =>
Promise.resolve({
@@ -655,13 +601,7 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
}),
);
const results = await fetchFacebookItems(
"test",
1,
"toronto",
25,
mockCookies,
);
const results = await fetchFacebookItems("test", 1, "toronto", 25);
expect(results).toEqual([]);
});
@@ -677,13 +617,7 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
}),
);
const results = await fetchFacebookItems(
"test",
1,
"toronto",
25,
mockCookies,
);
const results = await fetchFacebookItems("test", 1, "toronto", 25);
expect(results).toEqual([]);
});
@@ -699,13 +633,7 @@ describe("Facebook Marketplace Scraper Integration Tests", () => {
}),
);
const results = await fetchFacebookItems(
"test",
1,
"toronto",
25,
mockCookies,
);
const results = await fetchFacebookItems("test", 1, "toronto", 25);
expect(results).toEqual([]);
});
});

View File

@@ -16,13 +16,17 @@ describe("MCP protocol cookie inputs", () => {
});
test("search tools should not expose Facebook or eBay cookie inputs", () => {
const searchFacebookTool = tools.find((tool) => tool.name === "search_facebook");
const searchFacebookTool = tools.find(
(tool) => tool.name === "search_facebook",
);
const searchEbayTool = tools.find((tool) => tool.name === "search_ebay");
expect(searchFacebookTool?.inputSchema.properties).not.toHaveProperty(
"cookiesSource",
);
expect(searchEbayTool?.inputSchema.properties).not.toHaveProperty("cookies");
expect(searchEbayTool?.inputSchema.properties).not.toHaveProperty(
"cookies",
);
});
test("search_facebook should not forward cookies query parameters", async () => {
@@ -44,7 +48,8 @@ describe("MCP protocol cookie inputs", () => {
}),
);
const calledUrl = (global.fetch as ReturnType<typeof mock>).mock.calls[0]?.[0];
const calledUrl = (global.fetch as ReturnType<typeof mock>).mock
.calls[0]?.[0];
expect(String(calledUrl)).toContain("/facebook?q=laptop");
expect(String(calledUrl)).not.toContain("cookies=");
});