import { describe, it, expect } from 'bun:test';
import { CrawlQueue } from '@/spider/queue.js';
describe('crawl queue', () => {
describe('basic operations', () => {
it('should add items to queue', () => {
const queue = new CrawlQueue();
const item = { url: 'https://example.com', depth: 0 };
expect(queue.add(item)).toBe(true);
expect(queue.size()).toBe(1);
});
it('should not add duplicate urls', () => {
const queue = new CrawlQueue();
const item = { url: 'https://example.com', depth: 0 };
expect(queue.add(item)).toBe(true);
expect(queue.add(item)).toBe(false);
expect(queue.size()).toBe(1);
});
it('should retrieve items in fifo order', () => {
const queue = new CrawlQueue();
queue.add({ url: 'https://first.com', depth: 0 });
queue.add({ url: 'https://second.com', depth: 0 });
const first = queue.next();
const second = queue.next();
expect(first?.url).toBe('https://first.com');
expect(second?.url).toBe('https://second.com');
});
it('should return undefined when empty', () => {
const queue = new CrawlQueue();
expect(queue.next()).toBeUndefined();
});
});
describe('state tracking', () => {
it('should track visited urls', () => {
const queue = new CrawlQueue();
const url = 'https://example.com';
queue.add({ url, depth: 0 });
queue.next();
queue.markVisited(url);
expect(queue.isVisited(url)).toBe(true);
expect(queue.getVisitedCount()).toBe(1);
});
it('should track processing urls', () => {
const queue = new CrawlQueue();
const url = 'https://example.com';
queue.add({ url, depth: 0 });
queue.next();
expect(queue.isProcessing(url)).toBe(true);
expect(queue.getProcessingCount()).toBe(1);
});
it('should handle failed urls', () => {
const queue = new CrawlQueue();
const url = 'https://example.com';
queue.add({ url, depth: 0 });
queue.next();
queue.markFailed(url);
expect(queue.isProcessing(url)).toBe(false);
expect(queue.getProcessingCount()).toBe(0);
});
});
describe('queue management', () => {
it('should report empty state correctly', () => {
const queue = new CrawlQueue();
expect(queue.isEmpty()).toBe(true);
queue.add({ url: 'https://example.com', depth: 0 });
expect(queue.isEmpty()).toBe(false);
queue.next();
expect(queue.isEmpty()).toBe(true);
});
it('should clear all state', () => {
const queue = new CrawlQueue();
queue.add({ url: 'https://example.com', depth: 0 });
queue.next();
queue.markVisited('https://example.com');
queue.clear();
expect(queue.isEmpty()).toBe(true);
expect(queue.getVisitedCount()).toBe(0);
expect(queue.getProcessingCount()).toBe(0);
});
});
});