UNPKG

@sprucelabs/mercury-client

Version:

The simple way to interact with the Spruce Experience Platform

170 lines (169 loc) • 6.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const mercury_core_events_1 = require("@sprucelabs/mercury-core-events"); const schema_1 = require("@sprucelabs/schema"); const spruce_event_utils_1 = require("@sprucelabs/spruce-event-utils"); const test_1 = __importDefault(require("@sprucelabs/test")); const test_utils_1 = require("@sprucelabs/test-utils"); const MercuryClientFactory_1 = __importDefault(require("../clients/MercuryClientFactory")); const MutableContractClient_1 = __importDefault(require("../clients/MutableContractClient")); const constants_1 = require("./constants"); class AbstractClientTest extends test_1.default { static async afterEach() { await super.afterEach(); for (const client of this.clients) { await client.disconnect(); } this.clients = []; } static async beforeEach() { await super.beforeEach(); MercuryClientFactory_1.default.reset(); } static async beforeAll() { await super.beforeAll(); MercuryClientFactory_1.default.setDefaultTimeoutMs(2 * 60 * 1000); } static async afterAll() { await super.afterAll(); for (const client of this.clients) { await client.disconnect(); } this.clients = []; MercuryClientFactory_1.default.reset(); } static async connectToApi(options) { const { host = constants_1.TEST_HOST, ...rest } = options || {}; const client = await MercuryClientFactory_1.default.Client({ host, contracts: mercury_core_events_1.coreEventContracts, reconnectDelayMs: 10, emitTimeoutMs: 10000, ...rest, }); this.clients.push(client); return client; } static async loginAsDemoPerson(phone = process.env.DEMO_PHONE) { const client = await this.connectToApi(); if (!phone) { throw new schema_1.SchemaError({ code: 'MISSING_PARAMETERS', parameters: ['env.DEMO_PHONE'], }); } const requestPinResults = await client.emit('request-pin::v2020_12_25', { payload: { phone, }, }); const { challenge } = spruce_event_utils_1.eventResponseUtil.getFirstResponseOrThrow(requestPinResults); test_utils_1.assert.isTruthy(challenge); const confirmPinResults = await client.emit('confirm-pin::v2020_12_25', { payload: { challenge, pin: phone.substr(-4), }, }); const { person, token } = spruce_event_utils_1.eventResponseUtil.getFirstResponseOrThrow(confirmPinResults); test_utils_1.assert.isTruthy(person, 'Failed to login!'); return { person, client, token }; } static async seedDummyOrg(client) { const orgName = `Dummy org ${new Date().getTime()}`; const orgResults = await client.emit('create-organization::v2020_12_25', { payload: { name: orgName, }, }); const { organization } = spruce_event_utils_1.eventResponseUtil.getFirstResponseOrThrow(orgResults); test_utils_1.assert.isTruthy(organization); return organization; } static async seedInstallAndLoginAsSkill(client, orgId) { const skill = await this.seedAndInstallDummySkill(client, orgId); const skillClient = await this.connectToApi(); await skillClient.authenticate({ skillId: skill.id, apiKey: skill.apiKey, }); return { skill, client: skillClient }; } static async seedAndInstallDummySkill(client, orgId) { const skill = await this.seedDemoSkill(client); const installResults = await client.emit('install-skill::v2020_12_25', { target: { organizationId: orgId, }, payload: { skillId: skill.id }, }); test_utils_1.assert.isEqual(installResults.totalErrors, 0); return skill; } static async seedDemoSkill(client) { const skill1Results = await client.emit('register-skill::v2020_12_25', { payload: { name: `${this.skillName} ${++this.dummySkillCount} ${new Date().getTime() * Math.random()}`, }, }); const skill = skill1Results.responses[0].payload?.skill; test_utils_1.assert.isTruthy(skill); return skill; } static async registerEvent(namespace, client) { const sig = this.generateWillSendVipEventSignature(namespace); MutableContractClient_1.default.mixinContract(sig); const registerResults = await client.emit('register-events::v2020_12_25', { payload: { contract: this.generateWillSendVipEventSignature(), }, }); spruce_event_utils_1.eventResponseUtil.getFirstResponseOrThrow(registerResults); return sig; } static generateWillSendVipEventSignature(slug) { const contract = { eventSignatures: { [`${slug ? `${slug}.` : ''}will-send-vip::v1`]: { emitPayloadSchema: { id: 'willSendVipTargetAndPayload', fields: { target: { type: 'schema', isRequired: true, options: { schema: { id: 'willSendVipTarget', fields: { organizationId: { type: 'text', }, }, }, }, }, }, }, responsePayloadSchema: { id: 'testEventResponsePayload', fields: { messages: { type: 'text', isArray: true, isRequired: true, }, }, }, }, }, }; return contract; } } AbstractClientTest.dummySkillCount = 0; AbstractClientTest.clients = []; AbstractClientTest.skillName = 'Dummy skill'; exports.default = AbstractClientTest;