Files
apify--crawlee/packages/core/test/enqueue_links/protocol-matching-based-on-strategy.test.ts
2026-07-13 13:23:39 +08:00

96 lines
3.0 KiB
TypeScript

import { load } from 'cheerio';
import type { CheerioRoot, Source } from 'crawlee';
import { cheerioCrawlerEnqueueLinks, Configuration, EnqueueStrategy, RequestQueue } from 'crawlee';
import log from '@apify/log';
const apifyClient = Configuration.getStorageClient();
const HTML = `
<html>
<head>
<title>Example</title>
</head>
<body>
<ul>
<li><a class="first" href="https://example.com/first">I'm sorry, Dave. I'm afraid I can't do that.</a></li>
<li><a class="second" href="http://example.com/second">I'm sorry, Dave. I'm afraid I can't do that.</a></li>
</ul>
</body>
</html>
`;
function createRequestQueueMock() {
const enqueued: Source[] = [];
const requestQueue = new RequestQueue({ id: 'xxx', client: apifyClient });
// @ts-expect-error Override method for testing
requestQueue.addRequests = async function (requests) {
enqueued.push(...requests);
return { processedRequests: requests, unprocessedRequests: [] as never[] };
};
return { enqueued, requestQueue };
}
describe('enqueueLinks() - matching and ignoring http/https protocol differences', () => {
let ll: number;
beforeAll(() => {
ll = log.getLevel();
log.setLevel(log.LEVELS.ERROR);
});
afterAll(() => {
log.setLevel(ll);
});
let $: CheerioRoot;
beforeEach(() => {
$ = load(HTML);
});
test('SameHostname should ignore protocol difference', async () => {
const { enqueued, requestQueue } = createRequestQueueMock();
await cheerioCrawlerEnqueueLinks({
options: { selector: 'a', strategy: EnqueueStrategy.SameHostname },
$,
requestQueue,
originalRequestUrl: 'https://example.com',
});
expect(enqueued).toHaveLength(2);
expect(enqueued[0].url).toBe('https://example.com/first');
expect(enqueued[1].url).toBe('http://example.com/second');
});
test('SameDomain should ignore protocol difference', async () => {
const { enqueued, requestQueue } = createRequestQueueMock();
await cheerioCrawlerEnqueueLinks({
options: { selector: 'a', strategy: EnqueueStrategy.SameDomain },
$,
requestQueue,
originalRequestUrl: 'http://example.com',
});
expect(enqueued).toHaveLength(2);
expect(enqueued[0].url).toBe('https://example.com/first');
expect(enqueued[1].url).toBe('http://example.com/second');
});
test('SameOrigin should respect protocol', async () => {
const { enqueued, requestQueue } = createRequestQueueMock();
await cheerioCrawlerEnqueueLinks({
options: { selector: 'a', strategy: EnqueueStrategy.SameOrigin },
$,
requestQueue,
originalRequestUrl: 'https://example.com',
});
expect(enqueued).toHaveLength(1);
expect(enqueued[0].url).toBe('https://example.com/first');
});
});