umbot
Version:
Мультиплатформенный фреймворк для создания голосовых навыков и чат-ботов с единой бизнес-логикой. Встроенная поддержка ВКонтакте, Telegram, Viber, MAX, Яндекс Алисы, Маруси и Сбера SmartApp. Архитектура на адаптерах позволяет подключать любые другие платф
184 lines (183 loc) • 7.63 kB
JavaScript
"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;