Upload 4.9
This commit is contained in:
@@ -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')
|
||||||
|
|||||||
@@ -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({})
|
response.json(blogs)
|
||||||
.then(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
|
||||||
@@ -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', {
|
||||||
|
|||||||
9
part4/bloglist/package-lock.json
generated
9
part4/bloglist/package-lock.json
generated
@@ -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",
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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()
|
||||||
})
|
})
|
||||||
|
|||||||
45
part4/bloglist/tests/test_helper.js
Normal file
45
part4/bloglist/tests/test_helper.js
Normal 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
|
||||||
|
}
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
const info = (...params) => {
|
const info = (...params) => {
|
||||||
console.log(...params)
|
if (process.env.NODE_ENV !== 'test') {
|
||||||
|
console.log(...params)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const error = (...params) => {
|
const error = (...params) => {
|
||||||
console.error(...params)
|
if (process.env.NODE_ENV !== 'test') {
|
||||||
|
console.error(...params)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|||||||
Reference in New Issue
Block a user