From 1091308ea3fa738ef8acad80fbedc14d4d6bff12 Mon Sep 17 00:00:00 2001 From: Rodrigo Rodriguez Date: Sat, 17 Aug 2024 21:35:09 -0300 Subject: [PATCH] new(all): Unit tests infra. --- .test-init.ts | 47 +++++++++++++++++++ .../basic.gblib/services/DialogKeywords.ts | 4 +- .../basic.gblib/services/SystemKeywords.ts | 1 + .../basic.gblib/tests/DialogKeywords.test.ts | 16 +++++++ .../{services => tests}/GBVMService.test.ts | 2 +- .../basic.gblib/tests/SystemKeywords.test.ts | 36 ++++++++++++++ .../security.gbapp/services/SecService.ts | 15 ++++-- src/RootData.ts | 1 + 8 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 .test-init.ts create mode 100644 packages/basic.gblib/tests/DialogKeywords.test.ts rename packages/basic.gblib/{services => tests}/GBVMService.test.ts (94%) create mode 100644 packages/basic.gblib/tests/SystemKeywords.test.ts diff --git a/.test-init.ts b/.test-init.ts new file mode 100644 index 000000000..9b280f030 --- /dev/null +++ b/.test-init.ts @@ -0,0 +1,47 @@ +import { expect, test } from 'vitest'; +import { GBServer } from './src/app'; +import { RootData } from './src/RootData'; +import { GBMinInstance } from 'botlib'; +import { Mutex } from 'async-mutex'; + +export default function init() { + + const min = { + packages: null, + appPackages: null, + botId: 'gbtest', + instance: {botId: 'gbtest'}, + core: {}, + conversationalService: {}, + kbService: {}, + adminService: {}, + deployService: {}, + textServices: {}, + bot: {}, + dialogs: {}, + userState: {}, + userProfile: {}, + whatsAppDirectLine: {}, + cbMap: {}, + scriptMap: {}, + sandBoxMap: {}, + gbappServices: {} + + } + + GBServer.globals = new RootData(); + GBServer.globals.server = null; + GBServer.globals.httpsServer = null; + GBServer.globals.webSessions = {}; + GBServer.globals.processes = [0, { pid: 1, proc: {step: {}}}]; + GBServer.globals.files = {}; + GBServer.globals.appPackages = []; + GBServer.globals.sysPackages = []; + GBServer.globals.minInstances = [min]; + GBServer.globals.minBoot = min; + GBServer.globals.wwwroot = null; + GBServer.globals.entryPointDialog = null; + GBServer.globals.debuggers = []; + GBServer.globals.indexSemaphore = new Mutex(); + GBServer.globals.users = {1: {userId: 1}}; +} diff --git a/packages/basic.gblib/services/DialogKeywords.ts b/packages/basic.gblib/services/DialogKeywords.ts index dc0d3d950..cc968a7ca 100644 --- a/packages/basic.gblib/services/DialogKeywords.ts +++ b/packages/basic.gblib/services/DialogKeywords.ts @@ -427,7 +427,7 @@ export class DialogKeywords { * @example TALK TOLIST (array,member) * */ - public async getToLst(pid, array, member) { + public async getToLst({pid, array, member}) { const { min, user } = await DialogKeywords.getProcessInfo(pid); if (!array) { @@ -1366,7 +1366,7 @@ export class DialogKeywords { const step = proc.step; const min = GBServer.globals.minInstances.filter(p => p.instance.instanceId == proc.instanceId)[0]; const sec = new SecService(); - const user = await sec.getUserFromId(min.instance.instanceId, proc.userId); + const user = GBServer.globals.users [proc.userId]; const params = user ? JSON.parse(user.params) : {}; return { min, diff --git a/packages/basic.gblib/services/SystemKeywords.ts b/packages/basic.gblib/services/SystemKeywords.ts index 37229ff4d..94cdd66f7 100644 --- a/packages/basic.gblib/services/SystemKeywords.ts +++ b/packages/basic.gblib/services/SystemKeywords.ts @@ -92,6 +92,7 @@ export class SystemKeywords { } public async append({ pid, args }) { + if (!args) return []; let array = [].concat(...args); return array.filter(function (item, pos) { return item; diff --git a/packages/basic.gblib/tests/DialogKeywords.test.ts b/packages/basic.gblib/tests/DialogKeywords.test.ts new file mode 100644 index 000000000..681f41b28 --- /dev/null +++ b/packages/basic.gblib/tests/DialogKeywords.test.ts @@ -0,0 +1,16 @@ +import { expect, test } from 'vitest'; +import { DialogKeywords } from '../services/DialogKeywords'; +import init from '../../../.test-init' + +init(); + +const dk = new DialogKeywords(); +const pid = 1; + +test('TOLIST', async () => { + + const obj = [{a:1, b:2}, {a:2, b:4}]; + + expect(await dk.getToLst({ pid, array: obj, member:'a' })) + .toBe("1,2"); +}); diff --git a/packages/basic.gblib/services/GBVMService.test.ts b/packages/basic.gblib/tests/GBVMService.test.ts similarity index 94% rename from packages/basic.gblib/services/GBVMService.test.ts rename to packages/basic.gblib/tests/GBVMService.test.ts index e6245ea73..e990016c2 100644 --- a/packages/basic.gblib/services/GBVMService.test.ts +++ b/packages/basic.gblib/tests/GBVMService.test.ts @@ -1,4 +1,4 @@ -import { GBVMService } from './GBVMService'; +import { GBVMService } from '../services/GBVMService'; import { expect, test } from 'vitest' test('Default', () => { diff --git a/packages/basic.gblib/tests/SystemKeywords.test.ts b/packages/basic.gblib/tests/SystemKeywords.test.ts new file mode 100644 index 000000000..73e0cd2f6 --- /dev/null +++ b/packages/basic.gblib/tests/SystemKeywords.test.ts @@ -0,0 +1,36 @@ +import { GBVMService } from '../services/GBVMService'; +import { expect, test } from 'vitest'; +import { SystemKeywords } from '../services/SystemKeywords'; + +const s = new SystemKeywords(); +const pid = 1; + +test('APPEND', async () => { + expect(await s.append({ pid, args: [1, 1, 1, 1] })).toStrictEqual([1, 1, 1, 1]); + expect(await s.append({ pid, args: [1] })).toStrictEqual([1]); + expect(await s.append({ pid, args: [] })).toStrictEqual([]); + expect(await s.append({ pid, args: null })).toStrictEqual([]); +}); + +test('COMPARE', () => { + expect(GBVMService.compare(1, 1)).toBeTruthy(); + expect(GBVMService.compare({ a: 1 }, { a: 1 })).toBeTruthy(); + expect(GBVMService.compare({ a: 1 }, { a: 2 })).toBeFalsy(); + expect(GBVMService.compare({ a: 1, b: 2 }, { a: 1, b: 2 })).toBeTruthy(); +}); + +test('Parse Storage Field', async () => { + const s = new GBVMService(); + + expect(await s.parseField('name STRING(30)')).toStrictEqual({ + name: 'name', + definition: { + allowNull: true, + unique: false, + primaryKey: false, + size: 30, + autoIncrement: false, + type: 'STRING' + } + }); +}); diff --git a/packages/security.gbapp/services/SecService.ts b/packages/security.gbapp/services/SecService.ts index 12abe0139..ad699c4b8 100644 --- a/packages/security.gbapp/services/SecService.ts +++ b/packages/security.gbapp/services/SecService.ts @@ -8,6 +8,7 @@ import * as Fs from 'fs'; import mkdirp from 'mkdirp'; import urlJoin from 'url-join'; import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js'; +import { GBServer } from '../../../src/app.js'; /** @@ -52,7 +53,8 @@ export class SecService extends GBService { user.displayName = displayName; user.email = email; user.defaultChannel = channelName; - + GBServer.globals.users [user.userId] = user; + return await user.save(); } @@ -74,6 +76,7 @@ export class SecService extends GBService { const user = await GuaribasUser.findOne(options); user.conversationReference = conversationReference; + GBServer.globals.users [user.userId] = user; await user.save(); } @@ -82,6 +85,7 @@ export class SecService extends GBService { const user = await GuaribasUser.findOne(options); user.conversationReference = conversationReference; + GBServer.globals.users [user.userId] = user; await user.save(); } @@ -92,7 +96,7 @@ export class SecService extends GBService { } }); user.locale = locale; - + GBServer.globals.users [user.userId] = user; return await user.save(); } @@ -103,7 +107,7 @@ export class SecService extends GBService { } }); user.hearOnDialog = dialogName; - + GBServer.globals.users [user.userId] = user; return await user.save(); } @@ -114,7 +118,7 @@ export class SecService extends GBService { } }); user.instanceId = instanceId; - + GBServer.globals.users [user.userId] = user; return await user.save(); } @@ -160,9 +164,11 @@ export class SecService extends GBService { agent.instanceId = user.instanceId; agent.agentMode = 'self'; agent.agentSystemId = null; + GBServer.globals.users [agent.userId] = user; await agent.save(); } + GBServer.globals.users [user.userId] = user; await user.save(); return user; @@ -306,6 +312,7 @@ export class SecService extends GBService { } obj[name] = value; user.params = JSON.stringify(obj); + GBServer.globals.users [userId] = user; return await user.save(); } } \ No newline at end of file diff --git a/src/RootData.ts b/src/RootData.ts index 9fa5a6595..62e676ad9 100644 --- a/src/RootData.ts +++ b/src/RootData.ts @@ -58,6 +58,7 @@ export class RootData { public debugConversationId: any; // Used to self-message during debug. public debuggers: any[]; // Client of attached Debugger instances by botId. public chatGPT: any; // ChatGPT API handle (shared Browser). + public users: any[]; // Loaded users. public dk; public wa; public sys;