n8n-nodes-duckduckgo-search
Version:
A powerful and comprehensive n8n community node that seamlessly integrates DuckDuckGo search capabilities into your workflows. Search the web, find images, discover news, and explore videos - all with privacy-focused, reliable results.
208 lines (207 loc) • 10.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const searchOperators_1 = require("../searchOperators");
describe('Search Operators', () => {
describe('buildSearchQuery', () => {
it('should return base query when no operators provided', () => {
const result = (0, searchOperators_1.buildSearchQuery)('test query');
expect(result).toBe('test query');
});
it('should return base query when operators object is empty', () => {
const result = (0, searchOperators_1.buildSearchQuery)('test query', {});
expect(result).toBe('test query');
});
it('should add site operator correctly', () => {
const result = (0, searchOperators_1.buildSearchQuery)('nodejs', { site: 'github.com' });
expect(result).toBe('nodejs site:github.com');
});
it('should add filetype operator correctly', () => {
const result = (0, searchOperators_1.buildSearchQuery)('documentation', { filetype: 'pdf' });
expect(result).toBe('documentation filetype:pdf');
});
it('should add multiple operators correctly', () => {
const result = (0, searchOperators_1.buildSearchQuery)('api', {
site: 'docs.microsoft.com',
filetype: 'pdf',
intitle: 'reference'
});
expect(result).toBe('api site:docs.microsoft.com filetype:pdf intitle:reference');
});
it('should handle location with spaces by adding quotes', () => {
const result = (0, searchOperators_1.buildSearchQuery)('restaurants', { location: 'New York' });
expect(result).toBe('restaurants location:"New York"');
});
it('should handle location without spaces without quotes', () => {
const result = (0, searchOperators_1.buildSearchQuery)('restaurants', { location: 'London' });
expect(result).toBe('restaurants location:London');
});
it('should handle exclude operator with multiple values', () => {
const result = (0, searchOperators_1.buildSearchQuery)('recipes', { exclude: 'vegan, gluten-free' });
expect(result).toBe('recipes -vegan -gluten-free');
});
it('should handle exclude operator with pre-existing minus sign', () => {
const result = (0, searchOperators_1.buildSearchQuery)('recipes', { exclude: '-vegan, -vegetarian' });
expect(result).toBe('recipes -vegan -vegetarian');
});
it('should handle exact phrase operator', () => {
const result = (0, searchOperators_1.buildSearchQuery)('', { exact: 'machine learning algorithms' });
expect(result).toBe('"machine learning algorithms"');
});
it('should handle exact phrase with existing quotes', () => {
const result = (0, searchOperators_1.buildSearchQuery)('', { exact: '"already quoted"' });
expect(result).toBe('"already quoted"');
});
it('should handle OR operator correctly', () => {
const result = (0, searchOperators_1.buildSearchQuery)('programming', { or: ['python', 'javascript', 'typescript'] });
expect(result).toBe('programming (python OR javascript OR typescript)');
});
it('should handle empty base query with operators', () => {
const result = (0, searchOperators_1.buildSearchQuery)('', { site: 'stackoverflow.com', intitle: 'error' });
expect(result).toBe('site:stackoverflow.com intitle:error');
});
it('should handle all operators together', () => {
const operators = {
site: 'github.com',
filetype: 'md',
intitle: 'readme',
inurl: 'docs',
exclude: 'deprecated, old',
exact: 'getting started',
or: ['guide', 'tutorial']
};
const result = (0, searchOperators_1.buildSearchQuery)('documentation', operators);
expect(result).toBe('documentation site:github.com filetype:md intitle:readme inurl:docs -deprecated -old "getting started" (guide OR tutorial)');
});
});
describe('parseSearchOperators', () => {
it('should return empty operators for query without operators', () => {
const result = (0, searchOperators_1.parseSearchOperators)('simple search query');
expect(result.baseQuery).toBe('simple search query');
expect(result.operators).toEqual({});
});
it('should parse site operator', () => {
const result = (0, searchOperators_1.parseSearchOperators)('nodejs site:github.com');
expect(result.baseQuery).toBe('nodejs');
expect(result.operators.site).toBe('github.com');
});
it('should parse multiple operators', () => {
const result = (0, searchOperators_1.parseSearchOperators)('api docs site:microsoft.com filetype:pdf intitle:reference');
expect(result.baseQuery).toBe('api docs');
expect(result.operators).toEqual({
site: 'microsoft.com',
filetype: 'pdf',
intitle: 'reference'
});
});
it('should parse quoted operator values', () => {
const result = (0, searchOperators_1.parseSearchOperators)('restaurants location:"New York"');
expect(result.baseQuery).toBe('restaurants');
expect(result.operators.location).toBe('New York');
});
it('should parse exclusions', () => {
const result = (0, searchOperators_1.parseSearchOperators)('recipes -vegan -gluten');
expect(result.baseQuery).toBe('recipes');
expect(result.operators.exclude).toBe('vegan, gluten');
});
it('should parse exact phrases', () => {
const result = (0, searchOperators_1.parseSearchOperators)('search for "exact phrase" in results');
expect(result.baseQuery).toBe('search for in results');
expect(result.operators.exact).toBe('exact phrase');
});
it('should not include quoted operator values as exact phrases', () => {
const result = (0, searchOperators_1.parseSearchOperators)('location:"San Francisco" restaurants');
expect(result.baseQuery).toBe('restaurants');
expect(result.operators.location).toBe('San Francisco');
expect(result.operators.exact).toBeUndefined();
});
it('should parse OR operators', () => {
const result = (0, searchOperators_1.parseSearchOperators)('python OR javascript programming');
expect(result.baseQuery).toBe('programming');
expect(result.operators.or).toEqual(['python', 'javascript']);
});
it('should parse complex query with all operator types', () => {
const query = 'web development site:github.com filetype:md -deprecated "best practices" react OR vue';
const result = (0, searchOperators_1.parseSearchOperators)(query);
expect(result.baseQuery).toBe('web development');
expect(result.operators).toEqual({
site: 'github.com',
filetype: 'md',
exclude: 'deprecated',
exact: 'best practices',
or: ['react', 'vue']
});
});
});
describe('validateSearchOperators', () => {
it('should return empty array for valid operators', () => {
const operators = {
site: 'example.com',
filetype: 'pdf',
region: 'us',
language: 'en'
};
const errors = (0, searchOperators_1.validateSearchOperators)(operators);
expect(errors).toEqual([]);
});
it('should validate invalid filetype', () => {
const operators = {
filetype: 'invalid'
};
const errors = (0, searchOperators_1.validateSearchOperators)(operators);
expect(errors).toHaveLength(1);
expect(errors[0]).toContain('Invalid filetype: invalid');
});
it('should validate invalid region', () => {
const operators = {
region: 'xx'
};
const errors = (0, searchOperators_1.validateSearchOperators)(operators);
expect(errors).toHaveLength(1);
expect(errors[0]).toContain('Invalid region: xx');
});
it('should validate invalid language', () => {
const operators = {
language: 'xx'
};
const errors = (0, searchOperators_1.validateSearchOperators)(operators);
expect(errors).toHaveLength(1);
expect(errors[0]).toContain('Invalid language: xx');
});
it('should validate invalid prefer value', () => {
const operators = {
prefer: 'invalid'
};
const errors = (0, searchOperators_1.validateSearchOperators)(operators);
expect(errors).toHaveLength(1);
expect(errors[0]).toContain('Invalid prefer value: invalid');
});
it('should validate invalid IP address', () => {
const operators = {
ip: '999.999.999.999'
};
const errors = (0, searchOperators_1.validateSearchOperators)(operators);
expect(errors).toHaveLength(1);
expect(errors[0]).toContain('Invalid IP address format');
});
it('should validate multiple invalid operators', () => {
const operators = {
filetype: 'invalid',
region: 'xx',
language: 'yy',
ip: 'not-an-ip'
};
const errors = (0, searchOperators_1.validateSearchOperators)(operators);
expect(errors).toHaveLength(4);
});
it('should accept valid values in any case', () => {
const operators = {
filetype: 'PDF',
region: 'US',
language: 'EN',
prefer: 'NEWER'
};
const errors = (0, searchOperators_1.validateSearchOperators)(operators);
expect(errors).toEqual([]);
});
});
});