2. Creating the project
$ mkdir -p game && cd $_
$ npm init -y
$ npm install express
$ cat > index.js <<'EOF'
const express = require('express')
const app = express()
const result = {
"rounds": 1000,
"playersBalances": [
{ "cautious": 100 },
{ "random": 80 },
{ "demanding": 40 },
{ "impulsive": 30 }
]
}
app.get('/', (req, res) => {
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify(result))
})
app.listen(8080)
EOF
$ node index.js &> game.log &
$ http localhost:8080
$ kill %1
Initial commit:
$ git init $ cat > .gitignore <<'EOF' /node_modules *.log EOF $ git add . $ git status $ git commit -m 'Initial commit'
3. Adding Jest and SuperTest
$ npm install -D jest supertest
$ git apply <<'EOF'
diff --git a/package.json b/package.json
index e7a65a7..e6c60fd 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"description": "",
"main": "index.js",
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
+ "test": "jest"
},
"keywords": [],
"author": "",
@@ -15,5 +15,11 @@
"devDependencies": {
"jest": "^28.1.3",
"supertest": "^6.2.4"
+ },
+ "jest": {
+ "testEnvironment": "node",
+ "coveragePathIgnorePatterns": [
+ "/node_modules"
+ ]
}
}
EOF
$ npm test > game@1.0.0 test > jest No tests found, exiting with code 1 Run with `--passWithNoTests` to exit with code 0 In /home/pj/Downloads/desabio-bp/game 3 files checked. testMatch: **/__tests__/**/*.[jt]s?(x), **/?(*.)+(spec|test).[tj]s?(x) - 0 matches testPathIgnorePatterns: /node_modules/ - 3 matches testRegex: - 0 matches Pattern: - 0 matches
$ cat > sample.test.js <<'EOF'
describe('Sample Test', () => {
it('should test tha true === true', () => {
expect(true).toBe(true)
})
})
EOF
$ npm test
$ git add . $ git status $ git commit -m 'Added configuration for Jest and SuperTest'
4. Creating a basic API test
First, a little refactoring:
$ git apply <<'EOF'
diff --git a/index.js b/index.js
index c1a3811..f6682c5 100644
--- a/index.js
+++ b/index.js
@@ -16,4 +16,4 @@ app.get('/', (req, res) => {
res.end(JSON.stringify(result))
})
-app.listen(8080)
+module.exports = app
EOF
$ cat > app.js <<'EOF'
const app = require('./index')
app.listen(8080)
EOF
$ node app.js &> game.log & $ http localhost:8080 $ kill %1
Now, let’s create a basic test:
$ cat > index.test.js <<'EOF'
const supertest = require('supertest')
const app = require('./index')
test('GET /', async () => {
const response = await supertest(app).get('/')
expect(response.statusCode).toEqual(200)
expect(response.body.rounds).toEqual(1000)
})
EOF
Do our test again:
$ npm test > game@1.0.0 test > jest PASS ./index.test.js PASS ./sample.test.js Test Suites: 2 passed, 2 total Tests: 2 passed, 2 total Snapshots: 0 total Time: 0.429 s, estimated 1 s Ran all test suites.
Remove sample.test.js (we don’t need it anymore):
$ rm sample.test.js
Let’s commit our basic test:
$ git add . $ git status $ git commit -m 'Added a first SuperTest'
5. Improving the API test
$ git apply <<'EOF'
diff --git a/index.test.js b/index.test.js
index 8498451..a9f5cbf 100644
--- a/index.test.js
+++ b/index.test.js
@@ -1,9 +1,12 @@
const supertest = require('supertest')
const app = require('./index')
-test('GET /', async () => {
- const response = await supertest(app).get('/')
-
- expect(response.statusCode).toEqual(200)
- expect(response.body.rounds).toEqual(1000)
+describe('GET /', () => {
+ it('responds with json', (done) => {
+ supertest(app)
+ .get('/')
+ .set('Accept', 'application/json')
+ .expect('Content-Type', /json/)
+ .expect(200, done)
+ })
})
EOF
$ npm test $ git add .
$ git apply <<'EOF'
diff --git a/index.test.js b/index.test.js
index a9f5cbf..385822e 100644
--- a/index.test.js
+++ b/index.test.js
@@ -1,12 +1,28 @@
const supertest = require('supertest')
const app = require('./index')
+const isSorted = (arr) =>
+ !!arr.reduce((n, item) => n !== false && item >= n && item)
+
describe('GET /', () => {
- it('responds with json', (done) => {
- supertest(app)
+ it('responds with a valid json', async () => {
+ const response = await supertest(app)
.get('/')
.set('Accept', 'application/json')
- .expect('Content-Type', /json/)
- .expect(200, done)
+ expect(response.headers['content-type']).toMatch(/json/)
+ expect(response.status).toEqual(200)
+
+ // check if the number of rounds was defined and it is numeric
+ expect(typeof response.body.rounds).toBe('number')
+
+ const playersBalances = response.body.playersBalances
+
+ // check if we have four players
+ expect(playersBalances).toBeDefined()
+ expect(playersBalances.length).toBe(4)
+
+ // create an array with balances and check if it is Sorted
+ const balances = playersBalances.map(o => Object.values(o)[0]).reverse()
+ expect(isSorted(balances)).toBe(true)
})
})
EOF
$ npm test
$ git add . $ git commit 'Improved the API test'