diff --git a/__mocks__/mock.provider.js b/__mocks__/mock.provider.js new file mode 100644 index 0000000..9dfd91c --- /dev/null +++ b/__mocks__/mock.provider.js @@ -0,0 +1,17 @@ +const { EventEmitter } = require('node:events') + +class MockProvider extends EventEmitter { + delaySendMessage = (miliseconds, eventName, payload) => + new Promise((res) => + setTimeout(() => { + this.emit(eventName, payload) + res + }, miliseconds) + ) + + sendMessage = async (userId, message) => { + return Promise.resolve({ userId, message }) + } +} + +module.exports = MockProvider diff --git a/package.json b/package.json index 22d78de..2d4cc08 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "devDependencies": { "@rollup/plugin-commonjs": "^23.0.2", "c8": "^7.12.0", + "cross-env": "^7.0.3", "eslint": "^8.26.0", "eslint-config-prettier": "^8.5.0", "prettier": "^2.7.1", diff --git a/packages/core/classes/bot.class.js b/packages/core/classes/bot.class.js index 9bb940a..d856bb0 100644 --- a/packages/core/classes/bot.class.js +++ b/packages/core/classes/bot.class.js @@ -23,8 +23,8 @@ class BotClass { listenerBusEvents = () => [ { event: 'require_action', - func: ({ instructions }) => - printer(instructions, '⚡⚡ ACCION REQUERIDA ⚡⚡'), + func: ({ instructions, title = '⚡⚡ ACCION REQUERIDA ⚡⚡' }) => + printer(instructions, title), }, { event: 'ready', diff --git a/packages/core/package.json b/packages/core/package.json index fb1d68e..019e415 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -11,6 +11,7 @@ "format:write": "prettier --write .", "lint:check": "eslint .", "lint:fix": "eslint --fix .", + "test.unit": "cross-env NODE_ENV=test node ../../node_modules/uvu/bin.js tests", "build:core": "yarn run format:write && yarn run lint:fix && yarn run io:rollup" }, "keywords": [], diff --git a/packages/core/tests/bot.class.test.js b/packages/core/tests/bot.class.test.js index ae91476..6b94c6d 100644 --- a/packages/core/tests/bot.class.test.js +++ b/packages/core/tests/bot.class.test.js @@ -1,6 +1,6 @@ -const { EventEmitter } = require('node:events') const { test } = require('uvu') const assert = require('uvu/assert') +const MockProvider = require('../../../__mocks__/mock.provider') const { create } = require('../') const BotClass = require('../classes/bot.class') @@ -12,9 +12,7 @@ class MockDB { save = () => {} } -class MockProvider extends EventEmitter {} - -test(`BotClass`, async () => { +test(`[BotClass] Probando instanciamiento de clase`, async () => { const setting = { flow: new MockFlow(), database: new MockDB(), @@ -22,7 +20,76 @@ test(`BotClass`, async () => { } const bot = await create(setting) assert.is(bot instanceof BotClass, true) - assert.is(bot.handleMsg({ body: 'test', to: 'to', from: 'from' })) +}) + +test(`[BotClass] Eventos 'require_action,ready,auth_failure,message '`, async () => { + let responseEvents = {} + + const MOCK_EVENTS = { + require_action: { + instructions: 'Debes...', + }, + ready: true, + auth_failure: { + instructions: 'Error...', + }, + message: { + from: 'XXXXXX', + body: 'hola', + hasMedia: false, + }, + } + + const mockProvider = new MockProvider() + + const setting = { + flow: new MockFlow(), + database: new MockDB(), + provider: mockProvider, + } + await create(setting) + + /// Escuchamos eventos + mockProvider.on( + 'require_action', + (r) => (responseEvents['require_action'] = r) + ) + mockProvider.on('ready', (r) => (responseEvents['ready'] = r)) + mockProvider.on('auth_failure', (r) => (responseEvents['auth_failure'] = r)) + mockProvider.on('message', (r) => (responseEvents['message'] = r)) + + /// Emitimos eventos + mockProvider.delaySendMessage( + 0, + 'require_action', + MOCK_EVENTS.require_action + ) + mockProvider.delaySendMessage(0, 'ready', MOCK_EVENTS.ready) + mockProvider.delaySendMessage(0, 'auth_failure', MOCK_EVENTS.auth_failure) + mockProvider.delaySendMessage(0, 'message', MOCK_EVENTS.message) + + await delay(0) + + /// Testeamos eventos + assert.is( + JSON.stringify(responseEvents.require_action), + JSON.stringify(MOCK_EVENTS.require_action) + ) + assert.is(responseEvents.ready, MOCK_EVENTS.ready) + + assert.is( + JSON.stringify(responseEvents.auth_failure), + JSON.stringify(MOCK_EVENTS.auth_failure) + ) + + assert.is( + JSON.stringify(responseEvents.message), + JSON.stringify(MOCK_EVENTS.message) + ) }) test.run() + +function delay(ms) { + return new Promise((res) => setTimeout(res, ms)) +} diff --git a/packages/core/tests/interactive.test.js b/packages/core/tests/interactive.test.js.bak similarity index 100% rename from packages/core/tests/interactive.test.js rename to packages/core/tests/interactive.test.js.bak diff --git a/packages/core/utils/interactive.js b/packages/core/utils/interactive.js index d626025..dcbe716 100644 --- a/packages/core/utils/interactive.js +++ b/packages/core/utils/interactive.js @@ -1,10 +1,14 @@ -const { yellow, red, bgRed } = require('kleur') - +const { yellow, bgRed } = require('kleur') +const NODE_ENV = process.env.NODE_ENV || 'dev' const printer = (message, title) => { - console.clear() - if (title) console.log(bgRed(`${title}`)) - console.log(yellow(Array.isArray(message) ? message.join('\n') : message)) - console.log(``) + if (NODE_ENV !== 'test') { + console.clear() + if (title) console.log(bgRed(`${title}`)) + console.log( + yellow(Array.isArray(message) ? message.join('\n') : message) + ) + console.log(``) + } } module.exports = { printer }