Skip to content

Commit 98b85d3

Browse files
committed
integration testing
1 parent d1fd7a0 commit 98b85d3

File tree

8 files changed

+175
-25
lines changed

8 files changed

+175
-25
lines changed

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"@types/express": "^4.17.11",
3333
"@types/jest": "^26.0.22",
3434
"@types/node": "^14.14.35",
35+
"@types/supertest": "^2.0.11",
3536
"@typescript-eslint/eslint-plugin": "^4.19.0",
3637
"@typescript-eslint/parser": "^4.19.0",
3738
"bson-objectid": "^2.0.1",
@@ -40,6 +41,7 @@
4041
"jest": "^26.6.3",
4142
"mongodb-memory-server": "^6.9.6",
4243
"nodemon": "^2.0.7",
44+
"supertest": "^6.1.3",
4345
"ts-jest": "^26.5.4",
4446
"ts-node": "^9.1.1",
4547
"typedoc": "^0.20.35",

src/controllers/authController.ts

+11-6
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,23 @@ import catchAsync from "../utils/catchAsync";
88

99
dotenv.config({ path: __dirname + "/.env" });
1010

11-
const signToken = (id: Types.ObjectId) => {
12-
return jwt.sign({ id }, process.env.JWT_SECRET!, {
13-
expiresIn: "24h",
14-
});
11+
export const signToken = (id: Types.ObjectId): string => {
12+
// Dirty hack to generate secret for testing purpose
13+
return jwt.sign(
14+
{ id },
15+
process.env.JWT_SECRET ? process.env.JWT_SECRET : "test",
16+
{
17+
expiresIn: "24h",
18+
}
19+
);
1520
};
1621

17-
const createSendToken = (
22+
export const createSendToken = (
1823
user: IUser,
1924
statusCode: number,
2025
req: Request,
2126
res: Response
22-
) => {
27+
): void => {
2328
const token = signToken(user._id);
2429
const cookieExpiration = +process.env.JWT_COOKIE_EXPIRES_IN!;
2530

src/main.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ mongoose
2424

2525
const port = process.env.PORT || 3000;
2626

27-
const server = app.listen(port, () =>
27+
// export server for testing
28+
export const server = app.listen(port, () =>
2829
console.log(`Server is listening on port ${port} 🤝`)
2930
);
3031

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { signToken } from "./../../controllers/authController";
2+
import { Types } from "mongoose";
3+
4+
// create an id with the type ObjectId
5+
const id = Types.ObjectId("4edd40c86762e0fb12000003");
6+
7+
describe("signToken", () => {
8+
it("should return a valid JWT signed token", () => {
9+
const token = signToken(id);
10+
expect(token).toBeTruthy();
11+
});
12+
});
13+
14+
const data = {
15+
firstName: "John",
16+
lastName: "Doe",
17+
email: "doe@gmail.com",
18+
username: "doe",
19+
password: "123456789",
20+
passwordConfirm: "123456789",
21+
};

src/test/api/questionController.test.ts renamed to src/test/controllers/questionController.test.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import mongoose from "mongoose";
2-
import { clearDatabase, connect } from "./dbHandler";
3-
import { Question } from "./../../models/questionModel";
2+
import { clearDatabase, connect } from "../utils/dbHandler";
3+
import { Question } from "../../models/questionModel";
44
import ObjectID from "bson-objectid";
55

66
// create an id with the type ObjectId
@@ -20,6 +20,10 @@ afterEach(async () => {
2020
await clearDatabase();
2121
});
2222

23+
beforeEach(async () => {
24+
await createQuestion();
25+
});
26+
2327
/**
2428
* Remove and close the db and server
2529
*/
@@ -37,14 +41,14 @@ describe("createQuestion", () => {
3741
*/
3842
it("should create question", async () => {
3943
const result = await Question.create(validQuestion);
44+
expect(result._id).toBeDefined();
4045
expect(result).toMatchObject({ title: validQuestion.title });
4146
});
4247

4348
/**
4449
* should exist after created
4550
*/
4651
it("exists after created", async () => {
47-
await Question.create(validQuestion);
4852
const result = await Question.findOne();
4953

5054
expect(result).toHaveProperty("title", validQuestion.title);
@@ -70,3 +74,8 @@ const invalidQuestion = [
7074
{ body: "a", author: id },
7175
{ title: "a", author: id },
7276
];
77+
78+
const createQuestion = async () => {
79+
const result = await Question.create(validQuestion);
80+
return result;
81+
};
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { server } from "./../../main";
2+
import request from "supertest";
3+
4+
describe("/questions", () => {
5+
beforeEach(() => {
6+
server;
7+
});
8+
9+
afterEach(() => {
10+
server.close();
11+
});
12+
13+
describe("GET /", () => {
14+
it("should return all questions", async () => {
15+
const res = await request(server).get("/questions");
16+
expect(res.status).toBe(401);
17+
});
18+
});
19+
});

src/test/api/dbHandler.ts renamed to src/test/utils/dbHandler.ts

+9-11
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
11
import mongoose from "mongoose";
22
import { MongoMemoryServer } from "mongodb-memory-server";
33

4-
const mongoD = new MongoMemoryServer();
4+
const mongod = new MongoMemoryServer();
55

66
/**
77
* Connect to the in-memory database
88
*/
99
export const connect = async (): Promise<void> => {
10-
const uri = await mongoD.getUri();
11-
await mongoose
12-
.connect(uri, {
13-
useNewUrlParser: true,
14-
useUnifiedTopology: true,
15-
useFindAndModify: false,
16-
useCreateIndex: true,
17-
})
18-
.then(() => console.log("in-memory DB connected"));
10+
const uri = await mongod.getUri();
11+
await mongoose.connect(uri, {
12+
useNewUrlParser: true,
13+
useUnifiedTopology: true,
14+
useFindAndModify: false,
15+
useCreateIndex: true,
16+
});
1917
};
2018

2119
/**
@@ -24,7 +22,7 @@ export const connect = async (): Promise<void> => {
2422
export const closeDatabase = async (): Promise<void> => {
2523
await mongoose.connection.dropDatabase();
2624
await mongoose.connection.close();
27-
await mongoD.stop();
25+
await mongod.stop();
2826
};
2927

3028
/**

yarn.lock

+99-4
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,11 @@
649649
resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.0.tgz#14f854c0f93d326e39da6e3b6f34f7d37513d108"
650650
integrity sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==
651651

652+
"@types/cookiejar@*":
653+
version "2.1.2"
654+
resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8"
655+
integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==
656+
652657
"@types/cors@^2.8.8":
653658
version "2.8.10"
654659
resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4"
@@ -822,6 +827,21 @@
822827
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff"
823828
integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==
824829

830+
"@types/superagent@*":
831+
version "4.1.10"
832+
resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.10.tgz#5e2cc721edf58f64fe9b819f326ee74803adee86"
833+
integrity sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g==
834+
dependencies:
835+
"@types/cookiejar" "*"
836+
"@types/node" "*"
837+
838+
"@types/supertest@^2.0.11":
839+
version "2.0.11"
840+
resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.11.tgz#2e70f69f220bc77b4f660d72c2e1a4231f44a77d"
841+
integrity sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==
842+
dependencies:
843+
"@types/superagent" "*"
844+
825845
"@types/tmp@^0.2.0":
826846
version "0.2.0"
827847
resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.0.tgz#e3f52b4d7397eaa9193592ef3fdd44dc0af4298c"
@@ -1639,7 +1659,7 @@ colors@^1.4.0:
16391659
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
16401660
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
16411661

1642-
combined-stream@^1.0.6, combined-stream@~1.0.6:
1662+
combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
16431663
version "1.0.8"
16441664
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
16451665
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@@ -1651,7 +1671,7 @@ commondir@^1.0.1:
16511671
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
16521672
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
16531673

1654-
component-emitter@^1.2.1, component-emitter@~1.3.0:
1674+
component-emitter@^1.2.1, component-emitter@^1.3.0, component-emitter@~1.3.0:
16551675
version "1.3.0"
16561676
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
16571677
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
@@ -1727,6 +1747,11 @@ cookie@~0.4.1:
17271747
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
17281748
integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
17291749

1750+
cookiejar@^2.1.2:
1751+
version "2.1.2"
1752+
resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
1753+
integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
1754+
17301755
copy-descriptor@^0.1.0:
17311756
version "0.1.1"
17321757
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
@@ -2402,6 +2427,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
24022427
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
24032428
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
24042429

2430+
fast-safe-stringify@^2.0.7:
2431+
version "2.0.7"
2432+
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
2433+
integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
2434+
24052435
fastq@^1.6.0:
24062436
version "1.11.0"
24072437
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858"
@@ -2505,6 +2535,15 @@ forever-agent@~0.6.1:
25052535
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
25062536
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
25072537

2538+
form-data@^3.0.0:
2539+
version "3.0.1"
2540+
resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
2541+
integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
2542+
dependencies:
2543+
asynckit "^0.4.0"
2544+
combined-stream "^1.0.8"
2545+
mime-types "^2.1.12"
2546+
25082547
form-data@~2.3.2:
25092548
version "2.3.3"
25102549
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
@@ -2514,6 +2553,11 @@ form-data@~2.3.2:
25142553
combined-stream "^1.0.6"
25152554
mime-types "^2.1.12"
25162555

2556+
formidable@^1.2.2:
2557+
version "1.2.2"
2558+
resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9"
2559+
integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==
2560+
25172561
forwarded@~0.1.2:
25182562
version "0.1.2"
25192563
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@@ -4028,7 +4072,7 @@ merge2@^1.3.0:
40284072
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
40294073
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
40304074

4031-
methods@~1.1.2:
4075+
methods@^1.1.2, methods@~1.1.2:
40324076
version "1.1.2"
40334077
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
40344078
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
@@ -4077,6 +4121,11 @@ mime@1.6.0:
40774121
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
40784122
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
40794123

4124+
mime@^2.4.6:
4125+
version "2.5.2"
4126+
resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
4127+
integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
4128+
40804129
mimic-fn@^2.1.0:
40814130
version "2.1.0"
40824131
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
@@ -4414,6 +4463,11 @@ object-copy@^0.1.0:
44144463
define-property "^0.2.5"
44154464
kind-of "^3.0.3"
44164465

4466+
object-inspect@^1.9.0:
4467+
version "1.10.2"
4468+
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30"
4469+
integrity sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==
4470+
44174471
object-visit@^1.0.0:
44184472
version "1.0.1"
44194473
resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
@@ -4716,6 +4770,13 @@ qs@6.7.0:
47164770
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
47174771
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
47184772

4773+
qs@^6.9.4:
4774+
version "6.10.1"
4775+
resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
4776+
integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
4777+
dependencies:
4778+
side-channel "^1.0.4"
4779+
47194780
qs@~6.5.2:
47204781
version "6.5.2"
47214782
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@@ -4788,7 +4849,7 @@ readable-stream@^2.0.6, readable-stream@^2.3.5:
47884849
string_decoder "~1.1.1"
47894850
util-deprecate "~1.0.1"
47904851

4791-
readable-stream@^3.1.1, readable-stream@^3.4.0:
4852+
readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
47924853
version "3.6.0"
47934854
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
47944855
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -5151,6 +5212,15 @@ shiki@^0.9.3:
51515212
onigasm "^2.2.5"
51525213
vscode-textmate "^5.2.0"
51535214

5215+
side-channel@^1.0.4:
5216+
version "1.0.4"
5217+
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
5218+
integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
5219+
dependencies:
5220+
call-bind "^1.0.0"
5221+
get-intrinsic "^1.0.2"
5222+
object-inspect "^1.9.0"
5223+
51545224
sift@7.0.1:
51555225
version "7.0.1"
51565226
resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08"
@@ -5478,6 +5548,31 @@ strip-json-comments@~2.0.1:
54785548
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
54795549
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
54805550

5551+
superagent@^6.1.0:
5552+
version "6.1.0"
5553+
resolved "https://registry.yarnpkg.com/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6"
5554+
integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==
5555+
dependencies:
5556+
component-emitter "^1.3.0"
5557+
cookiejar "^2.1.2"
5558+
debug "^4.1.1"
5559+
fast-safe-stringify "^2.0.7"
5560+
form-data "^3.0.0"
5561+
formidable "^1.2.2"
5562+
methods "^1.1.2"
5563+
mime "^2.4.6"
5564+
qs "^6.9.4"
5565+
readable-stream "^3.6.0"
5566+
semver "^7.3.2"
5567+
5568+
supertest@^6.1.3:
5569+
version "6.1.3"
5570+
resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.1.3.tgz#3f49ea964514c206c334073e8dc4e70519c7403f"
5571+
integrity sha512-v2NVRyP73XDewKb65adz+yug1XMtmvij63qIWHZzSX8tp6wiq6xBLUy4SUAd2NII6wIipOmHT/FD9eicpJwdgQ==
5572+
dependencies:
5573+
methods "^1.1.2"
5574+
superagent "^6.1.0"
5575+
54815576
supports-color@^5.3.0, supports-color@^5.5.0:
54825577
version "5.5.0"
54835578
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"

0 commit comments

Comments
 (0)