Skip to content

Commit 9efb753

Browse files
committed
first commit
0 parents  commit 9efb753

34 files changed

Lines changed: 5675 additions & 0 deletions

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
.DS_Store

NOTES.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
yarn add supertest jest ts-jest @types/jest @types/supertest -D
2+
3+
yarn ts-jest config:init

README.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Testing Express REST API
2+
3+
## Key takeaways
4+
* An understanding of how important testing is
5+
* Testing doesn't have to be complicated or difficult
6+
7+
## What will you learn?
8+
* Testing a REST API end-to-end with Supertest & mongodb-memory-server
9+
* Mocking services
10+
* Testing from the controller to the service
11+
12+
13+
Read: https://github.com/goldbergyoni/javascript-testing-best-practices
14+
15+
## What you will need
16+
* Clone this repository: https://github.com/TomDoesTech/REST-API-Tutorial-Updated
17+
* An IDE or text editor (VS Code)
18+
* A package manager such as NPM or Yarn
19+
* Node.js installed
20+
21+
22+
## What next?
23+
* ~~Testing the API with Jest~~
24+
* Build a React.js user interface
25+
* Add Prometheus metrics to the API
26+
* Deploy the API with Caddy & Docker
27+
* Add Google OAuth
28+
29+
## Data flow
30+
![](./diagrams/data-flow-testing.png)
31+
32+
33+
## Support
34+
[Buy me a Coffee](https://www.buymeacoffee.com/tomn)
35+
36+
[Sign up to DigitalOcean](https://m.do.co/c/1b74cb8c56f4) I 💖 DigitalOcean
37+
38+
[Subscribe on YouTube](https://www.youtube.com/TomDoesTech)

config/default.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
export default {
2+
port: 1337,
3+
dbUri: "mongodb://localhost:27017/rest-api-tutorial",
4+
saltWorkFactor: 10,
5+
accessTokenTtl: "15m",
6+
refreshTokenTtl: "1y",
7+
publicKey: `-----BEGIN PUBLIC KEY-----
8+
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCXzZerpx9qdaelwt1U7NCpWXQK
9+
km1OW4ohDF/7g01xDtYf8Nox9wzhhVQrFD+G4eaJoWxIhJYQTgT4ijMlpjXs07Mc
10+
wktcMX49h6Eoo6ZddOMl380UpivkaO+h80miG4JCFAM0G0pUoeNT8h6L9zHqr/yE
11+
oBRd3RAsqxeCKwKrswIDAQAB
12+
-----END PUBLIC KEY-----`,
13+
privateKey: `-----BEGIN RSA PRIVATE KEY-----
14+
MIICXAIBAAKBgQCXzZerpx9qdaelwt1U7NCpWXQKkm1OW4ohDF/7g01xDtYf8Nox
15+
9wzhhVQrFD+G4eaJoWxIhJYQTgT4ijMlpjXs07McwktcMX49h6Eoo6ZddOMl380U
16+
pivkaO+h80miG4JCFAM0G0pUoeNT8h6L9zHqr/yEoBRd3RAsqxeCKwKrswIDAQAB
17+
AoGASdYpcMewQzMJIVpgF7+8WrL0+3NvkU57KEoBoa+jClviENUw/F6jOEqGvxFx
18+
OOVGIimPJtK+vx2D03Q9HpHy5gfG3Q0hXq8RABfzOkgKOQJYEb/CtkadRo9sqPpw
19+
PtXaFrwYNPevqzUydk5Y4imQN0yycmKPirgWP2GGZj8nAxECQQDMmWI6BkE+8p0H
20+
PszrkpDlAo3p/4oMW4XgoxBbIuHMuzYZi6d6FUvcOjGI88ktTBSMIhwjF5K/lIBU
21+
RXcKjzKJAkEAvfCtHN6oLs22MXp1AZBTSIfLp/8C4nLfW6VMboR+Sw9R5MatTuTI
22+
W4seeBxn1/DU88IhU579maYMX8TFMITNWwJATAPMz9wVD6saFmAJyJhKxxsc2Mx9
23+
YLv8UIqlAAdEt0jy/6i4T45sAeWJE+XnX7H9jFb79znB5vXoe+bXJJAxaQJBAK9P
24+
WeigleiFFBl85kvoMwZp2A4Z8EakMgX7fp0vCwYqgLLAsat0vHzJ3fiMd0g3T8Yg
25+
svPkdjt/qEIocryChqsCQGnInFDk9fC5C8G1Ez2N/p0WztoPDNKfYVDGZ8IRMjEy
26+
rPeH03CIhIoh6QPPg02GKC3VumQxgwOe2wkQ2OgHYLE=
27+
-----END RSA PRIVATE KEY-----`,
28+
};

config/test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
export default {
2+
port: 1337,
3+
dbUri: "mongodb://localhost:27017/rest-api-tutorial",
4+
saltWorkFactor: 10,
5+
accessTokenTtl: "15m",
6+
refreshTokenTtl: "1y",
7+
publicKey: `-----BEGIN PUBLIC KEY-----
8+
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCXzZerpx9qdaelwt1U7NCpWXQK
9+
km1OW4ohDF/7g01xDtYf8Nox9wzhhVQrFD+G4eaJoWxIhJYQTgT4ijMlpjXs07Mc
10+
wktcMX49h6Eoo6ZddOMl380UpivkaO+h80miG4JCFAM0G0pUoeNT8h6L9zHqr/yE
11+
oBRd3RAsqxeCKwKrswIDAQAB
12+
-----END PUBLIC KEY-----`,
13+
privateKey: `-----BEGIN RSA PRIVATE KEY-----
14+
MIICXAIBAAKBgQCXzZerpx9qdaelwt1U7NCpWXQKkm1OW4ohDF/7g01xDtYf8Nox
15+
9wzhhVQrFD+G4eaJoWxIhJYQTgT4ijMlpjXs07McwktcMX49h6Eoo6ZddOMl380U
16+
pivkaO+h80miG4JCFAM0G0pUoeNT8h6L9zHqr/yEoBRd3RAsqxeCKwKrswIDAQAB
17+
AoGASdYpcMewQzMJIVpgF7+8WrL0+3NvkU57KEoBoa+jClviENUw/F6jOEqGvxFx
18+
OOVGIimPJtK+vx2D03Q9HpHy5gfG3Q0hXq8RABfzOkgKOQJYEb/CtkadRo9sqPpw
19+
PtXaFrwYNPevqzUydk5Y4imQN0yycmKPirgWP2GGZj8nAxECQQDMmWI6BkE+8p0H
20+
PszrkpDlAo3p/4oMW4XgoxBbIuHMuzYZi6d6FUvcOjGI88ktTBSMIhwjF5K/lIBU
21+
RXcKjzKJAkEAvfCtHN6oLs22MXp1AZBTSIfLp/8C4nLfW6VMboR+Sw9R5MatTuTI
22+
W4seeBxn1/DU88IhU579maYMX8TFMITNWwJATAPMz9wVD6saFmAJyJhKxxsc2Mx9
23+
YLv8UIqlAAdEt0jy/6i4T45sAeWJE+XnX7H9jFb79znB5vXoe+bXJJAxaQJBAK9P
24+
WeigleiFFBl85kvoMwZp2A4Z8EakMgX7fp0vCwYqgLLAsat0vHzJ3fiMd0g3T8Yg
25+
svPkdjt/qEIocryChqsCQGnInFDk9fC5C8G1Ez2N/p0WztoPDNKfYVDGZ8IRMjEy
26+
rPeH03CIhIoh6QPPg02GKC3VumQxgwOe2wkQ2OgHYLE=
27+
-----END RSA PRIVATE KEY-----`,
28+
};

diagrams/data-flow-testing.png

34.7 KB
Loading

jest.config.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
2+
module.exports = {
3+
preset: "ts-jest",
4+
testEnvironment: "node",
5+
testMatch: ["**/**/*.test.ts"],
6+
verbose: true,
7+
forceExit: true,
8+
clearMocks: true,
9+
resetMocks: true,
10+
restoreMocks: true,
11+
};

package.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"name": "rest-api-tutorial-updated",
3+
"version": "1.0.0",
4+
"main": "index.js",
5+
"author": "Tom Nagle",
6+
"license": "MIT",
7+
"scripts": {
8+
"dev": "ts-node-dev --respawn --transpile-only src/app.ts",
9+
"test": "jest"
10+
},
11+
"dependencies": {
12+
"bcrypt": "^5.0.1",
13+
"config": "^3.3.6",
14+
"cors": "^2.8.5",
15+
"dayjs": "^1.10.7",
16+
"express": "^4.17.1",
17+
"jsonwebtoken": "^8.5.1",
18+
"lodash": "^4.17.21",
19+
"mongoose": "^6.0.8",
20+
"nanoid": "^3.1.28",
21+
"pino": "^6.13.3",
22+
"pino-pretty": "^7.0.1",
23+
"zod": "^3.9.5"
24+
},
25+
"devDependencies": {
26+
"@types/bcrypt": "^5.0.0",
27+
"@types/body-parser": "^1.19.1",
28+
"@types/config": "^0.0.39",
29+
"@types/cors": "^2.8.12",
30+
"@types/express": "^4.17.13",
31+
"@types/jest": "^27.0.2",
32+
"@types/jsonwebtoken": "^8.5.5",
33+
"@types/lodash": "^4.14.175",
34+
"@types/mongoose": "^5.11.97",
35+
"@types/nanoid": "^3.0.0",
36+
"@types/node": "^16.10.2",
37+
"@types/pino": "^6.3.11",
38+
"@types/supertest": "^2.0.11",
39+
"jest": "^27.2.4",
40+
"supertest": "^6.1.6",
41+
"ts-jest": "^27.0.5",
42+
"ts-node-dev": "^1.1.8",
43+
"typescript": "^4.4.3"
44+
}
45+
}

0 commit comments

Comments
 (0)