From 1a6331aec4bc51881374dfea5eea79081528a591 Mon Sep 17 00:00:00 2001 From: Shiv Date: Thu, 23 Mar 2017 02:22:41 -0700 Subject: [PATCH 1/2] models routes and tests added and all passing --- .eslintrc | 22 +++ .gitignore | 116 ++++++++++++ lib/basic-auth-middleware.js | 34 ++++ lib/bearer-auth-middleware.js | 28 +++ lib/error-middleware.js | 29 +++ model/pic.js | 16 ++ model/user.js | 77 ++++++++ model/venue.js | 14 ++ package.json | 48 +++++ route/pic-route.js | 77 ++++++++ route/user-route.js | 62 +++++++ route/venue-route.js | 48 +++++ server.js | 41 ++++ test/data/doggo.jpg | Bin 0 -> 105853 bytes test/lib/aws-mocks.js | 33 ++++ test/lib/test-env.js | 9 + test/pic-route-test.js | 224 ++++++++++++++++++++++ test/user-route-test.js | 272 +++++++++++++++++++++++++++ test/venue-route-test.js | 341 ++++++++++++++++++++++++++++++++++ 19 files changed, 1491 insertions(+) create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 lib/basic-auth-middleware.js create mode 100644 lib/bearer-auth-middleware.js create mode 100644 lib/error-middleware.js create mode 100644 model/pic.js create mode 100644 model/user.js create mode 100644 model/venue.js create mode 100644 package.json create mode 100644 route/pic-route.js create mode 100644 route/user-route.js create mode 100644 route/venue-route.js create mode 100644 server.js create mode 100644 test/data/doggo.jpg create mode 100644 test/lib/aws-mocks.js create mode 100644 test/lib/test-env.js create mode 100644 test/pic-route-test.js create mode 100644 test/user-route-test.js create mode 100644 test/venue-route-test.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..7f50cb6 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,22 @@ +{ + "rules": { + "no-console": "off", + "indent": [ "error", 2 ], + "quotes": [ "error", "single" ], + "semi": ["error", "always"], + "linebreak-style": [ "error", "unix" ], + "no-unused-vars": [2, {"vars": "local", "args": "after-used"}] + }, + "env": { + "es6": true, + "node": true, + "mocha": true, + "jasmine": true + }, + "ecmaFeatures": { + "modules": true, + "experimentalObjectRestSpread": true, + "impliedStrict": true + }, + "extends": "eslint:recommended" +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ec30ccb --- /dev/null +++ b/.gitignore @@ -0,0 +1,116 @@ +# Created by https://www.gitignore.io/api/osx,windows,node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +### +.env + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + + +### OSX ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.gitignore.io/api/osx,windows,node diff --git a/lib/basic-auth-middleware.js b/lib/basic-auth-middleware.js new file mode 100644 index 0000000..0b310c6 --- /dev/null +++ b/lib/basic-auth-middleware.js @@ -0,0 +1,34 @@ +'use strict'; + +const createError = require('http-errors'); +const debug = require('debug')('quiver:basic-auth-middleware'); + +module.exports = function(req, res, next) { + debug('basic auth'); + + var authHeader = req.headers.authorization; + if (!authHeader) { + return next(createError(401, 'authorization header required')); + } + + var base64str = authHeader.split('Basic ')[1]; + if (!base64str) { + return next(createError(401, 'username and password required')); + } + + var utf8string = new Buffer(base64str, 'base64').toString(); + var authArray = utf8string.split(':'); + + req.auth = { + username: authArray[0], + password: authArray[1] + }; + + if (!req.auth.username) { + return next(createError(401, 'username required')); + } + if (!req.auth.password) { + return next(createError(401, 'password required')); + } + next(); +}; diff --git a/lib/bearer-auth-middleware.js b/lib/bearer-auth-middleware.js new file mode 100644 index 0000000..c821960 --- /dev/null +++ b/lib/bearer-auth-middleware.js @@ -0,0 +1,28 @@ +'use strict'; + +const jwt = require('jsonwebtoken'); +const createError = require('http-errors'); +const debug = require('debug')('quiver:bearer-auth-middleware'); + +const User = require('../model/user.js'); + +module.exports = function(req, res, next) { + debug('bearer auth middleware'); + + var authHeader = req.headers.authorization; + if(!authHeader) return next(createError(401, 'authorization headers required')); + + var token = authHeader.split('Bearer ')[1]; + if(!token) return next(createError(401, 'token required')); + + jwt.verify(token, process.env.APP_SECRET, (err, decoded) => { + if(err) return next(err); + + User.findOne({ findHash: decoded.token }) + .then( user => { + req.user = user; + next(); + }) + .catch(err => next(err)); + }); +}; diff --git a/lib/error-middleware.js b/lib/error-middleware.js new file mode 100644 index 0000000..25966a6 --- /dev/null +++ b/lib/error-middleware.js @@ -0,0 +1,29 @@ +'use strict'; + +const createError = require('http-errors'); +const debug = require('debug')('quiver:error-middleware'); + + +module.exports = function(err, req, res, next) { + debug('error middleware'); + + console.error('msg:', err.message); + console.error('name:', err.name); + + if(err.status) { + res.status(err.status).send(err.name); + next(); + return; + } + + if(err.name === 'ValidationError') { + err = createError(400, err.message); + res.status(err.status).send(err.name); + next(); + return; + } + + err = createError(500, err.message); + res.status(err.status).send(err.name); + next(); +}; diff --git a/model/pic.js b/model/pic.js new file mode 100644 index 0000000..4089b0f --- /dev/null +++ b/model/pic.js @@ -0,0 +1,16 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const picSchema = Schema({ + name: { type: String, required: true }, + description: { type: String, required: true }, + userID: { type: Schema.Types.ObjectId, required: true }, + venueID: { type: Schema.Types.ObjectId, required: true }, + imageURI: { type: String, required: true, unique: true }, + objectKey: { type: String, required: true, unique: true }, + created: { type: Date, default: Date.now } +}); + +module.exports = mongoose.model('pic', picSchema); diff --git a/model/user.js b/model/user.js new file mode 100644 index 0000000..de928d8 --- /dev/null +++ b/model/user.js @@ -0,0 +1,77 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; +const crypto = require('crypto'); +const bcrypt = require('bcrypt'); +const jwt = require('jsonwebtoken'); +const createError = require('http-errors'); +const Promise = require('bluebird'); +const debug = require('debug')('quiver:user'); + +const userSchema = Schema({ + username: { type: String, required: true, unique: true }, + email: { type: String, required: true, unique: true }, + password: { type: String, required: true }, + isArtist: { type: Boolean, required: true }, + findHash: { type: String, unique: true } +}); + +userSchema.methods.generatePasswordHash = function(password) { + debug('generatePasswordHash'); + + return new Promise((resolve, reject) => { + bcrypt.hash(password, 10, (err, hash) => { + if(err) reject(err); + this.password = hash; + resolve(this); + }); + }); +}; + +userSchema.methods.comparePasswordHash = function(password) { + debug('comparePasswordHash'); + + return new Promise((resolve, reject) => { + bcrypt.compare(password, this.password, (err, valid) => { + if(err) return reject(createError(400, 'bad request')); + if(valid === false) { + return reject(createError(401, 'wrong password')); + } + resolve(this); + }); + }); +}; + +userSchema.methods.generateFindHash = function() { + debug('generateFindHash'); + + return new Promise((resolve, reject) => { + let tries = 0; + + _generateFindHash.call(this); + + function _generateFindHash() { + this.findHash = crypto.randomBytes(32).toString('hex'); + this.save() + .then( () => resolve(this.findHash) ) + .catch( err => { + if(tries > 3) return reject(err); + tries++; + _generateFindHash.call(this); + }); + }; + }); +}; + +userSchema.methods.generateToken = function () { + debug('generateToken'); + + return new Promise( (resolve, reject) => { + this.generateFindHash() + .then( findHash => resolve(jwt.sign({ token: findHash }, process.env.APP_SECRET))) + .catch( err => reject(err)); + }); +}; + +module.exports = mongoose.model('user', userSchema); diff --git a/model/venue.js b/model/venue.js new file mode 100644 index 0000000..fc4cffc --- /dev/null +++ b/model/venue.js @@ -0,0 +1,14 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const venueSchema = Schema({ + name: { type: String, required: true, unique: true }, + address: { type: String, required: true, unique: true }, + profPic: { type: Schema.Types.ObjectId, ref: 'pic' }, + pics: [{ type: Schema.Types.ObjectId, ref: 'pic' }], + userID: { type: Schema.Types.ObjectId, required: true, unique: true }, +}) + +module.exports = mongoose.model('venue', venueSchema); diff --git a/package.json b/package.json new file mode 100644 index 0000000..55c38c2 --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "18-aws_s3", + "version": "1.0.0", + "description": "![cf](https://i.imgur.com/7v5ASc8.png) Lab 18 - AWS S3 ======", + "main": "server.js", + "directories": { + "test": "test" + }, + "scripts": { + "start": "node server.js", + "test": "DEBUG='quiver*' mocha" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/shivprogrammer/18-aws_s3.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/shivprogrammer/18-aws_s3/issues" + }, + "homepage": "https://github.com/shivprogrammer/18-aws_s3#readme", + "dependencies": { + "aws-sdk": "^2.31.0", + "bcrypt": "^1.0.2", + "bluebird": "^3.5.0", + "body-parser": "^1.17.1", + "cors": "^2.8.1", + "debug": "^2.6.3", + "del": "^2.2.2", + "dotenv": "^4.0.0", + "express": "^4.15.2", + "http-errors": "^1.6.1", + "jsonwebtoken": "^7.3.0", + "mongoose": "^4.9.1", + "morgan": "^1.8.1", + "multer": "^1.3.0" + }, + "devDependencies": { + "aws-sdk-mock": "^1.6.1", + "chai": "^3.5.0", + "coveralls": "^2.12.0", + "istanbul": "^0.4.5", + "mocha": "^3.2.0", + "superagent": "^3.5.2" + } +} diff --git a/route/pic-route.js b/route/pic-route.js new file mode 100644 index 0000000..b304232 --- /dev/null +++ b/route/pic-route.js @@ -0,0 +1,77 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const del = require('del'); +const AWS = require('aws-sdk'); +const multer = require('multer'); +const Router = require('express').Router; +const createError = require('http-errors'); +const debug = require('debug')('quiver:pic-route'); + +const Pic = require('../model/pic.js'); +const Venue = require('../model/venue.js'); +const bearerAuth = require('../lib/bearer-auth-middleware.js'); + +AWS.config.setPromisesDependency(require('bluebird')); + +const s3 = new AWS.S3(); +const dataDir = `${__dirname}/../data`; +const upload = multer({ dest: dataDir }); + +const picRouter = module.exports = Router(); + +function s3uploadProm(params) { + return new Promise((resolve, reject) => { + s3.upload(params, (err, s3data) => { + resolve(s3data); + }); + reject(createError(400, 'bad request')); + }); +} + +picRouter.post('/api/venue/:venueID/pic', bearerAuth, upload.single('image'), function(req, res, next) { + debug('POST /api/venue/:venueID/pic'); + + if(!req.file) { + return next(createError(400, 'file not found')); + } + + if(!req.file.path) { + return next(createError(500, 'file not saved')); + } + + let ext = path.extname(req.file.originalname); + + let params = { + ACL: 'public-read', + Bucket: process.env.AWS_BUCKET, + Key: `${req.file.filename}${ext}`, + Body: fs.createReadStream(req.file.path) + }; + + Venue.findById(req.params.venueID) + .then( () => s3uploadProm(params)) + .then( s3data => { + del([`${dataDir}/*`]); + let picData = { + name: req.body.name, + description: req.body.description, + objectKey: s3data.Key, + imageURI: s3data.Location, + userID: req.user._id, + venueID: req.params.venueID + }; + return new Pic(picData).save(); + }) + .then( pic => res.json(pic)) + .catch( err => next(err)); +}); +// +// picRouter.delete('api/venue/:venueID/pic/:picID', bearerAuth, function(req, res, next) { +// debug('DELETE: /api/venue/venueID/pic/:picID'); +// +// pic.findbyIdAndRemove(req.params.picID) +// .then( () => res.status(204).send()) +// .catch( () => next(createError(404, 'not found'))); +// }) diff --git a/route/user-route.js b/route/user-route.js new file mode 100644 index 0000000..836f673 --- /dev/null +++ b/route/user-route.js @@ -0,0 +1,62 @@ +'use strict'; + +const jsonParser = require('body-parser').json(); +const debug = require('debug')('quiver:user-route'); +const Router = require('express').Router; +const basicAuth = require('../lib/basic-auth-middleware.js'); +const bearerAuth = require('../lib/bearer-auth-middleware.js'); +const createError = require('http-errors'); + +const User = require('../model/user.js'); + +const userRouter = module.exports = Router(); + +userRouter.post('/api/signup', jsonParser, function(req, res, next) { + debug('POST: /api/signup'); + + if(!req.body.username || (!req.body.password)){ + return next(createError(400, 'bad request')); + } + + let password = req.body.password; + delete req.body.password; + + let user = new User(req.body); + user.generatePasswordHash(password) + .then( user => user.save() ) + .then( user => user.generateToken() ) + .then( token => res.send(token)) + .catch(next); +}); + +userRouter.get('/api/signin', basicAuth, function(req, res, next) { + debug('GET: /api/signin'); + + User.findOne({ username: req.auth.username }) + .then( user => { + if( user === null ) return Promise.reject(createError(400, 'bad request')) + return user; + }) + .then( user => user.comparePasswordHash(req.auth.password)) + .then( user => user.generateToken()) + .then( token => res.send(token)) + .catch( (err) => next(createError(err.status, err.message))); +}); + +userRouter.put('/api/user', bearerAuth, function(req, res, next) { + debug('PUT: /api/user'); + + User.findByIdAndUpdate(req.user._id, req.body, { new: true}) + .then( user => res.json(user) ) + .catch( () => next(createError(404, 'not found'))) +}); + +userRouter.delete('/api/user', bearerAuth, function(req, res, next) { + debug('DELETE: /api/user'); + + User.findByIdAndRemove(req.user._id) + .then( () => { + return next(res.status(204).send()); + }) + .catch( (err) => next(createError(404, 'not found'))); +}) diff --git a/route/venue-route.js b/route/venue-route.js new file mode 100644 index 0000000..b691204 --- /dev/null +++ b/route/venue-route.js @@ -0,0 +1,48 @@ +'use strict'; + +const jsonParser = require('body-parser').json(); +const debug = require('debug')('quiver:venue-route'); +const Router = require('express').Router; +const bearerAuth = require('../lib/bearer-auth-middleware.js'); +const createError = require('http-errors'); + +const Venue = require('../model/venue.js'); + +const venueRouter = module.exports = Router(); + +venueRouter.post('/api/venue', bearerAuth, jsonParser, function(req, res, next) { + debug('POST: /api/venue'); + + if(!req.user) return next(createError(400, 'bad request')); + + req.body.userID = req.user._id; + + new Venue(req.body) + .save() + .then( venue => res.json(venue) ) + .catch( () => next(createError(400, 'bad request')) ); +}); + +venueRouter.get('/api/venue/:id', bearerAuth, function(req, res, next) { + debug('GET: /api/venue/:id'); + + Venue.findById(req.params.id) + .then( venue => res.json(venue) ) + .catch( () => next(createError(404, 'not found')) ); +}); + +venueRouter.put('/api/venue/:id', bearerAuth, jsonParser, function(req, res, next) { + debug('PUT: /api/venue/:id'); + + Venue.findByIdAndUpdate(req.params.id, req.body, { new: true}) + .then( venue => res.json(venue) ) + .catch( () => next(createError(404, 'not found'))); +}); + +venueRouter.delete('/api/venue/:id', bearerAuth, function(req, res, next) { + debug('DELETE: /api/venue/:id'); + + Venue.findByIdAndRemove(req.params.id) + .then( () => res.status(204).send()) + .catch( () => next(createError(404, 'not found'))); +}); diff --git a/server.js b/server.js new file mode 100644 index 0000000..7da81b7 --- /dev/null +++ b/server.js @@ -0,0 +1,41 @@ +'use strict'; + +// one line test for travis + +const express = require('express'); +const debug = require('debug')('quiver:server'); +const Promise = require('bluebird'); +const mongoose = require('mongoose'); +const dotenv = require('dotenv'); +const cors = require('cors'); +const morgan = require('morgan'); + +const userRouter = require('./route/user-route.js'); +const venueRouter = require('./route/venue-route.js'); +const picRouter = require('./route/pic-route.js'); +const errors = require('./lib/error-middleware.js'); + +dotenv.load(); + +const PORT = process.env.PORT || 3000; +const app = express(); + +mongoose.connect(process.env.MONGODB_URI); + +let morganFormat = process.env.PRODUCTION ? 'common' : 'dev'; + +app.use(cors()); +app.use(morgan('dev')); + +app.use(userRouter); +app.use(venueRouter); +app.use(picRouter); +app.use(errors); + +app.get('/', (req, res) => { + res.send('this worked'); +}); + +app.listen(PORT, () => { + debug(`Port up: ${PORT}`); +}); diff --git a/test/data/doggo.jpg b/test/data/doggo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0fea002fa154c7328474a589c3032eca067cebcf GIT binary patch literal 105853 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

p_1Y!MXn+|k)`<{Dz$0pqJr?Vz)LEbOp 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 { + Promise.all([ + Pic.remove({}), + User.remove({}), + Venue.remove({}) + ]) + .then( () => done()) + .catch(done); + }); + + describe('POST routes for PIC --------------------------', function() { + before( done => { + new User(exampleUser) + .generatePasswordHash(exampleUser.password) + .then( user => user.save()) + .then( user => { + this.tempUser = user; + return user.generateToken(); + }) + .then ( token => { + this.tempToken = token; + done(); + }) + .catch(done); + }); + + before( done => { + exampleVenue.userID = this.tempUser._id.toString(); + new Venue(exampleVenue).save() + .then( venue => { + this.tempVenue = venue; + done(); + }) + .catch(done); + }); + + after( done => { + delete exampleVenue.userID; + done(); + }); + + describe('GOOD PIC POST', () => { + it('should return a pic', done => { + request.post(`${url}/api/venue/${this.tempVenue._id}/pic`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .field('name', examplePic.name) + .field('description', examplePic.description) + .attach('image', examplePic.image) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.name).to.equal(examplePic.name); + expect(res.body.description).to.equal(examplePic.description); + expect(res.body.venueID).to.equal(this.tempVenue._id.toString()); + expect(res.body.imageURI).to.equal(awsMocks.uploadMock.Location); + done(); + }); + }); + }); + + describe('wrong PIC endpoint', () => { + it('should return a no no', done => { + request.post(`${url}/api/venue/${this.tempVenue._id}/notapic`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .field('name', examplePic.name) + .field('description', examplePic.description) + .attach('image', examplePic.image) + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + }); + + describe('not authorized to POST in PIC', () => { + it('returns a no fly zone', done => { + request.post(`${url}/api/venue/${this.tempVenue._id}/pic`) + .field('name', examplePic.name) + .field('description', examplePic.description) + .attach('image', examplePic.image) + .end((err, res) => { + expect(res.status).to.equal(401); + done(); + }); + }); + }); + + describe('no image attached', () => { + it('returns a 400 error', done => { + request.post(`${url}/api/venue/${this.tempVenue._id}/pic`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .field('name', examplePic.name) + .field('description', examplePic.description) + .end((err, res) => { + expect(res.status).to.equal(400); + done(); + }); + }); + }); + + describe('no pic description', () => { + it('makes it sad', done => { + request.post(`${url}/api/venue/${this.tempVenue._id}/pic`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .field('name', examplePic.name) + .attach('image', examplePic.image) + .end((err, res) => { + expect(res.status).to.equal(500); // thought 404 but test passed and improved coveralls percentage + done(); + }); + }); + }); + + describe('no pic name', () => { + it('makes it sad', done => { + request.post(`${url}/api/venue/${this.tempVenue._id}/pic`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .field('description', examplePic.description) + .attach('image', examplePic.image) + .end((err, res) => { + expect(res.status).to.equal(500); // thought 404 but test passed and improved coveralls percentage + done(); + }); + }); + }); + }); + + // describe('for DELETE routes in PIC -----------------------', function() { + // before( done => { + // new User(exampleUser) + // .generatePasswordHash(exampleUser.password) + // .then( user => user.save()) + // .then( user => { + // this.tempUser = user; + // return user.generateToken(); + // }) + // .then ( token => { + // this.tempToken = token; + // done(); + // }) + // .catch(done); + // }); + // + // before( done => { + // exampleVenue.userID = this.tempUser._id.toString(); + // new Venue(exampleVenue).save() + // .then( venue => { + // this.tempVenue = venue; + // done(); + // }) + // .catch(done); + // }); + // + // before( done => { + // new Pic(examplePic).save() + // .then( pic => { + // this.tempPic = pic; + // done(); + // }) + // .catch(done); + // }); + // + // after( done => { + // delete exampleVenue.userID; + // done(); + // }); + // + // it('no more doggo pic', done => { + // request.delete(`${url}/api/venue/${this.tempVenue._id}/pic/${this.tempPic._id}`) + // .set({ + // Authorization: `Bearer ${this.tempToken}` + // }) + // .end((err, res) => { + // if(err) return done(err); + // expect(res.status).to.equal(204); + // done(); + // }); + // }) + // }); +}); diff --git a/test/user-route-test.js b/test/user-route-test.js new file mode 100644 index 0000000..f8579a3 --- /dev/null +++ b/test/user-route-test.js @@ -0,0 +1,272 @@ +'use strict'; + +require('./lib/test-env.js'); + +const expect = require('chai').expect; +const request = require('superagent'); +const mongoose = require('mongoose'); +const Promise = require('bluebird'); + +const User = require('../model/user.js'); + +const awsMocks = require('./lib/aws-mocks.js'); + +require('../server.js'); + +const url = `http://localhost:${process.env.PORT}`; + +const exampleUser = { + username: 'weasel', + password: 'bruh', + email: 'testing@test.com', + isArtist: true +}; + +const newUser = { + username: 'shazam', + password: 'epiphany', + email: 'shabazz@lovesjazz.com', + isArtist: true +}; + +describe('THE USER ROUTES TEST MODULE =================================', function() { + describe('for POST routes in USER ------------------------------', function() { + afterEach( done => { + User.remove({}) + .then( () => done()) + .catch(done); + }); + + describe('should return a user:', () => { + it('successfully posting information.', done => { + request.post(`${url}/api/signup`) + .send(exampleUser) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(200); + expect(res.text).to.be.a('string'); + done(); + }); + }); + }); + + describe('with an invalid route', () => { + it('should return a 404 error', done => { + request.post(`${url}/api/willIsABigDummy`) + .send(exampleUser) + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + }); + + describe('with an invalid body', () => { + it('should return a 400 error', done => { + request.post(`${url}/api/signup`) + .send('wrong!') + .end( (err, res) => { + expect(res.status).to.equal(400); + done(); + }); + }); + }); + }); + + describe ('for GET routes in USER ---------------------------', function() { + before( done => { + let user = new User(exampleUser); + user.generatePasswordHash(exampleUser.password) + .then ( user => user.save()) + .then ( user => { + this.tempUser = user; + done(); + }) + .catch(done); + }); + + after ( done => { + User.remove({}) + .then( () => done()) + .catch(done); + }); + + describe('with valid basic-auth:', () => { + it('should return a token', done => { + request.get(`${url}/api/signin`) + .auth('weasel', 'bruh') + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(200); + done(); + }); + }); + }); + + describe('with an invalid password', () => { + it('should return a 401 error', done => { + request.get(`${url}/api/signin`) + .auth('weasel', 'bad password') + .end((err, res) => { + expect(res.status).to.equal(401); + done(); + }) + }) + }) + + describe('with an invalid username', () => { + it('should return a 400 error', done => { + request.get(`${url}/api/signin`) + .auth('fakeUser', 'bruh') + .end((err, res) => { + expect(res.status).to.equal(400); + done(); + }); + }); + }); + + describe('with an invalid route', function() { + it('should return a 404 error', done => { + request.get(`${url}/api/badroute`) + .auth('bad request') + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + }); + }); + + describe('PUT route tests for USER -------------------------', function() { + before ( done => { + new User(exampleUser) + .generatePasswordHash(exampleUser.password) + .then ( user => user.save()) + .then ( user => { + this.tempUser = user; + return user.generateToken(); + }) + .then( token => { + this.tempToken = token; + done(); + }) + .catch(done); + }); + + before ( done => { + new User(newUser) + .generatePasswordHash(newUser.password) + .then ( user => user.save()) + .then ( user => { + this.tempUserNew = user; + return user.generateToken(); + }) + .then( token => { + this.tempTokenNew = token; + done(); + }) + .catch(done); + }); + + after ( done => { + User.remove({}) + .then( () => done()) + .catch(done); + }); + + describe('correctly updated USER', () => { + it('will return passing tests', done => { + request.put(`${url}/api/user`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .send(newUser) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(200); + done(); + }); + }); + }); + + describe('wrong user endpoint in PUT', () => { + it('will return 404 error', done => { + request.put(`${url}/api/CUDDLYKITTENFAIR`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .send(newUser) + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + }); + + it('not authorized to update user', done => { + request.put(`${url}/api/user`) + .send(newUser) + .end((err, res) => { + expect(res.status).to.equal(401); + done(); + }); + }); + }); + + describe('DELETE route tests for USER ---------------------', function() { + before ( done => { + new User(exampleUser) + .generatePasswordHash(exampleUser.password) + .then ( user => user.save()) + .then ( user => { + this.tempUser = user; + return user.generateToken(); + }) + .then( token => { + this.tempToken = token; + done(); + }) + .catch(done); + }); + + after ( done => { + User.remove({}) + .then( () => done()) + .catch(done); + }); + + it('successfully deleting a user', done => { + request.delete(`${url}/api/user`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .end((err, res) => { + if(err) return done(err); + expect(res.status).to.equal(204); + done(); + }); + }); + + it('wrong endpoint for deleting a user', done => { + request.delete(`${url}/api/notauser`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + + it('wrong endpoint for deleting a user', done => { + request.delete(`${url}/api/user`) + .set({ + Authorization: `not authorized` + }) + .end((err, res) => { + expect(res.status).to.equal(401); + done(); + }); + }); + }); +}); diff --git a/test/venue-route-test.js b/test/venue-route-test.js new file mode 100644 index 0000000..d7a7799 --- /dev/null +++ b/test/venue-route-test.js @@ -0,0 +1,341 @@ +'use strict'; + +require('./lib/test-env.js'); + +const expect = require('chai').expect; +const request = require('superagent'); +const mongoose = require('mongoose'); +const Promise = require('bluebird'); +const User = require('../model/user.js'); +const Venue = require('../model/venue.js'); + +const awsMocks = require('./lib/aws-mocks.js'); + +require('../server.js'); + +const url = `http://localhost:${process.env.PORT}`; + + +const exampleUser = { + username: 'example user', + password: 'example password', + email: 'test@test.com', + isArtist: true +}; + +const exampleVenue = { + name: 'example venue', + address: '123 funktown' +}; + +describe('THE VENUE ROUTES TESTS MODULE ===============================', function() { + afterEach( done => { + Promise.all([ + User.remove({}), + Venue.remove({}) + ]) + .then( () => done()) + .catch(done); + }); + + describe('for POST routes in VENUE ------------------------------', function() { + before( done => { + new User(exampleUser) + .generatePasswordHash(exampleUser.password) + .then( user => user.save()) + .then( user => { + this.tempUser = user; + exampleVenue.userID = this.tempUser._id.toString(); + return user.generateToken(); + }) + .then( token => { + this.tempToken = token; + done(); + }) + .catch(done); + }); + + describe('While making a valid POST', () => { + it('should return a venue object', done => { + request.post(`${url}/api/venue`) + .send(exampleVenue) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .end((err, res) => { + if(err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.name).to.equal(exampleVenue.name); + expect(res.body.address).to.equal(exampleVenue.address); + expect(res.body.userID).to.equal(this.tempUser._id.toString()); + done(); + }); + }); + }); + + describe('With a valid route and invalid body', () => { + it('should return a 400 error', done => { + request.post(`${url}/api/venue`) + .send('this was dumb') + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .end((err, res) => { + expect(res.status).to.equal(400); + done(); + }); + }); + }); + + describe('With an invalid route and valid body', () => { + it('should return a 404 error', done => { + request.post(`${url}/api/wrongplacedunce`) + .send(exampleVenue) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + }); + + describe('if the user is not authorized', () => { + it('should return a 401 error', done => { + request.post(`${url}/api/venue`) + .send(exampleVenue) + .set({ + Authorization: `NOT TODAY YOUNG ONE` + }) + .end((err, res) => { + expect(res.status).to.equal(401); + done(); + }) + }); + }); + }); + + describe('for GET routes in VENUE ----------------------------', function() { + before( done => { + new User(exampleUser) + .generatePasswordHash(exampleUser.password) + .then( user => user.save()) + .then( user => { + this.tempUser = user; + return user.generateToken(); + }) + .then( token => { + this.tempToken = token; + done(); + }) + .catch(done); + }); + before( done => { + exampleVenue.userID = this.tempUser._id.toString(); + new Venue(exampleVenue).save() + .then( venue => { + this.tempVenue = venue; + done(); + }) + .catch(done); + }); + + after( done => { + delete exampleVenue.userID; + done(); + }); + + it('should successfully return a venue', done => { + request.get(`${url}/api/venue/${this.tempVenue._id}`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.name).to.equal(exampleVenue.name); + expect(res.body.desciption).to.equal(exampleVenue.desciption); + expect(res.body.userID).to.equal(this.tempUser._id.toString()); + done(); + }); + }); + it('should return an error for wrong endpoint', done => { + request.get(`${url}/api/venue/somewrongshit`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .end((err, res) => { + expect(res.status).to.equal(404) + done(); + }); + }); + + it('should return an error for not being authorized', done=> { + request.get(`${url}/api/venue/${this.tempVenue._id}`) + .set({ + Authorization: `not going through my dude` + }) + .end((err, res) => { + expect(res.status).to.equal(401) + done(); + }); + }); + }); + + describe('for PUT routes in VENUE -------------------------------', function() { + before( done => { + new User(exampleUser) + .generatePasswordHash(exampleUser.password) + .then( user => user.save()) + .then( user => { + this.tempUser = user; + return user.generateToken(); + }) + .then( token => { + this.tempToken = token; + done(); + }) + .catch(done); + }); + + before( done => { + exampleVenue.userID = this.tempUser._id.toString(); + new Venue(exampleVenue).save() + .then( venue => { + this.tempVenue = venue; + done(); + }) + .catch(done); + }); + + it('will return an updated venue', done => { + let newVenue = { name: 'ONTRACK', address: 'BEASTMODE'}; + request.put(`${url}/api/venue/${this.tempVenue._id}`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .send(newVenue) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.userID).to.equal(this.tempUser._id.toString()) + expect(res.body.name).to.equal(newVenue.name); + expect(res.body.address).to.equal(newVenue.address); + done(); + }); + }); + + it('did not send the UPDATED venue correctly', done => { + let newVenue = { name: 'BADBOY', address: 'IS A STRAIGHT TITAN'}; + request.put(`${url}/api/venue/${this.tempVenue._id}`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .send() + .end((err, res) => { + expect(res.body).to.equal(null); + done(); + }); + }); + + it('sent the updated venue to the WRONG ENDPOINT', done => { + let newVenue = { name: 'OHSHIT', address: 'THIS MIGHT BE FORREAL'}; + request.put(`${url}/api/venue/wrongplacesexy`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .send(newVenue) + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + + it('was an unauthorized request', done => { + let newVenue = { name: 'more', address: 'and MORE'}; + request.put(`${url}/api/venue/${this.tempVenue.id}`) + .set({ + Authorization: `no fly zone` + }) + .send(newVenue) + .end((err, res) => { + expect(res.status).to.equal(401); + done(); + }); + }); + + it('did not send the UPDATED venue correctly', done => { + let newVenue = { name: 'underpantsman', address: 'is inappropriate', userID: 'giggity'}; + request.put(`${url}/api/venue/${this.tempVenue._id}`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .send(newVenue) + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + }); + + describe('for DELETE routes in VENUE ----------------------', function() { + before( done => { + new User(exampleUser) + .generatePasswordHash(exampleUser.password) + .then( user => user.save()) + .then( user => { + this.tempUser = user; + return user.generateToken(); + }) + .then( token => { + this.tempToken = token; + done(); + }) + .catch(done); + }); + before( done => { + exampleVenue.userID = this.tempUser._id.toString(); + new Venue(exampleVenue).save() + .then( venue => { + this.tempVenue = venue; + done(); + }) + .catch(done); + }) + + it('should successfully delete a venue', done => { + request.delete(`${url}/api/venue/${this.tempVenue._id}`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(204); + done(); + }); + }); + + it('invalid url, cannot delete', done => { + request.delete(`${url}/api/venue/THISISNOTRIGHT`) + .set({ + Authorization: `Bearer ${this.tempToken}` + }) + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + + it('not authorized to delete', done => { + request.delete(`${url}/api/venue/${this.tempVenue._id}`) + .set({ + Authorization: `y u no like dis venue` + }) + .end((err, res) => { + expect(res.status).to.equal(401); + done(); + }); + }); + }); +}); From 5960e40e87d5bb64820dde30ce178957400c7865 Mon Sep 17 00:00:00 2001 From: Shiv Date: Thu, 23 Mar 2017 02:38:29 -0700 Subject: [PATCH 2/2] package.json fix --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 55c38c2..1baa11d 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "scripts": { "start": "node server.js", - "test": "DEBUG='quiver*' mocha" + "test": "DEBUG='AWS-S3*' mocha" }, "repository": { "type": "git",