UNPKG

@sprucelabs/mercury-client

Version:

The simple way to interact with the Spruce Experience Platform

202 lines (201 loc) • 8.07 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); 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 = __importStar(require("@sprucelabs/test")); 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_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_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_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_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_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;