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 express = require('express')
require('express-async-errors')
const app = express()
const cors = require('cors')
const blogsRouter = require('./controllers/blogs')

View File

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

View File

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

View File

@@ -13,6 +13,7 @@
"cross-env": "^7.0.3",
"dotenv": "^16.1.1",
"express": "^4.18.2",
"express-async-errors": "^3.1.1",
"mongoose": "^7.2.2"
},
"devDependencies": {
@@ -2430,6 +2431,14 @@
"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": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",

View File

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

View File

@@ -4,6 +4,14 @@ const app = require('../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 () => {
await api
.get('/api/blogs')
@@ -11,6 +19,48 @@ test('blogs are returned as json', async () => {
.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 () => {
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()
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 = {
MONGODB_URI,

View File

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