@metriport/api-sdk 14.0.4 → 14.0.5-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/env-setup.d.ts +2 -0
- package/dist/__tests__/env-setup.d.ts.map +1 -0
- package/dist/__tests__/env-setup.js +35 -0
- package/dist/__tests__/env-setup.js.map +1 -0
- package/dist/devices/client/__tests__/metriport.test.d.ts +2 -0
- package/dist/devices/client/__tests__/metriport.test.d.ts.map +1 -0
- package/dist/devices/client/__tests__/metriport.test.js +26 -0
- package/dist/devices/client/__tests__/metriport.test.js.map +1 -0
- package/dist/medical/client/__tests__/metriport.test.d.ts +2 -0
- package/dist/medical/client/__tests__/metriport.test.d.ts.map +1 -0
- package/dist/medical/client/__tests__/metriport.test.e2e.d.ts +2 -0
- package/dist/medical/client/__tests__/metriport.test.e2e.d.ts.map +1 -0
- package/dist/medical/client/__tests__/metriport.test.e2e.js +158 -0
- package/dist/medical/client/__tests__/metriport.test.e2e.js.map +1 -0
- package/dist/medical/client/__tests__/metriport.test.js +86 -0
- package/dist/medical/client/__tests__/metriport.test.js.map +1 -0
- package/dist/medical/models/__tests__/contact.d.ts +3 -0
- package/dist/medical/models/__tests__/contact.d.ts.map +1 -0
- package/dist/medical/models/__tests__/contact.js +12 -0
- package/dist/medical/models/__tests__/contact.js.map +1 -0
- package/dist/medical/models/__tests__/demographics.test.d.ts +2 -0
- package/dist/medical/models/__tests__/demographics.test.d.ts.map +1 -0
- package/dist/medical/models/__tests__/demographics.test.js +57 -0
- package/dist/medical/models/__tests__/demographics.test.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/env-setup.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const dotenv = __importStar(require("dotenv"));
|
|
30
|
+
const path_1 = __importDefault(require("path"));
|
|
31
|
+
const cwd = process.cwd();
|
|
32
|
+
const paths = [cwd, ...(cwd.includes("packages") ? [] : ["packages", "api-sdk"])];
|
|
33
|
+
dotenv.config({ path: path_1.default.resolve(...paths, ".env") });
|
|
34
|
+
// Keep dotenv import and config before everything else
|
|
35
|
+
//# sourceMappingURL=env-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-setup.js","sourceRoot":"","sources":["../../src/__tests__/env-setup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,gDAAwB;AACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAC1B,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AAClF,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAI,CAAC,OAAO,CAAC,GAAG,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AACxD,uDAAuD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metriport.test.d.ts","sourceRoot":"","sources":["../../../../src/devices/client/__tests__/metriport.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const jest_mock_1 = require("jest-mock");
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const metriport_1 = require("../metriport");
|
|
9
|
+
const faker_1 = require("@faker-js/faker");
|
|
10
|
+
jest.mock("axios");
|
|
11
|
+
describe("getMetriportUserId", () => {
|
|
12
|
+
const userId = faker_1.faker.string.uuid();
|
|
13
|
+
const apiKey = faker_1.faker.string.uuid();
|
|
14
|
+
const mockedAxios = (0, jest_mock_1.mocked)(axios_1.default);
|
|
15
|
+
it("returns the userId", async () => {
|
|
16
|
+
const metriportClient = new metriport_1.MetriportDevicesApi(apiKey);
|
|
17
|
+
metriportClient["api"] = mockedAxios;
|
|
18
|
+
jest.spyOn(metriportClient, "getMetriportUserId");
|
|
19
|
+
mockedAxios.post.mockResolvedValueOnce({ data: { userId } });
|
|
20
|
+
const result = await metriportClient.getMetriportUserId(userId);
|
|
21
|
+
expect(mockedAxios.post).toHaveBeenCalledTimes(1);
|
|
22
|
+
expect(axios_1.default.post).toHaveBeenCalledWith(`/user`, null, { params: { appUserId: userId } });
|
|
23
|
+
expect(result).toEqual(userId);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=metriport.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metriport.test.js","sourceRoot":"","sources":["../../../../src/devices/client/__tests__/metriport.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAmC;AACnC,kDAA0B;AAC1B,4CAAmD;AACnD,2CAAwC;AAExC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAEnB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,MAAM,MAAM,GAAG,aAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,aAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,IAAA,kBAAM,EAAC,eAAK,CAAC,CAAC;IAElC,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,eAAe,GAAG,IAAI,+BAAmB,CAAC,MAAM,CAAC,CAAC;QAExD,eAAe,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;QAErC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;QAElD,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEhE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,eAAK,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metriport.test.d.ts","sourceRoot":"","sources":["../../../../src/medical/client/__tests__/metriport.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metriport.test.e2e.d.ts","sourceRoot":"","sources":["../../../../src/medical/client/__tests__/metriport.test.e2e.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
7
|
+
const dayjs_1 = __importDefault(require("dayjs"));
|
|
8
|
+
const uuid_1 = require("uuid");
|
|
9
|
+
const shared_1 = require("../../../shared");
|
|
10
|
+
const metriport_1 = require("../metriport");
|
|
11
|
+
jest.setTimeout(15000);
|
|
12
|
+
const METRIPORT = "METRIPORT";
|
|
13
|
+
const COMMONWELL = "COMMONWELL";
|
|
14
|
+
const CAREQUALITY = "CAREQUALITY";
|
|
15
|
+
const apiKey = (0, shared_1.getEnvVarOrFail)("TEST_API_KEY");
|
|
16
|
+
const baseAddress = (0, shared_1.getEnvVarOrFail)("API_URL");
|
|
17
|
+
const patientId = (0, shared_1.getEnvVar)("TEST_PATIENT_ID");
|
|
18
|
+
const metriport = new metriport_1.MetriportMedicalApi(apiKey, { baseAddress });
|
|
19
|
+
describe("listDocuments", () => {
|
|
20
|
+
if (!patientId) {
|
|
21
|
+
console.log(`Missing TEST_PATIENT_ID env var, SKIPPING the listDocuments related E2E TESTS!!!`);
|
|
22
|
+
it.skip("skipping e2e tests", () => { });
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// TODO we should have a beforeAll()/afterAll() to setup/teardown the test data
|
|
26
|
+
// so the result of the tests is more deterministic.
|
|
27
|
+
// As an alternative, could move these to the API's metriport.test.e2e.ts
|
|
28
|
+
it("returns documents when no filters", async () => {
|
|
29
|
+
const { documents } = await metriport.listDocuments(patientId);
|
|
30
|
+
expect(documents).toBeTruthy();
|
|
31
|
+
expect(documents.length).toBeGreaterThanOrEqual(1);
|
|
32
|
+
});
|
|
33
|
+
it("returns no documents when dateFrom is future", async () => {
|
|
34
|
+
const filters = { dateFrom: (0, dayjs_1.default)().add(3, "day").format(shared_1.ISO_DATE) };
|
|
35
|
+
const { documents } = await metriport.listDocuments(patientId, filters);
|
|
36
|
+
expect(documents).toBeTruthy();
|
|
37
|
+
expect(documents.length).toEqual(0);
|
|
38
|
+
});
|
|
39
|
+
it("returns no documents when dateTo is ancient", async () => {
|
|
40
|
+
const filters = {
|
|
41
|
+
dateTo: (0, dayjs_1.default)().subtract(100, "years").format(shared_1.ISO_DATE),
|
|
42
|
+
};
|
|
43
|
+
const { documents } = await metriport.listDocuments(patientId, filters);
|
|
44
|
+
expect(documents).toBeTruthy();
|
|
45
|
+
expect(documents.length).toEqual(0);
|
|
46
|
+
});
|
|
47
|
+
it("returns documents when dateFrom is past", async () => {
|
|
48
|
+
const filters = {
|
|
49
|
+
dateFrom: (0, dayjs_1.default)().subtract(10, "years").format(shared_1.ISO_DATE),
|
|
50
|
+
};
|
|
51
|
+
const { documents } = await metriport.listDocuments(patientId, filters);
|
|
52
|
+
expect(documents).toBeTruthy();
|
|
53
|
+
expect(documents.length).toBeGreaterThanOrEqual(1);
|
|
54
|
+
});
|
|
55
|
+
it("converts dateFrom Date to ISO string", async () => {
|
|
56
|
+
const filters = {
|
|
57
|
+
dateFrom: (0, dayjs_1.default)().subtract(10, "years").toDate(),
|
|
58
|
+
};
|
|
59
|
+
const { documents } = await metriport.listDocuments(patientId, filters);
|
|
60
|
+
expect(documents).toBeTruthy();
|
|
61
|
+
expect(documents.length).toBeGreaterThanOrEqual(1);
|
|
62
|
+
});
|
|
63
|
+
it("returns documents when dateTo is today", async () => {
|
|
64
|
+
const filters = {
|
|
65
|
+
dateTo: (0, dayjs_1.default)().format(shared_1.ISO_DATE),
|
|
66
|
+
};
|
|
67
|
+
const { documents } = await metriport.listDocuments(patientId, filters);
|
|
68
|
+
expect(documents).toBeTruthy();
|
|
69
|
+
expect(documents.length).toBeGreaterThanOrEqual(1);
|
|
70
|
+
});
|
|
71
|
+
it("converts dateFrom Date to ISO string", async () => {
|
|
72
|
+
const filters = {
|
|
73
|
+
dateTo: new Date(),
|
|
74
|
+
};
|
|
75
|
+
const { documents } = await metriport.listDocuments(patientId, filters);
|
|
76
|
+
expect(documents).toBeTruthy();
|
|
77
|
+
expect(documents.length).toBeGreaterThanOrEqual(1);
|
|
78
|
+
});
|
|
79
|
+
it("returns documents filtering by content", async () => {
|
|
80
|
+
const filters = {
|
|
81
|
+
content: "org",
|
|
82
|
+
};
|
|
83
|
+
const { documents } = await metriport.listDocuments(patientId, filters);
|
|
84
|
+
expect(documents).toBeTruthy();
|
|
85
|
+
expect(documents.length).toBeGreaterThanOrEqual(1);
|
|
86
|
+
});
|
|
87
|
+
it("does not return documents filtering by unknown content", async () => {
|
|
88
|
+
const filters = {
|
|
89
|
+
content: (0, uuid_1.v4)(),
|
|
90
|
+
};
|
|
91
|
+
const { documents } = await metriport.listDocuments(patientId, filters);
|
|
92
|
+
expect(documents).toBeTruthy();
|
|
93
|
+
expect(documents.length).toEqual(0);
|
|
94
|
+
});
|
|
95
|
+
it("fails if content filter is less than 3 chars", async () => {
|
|
96
|
+
const filters = {
|
|
97
|
+
content: "jo",
|
|
98
|
+
};
|
|
99
|
+
await expect(metriport.listDocuments(patientId, filters)).rejects.toThrow();
|
|
100
|
+
});
|
|
101
|
+
it("returns documents when all filters are combined", async () => {
|
|
102
|
+
const filters = {
|
|
103
|
+
dateFrom: (0, dayjs_1.default)().subtract(10, "years").format(shared_1.ISO_DATE),
|
|
104
|
+
dateTo: (0, dayjs_1.default)().add(1, "day").format(shared_1.ISO_DATE),
|
|
105
|
+
content: "org",
|
|
106
|
+
};
|
|
107
|
+
const { documents } = await metriport.listDocuments(patientId, filters);
|
|
108
|
+
expect(documents).toBeTruthy();
|
|
109
|
+
expect(documents.length).toBeGreaterThanOrEqual(1);
|
|
110
|
+
});
|
|
111
|
+
it("returns document in FHIR format", async () => {
|
|
112
|
+
const filters = {
|
|
113
|
+
dateFrom: (0, dayjs_1.default)().subtract(10, "years").format(shared_1.ISO_DATE),
|
|
114
|
+
dateTo: (0, dayjs_1.default)().add(1, "day").format(shared_1.ISO_DATE),
|
|
115
|
+
};
|
|
116
|
+
const { documents } = await metriport.listDocuments(patientId, filters);
|
|
117
|
+
expect(documents).toBeTruthy();
|
|
118
|
+
expect(documents.length).toBeGreaterThanOrEqual(1);
|
|
119
|
+
const doc = documents[0];
|
|
120
|
+
expect(doc.resourceType).toEqual("DocumentReference");
|
|
121
|
+
expect(doc.id).toBeTruthy();
|
|
122
|
+
expect(doc.meta).toBeTruthy();
|
|
123
|
+
expect(doc.contained).toBeTruthy();
|
|
124
|
+
expect(doc.extension).toBeTruthy();
|
|
125
|
+
expect(doc.masterIdentifier).toBeTruthy();
|
|
126
|
+
expect(doc.identifier).toBeTruthy();
|
|
127
|
+
expect(doc.status).toBeTruthy();
|
|
128
|
+
expect(doc.type).toBeTruthy();
|
|
129
|
+
expect(doc.date).toBeTruthy();
|
|
130
|
+
expect(doc.author).toBeTruthy();
|
|
131
|
+
expect(doc.content).toBeTruthy();
|
|
132
|
+
});
|
|
133
|
+
it("only returns doc refs from Metriport and HIEs", async () => {
|
|
134
|
+
const expectedExtensionCodes = [METRIPORT, COMMONWELL, CAREQUALITY];
|
|
135
|
+
const { documents } = await metriport.listDocuments(patientId);
|
|
136
|
+
expect(documents).toBeTruthy();
|
|
137
|
+
expect(documents.length).toBeGreaterThanOrEqual(1);
|
|
138
|
+
const docsWithValidExtensions = documents.filter(doc => {
|
|
139
|
+
const contains = doc.extension?.filter(e => e.valueCoding?.code && expectedExtensionCodes.includes(e.valueCoding?.code));
|
|
140
|
+
return contains && contains.length > 0;
|
|
141
|
+
}).length;
|
|
142
|
+
expect(docsWithValidExtensions).toEqual(documents.length);
|
|
143
|
+
});
|
|
144
|
+
it("returns documents as DTO", async () => {
|
|
145
|
+
const documents = await metriport.listDocumentsAsDTO(patientId);
|
|
146
|
+
expect(documents).toBeTruthy();
|
|
147
|
+
expect(documents.length).toBeGreaterThanOrEqual(1);
|
|
148
|
+
const doc = documents[0];
|
|
149
|
+
expect(doc.id).toBeTruthy();
|
|
150
|
+
expect(doc.description).toBeTruthy();
|
|
151
|
+
expect(doc.fileName).toBeTruthy();
|
|
152
|
+
expect(doc.type).toBeTruthy();
|
|
153
|
+
expect(doc.status).toBeTruthy();
|
|
154
|
+
expect(doc.mimeType).toBeTruthy();
|
|
155
|
+
expect(doc.size).toBeTruthy();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=metriport.test.e2e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metriport.test.e2e.js","sourceRoot":"","sources":["../../../../src/medical/client/__tests__/metriport.test.e2e.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const metriport_1 = require("../metriport");
|
|
9
|
+
describe("api-sdk client", () => {
|
|
10
|
+
describe("verifyWebhookSignature", () => {
|
|
11
|
+
const webhookKey = "testWebhookKey";
|
|
12
|
+
function generateValidSignature(key, body) {
|
|
13
|
+
return crypto_1.default.createHmac("sha256", key).update(body).digest("hex");
|
|
14
|
+
}
|
|
15
|
+
it("returns true for a valid signature with body as string", () => {
|
|
16
|
+
const validBody = JSON.stringify({ event: "test_event" });
|
|
17
|
+
const validSignature = generateValidSignature(webhookKey, validBody);
|
|
18
|
+
const result = metriport_1.MetriportMedicalApi.verifyWebhookSignature(webhookKey, validBody, validSignature);
|
|
19
|
+
expect(result).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
it("returns true for a valid signature with body as Buffer", () => {
|
|
22
|
+
const validBody = Buffer.from(JSON.stringify({ event: "test_event" }));
|
|
23
|
+
const validSignature = generateValidSignature(webhookKey, validBody.toString());
|
|
24
|
+
const result = metriport_1.MetriportMedicalApi.verifyWebhookSignature(webhookKey, validBody, validSignature);
|
|
25
|
+
expect(result).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
it("throws when body is not a string or Buffer", () => {
|
|
28
|
+
const validBody = { event: "test_event" };
|
|
29
|
+
const invalidSignature = "invalid_signature";
|
|
30
|
+
expect(() => metriport_1.MetriportMedicalApi.verifyWebhookSignature(webhookKey, validBody, invalidSignature)).toThrow("Body must be a string or Buffer");
|
|
31
|
+
});
|
|
32
|
+
it("returns false for an invalid signature", () => {
|
|
33
|
+
const validBody = JSON.stringify({ event: "test_event" });
|
|
34
|
+
const invalidSignature = "invalid_signature";
|
|
35
|
+
const result = metriport_1.MetriportMedicalApi.verifyWebhookSignature(webhookKey, validBody, invalidSignature);
|
|
36
|
+
expect(result).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
it("returns false when body is modified", () => {
|
|
39
|
+
const validBody = JSON.stringify({ event: "test_event" });
|
|
40
|
+
const validSignature = generateValidSignature(webhookKey, validBody);
|
|
41
|
+
const modifiedBody = JSON.stringify({ event: "modified_event" });
|
|
42
|
+
const result = metriport_1.MetriportMedicalApi.verifyWebhookSignature(webhookKey, modifiedBody, validSignature);
|
|
43
|
+
expect(result).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
it("returns false when webhook key is incorrect", () => {
|
|
46
|
+
const validBody = JSON.stringify({ event: "test_event" });
|
|
47
|
+
const validSignature = generateValidSignature(webhookKey, validBody);
|
|
48
|
+
const incorrectKey = "incorrectWebhookKey";
|
|
49
|
+
const result = metriport_1.MetriportMedicalApi.verifyWebhookSignature(incorrectKey, validBody, validSignature);
|
|
50
|
+
expect(result).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
describe("uses timingSafeEqual", () => {
|
|
53
|
+
const validBody = JSON.stringify({ event: "test_event" });
|
|
54
|
+
const validSignature = generateValidSignature(webhookKey, validBody);
|
|
55
|
+
let mockTimingSafeEqual;
|
|
56
|
+
beforeAll(() => {
|
|
57
|
+
jest.restoreAllMocks();
|
|
58
|
+
mockTimingSafeEqual = jest.fn();
|
|
59
|
+
jest.spyOn(crypto_1.default, "timingSafeEqual").mockImplementation(mockTimingSafeEqual);
|
|
60
|
+
jest.spyOn(crypto_1.default, "createHmac").mockReturnValue({
|
|
61
|
+
update: jest.fn().mockReturnThis(),
|
|
62
|
+
digest: jest.fn().mockReturnValue(validSignature),
|
|
63
|
+
}); // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
64
|
+
});
|
|
65
|
+
beforeEach(() => {
|
|
66
|
+
jest.clearAllMocks();
|
|
67
|
+
});
|
|
68
|
+
afterAll(() => {
|
|
69
|
+
jest.restoreAllMocks();
|
|
70
|
+
});
|
|
71
|
+
it("uses crypto.timingSafeEqual for comparison", () => {
|
|
72
|
+
mockTimingSafeEqual.mockReturnValueOnce(true);
|
|
73
|
+
const result = metriport_1.MetriportMedicalApi.verifyWebhookSignature(webhookKey, validBody, validSignature);
|
|
74
|
+
expect(mockTimingSafeEqual).toHaveBeenCalled();
|
|
75
|
+
expect(result).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
it("returns false when timingSafeEqual returns false", () => {
|
|
78
|
+
mockTimingSafeEqual.mockReturnValueOnce(false);
|
|
79
|
+
const result = metriport_1.MetriportMedicalApi.verifyWebhookSignature(webhookKey, validBody, validSignature);
|
|
80
|
+
expect(mockTimingSafeEqual).toHaveBeenCalled();
|
|
81
|
+
expect(result).toBe(false);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=metriport.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metriport.test.js","sourceRoot":"","sources":["../../../../src/medical/client/__tests__/metriport.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contact.d.ts","sourceRoot":"","sources":["../../../../src/medical/models/__tests__/contact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1C,wBAAgB,WAAW,CAAC,MAAM,GAAE,OAAO,CAAC,OAAO,CAAM,GAAG,OAAO,CAKlE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeContact = void 0;
|
|
4
|
+
const faker_1 = require("@faker-js/faker");
|
|
5
|
+
function makeContact(params = {}) {
|
|
6
|
+
return {
|
|
7
|
+
phone: params.phone ?? faker_1.faker.phone.number("##########"),
|
|
8
|
+
email: params.email ?? faker_1.faker.internet.email(),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
exports.makeContact = makeContact;
|
|
12
|
+
//# sourceMappingURL=contact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contact.js","sourceRoot":"","sources":["../../../../src/medical/models/__tests__/contact.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AAExC,SAAgB,WAAW,CAAC,SAA2B,EAAE;IACvD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,aAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;QACvD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,aAAK,CAAC,QAAQ,CAAC,KAAK,EAAE;KAC9C,CAAC;AACJ,CAAC;AALD,kCAKC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demographics.test.d.ts","sourceRoot":"","sources":["../../../../src/medical/models/__tests__/demographics.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const demographics_1 = require("../demographics");
|
|
4
|
+
const contact_1 = require("./contact");
|
|
5
|
+
describe("demographicsSchema", () => {
|
|
6
|
+
describe("contactSchema", () => {
|
|
7
|
+
it("accepts simple email", async () => {
|
|
8
|
+
const contact = (0, contact_1.makeContact)({ email: "test@metriport.com" });
|
|
9
|
+
expect(() => demographics_1.contactSchema.parse(contact)).not.toThrow();
|
|
10
|
+
});
|
|
11
|
+
it("accepts null email", async () => {
|
|
12
|
+
const contact = (0, contact_1.makeContact)();
|
|
13
|
+
contact.email = null;
|
|
14
|
+
expect(() => demographics_1.contactSchema.parse(contact)).not.toThrow();
|
|
15
|
+
});
|
|
16
|
+
it("accepts undefined email", async () => {
|
|
17
|
+
const contact = (0, contact_1.makeContact)();
|
|
18
|
+
contact.email = undefined;
|
|
19
|
+
expect(() => demographics_1.contactSchema.parse(contact)).not.toThrow();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe("emailSchema", () => {
|
|
23
|
+
const casesToSucceed = [
|
|
24
|
+
"t@m.co",
|
|
25
|
+
"test@metriport.com",
|
|
26
|
+
"test.second@metriport.com",
|
|
27
|
+
"test_second@metriport.com",
|
|
28
|
+
"test-second@metriport.com",
|
|
29
|
+
"user123@metriport.com",
|
|
30
|
+
"123user@metriport.com",
|
|
31
|
+
"user@metriport.com.br",
|
|
32
|
+
];
|
|
33
|
+
const casesToFail = [
|
|
34
|
+
null,
|
|
35
|
+
undefined,
|
|
36
|
+
" test@metriport.com",
|
|
37
|
+
"test@metriport.com ",
|
|
38
|
+
"test:second@metriport.com",
|
|
39
|
+
"test second@metriport.com",
|
|
40
|
+
"test metriport.com",
|
|
41
|
+
"test@ metriport.com",
|
|
42
|
+
"test@metriport",
|
|
43
|
+
"test@.com",
|
|
44
|
+
];
|
|
45
|
+
for (const email of casesToSucceed) {
|
|
46
|
+
it(`accepts '${email}'`, async () => {
|
|
47
|
+
expect(() => demographics_1.emailSchema.parse(email)).not.toThrow();
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
for (const email of casesToFail) {
|
|
51
|
+
it(`fails when gets '${email}'`, async () => {
|
|
52
|
+
expect(() => demographics_1.emailSchema.parse(email)).toThrow();
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=demographics.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demographics.test.js","sourceRoot":"","sources":["../../../../src/medical/models/__tests__/demographics.test.ts"],"names":[],"mappings":";;AAAA,kDAA6D;AAC7D,uCAAwC;AAExC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACpC,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;YAC7D,MAAM,CAAC,GAAG,EAAE,CAAC,4BAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;YAClC,MAAM,OAAO,GAAG,IAAA,qBAAW,GAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;YACrB,MAAM,CAAC,GAAG,EAAE,CAAC,4BAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,OAAO,GAAG,IAAA,qBAAW,GAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;YAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,4BAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,MAAM,cAAc,GAAa;YAC/B,QAAQ;YACR,oBAAoB;YACpB,2BAA2B;YAC3B,2BAA2B;YAC3B,2BAA2B;YAC3B,uBAAuB;YACvB,uBAAuB;YACvB,uBAAuB;SACxB,CAAC;QACF,MAAM,WAAW,GAAkC;YACjD,IAAI;YACJ,SAAS;YACT,qBAAqB;YACrB,qBAAqB;YACrB,2BAA2B;YAC3B,2BAA2B;YAC3B,oBAAoB;YACpB,qBAAqB;YACrB,gBAAgB;YAChB,WAAW;SACZ,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE;YAClC,EAAE,CAAC,YAAY,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE;gBAClC,MAAM,CAAC,GAAG,EAAE,CAAC,0BAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACvD,CAAC,CAAC,CAAC;SACJ;QACD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE;YAC/B,EAAE,CAAC,oBAAoB,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE;gBAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,0BAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACnD,CAAC,CAAC,CAAC;SACJ;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metriport/api-sdk",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.5-alpha.0",
|
|
4
4
|
"description": "Metriport helps you access and manage health and medical data, through a single open source API.",
|
|
5
5
|
"author": "Metriport Inc. <contact@metriport.com>",
|
|
6
6
|
"homepage": "https://metriport.com/",
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@medplum/fhirtypes": "^2.0.32",
|
|
61
|
-
"@metriport/commonwell-sdk": "^5.1.
|
|
62
|
-
"@metriport/shared": "^0.14.
|
|
61
|
+
"@metriport/commonwell-sdk": "^5.1.12-alpha.0",
|
|
62
|
+
"@metriport/shared": "^0.14.7-alpha.0",
|
|
63
63
|
"axios": "^1.4.0",
|
|
64
64
|
"dayjs": "^1.11.7",
|
|
65
65
|
"dotenv": "^16.3.1",
|
|
@@ -77,5 +77,5 @@
|
|
|
77
77
|
"ts-jest": "29.1.1",
|
|
78
78
|
"typescript": "^4.9.5"
|
|
79
79
|
},
|
|
80
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "ff0f96acd37aaa229f8b3a849c5f3cafff6d4d8b"
|
|
81
81
|
}
|