UNPKG

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.

260 lines (259 loc) 10.4 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const DuckDuckGo_node_1 = require("../DuckDuckGo.node"); const directSearch = __importStar(require("../directSearch")); jest.mock('duck-duck-scrape', () => ({ search: jest.fn(), searchNews: jest.fn(), searchImages: jest.fn(), searchVideos: jest.fn(), SafeSearchType: { STRICT: 'strict', MODERATE: 'moderate', OFF: 'off', }, })); jest.mock('../directSearch', () => ({ directWebSearch: jest.fn(), directImageSearch: jest.fn(), getSafeSearchString: jest.fn((value) => { switch (value) { case 2: return 'strict'; case 1: return 'moderate'; default: return 'off'; } }), })); describe('DuckDuckGo Node - Locale Support', () => { let duckDuckGoNode; let mockExecuteFunction; let mockGetNodeParameter; beforeEach(() => { duckDuckGoNode = new DuckDuckGo_node_1.DuckDuckGo(); mockGetNodeParameter = jest.fn(); mockExecuteFunction = { getInputData: jest.fn().mockReturnValue([{ json: {} }]), getNodeParameter: mockGetNodeParameter, getNode: jest.fn().mockReturnValue({ name: 'DuckDuckGo', type: 'n8n-nodes-base.duckDuckGo', typeVersion: 1 }), helpers: { returnJsonArray: jest.fn((items) => items.map((item, index) => ({ json: item, pairedItem: { item: index } }))), }, continueOnFail: jest.fn().mockReturnValue(false), logger: { info: jest.fn(), warn: jest.fn(), error: jest.fn(), debug: jest.fn(), }, }; jest.clearAllMocks(); }); describe('Locale Parameter', () => { it('should use global locale when region is not specified', async () => { mockGetNodeParameter .mockImplementation((parameter, _itemIndex, fallback) => { switch (parameter) { case 'operation': return 'search'; case 'query': return 'test query'; case 'locale': return 'fr-fr'; case 'webSearchOptions': return { maxResults: 10, safeSearch: 1, }; case 'debugMode': return false; case 'errorHandling': return 'continueOnFail'; case 'cacheSettings': return { enableCache: false, }; case 'enableTelemetry': return false; case 'useApiKey': return false; default: return fallback; } }); directSearch.directWebSearch.mockResolvedValue({ results: [ { title: 'Test Result', url: 'https://example.com', description: 'Test description' } ] }); await duckDuckGoNode.execute.call(mockExecuteFunction); expect(directSearch.directWebSearch).toHaveBeenCalledWith('"test query"', expect.objectContaining({ locale: 'fr-fr', safeSearch: 'moderate', })); }); it('should prioritize region-specific setting over global locale', async () => { mockGetNodeParameter .mockImplementation((parameter, _itemIndex, fallback) => { switch (parameter) { case 'operation': return 'search'; case 'query': return 'test query'; case 'locale': return 'fr-fr'; case 'webSearchOptions': return { maxResults: 10, region: 'de-de', safeSearch: 1, }; case 'debugMode': return false; case 'errorHandling': return 'continueOnFail'; case 'cacheSettings': return { enableCache: false, }; case 'enableTelemetry': return false; case 'useApiKey': return false; default: return fallback; } }); directSearch.directWebSearch.mockResolvedValue({ results: [ { title: 'Test Result', url: 'https://example.com', description: 'Test description' } ] }); await duckDuckGoNode.execute.call(mockExecuteFunction); expect(directSearch.directWebSearch).toHaveBeenCalledWith('"test query"', expect.objectContaining({ locale: 'de-de', safeSearch: 'moderate', })); }); it('should work with different search types', async () => { mockGetNodeParameter .mockImplementation((parameter, _itemIndex, fallback) => { switch (parameter) { case 'operation': return 'searchImages'; case 'imageQuery': return 'test image query'; case 'locale': return 'es-es'; case 'imageSearchOptions': return { maxResults: 10, safeSearch: 1, }; case 'debugMode': return false; case 'errorHandling': return 'continueOnFail'; case 'cacheSettings': return { enableCache: false, }; default: return fallback; } }); directSearch.directImageSearch.mockResolvedValue({ results: [ { title: 'Test Image Result', url: 'https://example.com/image.jpg', thumbnail: 'https://example.com/thumb.jpg', source: 'https://example.com', } ] }); await duckDuckGoNode.execute.call(mockExecuteFunction); expect(directSearch.directImageSearch).toHaveBeenCalledWith('test image query', expect.objectContaining({ locale: 'es-es', })); }); it('should use default locale when neither global nor region is specified', async () => { mockGetNodeParameter .mockImplementation((parameter, _itemIndex, fallback) => { switch (parameter) { case 'operation': return 'search'; case 'query': return 'test query'; case 'webSearchOptions': return { maxResults: 10, safeSearch: 1, }; case 'debugMode': return false; case 'errorHandling': return 'continueOnFail'; case 'cacheSettings': return { enableCache: false, }; case 'enableTelemetry': return false; case 'useApiKey': return false; default: return fallback; } }); directSearch.directWebSearch.mockResolvedValue({ results: [ { title: 'Test Result', url: 'https://example.com', description: 'Test description' } ] }); await duckDuckGoNode.execute.call(mockExecuteFunction); expect(directSearch.directWebSearch).toHaveBeenCalledWith('"test query"', expect.objectContaining({ locale: 'en-us', safeSearch: 'moderate', })); }); }); });