UNPKG

umbot

Version:

Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф

184 lines (183 loc) 7.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BotTest = void 0; const controller_1 = require("../controller"); const Bot_1 = require("./Bot"); const utils_1 = require("../utils/"); const node_perf_hooks_1 = require("node:perf_hooks"); /** * Класс для тестирования созданного навыка/бота через консольный интерфейс. Позволяет протестировать логику вашего приложения без предварительной публикации. * Также предоставляет интерактивный режим для отладки и тестирования функциональности. * Для того чтобы протестировать необходимую платформу, необходимо указать `appType`, в случае если значение не указано или установлено в auto, то для тестирования будет использоваться первая платформа. * * @extends Bot * * @example * ```ts * const botTest = new BotTest(); * botTest.setPlatformParams({ * intents: [{ * name: 'greeting', * slots: ['привет', 'здравствуйте'] * }] * }); * botTest.initBotController(MyController); * * // Запуск тестирования * await botTest.test({ * isShowResult: true, * isShowStorage: true * }); * ``` */ class BotTest extends Bot_1.Bot { _botController; constructor(type, botController) { super(type, botController); if (botController) { this._botController = new botController(this.getAppContext()); } else { this._botController = new controller_1.BaseBotController(this.getAppContext()); } this._setBotController(this._botController); } initBotController(fn) { this._botController = new fn(this.getAppContext()); this._setBotController(this._botController); return super.initBotController(fn); } #showInfo({ isShowResult = false, isShowStorage = false, isShowTime = true }, result, timeStart) { if (isShowResult) { console.log(`Ответ в формате платформы: > ${JSON.stringify(result)}`); } if (isShowStorage) { console.log(`Данные в базе > ${JSON.stringify(this._botController.userData)}`); console.log(`Данные в хранилище > ${JSON.stringify(this._botController.state)}`); } if (isShowTime) { const endTime = node_perf_hooks_1.performance.now() - timeStart; console.log(`Время выполнения: ${endTime.toFixed(3)}мс`); } } /** * Запускает интерактивное тестирование приложения. * Позволяет вводить команды и получать ответы в консоли. * Также, если не задан `setAppMode` равный `strict_prod`, то режим автоматически выставится в `dev` * * @param {IBotTestParams} [params] - Параметры тестирования * @returns {Promise<void>} * * @example * ```ts * // Базовое тестирование * await botTest.test(); * * // Расширенное тестирование с отображением всех данных * await botTest.test({ * isShowResult: true, * isShowStorage: true, * isShowTime: true * }); * ``` */ async test(params = {}) { let count = 0; let state = {}; let isEnd = false; this._botController.skipAutoReply = true; if (this.getAppContext().appMode !== 'strict_prod') { this.setAppMode('dev'); } do { let query; if (count === 0) { console.log("Для выхода введите 'exit'\n"); query = 'Привет'; } else { query = await (0, utils_1.stdin)(); if (query === 'exit') { break; } } if (!this._content) { this.setContent(JSON.stringify(this.getSkillContent(query, count, state))); } const timeStart = node_perf_hooks_1.performance.now(); if (typeof this._content === 'string') { this.setContent(JSON.parse(this._content)); } this._setBotController(this._botController); const result = (await this.run(this.appType)); const platformAdapter = this.getAppContext().platforms; let strRes; if (this._botController.appType && platformAdapter?.[this._botController.appType]?.isVoice) { if (result.response?.text) { strRes = result.response.text; } else { strRes = result.response?.tts || 'пусто'; } } else { strRes = this._botController.text; } this.#showInfo(params, result, timeStart); console.log(`\nОтвет: > ${strRes}`); if (this._botController.isEnd) { isEnd = true; } else { console.log('Ваш запрос: > '); this.setContent(null); this._botController.text = this._botController.tts = ''; state = this._botController.userData; count++; this._botController.clearStoreData(); } } while (!isEnd); } _clearState() { return; } /** * Формирует конфигурацию для тестирования конкретной платформы. * Создает структуру данных, соответствующую формату выбранной платформы * * @param query - Пользовательский запрос * @param count - Номер сообщения в диалоге * @param state - Данные из хранилища * @returns Конфигурация для выбранной платформы * * @protected */ getSkillContent(query, count, state) { /** * Все переменные используются внутри шаблонов */ const userId = 'user_local_test'; let appType = this.appType; if (appType === 'auto') { appType = Object.keys(this.getAppContext().platforms)[0]; this.appType = appType; } if (!this.getAppContext().platforms[appType].isVoice) { this._botController.skipAutoReply = false; } return this.getAppContext().platforms[appType].getQueryExample(query, userId, count, state); } /** * Запуск обработку запроса * Не рекомендуется вызывать самостоятельно, ответственность за вызов метода лежит за классом. * @param appType * @param content */ run(appType, content) { this.appType = appType || 'alisa'; this._botController.appType = appType || 'alisa'; return super.run(appType, content); } } exports.BotTest = BotTest;