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
JavaScript
"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',
}));
});
});
});