UNPKG

devextreme

Version:

JavaScript/TypeScript Component Suite for Responsive Web Development

276 lines (275 loc) • 14.7 kB
/** * DevExtreme (cjs/__internal/core/ai_integration/commands/smartPaste.test.js) * Version: 25.2.7 * Build date: Tue May 05 2026 * * Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; var _globals = require("@jest/globals"); var _smartPaste = require("../../../core/ai_integration/commands/smartPaste"); var _prompt_manager = require("../../../core/ai_integration/core/prompt_manager"); var _request_manager = require("../../../core/ai_integration/core/request_manager"); var _templates = require("../../../core/ai_integration/templates"); var _provider_mock = require("../../../core/ai_integration/test_utils/provider_mock"); const COMMAND_NAME = "smartPaste"; const USER_TEXT = "text to paste"; const USER_FIELDS = [{ name: "description", format: "text" }]; const USER_FIELDS_WITH_INSTRUCTION = [{ name: "description", format: "text", instruction: "instruction" }]; const PROCESSED_USER_FIELDS = "fieldName: description, format: text"; const PROCESSED_USER_FIELDS_WITH_INSTRUCTION = "fieldName: description, format: text, instruction: instruction"; (0, _globals.describe)("SmartPasteCommand", () => { const params = { text: USER_TEXT, fields: USER_FIELDS }; const paramsWithInstruction = { text: USER_TEXT, fields: USER_FIELDS_WITH_INSTRUCTION }; let promptManager = null; let requestManager = null; let command = null; (0, _globals.beforeEach)(() => { const provider = new _provider_mock.Provider; requestManager = new _request_manager.RequestManager(provider); promptManager = new _prompt_manager.PromptManager; command = new _smartPaste.SmartPasteCommand(promptManager, requestManager) }); (0, _globals.describe)("getTemplateName", () => { (0, _globals.it)("should return the name of the corresponding template", () => { const templateName = command.getTemplateName(); (0, _globals.expect)(templateName).toStrictEqual("smartPaste") }) }); (0, _globals.describe)("buildPromptData", () => { (0, _globals.it)("should form PromptData with text and fields info", () => { const promptData = command.buildPromptData(params); (0, _globals.expect)(promptData).toStrictEqual({ user: { text: USER_TEXT, fields: PROCESSED_USER_FIELDS } }) }); (0, _globals.it)("should form PromptData with text and fields info including instruction", () => { const promptData = command.buildPromptData(paramsWithInstruction); (0, _globals.expect)(promptData).toStrictEqual({ user: { text: USER_TEXT, fields: PROCESSED_USER_FIELDS_WITH_INSTRUCTION } }) }) }); (0, _globals.describe)("parseResult", () => { const fields = { fields: [{ name: "Field1", format: "text" }, { name: "Field2", format: "text" }] }; (0, _globals.it)("should return the parsed result", () => { const result = command.parseResult("Field1:::value1;;;Field2:::value2", fields); (0, _globals.expect)(result).toStrictEqual([{ name: "Field1", value: "value1" }, { name: "Field2", value: "value2" }]) }); (0, _globals.it)("should parse array values correctly", () => { const result = command.parseResult("Field1:::value1:::value2;;;Field2:::value3:::value4:::value5", fields); (0, _globals.expect)(result).toStrictEqual([{ name: "Field1", value: ["value1", "value2"] }, { name: "Field2", value: ["value3", "value4", "value5"] }]) }); (0, _globals.it)("should not include an empty fields into parsed result", () => { const result = command.parseResult("Field1:::value1;;;Field2:::", fields); (0, _globals.expect)(result).toStrictEqual([{ name: "Field1", value: "value1" }]) }); (0, _globals.it)("should process multiple delimiters and malformed field data correctly", () => { const result = command.parseResult("Field1:::value1;;;;;;Field2", fields); (0, _globals.expect)(result).toStrictEqual([{ name: "Field1", value: "value1" }]) }); (0, _globals.it)("should trim string and array values in parseResult", () => { const result = command.parseResult("Field1::: value1 ;;;Field2::: value2 ::: value3 ", fields); (0, _globals.expect)(result).toStrictEqual([{ name: "Field1", value: "value1" }, { name: "Field2", value: ["value2", "value3"] }]) }) }); (0, _globals.describe)("execute", () => { const callbacks = { onComplete: () => {} }; (0, _globals.it)("promptManager.buildPrompt should be called with parameters containing the passed values", () => { const buildPromptSpy = _globals.jest.spyOn(promptManager, "buildPrompt"); command.execute(params, callbacks); (0, _globals.expect)(buildPromptSpy).toHaveBeenCalledTimes(1); (0, _globals.expect)(promptManager.buildPrompt).toHaveBeenCalledWith("smartPaste", { user: { text: USER_TEXT, fields: PROCESSED_USER_FIELDS } }) }); (0, _globals.it)("promptManager.buildPrompt should should return prompt with passed values", () => { var _templates$smartPaste; _globals.jest.spyOn(promptManager, "buildPrompt"); command.execute(params, callbacks); const expectedUserPrompt = null === (_templates$smartPaste = _templates.templates.smartPaste.user) || void 0 === _templates$smartPaste ? void 0 : _templates$smartPaste.replace("{{text}}", USER_TEXT).replace("{{fields}}", PROCESSED_USER_FIELDS); (0, _globals.expect)(promptManager.buildPrompt).toHaveReturnedWith({ system: _templates.templates.smartPaste.system, user: expectedUserPrompt }) }); (0, _globals.it)("should call provider.sendRequest once and return the abort function", () => { const sendRequestSpy = _globals.jest.spyOn(requestManager, "sendRequest"); const abort = command.execute(params, callbacks); (0, _globals.expect)(typeof abort).toBe("function"); (0, _globals.expect)(sendRequestSpy).toHaveBeenCalledTimes(1) }) }); (0, _globals.describe)("toTyped", () => { const callToTyped = (values, type, fieldName) => _smartPaste.SmartPasteCommand.toTyped(values, type, fieldName); (0, _globals.describe)("Happy Path", () => { (0, _globals.it)("should convert valid color", () => { const result = callToTyped(["#ff0000"], "color"); (0, _globals.expect)(result).toBe("#ff0000") }); (0, _globals.it)("should convert valid boolean true", () => { const result = callToTyped(["true"], "boolean"); (0, _globals.expect)(result).toBe(true) }); (0, _globals.it)("should convert valid boolean false", () => { const result = callToTyped(["false"], "boolean"); (0, _globals.expect)(result).toBe(false) }); (0, _globals.it)("should convert valid string", () => { const result = callToTyped(["test string"], "string"); (0, _globals.expect)(result).toBe("test string") }); (0, _globals.it)("should convert valid string array", () => { const result = callToTyped(["item1", "item2", "item3"], "stringArray"); (0, _globals.expect)(result).toEqual(["item1", "item2", "item3"]) }); (0, _globals.it)("should convert valid number", () => { const result = callToTyped(["42.5"], "number"); (0, _globals.expect)(result).toBe(42.5) }); (0, _globals.it)("should convert valid number range", () => { const result = callToTyped(["10", "20"], "numberRange"); (0, _globals.expect)(result).toEqual([10, 20]) }); (0, _globals.it)("should convert valid date", () => { const result = callToTyped(["2024-01-15"], "date"); (0, _globals.expect)(result).toEqual(new Date("2024-01-15")) }); (0, _globals.it)("should convert valid date range", () => { const result = callToTyped(["2024-01-15", "2024-01-20"], "dateRange"); (0, _globals.expect)(result).toEqual([new Date("2024-01-15"), new Date("2024-01-20")]) }) }); (0, _globals.describe)("Empty results", () => { _globals.it.each(["string", "stringArray", "color", "boolean", "number", "numberRange", "date", "dateRange"])("should not throw for empty array when type=%s", type => { (0, _globals.expect)(() => callToTyped([], type, "testField")).not.toThrow(); (0, _globals.expect)(() => callToTyped([""], type, "testField")).not.toThrow(); (0, _globals.expect)(callToTyped([], type, "testField")).toBeUndefined(); (0, _globals.expect)(callToTyped([""], type, "testField")).toBeUndefined() }); (0, _globals.it)("should not throw for empty array when type is undefined", () => { (0, _globals.expect)(() => callToTyped([], void 0, "testField")).not.toThrow() }) }); (0, _globals.describe)("Default values", () => { (0, _globals.it)("should return default for undefined type with single value", () => { const result = callToTyped(["single value"]); (0, _globals.expect)(result).toBe("single value") }); (0, _globals.it)("should return default for undefined type with multiple values", () => { const result = callToTyped(["value1", "value2", "value3"]); (0, _globals.expect)(result).toEqual(["value1", "value2", "value3"]) }); (0, _globals.it)("should return single value when single item in array for default type", () => { const result = callToTyped(["single"]); (0, _globals.expect)(result).toBe("single") }) }); (0, _globals.describe)("Exception handling", () => { function buildErrorRegExp(value, field, type) { function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") } return new RegExp(`E1064.*${escapeRegExp(JSON.stringify(value))}.*${escapeRegExp(field)}.*${escapeRegExp(type)}.*`) } const field = "testField"; (0, _globals.it)("should throw error for invalid color", () => { const value = ["invalid-color"]; (0, _globals.expect)(() => callToTyped(value, "color", field)).toThrow(buildErrorRegExp(value, field, "color")) }); (0, _globals.it)("should throw error for invalid boolean", () => { const value = ["not-a-boolean"]; (0, _globals.expect)(() => callToTyped(value, "boolean", field)).toThrow(buildErrorRegExp(value, field, "boolean")) }); (0, _globals.it)("should throw error for invalid number", () => { const value = ["not-a-number"]; (0, _globals.expect)(() => callToTyped(value, "number", field)).toThrow(buildErrorRegExp(value, field, "number")) }); (0, _globals.it)("should throw error when number range has single value", () => { const value = ["10"]; (0, _globals.expect)(() => callToTyped(value, "numberRange", field)).toThrow(buildErrorRegExp(value, field, "number range")) }); (0, _globals.it)("should throw error when number range has more than 2 values", () => { const value = ["10", "20", "30"]; (0, _globals.expect)(() => callToTyped(value, "numberRange", field)).toThrow(buildErrorRegExp(value, field, "number range")) }); (0, _globals.it)("should throw error when number range has invalid numbers", () => { const value = ["10", "invalid"]; (0, _globals.expect)(() => callToTyped(value, "numberRange", field)).toThrow(buildErrorRegExp(value, field, "number range")) }); (0, _globals.it)("should throw error for invalid date", () => { const value = ["invalid-date"]; (0, _globals.expect)(() => callToTyped(value, "date", field)).toThrow(buildErrorRegExp(value, field, "date")) }); (0, _globals.it)("should throw error when date range has single value", () => { const value = ["2024-01-15"]; (0, _globals.expect)(() => callToTyped(value, "dateRange", field)).toThrow(buildErrorRegExp(value, field, "date range")) }); (0, _globals.it)("should throw error when date range has more than 2 values", () => { const value = ["2024-01-15", "2024-01-20", "2024-01-25"]; (0, _globals.expect)(() => callToTyped(value, "dateRange", field)).toThrow(buildErrorRegExp(value, field, "date range")) }); (0, _globals.it)("should throw error when date range has invalid dates", () => { const value = ["2024-01-15", "invalid-date"]; (0, _globals.expect)(() => callToTyped(value, "dateRange", field)).toThrow(buildErrorRegExp(value, field, "date range")) }) }) }) });