Skip to content

Commit bb92820

Browse files
author
JAMES FUQIAN
committed
cleanup, use jest for tests.
1 parent 709cad4 commit bb92820

11 files changed

Lines changed: 148 additions & 3394 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ npm-debug.log*
1717
yarn-debug.log*
1818
yarn-error.log*
1919

20+
server/yarn.lock
21+
2022
.vscode
2123
.idea
2224

server/babel.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = {
2+
presets: [
3+
['@babel/preset-env', {targets: {node: 'current'}}],
4+
'@babel/preset-typescript',
5+
],
6+
};

server/package.json

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"start": "node -r module-alias/register ./dist --env=production",
88
"start:debug": "node --inspect=0.0.0.0:9229 ./node_modules/.bin/ts-node -r tsconfig-paths/register ./src",
99
"start:dev": "nodemon",
10-
"test": "mocha --exit -r tsconfig-paths/register -r ts-node/register src/test/*.spec.ts"
10+
"test": "jest --coverage"
1111
},
1212
"nodemonConfig": {
1313
"watch": [
@@ -77,31 +77,27 @@
7777
"morgan": "^1.10.0"
7878
},
7979
"devDependencies": {
80-
"@types/chai": "^4.3.0",
81-
"@types/chai-http": "^4.2.0",
80+
"@babel/preset-env": "^7.16.11",
81+
"@babel/preset-typescript": "^7.16.7",
8282
"@types/command-line-args": "^5.0.0",
8383
"@types/cookie-parser": "^1.4.2",
8484
"@types/express": "^4.17.11",
8585
"@types/find": "^0.2.1",
8686
"@types/fs-extra": "^9.0.11",
87+
"@types/jest": "^27.4.1",
8788
"@types/jsonfile": "^6.0.0",
88-
"@types/mocha": "^9.0.0",
8989
"@types/morgan": "^1.9.2",
90-
"@types/nock": "^11.1.0",
9190
"@types/node": "^15.0.1",
9291
"@types/supertest": "^2.0.11",
9392
"@typescript-eslint/eslint-plugin": "^4.22.0",
9493
"@typescript-eslint/parser": "^4.22.0",
95-
"chai": "^4.3.4",
96-
"chai-http": "^4.3.0",
9794
"eslint": "^7.25.0",
9895
"eslint-config-airbnb": "^19.0.4",
9996
"eslint-config-airbnb-typescript": "^16.1.0",
10097
"eslint-plugin-import": "^2.25.4",
10198
"find": "^0.3.0",
10299
"fs-extra": "^9.1.0",
103-
"mocha": "^9.1.3",
104-
"nock": "^13.2.2",
100+
"jest": "^27.5.1",
105101
"nodemon": "^2.0.7",
106102
"supertest": "^6.1.3",
107103
"ts-node": "^9.1.1",

server/src/Server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import StatusCodes from 'http-status-codes';
77
import 'express-async-errors';
88

99
import BaseRouter from './routes';
10-
import logger from '@shared/Logger';
10+
import logger from './shared/Logger';
1111

1212
const app = express();
1313
const { BAD_REQUEST } = StatusCodes;
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import axios from "axios";
2+
import { getLoggedInUser } from '../utils/user';
3+
import db from '../utils/db';
4+
import app from '../Server';
5+
import * as reqs from '../utils/request';
6+
import AuthorizationToken from "../entities/AuthorizationToken";
7+
8+
const BB2_BASE_URL = "https://sandbox.bluebutton.cms.gov";
9+
10+
const BB2_PATIENT_URL = `${BB2_BASE_URL}/v2/fhir/Patient/`;
11+
12+
const BB2_COVERAGE_URL = `${BB2_BASE_URL}/v2/fhir/Coverage/`;
13+
14+
const BB2_EOB_URL = `${BB2_BASE_URL}/v2/fhir/ExplanationOfBenefit/`;
15+
16+
const BB2_PROFILE_URL = `${BB2_BASE_URL}/v2/connect/userinfo`;
17+
18+
const BB2_AUTH_TOKEN_URL = `${BB2_BASE_URL}/v2/o/token/`;
19+
20+
const eob = { status: 200, data: { resource: "EOB" } };
21+
22+
const coverage = { status: 200, data: { resource: "Coverage" } };
23+
24+
const patient = { status: 200, data: { resource: "Patient" } };
25+
26+
const profile = { status: 200, data: { resource: "Profile" } };
27+
28+
const MOCK_AUTH_TOKEN_RESPONSE = {
29+
status: 200,
30+
data: {
31+
access_token: "access_token_foo_refreshed",
32+
expires_in: 36000,
33+
token_type: "Bearer",
34+
scope: ["scope1", "scope2", "scope3"],
35+
refresh_token: "refresh_token_bar_refreshed",
36+
patient: "-19990000000001",
37+
},
38+
};
39+
40+
const MOCK_AUTH_TOKEN = new AuthorizationToken(MOCK_AUTH_TOKEN_RESPONSE.data);
41+
42+
let server: any;
43+
44+
beforeAll(() => {
45+
server = app.listen(Number(3003), () => {
46+
});
47+
});
48+
49+
afterAll(() => {
50+
server.close();
51+
});
52+
53+
test("expect patient end point returns patient data.", async () => {
54+
// mock patient returned at deeper layer
55+
jest.spyOn(reqs, 'get').mockImplementation((url, params, token) =>
56+
{
57+
if (url === BB2_PATIENT_URL) {
58+
return Promise.resolve(patient);
59+
} else {
60+
throw Error("Invalid end point URL: " + url);
61+
}
62+
}
63+
);
64+
65+
const response = await axios.get("http://localhost:3003/api/data/patient");
66+
67+
expect(response.status).toEqual(200);
68+
expect(response.data).toEqual(patient.data);
69+
});
70+
71+
test("expect profile end point returns profile data.", async () => {
72+
// mock profile returned at lower level get
73+
jest.spyOn(reqs, 'get').mockImplementation((url, params, token) =>
74+
{
75+
if (url === BB2_PROFILE_URL) {
76+
return Promise.resolve(profile);
77+
} else {
78+
throw Error("Invalid end point URL: " + url);
79+
}
80+
});
81+
82+
const response = await axios.get("http://localhost:3003/api/data/userprofile");
83+
expect(response.status).toEqual(200);
84+
expect(response.data).toEqual(profile.data);
85+
});
86+
87+
test("expect coverage end point returns coverage data.", async () => {
88+
// mock coverage returned at deeper layer
89+
jest.spyOn(reqs, 'get').mockImplementation((url, params, token) =>
90+
{
91+
if (url === BB2_COVERAGE_URL) {
92+
return Promise.resolve(coverage);
93+
} else {
94+
throw Error("Invalid end point URL: " + url);
95+
}
96+
}
97+
);
98+
99+
const response = await axios.get("http://localhost:3003/api/data/coverage");
100+
101+
expect(response.status).toEqual(200);
102+
expect(response.data).toEqual(coverage.data);
103+
});
104+
105+
test("expect eob end point returns eob data.", async () => {
106+
const loggedInUser = getLoggedInUser(db);
107+
108+
loggedInUser.authToken = MOCK_AUTH_TOKEN;
109+
110+
// mock eob returned at lower level get
111+
jest.spyOn(reqs, 'get').mockImplementation((url, params, token) =>
112+
{
113+
if (url === BB2_EOB_URL) {
114+
return Promise.resolve(eob);
115+
} else {
116+
throw Error("Invalid end point URL: " + url);
117+
}
118+
}
119+
);
120+
121+
const response = await axios.get("http://localhost:3003/api/data/benefit-direct");
122+
console.log(response);
123+
expect(response.status).toEqual(200);
124+
expect(response.data).toEqual(eob.data);
125+
});

server/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import './pre-start'; // Must be the first import
2-
import app from '@server';
3-
import logger from '@shared/Logger';
2+
import app from './Server';
3+
import logger from './shared/Logger';
44

55
// Start the server
66
/* DEVELOPER NOTE:

server/src/routes/Data.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Router, Request, Response } from 'express';
22
import moment from 'moment';
33
import { getLoggedInUser } from '../utils/user';
44
import { refreshAccessToken } from '../utils/bb2';
5-
import config from '@configs/config';
5+
import config from '../configs/config';
66
import db from '../utils/db';
77
import { get } from '../utils/request';
88

@@ -20,11 +20,11 @@ function getURL(path: string): string {
2020

2121
// this function is used to query eob data for the authenticated Medicare.gov
2222
// user and returned - we are then storing in a mocked DB
23-
export async function getBenefitData(req: Request) {
23+
export async function getBenefitData(req: Request, res: Response) {
2424
const loggedInUser = getLoggedInUser(db);
2525
const FHIR_EOB_PATH = 'fhir/ExplanationOfBenefit/';
2626
const BB2_BENEFIT_URL = getURL(FHIR_EOB_PATH);
27-
27+
2828
if (!loggedInUser.authToken || !loggedInUser.authToken.accessToken) {
2929
return { data: {} };
3030
}
@@ -39,13 +39,7 @@ export async function getBenefitData(req: Request) {
3939

4040
const response = await get(BB2_BENEFIT_URL, req.query, `${loggedInUser.authToken?.accessToken}`);
4141

42-
if (response.status === 200) {
43-
return response.data as unknown;
44-
}
45-
46-
// send generic error to client
47-
const general_err = '{"message": "Unable to load EOB Data - fetch FHIR resource error."}';
48-
return JSON.parse(general_err) as unknown;
42+
res.json(response.data);
4943
}
5044

5145
/*

server/src/test/server_test.spec.ts

Lines changed: 0 additions & 91 deletions
This file was deleted.

server/src/utils/bb2.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import FormData from 'form-data';
22
import AuthorizationToken from '../entities/AuthorizationToken';
33
import db from './db';
4-
import config from '@configs/config';
4+
import config from '../configs/config';
55
import { generateCodeChallenge, generateRandomState } from './generatePKCE';
66
import { post, postWithConfig } from './request';
77

server/tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
/* Basic Options */
55
// "incremental": true, /* Enable incremental compilation */
66
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
7-
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
7+
// "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
8+
"module": "esnext",
89
// "lib": [], /* Specify library files to be included in the compilation. */
910
// "allowJs": true, /* Allow javascript files to be compiled. */
1011
// "checkJs": true, /* Report errors in .js files. */

0 commit comments

Comments
 (0)