@sprucelabs/mercury-client
Version:
The simple way to interact with the Spruce Experience Platform
170 lines (169 loc) • 6.8 kB
JavaScript
;
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;