Skip to content
Snippets Groups Projects
Commit 2af340d5 authored by Prasad Bhat's avatar Prasad Bhat
Browse files

CRUD with jest and winston

parents
No related branches found
No related tags found
No related merge requests found
.env 0 → 100644
PORT = 3000
\ No newline at end of file
node_modules/
\ No newline at end of file
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"$__":{"$versionError":null,"activePaths":{"paths":{},"states":{"default":{},"modify":{}}},"backup":{"activePaths":{"default":{"_id":true},"modify":{"age":true,"email":true,"username":true}},"validationError":null},"cachedRequired":{},"inserting":true,"op":null,"saveOptions":null,"savedState":{},"saving":null,"validating":null},"$isNew":false,"_doc":{"__v":0,"_id":"660ba01954379cadc18f7f1d","age":25,"email":"test@example.com","username":"testuser"},"level":"info","message":"User created:"}
{"$__":{"activePaths":{"paths":{"__v":"init","_id":"init","age":"init","email":"init","username":"init"},"states":{"init":{"__v":true,"_id":true,"age":true,"email":true,"username":true}}},"skipId":true},"$isNew":false,"_doc":{"__v":0,"_id":"660ba01954379cadc18f7f20","age":35,"email":"update@example.com","username":"updateuser"},"level":"info","message":"User updated:"}
{"0":{"__v":0,"_id":"660b9faaf9c6389d04985dc8","age":25,"email":"test@example.com","username":"testuser"},"1":{"__v":0,"_id":"660b9faff9c6389d04985dca","age":35,"email":"update@example.com","username":"updateuser"},"2":{"__v":0,"_id":"660b9fce60ceb1817425cdf1","age":25,"email":"test@example.com","username":"testuser"},"3":{"__v":0,"_id":"660b9fd360ceb1817425cdf4","age":35,"email":"update@example.com","username":"updateuser"},"4":{"__v":0,"_id":"660ba01954379cadc18f7f1d","age":25,"email":"test@example.com","username":"testuser"},"5":{"__v":0,"_id":"660ba01954379cadc18f7f20","age":35,"email":"update@example.com","username":"updateuser"},"level":"info","message":"Retrieved list of users:"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"$__":{"$versionError":null,"activePaths":{"paths":{},"states":{"default":{},"modify":{}}},"backup":{"activePaths":{"default":{"_id":true},"modify":{"age":true,"email":true,"username":true}},"validationError":null},"cachedRequired":{},"inserting":true,"op":null,"saveOptions":null,"savedState":{},"saving":null,"validating":null},"$isNew":false,"_doc":{"__v":0,"_id":"660ba0402ce1df9f805d4fd6","age":25,"email":"test@example.com","username":"testuser"},"level":"info","message":"User created:"}
{"$__":{"activePaths":{"paths":{"__v":"init","_id":"init","age":"init","email":"init","username":"init"},"states":{"init":{"__v":true,"_id":true,"age":true,"email":true,"username":true}}},"skipId":true},"$isNew":false,"_doc":{"__v":0,"_id":"660ba0402ce1df9f805d4fd8","age":35,"email":"update@example.com","username":"updateuser"},"level":"info","message":"User updated:"}
{"0":{"__v":0,"_id":"660ba0402ce1df9f805d4fd6","age":25,"email":"test@example.com","username":"testuser"},"1":{"__v":0,"_id":"660ba0402ce1df9f805d4fd8","age":35,"email":"update@example.com","username":"updateuser"},"level":"info","message":"Retrieved list of users:"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"$__":{"$versionError":null,"activePaths":{"paths":{},"states":{"default":{},"modify":{}}},"backup":{"activePaths":{"default":{"_id":true},"modify":{"age":true,"email":true}},"validationError":null},"cachedRequired":{},"inserting":true,"op":null,"saveOptions":null,"savedState":{},"saving":null,"validating":null},"$isNew":false,"_doc":{"__v":0,"_id":"660ba109fe782ca80b7b3bbb","age":25,"email":"john@gmail.com"},"level":"info","message":"User created:"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"0":{"__v":0,"_id":"660ba0402ce1df9f805d4fd6","age":25,"email":"test@example.com","username":"testuser"},"1":{"__v":0,"_id":"660ba0402ce1df9f805d4fd8","age":35,"email":"update@example.com","username":"updateuser"},"2":{"__v":0,"_id":"660ba109fe782ca80b7b3bbb","age":25,"email":"john@gmail.com"},"level":"info","message":"Retrieved list of users:"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"$__":{"activePaths":{"paths":{"__v":"init","_id":"init","age":"init","email":"init"},"states":{"init":{"__v":true,"_id":true,"age":true,"email":true}}},"skipId":true},"$isNew":false,"_doc":{"__v":0,"_id":"660ba109fe782ca80b7b3bbb","age":24,"email":"john@gmail.com"},"level":"info","message":"User updated:"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
{"level":"info","message":"Server listening at http://localhost:3000"}
index.js 0 → 100644
const express = require('express')
const app = express()
require('dotenv').config();
const mongoose = require('mongoose')
const userRoutes = require('./routes/userRoutes')
const logger = require('./logger');
const port = process.env.PORT || 3000
app.use(express.json());
const MONGO_URI = 'mongodb://localhost:27017/test';
/*
Create a node Express server.
Connect to mongo DB.
Create API to create users, update a user and get list of users.
Add proper logs Write unit tests to test your code.
*/
mongoose.connect(MONGO_URI)
.then(() => {
console.log('Connected to MongoDB');
})
.catch((error) => {
console.error('Error connecting to MongoDB:', error);
});
app.use('/api/users', userRoutes);
app.listen(port ,() => {
logger.info(`Server listening at http://localhost:${port}`);
});
module.exports = app
\ No newline at end of file
const winston = require('winston');
const logger = winston.createLogger({
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
module.exports = logger;
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
username: String,
email: String,
age: Number
});
module.exports = mongoose.model('User', userSchema);
\ No newline at end of file
This diff is collapsed.
{
"name": "jest",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "jest"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"dotenv": "^16.4.5",
"express": "^4.19.2",
"jest": "^29.7.0",
"mongoose": "^8.2.4",
"supertest": "^6.3.4",
"winston": "^3.13.0"
}
}
const express = require('express');
const router = express.Router();
const User = require('../models/user');
const logger = require('../logger')
router.post('/', async (req, res) => {
try {
const user = await User.create(req.body);
logger.info('User created:', user);
res.status(201).json(user);
} catch (err) {
logger.error('Error creating user:', err.message);
res.status(400).send(err.message);
}
});
/*
curl --location 'http://localhost:3000/api/users/' \
--header 'Content-Type: application/json' \
--data-raw '{
"userName": "John_doe",
"email": "john@gmail.com",
"age": 25
}'
*/
router.put('/:id', async (req, res) => {
try {
const user = await User.findByIdAndUpdate(req.params.id, req.body, { new: true });
if (!user) {
logger.error('User not found');
return res.status(404).send('User not found');
}
logger.info('User updated:', user);
res.json(user);
} catch (err) {
logger.error('Error updating user:', err.message);
res.status(400).send(err.message);
}
});
// set the path param to id of your document created
/*
curl --location --request PUT 'http://localhost:3000/api/users/660ba109fe782ca80b7b3bbb' \
--header 'Content-Type: application/json' \
--data '{
"age": 24
}'
*/
router.get('/', async (req, res) => {
try {
const users = await User.find();
logger.info('Retrieved list of users:', users);
res.json(users);
} catch (err) {
logger.error('Error retrieving users:', err.message);
res.status(500).send(err.message);
}
});
// curl --location 'http://localhost:3000/api/users/'
module.exports = router;
\ No newline at end of file
const request = require('supertest');
const app = require('../index');
const mongoose = require('mongoose');
const User = require('../models/user');
beforeAll(async () => {
await User.deleteMany();
});
afterAll(async () => {
await mongoose.disconnect();
});
describe('User API tests', () => {
it('should create a new user', async () => {
const res = await request(app)
.post('/api/users/')
.send({ username: 'testuser', email: 'test@example.com', age: 25 });
expect(res.statusCode).toEqual(201);
expect(res.body.username).toEqual('testuser');
expect(res.body.email).toEqual('test@example.com');
expect(res.body.age).toEqual(25);
});
it('should update an existing user', async () => {
const newUser = await User.create({ username: 'updateuser', email: 'update@example.com', age: 30 });
const res = await request(app)
.put(`/api/users/${newUser._id}`)
.send({ age: 35 });
expect(res.statusCode).toEqual(200);
expect(res.body.age).toEqual(35);
});
it('should get a list of users', async () => {
const res = await request(app)
.get('/api/users/');
expect(res.statusCode).toEqual(200);
expect(res.body.length).toBeGreaterThan(0);
});
});
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment