Upload 4.9

This commit is contained in:
Andrew Trieu
2023-05-31 20:55:51 +03:00
parent 31436ad7fa
commit 1c781aca74
9 changed files with 147 additions and 24 deletions

View File

@@ -1,5 +1,6 @@
const config = require('./utils/config') const config = require('./utils/config')
const express = require('express') const express = require('express')
require('express-async-errors')
const app = express() const app = express()
const cors = require('cors') const cors = require('cors')
const blogsRouter = require('./controllers/blogs') const blogsRouter = require('./controllers/blogs')

View File

@@ -1,24 +1,23 @@
const blogsRouter = require('express').Router() const blogsRouter = require('express').Router()
const Blog = require('../models/blog') const Blog = require('../models/blog')
blogsRouter.get('/', (request, response, next) => { blogsRouter.get('/', async (request, response) => {
Blog const blogs = await Blog.find({})
.find({})
.then(blogs => {
response.json(blogs) response.json(blogs)
}) })
.catch(error => next(error))
})
blogsRouter.post('/', (request, response, next) => { blogsRouter.post('/', async (request, response) => {
const blog = new Blog(request.body) const body = request.body
console.log(request.body)
blog const blog = await (new Blog({
.save() title: body.title,
.then(result => { author: body.author,
response.status(201).json(result) url: body.url,
}) likes: body.likes
.catch(error => next(error)) })).save()
response.status(201).json(blog)
}) })
module.exports = blogsRouter module.exports = blogsRouter

View File

@@ -1,10 +1,22 @@
const mongoose = require('mongoose') const mongoose = require('mongoose')
const blogSchema = new mongoose.Schema({ const blogSchema = new mongoose.Schema({
title: String, title: {
author: String, type: String,
url: String, required: true
likes: Number },
author: {
type: String,
required: true
},
url: {
type: String,
required: true
},
likes: {
type: Number,
required: true
}
}) })
blogSchema.set('toJSON', { blogSchema.set('toJSON', {

View File

@@ -13,6 +13,7 @@
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"dotenv": "^16.1.1", "dotenv": "^16.1.1",
"express": "^4.18.2", "express": "^4.18.2",
"express-async-errors": "^3.1.1",
"mongoose": "^7.2.2" "mongoose": "^7.2.2"
}, },
"devDependencies": { "devDependencies": {
@@ -2430,6 +2431,14 @@
"node": ">= 0.10.0" "node": ">= 0.10.0"
} }
}, },
"node_modules/express-async-errors": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/express-async-errors/-/express-async-errors-3.1.1.tgz",
"integrity": "sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng==",
"peerDependencies": {
"express": "^4.16.2"
}
},
"node_modules/express/node_modules/debug": { "node_modules/express/node_modules/debug": {
"version": "2.6.9", "version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",

View File

@@ -15,6 +15,7 @@
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"dotenv": "^16.1.1", "dotenv": "^16.1.1",
"express": "^4.18.2", "express": "^4.18.2",
"express-async-errors": "^3.1.1",
"mongoose": "^7.2.2" "mongoose": "^7.2.2"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -4,6 +4,14 @@ const app = require('../app')
const api = supertest(app) const api = supertest(app)
const Blog = require('../models/blog')
const helper = require('./test_helper')
beforeEach(async () => {
await Blog.deleteMany({})
await Blog.insertMany(helper.initialBlogs)
})
test('blogs are returned as json', async () => { test('blogs are returned as json', async () => {
await api await api
.get('/api/blogs') .get('/api/blogs')
@@ -11,6 +19,48 @@ test('blogs are returned as json', async () => {
.expect('Content-Type', /application\/json/) .expect('Content-Type', /application\/json/)
}) })
test('all blogs are returned', async () => {
const response = await api.get('/api/blogs')
expect(response.body).toHaveLength(helper.initialBlogs.length)
})
test('a specific blog is within the returned blogs', async () => {
const response = await api.get('/api/blogs')
const contents = response.body.map((r) => r.title)
expect(contents).toContain('Another blog')
})
test('a valid blog can be added ', async () => {
const newBlog = {
title: 'Test',
author: 'Tester',
url: 'http:/test.com',
likes: 999
}
await api
.post('/api/blogs')
.send(newBlog)
.expect(201)
.expect('Content-Type', /application\/json/)
const blogsAtEnd = await helper.blogsInDb()
expect(blogsAtEnd).toHaveLength(helper.initialBlogs.length + 1)
const contents = blogsAtEnd.map((n) => n.title)
expect(contents).toContain('Test')
})
test('blog without content is not added', async () => {
const newBlog = {
likes: 999
}
await api.post('/api/blogs').send(newBlog).expect(400)
const blogsAtEnd = await helper.blogsInDb()
expect(blogsAtEnd).toHaveLength(helper.initialBlogs.length)
})
afterAll(async () => { afterAll(async () => {
await mongoose.connection.close() await mongoose.connection.close()
}) })

View File

@@ -0,0 +1,45 @@
const Blog = require('../models/blog')
const initialBlogs = [
{
title: 'My blog',
author: 'Andrew',
url: 'www.andrew.eu',
likes: 1000,
},
{
title: 'My blog 2',
author: 'Andrew',
url: 'www.andrew.eu',
likes: 3000,
},
{
title: 'Another blog',
author: 'Hans',
url: 'www.andrew.eu',
likes: 5000,
}
]
const nonExistingId = async () => {
const blog = new Blog({
title: 'Test',
author: 'tester',
url: 'www.test.eu',
likes: 999,
})
await blog.save()
await blog.deleteOne()
return blog._id.toString()
}
const blogsInDb = async () => {
const blogs = await Blog.find({})
return blogs.map(blog => blog.toJSON())
}
module.exports = {
initialBlogs, nonExistingId, blogsInDb
}

View File

@@ -1,7 +1,9 @@
require('dotenv').config() require('dotenv').config()
const PORT = process.env.PORT const PORT = process.env.PORT
const MONGODB_URI = process.env.MONGODB_URI const MONGODB_URI = process.env.NODE_ENV === 'test'
? process.env.TEST_MONGODB_URI
: process.env.MONGODB_URI
module.exports = { module.exports = {
MONGODB_URI, MONGODB_URI,

View File

@@ -1,10 +1,14 @@
const info = (...params) => { const info = (...params) => {
if (process.env.NODE_ENV !== 'test') {
console.log(...params) console.log(...params)
} }
}
const error = (...params) => { const error = (...params) => {
if (process.env.NODE_ENV !== 'test') {
console.error(...params) console.error(...params)
} }
}
module.exports = { module.exports = {
info, error info, error