From f06735a66800392c3087592a07b2c7c59246d0c7 Mon Sep 17 00:00:00 2001 From: Blake Ferm Date: Sat, 2 May 2020 16:21:35 -0400 Subject: [PATCH] update repo --- db/models/student.js | 51 +++--- package.json | 54 +++--- routes/students.js | 91 +++++----- routes/tests.js | 62 ++++++- test/02_routes.test.js | 398 ++++++++++++++++++++--------------------- 5 files changed, 360 insertions(+), 296 deletions(-) diff --git a/db/models/student.js b/db/models/student.js index a163db7..d926a54 100644 --- a/db/models/student.js +++ b/db/models/student.js @@ -4,35 +4,36 @@ const Sequelize = require('sequelize'); const db = require('../db'); const Student = db.define('student', { - firstName: { - type: Sequelize.STRING, - allowNull: false, - // validate: { - // is: /[\w]+/, - // }, - }, - lastName: { - type: Sequelize.STRING, - allowNull: false, - // validate: { - // is: /[\w]+/, - // }, - }, - email: { - type: Sequelize.STRING, - allowNull: false, - validate: { - isEmail: true, + firstName: { + type: Sequelize.STRING, + allowNull: false, + // validate: { + // is: /[\w]+/, + // }, + }, + lastName: { + type: Sequelize.STRING, + allowNull: false, + // validate: { + // is: /[\w]+/, + // }, + }, + email: { + type: Sequelize.STRING, + allowNull: false, + validate: { + isEmail: true, + }, }, - }, }); Student.beforeCreate(student => { - const nameFirst = student.firstName; - const nameLast = student.lastName; + const nameFirst = student.firstName; + const nameLast = student.lastName; - student.firstName = nameFirst[0].toUpperCase() + nameFirst.slice(1); - student.lastName = nameLast[0].toUpperCase() + nameLast.slice(1); + // Captalize the first letter of first name + last name + student.firstName = nameFirst[0].toUpperCase() + nameFirst.slice(1); + student.lastName = nameLast[0].toUpperCase() + nameLast.slice(1); }); -module.exports = Student; +module.exports = Student; \ No newline at end of file diff --git a/package.json b/package.json index 5996521..1ffd478 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,28 @@ { - "name": "study-staturday-week-2", - "version": "1.0.0", - "description": "fun w express and sequelize!", - "main": "index.js", - "scripts": { - "test": "nodemon --exec 'mocha --reporter spec --timeout 1000 test/*.test.js || true'", - "start": "nodemon app.js" - }, - "author": "myself", - "license": "ISC", - "dependencies": { - "body-parser": "^1.18.2", - "express": "^4.16.2", - "morgan": "^1.9.0", - "nodemon": "^1.17.1", - "pg": "^7.4.1", - "pg-hstore": "^2.3.2", - "sequelize": "^4.32.2" - }, - "devDependencies": { - "chai": "^4.1.2", - "mocha": "^5.0.0", - "sinon": "^4.2.2", - "sinon-chai": "^2.14.0", - "supertest": "^3.0.0" - } -} + "name": "study-staturday-week-2", + "version": "1.0.0", + "description": "fun w express and sequelize!", + "main": "index.js", + "scripts": { + "test": "nodemon --exec mocha --reporter spec --timeout 1000 test/*.test.js || true", + "start": "nodemon app.js" + }, + "author": "myself", + "license": "ISC", + "dependencies": { + "body-parser": "^1.18.2", + "express": "^4.16.2", + "morgan": "^1.9.0", + "nodemon": "^1.17.1", + "pg": "^7.4.1", + "pg-hstore": "^2.3.2", + "sequelize": "^4.32.2" + }, + "devDependencies": { + "chai": "^4.1.2", + "mocha": "^5.0.0", + "sinon": "^4.2.2", + "sinon-chai": "^2.14.0", + "supertest": "^3.0.0" + } +} \ No newline at end of file diff --git a/routes/students.js b/routes/students.js index ef9691f..5ac06c8 100644 --- a/routes/students.js +++ b/routes/students.js @@ -1,57 +1,62 @@ +// require the router const router = require('express').Router(); const Student = require('../db/models/student'); -router.get('/', async (req, res, next) => { - try { - const students = await Student.findAll(); - res.send(students); - } catch (error) { - next(error); - } +// setup routes +router.get('/', async(req, res, next) => { + try { + const students = await Student.findAll(); + res.send(students); + } catch (error) { + next(error); + } }); -router.get('/:id', async (req, res, next) => { - try { - let student = await Student.findById(req.params.id); - if (student) { - res.send(student); - } else { - res.status(404).send('Student not found'); +router.get('/:id', async(req, res, next) => { + try { + let student = await Student.findById(req.params.id); + if (student) { + res.send(student); + } else { + res.status(404).send('Student not found'); + } + } catch (error) { + next(error); } - } catch (error) { - next(error); - } }); -router.post('/', async (req, res, next) => { - try { - let student = await Student.create(req.body); - res.status(201).send(student); - } catch (err) { - next(err); - } +router.post('/', async(req, res, next) => { + try { + let student = await Student.create(req.body); + res.status(201).send(student); + } catch (err) { + next(err); + } }); -router.put('/:id', async (req, res, next) => { - try { - let updatedStudentInfo = await Student.update(req.body, { - where: { id: req.params.id }, - returning: true, - plain: true, - }); - res.send(updatedStudentInfo[1]); - } catch (err) { - next(err); - } +router.put('/:id', async(req, res, next) => { + let updatedStudent = req.params.id; + try { + let updatedStudentInfo = await Student.update(req.body, { + where: { id: updatedStudent }, + returning: true, + plain: true, + }); + res.send(updatedStudentInfo[1]); + } catch (err) { + next(err); + } }); -router.delete('/:id', async (req, res, next) => { - try { - await Student.destroy({ where: { id: req.params.id } }); - res.status(204).send(); - } catch (err) { - next(err); - } +router.delete('/:id', async(req, res, next) => { + let deletedStudent = req.params.id; + try { + await Student.destroy({ where: { id: deletedStudent } }); + res.status(204).send(); + } catch (err) { + next(err); + } }); -module.exports = router; +// export the router +module.exports = router; \ No newline at end of file diff --git a/routes/tests.js b/routes/tests.js index 4820e44..dcc31bf 100644 --- a/routes/tests.js +++ b/routes/tests.js @@ -1,4 +1,64 @@ const router = require('express').Router(); +const Test = require('../db/models/test'); +const Student = require('../db/models/student'); +// setup routes +router.get('/', async(req, res, next) => { + try { + const tests = await Test.findAll(); + res.send(tests); + } catch (error) { + next(error); + } +}); -module.exports = router; +router.get('/:id', async(req, res, next) => { + let testId = req.params.id + try { + let selectedTest = await Test.findById(testId); + if (selectedTest) { + res.send(selectedTest); + + // run this if not a json object + res.json(selectedTest); + } else { + res.status(404).send('Test not found'); + } + } catch (error) { + next(error); + } +}); + +router.post('/student/:studentId', async(req, res, next) => { + let studentId = req.params.studentId; + + // a post has a req.body - see the test + console.log(req.body, "REQ.BODY") + + try { + // figure out the student row + let student = await Student.findById(studentId) + // create a new row to link these together + let newTest = await Test.create(req.body); + + // take new test we made + let studentTest = await newTest.setStudent(student); + + res.status(201).send(studentTest); + } catch (err) { + next(err); + } +}); + +router.delete('/:id', async(req, res, next) => { + let deletedTest = req.params.id; + try { + await Test.destroy({ where: { id: deletedTest } }); + res.status(204).send(); + } catch (err) { + next(err); + } +}); + +// export the router +module.exports = router; \ No newline at end of file diff --git a/test/02_routes.test.js b/test/02_routes.test.js index 389719d..c34422d 100644 --- a/test/02_routes.test.js +++ b/test/02_routes.test.js @@ -11,217 +11,215 @@ const Student = require('../db/models/student'); const Test = require('../db/models/test'); describe('Routes', () => { - before(() => { - return db.sync({ force: true }); - }); - - afterEach(() => { - return Promise.all([ - Student.truncate({ cascade: true }), - Test.truncate({ cascade: true }), - ]); - }); - - describe('Student Routes', () => { - let pepper; - let peter; - let charlie; - - beforeEach(() => { - const creatingStudents = [ - { - firstName: 'Pepper', - lastName: 'Potts', - email: 'saltn@pepper.com', - }, - { - firstName: 'Peter', - lastName: 'Parker', - email: 'spidey@email.com', - }, - { - firstName: 'Charlie', - lastName: 'Brown', - email: 'cb@cbdb.com', - }, - ].map(data => Student.create(data)); - return Promise.all(creatingStudents).then(createdStudents => { - pepper = createdStudents[0]; - peter = createdStudents[1]; - charlie = createdStudents[2]; - }); + before(() => { + return db.sync({ force: true }); }); - describe('GET /students', () => { - it('retrieves all the students', () => { - return agent - .get('/students') - .expect('Content-Type', /json/) - .expect(200) - .expect(res => { - expect(res.body).to.be.an.instanceOf(Array); - expect(res.body).to.have.length(3); - }); - }); + afterEach(() => { + return Promise.all([ + Student.truncate({ cascade: true }), + Test.truncate({ cascade: true }), + ]); }); - describe('GET /students/:id', () => { - it('retrieves a single student by their id', () => { - return agent - .get(`/students/${pepper.id}`) - .expect(200) - .expect(res => { - if (typeof res.body === 'string') res.body = JSON.parse(res.body); - expect(res.body.firstName).to.equal('Pepper'); - }); - }); - - it('returns a 404 error if student does not exist in DB', () => { - return agent.get('/students/09432').expect(404); - }); - }); + describe('Student Routes', () => { + let pepper; + let peter; + let charlie; + + beforeEach(() => { + const creatingStudents = [{ + firstName: 'Pepper', + lastName: 'Potts', + email: 'saltn@pepper.com', + }, + { + firstName: 'Peter', + lastName: 'Parker', + email: 'spidey@email.com', + }, + { + firstName: 'Charlie', + lastName: 'Brown', + email: 'cb@cbdb.com', + }, + ].map(data => Student.create(data)); + return Promise.all(creatingStudents).then(createdStudents => { + pepper = createdStudents[0]; + peter = createdStudents[1]; + charlie = createdStudents[2]; + }); + }); - describe('POST /students', () => { - it('creates a new Student instance', () => { - return agent - .post('/students') - .send({ - firstName: 'SQL', - lastName: 'PRK', - email: 'sqlprk@db.com', - }) - .expect(201) - .expect('Content-Type', /json/) - .expect(res => { - expect(res.body.firstName).to.equal('SQL'); - }); - }); - }); + describe('GET /students', () => { + it('retrieves all the students', () => { + return agent + .get('/students') + .expect('Content-Type', /json/) + .expect(200) + .expect(res => { + expect(res.body).to.be.an.instanceOf(Array); + expect(res.body).to.have.length(3); + }); + }); + }); - describe('PUT /students/:id', () => { - it('updates an instance of a student', () => { - return agent - .put(`/students/${pepper.id}`) - .send({ firstName: 'Salty' }) - .expect(200) - .expect('Content-Type', /json/) - .expect(res => { - expect(res.body.firstName).to.equal('Salty'); - }); - }); - }); + describe('GET /students/:id', () => { + it('retrieves a single student by their id', () => { + return agent + .get(`/students/${pepper.id}`) + .expect(200) + .expect(res => { + if (typeof res.body === 'string') res.body = JSON.parse(res.body); + expect(res.body.firstName).to.equal('Pepper'); + }); + }); - describe('DELETE /students/:id', () => { - it('deletes an instance of a student', () => { - return agent - .delete(`/students/${charlie.id}`) - .expect(204) - .expect(() => { - return Student.findById(charlie.id).then(res => - expect(res).to.equal(null) - ); - }); - }); - }); - }); - - describe('Test Routes', () => { - let funTest; - let badTest; - let hardTest; - let crayTest; - beforeEach(() => { - const creatingTests = [ - { - subject: 'Tree-Climbing', - grade: 81, - }, - { - subject: 'Outdoor Wilderness Survival', - grade: 43, - }, - { - subject: 'Wind-Surfing', - grade: 85, - }, - { - subject: 'Outdoor Wilderness Survival', - grade: 66, - }, - ].map(data => Test.create(data)); - return Promise.all(creatingTests).then(createdTests => { - funTest = createdTests[0]; - badTest = createdTests[1]; - hardTest = createdTests[2]; - crayTest = createdTests[3]; - }); - }); - afterEach(() => { - return Promise.all([ - Student.truncate({ cascade: true }), - Test.truncate({ cascade: true }), - ]); - }); + it('returns a 404 error if student does not exist in DB', () => { + return agent.get('/students/09432').expect(404); + }); + }); - describe('GET /tests', () => { - xit('retrieves all tests', () => { - return agent - .get('/tests') - .expect(200) - .expect(res => { - expect(res.body).to.be.an.instanceOf(Array); - expect(res.body).to.have.length(4); - }); - }); - }); + describe('POST /students', () => { + it('creates a new Student instance', () => { + return agent + .post('/students') + .send({ + firstName: 'SQL', + lastName: 'PRK', + email: 'sqlprk@db.com', + }) + .expect(201) + .expect('Content-Type', /json/) + .expect(res => { + expect(res.body.firstName).to.equal('SQL'); + }); + }); + }); - describe('GET /tests/:id', () => { - xit('gets the test instance by id', () => { - return agent - .get(`/tests/${funTest.id}`) - .expect(200) - .expect(res => { - expect(res.body.subject).to.equal(funTest.subject); - }); - }); - }); + describe('PUT /students/:id', () => { + it('updates an instance of a student', () => { + return agent + .put(`/students/${pepper.id}`) + .send({ firstName: 'Salty' }) + .expect(200) + .expect('Content-Type', /json/) + .expect(res => { + expect(res.body.firstName).to.equal('Salty'); + }); + }); + }); - describe('POST /tests/student/:studentId', () => { - let student; - beforeEach(() => { - return Student.create({ - firstName: 'Pepper', - lastName: 'Potts', - email: 'saltn@pepper.com', - }).then(newStudent => { - student = newStudent; + describe('DELETE /students/:id', () => { + it('deletes an instance of a student', () => { + return agent + .delete(`/students/${charlie.id}`) + .expect(204) + .expect(() => { + return Student.findById(charlie.id).then(res => + expect(res).to.equal(null) + ); + }); + }); }); - }); - xit('creates a new Test instance for a student', () => { - return agent - .post(`/tests/student/${student.id}`) - .send({ - subject: 'Outdoor Wilderness Survival', - grade: 43, - }) - .expect(201) - .expect('Content-Type', /json/) - .expect(res => { - expect(res.body.studentId).to.equal(student.id); - }); - }); }); - describe('DELETE /tests/:id', () => { - xit('deletes an instance of test by its id', () => { - return agent - .delete(`/tests/${crayTest.id}`) - .expect(204) - .expect(() => { - return Test.findById(crayTest.id).then(res => { - expect(res).to.equal(null); + + describe('Test Routes', () => { + let funTest; + let badTest; + let hardTest; + let crayTest; + beforeEach(() => { + const creatingTests = [{ + subject: 'Tree-Climbing', + grade: 81, + }, + { + subject: 'Outdoor Wilderness Survival', + grade: 43, + }, + { + subject: 'Wind-Surfing', + grade: 85, + }, + { + subject: 'Outdoor Wilderness Survival', + grade: 66, + }, + ].map(data => Test.create(data)); + return Promise.all(creatingTests).then(createdTests => { + funTest = createdTests[0]; + badTest = createdTests[1]; + hardTest = createdTests[2]; + crayTest = createdTests[3]; + }); + }); + afterEach(() => { + return Promise.all([ + Student.truncate({ cascade: true }), + Test.truncate({ cascade: true }), + ]); + }); + + describe('GET /tests', () => { + it('retrieves all tests', () => { + return agent + .get('/tests') + .expect(200) + .expect(res => { + expect(res.body).to.be.an.instanceOf(Array); + expect(res.body).to.have.length(4); + }); + }); + }); + + describe('GET /tests/:id', () => { + it('gets the test instance by id', () => { + return agent + .get(`/tests/${funTest.id}`) + .expect(200) + .expect(res => { + expect(res.body.subject).to.equal(funTest.subject); + }); + }); + }); + + describe('POST /tests/student/:studentId', () => { + let student; + beforeEach(() => { + return Student.create({ + firstName: 'Pepper', + lastName: 'Potts', + email: 'saltn@pepper.com', + }).then(newStudent => { + student = newStudent; + }); }); - }); - }); + it('creates a new Test instance for a student', () => { + return agent + .post(`/tests/student/${student.id}`) + .send({ + subject: 'Outdoor Wilderness Survival', + grade: 43, + }) + .expect(201) + .expect('Content-Type', /json/) + .expect(res => { + expect(res.body.studentId).to.equal(student.id); + }); + }); + }); + describe('DELETE /tests/:id', () => { + it('deletes an instance of test by its id', () => { + return agent + .delete(`/tests/${crayTest.id}`) + .expect(204) + .expect(() => { + return Test.findById(crayTest.id).then(res => { + expect(res).to.equal(null); + }); + }); + }); + }); }); - }); -}); +}); \ No newline at end of file