From b331a3403b76882caee6b1e448d15720e68e72ea Mon Sep 17 00:00:00 2001 From: Dustin McBride Date: Tue, 24 May 2016 10:50:42 -0700 Subject: [PATCH 1/6] init commit --- dustin/.eslintrc.js | 29 ++++++++++ dustin/.gitignore | 2 + dustin/data/1.json | 6 ++ dustin/data/2.json | 6 ++ dustin/data/3.json | 6 ++ dustin/gulpfile.js | 22 +++++++ dustin/package.json | 29 ++++++++++ dustin/routes/companies.js | 63 ++++++++++++++++++++ dustin/routes/index.js | 10 ++++ dustin/server.js | 20 +++++++ dustin/test/test.js | 114 +++++++++++++++++++++++++++++++++++++ 11 files changed, 307 insertions(+) create mode 100644 dustin/.eslintrc.js create mode 100644 dustin/.gitignore create mode 100644 dustin/data/1.json create mode 100644 dustin/data/2.json create mode 100644 dustin/data/3.json create mode 100644 dustin/gulpfile.js create mode 100644 dustin/package.json create mode 100644 dustin/routes/companies.js create mode 100644 dustin/routes/index.js create mode 100644 dustin/server.js create mode 100644 dustin/test/test.js diff --git a/dustin/.eslintrc.js b/dustin/.eslintrc.js new file mode 100644 index 0000000..ed2ec67 --- /dev/null +++ b/dustin/.eslintrc.js @@ -0,0 +1,29 @@ +module.exports = { + "env": { + "es6": true, + "node": true, + "mocha": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "indent": [ + "error", + 2 + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ] + } +}; diff --git a/dustin/.gitignore b/dustin/.gitignore new file mode 100644 index 0000000..b418f0d --- /dev/null +++ b/dustin/.gitignore @@ -0,0 +1,2 @@ +/node_modules +/data*.json diff --git a/dustin/data/1.json b/dustin/data/1.json new file mode 100644 index 0000000..395e9d9 --- /dev/null +++ b/dustin/data/1.json @@ -0,0 +1,6 @@ +{ + "name": "Scrub Daddy", + "website": "www.scrubdaddy", + "rasied": "500000", + "id": 1 +} \ No newline at end of file diff --git a/dustin/data/2.json b/dustin/data/2.json new file mode 100644 index 0000000..6c02ef4 --- /dev/null +++ b/dustin/data/2.json @@ -0,0 +1,6 @@ +{ + "name": "Scrub Daddy", + "website": "www.scrubdaddy", + "rasied": "500000", + "id": 2 +} \ No newline at end of file diff --git a/dustin/data/3.json b/dustin/data/3.json new file mode 100644 index 0000000..2301e9b --- /dev/null +++ b/dustin/data/3.json @@ -0,0 +1,6 @@ +{ + "name": "Scrub Daddy", + "website": "www.scrubdaddy", + "rasied": "500000", + "id": 3 +} \ No newline at end of file diff --git a/dustin/gulpfile.js b/dustin/gulpfile.js new file mode 100644 index 0000000..fc90c44 --- /dev/null +++ b/dustin/gulpfile.js @@ -0,0 +1,22 @@ +const gulp = require('gulp'); +const mocha = require('gulp-mocha'); +const lint = require('gulp-eslint'); + +gulp.task('linter' , () => { + return gulp.src(['./*.js', './test/*.js', './lib/*.js']) + .pipe(lint()) + .pipe(lint.format()); +}); + +gulp.task('tests', () => { + return gulp.src(['./*.js', './test/*.js', './lib/*.js'], {read: false}) + .pipe(mocha({reporter: 'nyan'})); +}); + +gulp.task('watch', () => { + gulp.watch(['./*.js', './test/*.js', './lib/*.js'], ['linter', 'tests']); +}); + +gulp.task('default', ['linter', 'tests', 'watch'], () => { + +}); diff --git a/dustin/package.json b/dustin/package.json new file mode 100644 index 0000000..73e3105 --- /dev/null +++ b/dustin/package.json @@ -0,0 +1,29 @@ +{ + "name": "Shark Tank API", + "version": "0.0.1", + "description": "", + "main": "server.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "chai": "^3.5.0", + "chai-http": "^2.0.1", + "gulp": "^3.9.1", + "gulp-eslint": "^2.0.0", + "gulp-mocha": "^2.2.0", + "mocha": "^2.4.5" + }, + "dependencies": { + "body-parser": "^1.15.1", + "express": "^4.13.4", + "json-fs-store": "^1.0.0" + } +} diff --git a/dustin/routes/companies.js b/dustin/routes/companies.js new file mode 100644 index 0000000..b877fa9 --- /dev/null +++ b/dustin/routes/companies.js @@ -0,0 +1,63 @@ +'use strict'; +var express = require('express'); +var router = express.Router(); +var db = require('json-fs-store')('./data'); +var fs = require('fs'); +var nextID = function () { + return fs.readdirSync('./data').length + 1; +}; + +router.post('/', (req, res, next) => { + let company = req.body; + company.id = nextID(); + db.add(company, function (err) { + if (err) throw err; + }); + res.send({ + Message: "POST received" + }); +}); + +router.put('/id', (req, res, next) => { + db.load(req.params.id, function (err, object) { + if (err) { + res.status(404).json({ + Error: 'Not Found' + }); + } + object.test = 100; + }); +}); + +router.get('/', (req, res, next) => { + db.list(function (err, objects) { + if (err) throw err; + res.json(objects); + }); +}); + +router.get('/:id', (req, res, next) => { + db.load(req.params.id, function (err, object) { + if (err) { + res.status(404).json({ + Error: 'Not Found' + }); + } + res.json(object); + }); +}); + +router.delete('/:id', (req, res, next) => { + db.remove(req.params.id, function (err) { + res.send({ + 'Message': 'Entry DELETED' + }); + if (err) { + res.status(404).json({ + Error: 'Not Found' + }); + } + }); +}); + +module.exports = router; diff --git a/dustin/routes/index.js b/dustin/routes/index.js new file mode 100644 index 0000000..b0a2ca3 --- /dev/null +++ b/dustin/routes/index.js @@ -0,0 +1,10 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + //res.render('index', { title: 'Express' }); + res.send("shark tank api") +}); + +module.exports = router; diff --git a/dustin/server.js b/dustin/server.js new file mode 100644 index 0000000..fcd40fb --- /dev/null +++ b/dustin/server.js @@ -0,0 +1,20 @@ +'use strict'; +const express = require('express'); +const bodyParser = require('body-parser'); +const jsonPaser = bodyParser.json(); +//const companyRouter = express.Router(); +var routes = require('./routes/index'); +var companies = require('./routes/companies'); +var app = express(); + +app.use(jsonPaser); + +app.use('/', routes); +app.use('/companies', companies); + + +app.get('/*', (req,res) => { + res.status(404).json({Error:'Not Found'}) +}) + +app.listen(3000, () => console.log('up on 3000')); diff --git a/dustin/test/test.js b/dustin/test/test.js new file mode 100644 index 0000000..d0fe3f7 --- /dev/null +++ b/dustin/test/test.js @@ -0,0 +1,114 @@ +'use strict'; + +const chai = require('chai'); +const expect = require('chai').expect; +const chaiHTTP = require('chai-http'); +var fs = require('fs'); +chai.use(chaiHTTP); +const request = chai.request; +require('../server'); + +var dbEntries = fs.readdirSync('./data').length +var payload = { + company: 'Tanktest', + seek_dollar: '200000', + seek_equity: '.2', + id: (dbEntries + 1) +}; + + describe('Shark tank API should', function () { + it('accept a POST request to /companies', function (done) { + request('localhost:3000') + .post('/companies') + .send(payload) + .end(function (err, res) { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.text).to.eql('{"Message":"POST received"}'); + done(); + }); + }); + + + it('list all companies in the "database"', function (done) { + request('localhost:3000') + .get('/companies') + .end(function (err, res) { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.length).to.eql(dbEntries + 1) + done(); + }); + }); + + + + it('list a company by id', function (done) { + request('localhost:3000') + .get('/companies/' + (dbEntries + 1)) + .end(function (err, res) { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body).to.eql(payload) + done(); + }); + }); + + // it('respond to a PUT request on default route /', function (done) { + // request('localhost:3000') + // .put('/') + // .end(function (err, res) { + // expect(err).to.eql(null); + // expect(res).to.have.status(200); + // expect(res.text).to.eql('{"Message":"PUT request to homepage received"}'); + // done(); + // }); + // }); + + + it('properly DELETE', function (done) { + request('localhost:3000') + .delete('/companies/' + (dbEntries + 1)) + .end(function (err, res) { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.text).to.eql('{"Message":"Entry DELETED"}'); + done(); + }); + }); + + // + + // + // it('respond to a PATCH request on default route /', function (done) { + // request('localhost:3000') + // .patch('/') + // .end(function (err, res) { + // expect(err).to.eql(null); + // expect(res).to.have.status(200); + // expect(res.text).to.eql('{"Message":"PATCH request to homepage received"}'); + // done(); + // }); + // }); + // + it('respond with 404 to an invalid route', function (done) { + request('localhost:3000') + .get('/companies/' + (dbEntries + 1)) + .end(function (err, res) { + expect(res).to.have.status(404); + expect(res.text).to.eql('{"Error":"Not Found"}'); + done(); + }); + }); + // + // it('respond with 400 if an invalid request is made', function (done) { + // request('localhost:3000') + // .copy('/') + // .end(function (err, res) { + // expect(res).to.have.status(400); + // expect(res.text).to.eql('{"Error":"Bad Request"}'); + // done(); + // }); + // }); + +}); From 499eb2b1eba601446b2c29de0375e2159ae24f65 Mon Sep 17 00:00:00 2001 From: Dustin McBride Date: Tue, 24 May 2016 10:52:59 -0700 Subject: [PATCH 2/6] removed data files --- dustin/.gitignore | 2 +- dustin/data/1.json | 6 ------ dustin/data/2.json | 6 ------ dustin/data/3.json | 6 ------ 4 files changed, 1 insertion(+), 19 deletions(-) delete mode 100644 dustin/data/1.json delete mode 100644 dustin/data/2.json delete mode 100644 dustin/data/3.json diff --git a/dustin/.gitignore b/dustin/.gitignore index b418f0d..a99e447 100644 --- a/dustin/.gitignore +++ b/dustin/.gitignore @@ -1,2 +1,2 @@ /node_modules -/data*.json +/data/*.json diff --git a/dustin/data/1.json b/dustin/data/1.json deleted file mode 100644 index 395e9d9..0000000 --- a/dustin/data/1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "Scrub Daddy", - "website": "www.scrubdaddy", - "rasied": "500000", - "id": 1 -} \ No newline at end of file diff --git a/dustin/data/2.json b/dustin/data/2.json deleted file mode 100644 index 6c02ef4..0000000 --- a/dustin/data/2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "Scrub Daddy", - "website": "www.scrubdaddy", - "rasied": "500000", - "id": 2 -} \ No newline at end of file diff --git a/dustin/data/3.json b/dustin/data/3.json deleted file mode 100644 index 2301e9b..0000000 --- a/dustin/data/3.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "Scrub Daddy", - "website": "www.scrubdaddy", - "rasied": "500000", - "id": 3 -} \ No newline at end of file From 89a256bba354992de2779111b4871dc6b040a9b7 Mon Sep 17 00:00:00 2001 From: Dustin McBride Date: Tue, 24 May 2016 10:55:47 -0700 Subject: [PATCH 3/6] fixed linter errors --- dustin/server.js | 4 ++-- dustin/test/test.js | 30 +++++++++++++----------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/dustin/server.js b/dustin/server.js index fcd40fb..e62894d 100644 --- a/dustin/server.js +++ b/dustin/server.js @@ -14,7 +14,7 @@ app.use('/companies', companies); app.get('/*', (req,res) => { - res.status(404).json({Error:'Not Found'}) -}) + res.status(404).json({Error:'Not Found'}); +}); app.listen(3000, () => console.log('up on 3000')); diff --git a/dustin/test/test.js b/dustin/test/test.js index d0fe3f7..7baea4c 100644 --- a/dustin/test/test.js +++ b/dustin/test/test.js @@ -8,7 +8,7 @@ chai.use(chaiHTTP); const request = chai.request; require('../server'); -var dbEntries = fs.readdirSync('./data').length +var dbEntries = fs.readdirSync('./data').length; var payload = { company: 'Tanktest', seek_dollar: '200000', @@ -16,7 +16,7 @@ var payload = { id: (dbEntries + 1) }; - describe('Shark tank API should', function () { +describe('Shark tank API should', function () { it('accept a POST request to /companies', function (done) { request('localhost:3000') .post('/companies') @@ -29,19 +29,16 @@ var payload = { }); }); - - it('list all companies in the "database"', function (done) { - request('localhost:3000') - .get('/companies') - .end(function (err, res) { - expect(err).to.eql(null); - expect(res).to.have.status(200); - expect(res.body.length).to.eql(dbEntries + 1) - done(); - }); - }); - - + it('list all companies in the "database"', function (done) { + request('localhost:3000') + .get('/companies') + .end(function (err, res) { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.length).to.eql(dbEntries + 1); + done(); + }); + }); it('list a company by id', function (done) { request('localhost:3000') @@ -49,7 +46,7 @@ var payload = { .end(function (err, res) { expect(err).to.eql(null); expect(res).to.have.status(200); - expect(res.body).to.eql(payload) + expect(res.body).to.eql(payload); done(); }); }); @@ -65,7 +62,6 @@ var payload = { // }); // }); - it('properly DELETE', function (done) { request('localhost:3000') .delete('/companies/' + (dbEntries + 1)) From aaa2c6a4730212860d941af2216c0e8c5f6cc34a Mon Sep 17 00:00:00 2001 From: Dustin McBride Date: Wed, 25 May 2016 16:36:10 -0700 Subject: [PATCH 4/6] minor changes --- dustin/routes/index.js | 5 ++--- dustin/server.js | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dustin/routes/index.js b/dustin/routes/index.js index b0a2ca3..83916a5 100644 --- a/dustin/routes/index.js +++ b/dustin/routes/index.js @@ -1,10 +1,9 @@ var express = require('express'); var router = express.Router(); -/* GET home page. */ + router.get('/', function(req, res, next) { - //res.render('index', { title: 'Express' }); - res.send("shark tank api") + res.send("shark tank api"); }); module.exports = router; diff --git a/dustin/server.js b/dustin/server.js index e62894d..80ff4a0 100644 --- a/dustin/server.js +++ b/dustin/server.js @@ -13,6 +13,7 @@ app.use('/', routes); app.use('/companies', companies); + app.get('/*', (req,res) => { res.status(404).json({Error:'Not Found'}); }); From d1bfa42259ee48be326bd399b1a6a4545f8fda10 Mon Sep 17 00:00:00 2001 From: Dustin McBride Date: Fri, 27 May 2016 10:24:32 -0700 Subject: [PATCH 5/6] added second resource and migrated to mongo --- dustin/.gitignore | 2 +- dustin/lib/errorhandler.js | 5 + dustin/package.json | 8 +- dustin/routes/companies.js | 87 +++++----- dustin/routes/index.js | 4 +- dustin/routes/sharks.js | 50 ++++++ dustin/schema/companies.js | 23 +++ dustin/schema/db_seeds/company_seeds.js | 85 +++++++++ dustin/schema/db_seeds/shark_seeds.js | 60 +++++++ dustin/schema/sharks.js | 8 + dustin/server.js | 30 +++- dustin/test/company_test.js | 152 ++++++++++++++++ dustin/test/db_seeds/shark_seeds.js | 50 ++++++ dustin/test/shark_test.js | 82 +++++++++ dustin/test/test.js | 220 ++++++++++++------------ 15 files changed, 702 insertions(+), 164 deletions(-) create mode 100644 dustin/lib/errorhandler.js create mode 100644 dustin/routes/sharks.js create mode 100644 dustin/schema/companies.js create mode 100644 dustin/schema/db_seeds/company_seeds.js create mode 100644 dustin/schema/db_seeds/shark_seeds.js create mode 100644 dustin/schema/sharks.js create mode 100644 dustin/test/company_test.js create mode 100644 dustin/test/db_seeds/shark_seeds.js create mode 100644 dustin/test/shark_test.js diff --git a/dustin/.gitignore b/dustin/.gitignore index a99e447..4c497d6 100644 --- a/dustin/.gitignore +++ b/dustin/.gitignore @@ -1,2 +1,2 @@ /node_modules -/data/*.json +/db diff --git a/dustin/lib/errorhandler.js b/dustin/lib/errorhandler.js new file mode 100644 index 0000000..5e09b43 --- /dev/null +++ b/dustin/lib/errorhandler.js @@ -0,0 +1,5 @@ +module.exports = function (err, req, res, next) { + res.status(500).json({ + message: err.message + }); +}; diff --git a/dustin/package.json b/dustin/package.json index 73e3105..6990956 100644 --- a/dustin/package.json +++ b/dustin/package.json @@ -1,5 +1,5 @@ { - "name": "Shark Tank API", + "name": "SharkTankAPI", "version": "0.0.1", "description": "", "main": "server.js", @@ -19,11 +19,13 @@ "gulp": "^3.9.1", "gulp-eslint": "^2.0.0", "gulp-mocha": "^2.2.0", - "mocha": "^2.4.5" + "mocha": "^2.4.5", + "morgan": "^1.7.0" }, "dependencies": { "body-parser": "^1.15.1", "express": "^4.13.4", - "json-fs-store": "^1.0.0" + "json-fs-store": "^1.0.0", + "mongoose": "^4.4.19" } } diff --git a/dustin/routes/companies.js b/dustin/routes/companies.js index b877fa9..0e18325 100644 --- a/dustin/routes/companies.js +++ b/dustin/routes/companies.js @@ -1,62 +1,69 @@ 'use strict'; var express = require('express'); var router = express.Router(); -var db = require('json-fs-store')('./data'); -var fs = require('fs'); -var nextID = function () { - return fs.readdirSync('./data').length + 1; -}; +const bodyParser = require('body-parser').json(); +const Company = require('../schema/companies'); -router.post('/', (req, res, next) => { - let company = req.body; - company.id = nextID(); - db.add(company, function (err) { - if (err) throw err; - }); - res.send({ - Message: "POST received" +//index companies +router.get('/', (req, res, next) => { + Company.find({}, (err, companies) => { + if (err) return next(err); + res.json(companies); }); }); -router.put('/id', (req, res, next) => { - db.load(req.params.id, function (err, object) { - if (err) { - res.status(404).json({ - Error: 'Not Found' - }); +router.get('/dealstats', (req, res, next) => { + + //get tvDealValuation amount + Company.find({ + tvDealValuation: { + $ne: true } - object.test = 100; + }, (err, companies) => { + if (err) return next(err); + let count = 0; + let total = (companies.reduce((a,b)=> { + if (b.tvDealValuation) ++count; + return a + b.tvDealValuation; + },0)); + res.send({averageTvDealValuation: total/count, totalTvDealValuation: total }); }); }); -router.get('/', (req, res, next) => { - db.list(function (err, objects) { - if (err) throw err; - res.json(objects); +//create companies +router.post('/', bodyParser, (req, res, next) => { + let newCompany = new Company(req.body); + newCompany.save((err, company) => { + if (err) return next(err); + res.json(company); }); }); -router.get('/:id', (req, res, next) => { - db.load(req.params.id, function (err, object) { - if (err) { - res.status(404).json({ - Error: 'Not Found' - }); - } - res.json(object); +//put company +router.put('/', bodyParser, (req, res, next) => { + let _id = req.body._id; + Company.findOneAndUpdate({ + _id + }, req.body, (err) => { + if (err) return next(err); + let message = 'successfully update'; + res.json({ + message + }); }); }); +//delete companies router.delete('/:id', (req, res, next) => { - db.remove(req.params.id, function (err) { - res.send({ - 'Message': 'Entry DELETED' + let _id = req.params.id; + Company.findOneAndRemove({ + _id + }, (err) => { + if (err) return next(err); + let message = 'sucessfully deleted'; + res.json({ + message }); - if (err) { - res.status(404).json({ - Error: 'Not Found' - }); - } }); }); diff --git a/dustin/routes/index.js b/dustin/routes/index.js index 83916a5..530f1fa 100644 --- a/dustin/routes/index.js +++ b/dustin/routes/index.js @@ -2,8 +2,8 @@ var express = require('express'); var router = express.Router(); -router.get('/', function(req, res, next) { - res.send("shark tank api"); +router.get('/', function(req, res) { + res.send('shark tank api'); }); module.exports = router; diff --git a/dustin/routes/sharks.js b/dustin/routes/sharks.js new file mode 100644 index 0000000..bb5a0a9 --- /dev/null +++ b/dustin/routes/sharks.js @@ -0,0 +1,50 @@ +'use strict'; +var express = require('express'); +var router = express.Router(); +const bodyParser = require('body-parser').json(); +const Shark = require('../schema/companies'); + +//index companies +router.get('/', (req, res, next) => { + Shark.find({}, (err, companies) => { + if (err) return next(err); + res.json(companies); + }); +}); + +//create companies +router.post('/', bodyParser, (req, res, next) => { + let newShark = new Shark(req.body); + newShark.save((err, shark) => { + if (err) return next(err); + res.json(shark); + }); +}); + +//put shark +router.put('/', bodyParser, (req, res, next) => { + let _id = req.body._id; + Shark.findOneAndUpdate({_id}, req.body, (err) => { + if (err) return next(err); + let message = 'successfully update'; + res.json({ + message + }); + }); +}); + +//delete companies +router.delete('/:id', (req, res, next) => { + let _id = req.params.id; + Shark.findOneAndRemove({ + _id + }, (err) => { + if (err) return next(err); + let message = 'sucessfully deleted'; + res.json({ + message + }); + }); +}); + +module.exports = router; diff --git a/dustin/schema/companies.js b/dustin/schema/companies.js new file mode 100644 index 0000000..1497e6b --- /dev/null +++ b/dustin/schema/companies.js @@ -0,0 +1,23 @@ +'use strict'; +const mongoose = require('mongoose'); + +const Company = new mongoose.Schema({ + name: String, + tvDealReached: Boolean, + seekAmount: Number, + seekEquity: Number, + seekValuation: Number, + tvDealAmount: Number, + tvDealEquity: Number, + tvDealValuation: Number, + actualDealReached: Boolean, + actualDealAmount: Number, + actualDealEquity: Number, + actualDealValuation: Number, + season: Number, + episode: Number + //sharks: Schema.Types.sharks; + //{type: Number, default: 0} +}); + +module.exports = mongoose.model('companies', Company); diff --git a/dustin/schema/db_seeds/company_seeds.js b/dustin/schema/db_seeds/company_seeds.js new file mode 100644 index 0000000..9023817 --- /dev/null +++ b/dustin/schema/db_seeds/company_seeds.js @@ -0,0 +1,85 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Company = require('../../schema/companies'); + +process.env.NODE_ENV = 'DEV'; +if (process.env.NODE_ENV === 'TEST') mongoose.connect('mongodb://localhost/test_db'); +if (process.env.NODE_ENV === 'DEV') mongoose.connect('mongodb://localhost/dev_db'); + +mongoose.connection.collections['companies'].drop(function () { + console.log('collection dropped'); +}); + +new Company({ + name: 'Scrub Daddy', + tvDealReached: true, + tvDealAmount: 300000, + tvDealEquity: .33, + tvDealValuation: 1000000, + actualDealReached: true, + season: 4, + episode: 7 +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Company ' + data.name + ' created'); +}); + +new Company({ + name: 'Squatty Potty', + tvDealReached: true, + tvDealAmount: 350000, + tvDealEquity: .1, + tvDealValuation: 3500000, + actualDealReached: true, + season: 6, + episode: 9 +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Company ' + data.name + ' created'); +}); + +new Company({ + name: 'Cousins Maine Lobster', + tvDealReached: true, + tvDealAmount: 55000, + tvDealEquity: .15, + tvDealValuation: 366667, + actualDealReached: true, + season: 4, + episode: 6 +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Company ' + data.name + ' created'); +}); + +new Company({ + name: 'Tower Paddle Boards', + tvDealReached: true, + tvDealAmount: 150000, + tvDealEquity: .3, + tvDealValuation: 500000, + actualDealReached: true, + season: 3, + episode: 9 +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Company ' + data.name + ' created'); +}); + +new Company({ + name: 'Bantam Bagels', + tvDealReached: true, + tvDealAmount: 275000, + tvDealEquity: .25, + tvDealValuation: 1100000, + actualDealReached: true, + season: 6, + episode: 13 +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Company ' + data.name + ' created'); + mongoose.connection.close(function (data) { + //if (cb) cb(); + }); +}) diff --git a/dustin/schema/db_seeds/shark_seeds.js b/dustin/schema/db_seeds/shark_seeds.js new file mode 100644 index 0000000..2cebe76 --- /dev/null +++ b/dustin/schema/db_seeds/shark_seeds.js @@ -0,0 +1,60 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Shark = require('../../schema/sharks'); + + + process.env.NODE_ENV='DEV' + if (process.env.NODE_ENV === 'TEST') mongoose.connect('mongodb://localhost/test_db'); + if (process.env.NODE_ENV === 'DEV') mongoose.connect('mongodb://localhost/dev_db'); + + mongoose.connection.collections['sharks'].drop(function () { + console.log('collection dropped'); + + new Shark({ + name: 'Kevin O\'Leary' + }).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); + }); + + new Shark({ + name: 'Barbara Corcoran' + }).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); + }); + + new Shark({ + name: 'Daymond John' + }).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); + }); + + new Shark({ + name: 'Robert Herjavec' + }).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); + }); + + new Shark({ + name: 'Lori Greiner' + }).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); + }); + + new Shark({ + name: 'Mark Cuban' + }).save((err, data) => { + if (err) console.log(err); + if (data) { + console.log('Shark ' + data.name + ' created'); + mongoose.connection.close(function (data) { + //if (cb) cb(); + }); + } + }); + }); diff --git a/dustin/schema/sharks.js b/dustin/schema/sharks.js new file mode 100644 index 0000000..a32b00a --- /dev/null +++ b/dustin/schema/sharks.js @@ -0,0 +1,8 @@ +'use strict'; +const mongoose = require('mongoose'); + +const Shark = new mongoose.Schema({ + name: String, +}); + +module.exports = mongoose.model('sharks', Shark); diff --git a/dustin/server.js b/dustin/server.js index 80ff4a0..a6f16b9 100644 --- a/dustin/server.js +++ b/dustin/server.js @@ -2,20 +2,34 @@ const express = require('express'); const bodyParser = require('body-parser'); const jsonPaser = bodyParser.json(); -//const companyRouter = express.Router(); -var routes = require('./routes/index'); -var companies = require('./routes/companies'); -var app = express(); +const routes = require('./routes/index'); +const companies = require('./routes/companies'); +const sharks = require('./routes/sharks'); +const app = express(); +const mongoose = require('mongoose'); +const morgan = require('morgan'); +const errorHandler = require('./lib/errorhandler'); + +const dbPort = process.env.MONGOLAB_URI || 'mongodb://localhost/dev_db'; + +mongoose.connect(dbPort); + +if (!(process.env.NODE_ENV === 'TEST')) app.use(morgan('dev')); app.use(jsonPaser); app.use('/', routes); app.use('/companies', companies); +app.use('/sharks', sharks); +app.get('/*', (req, res) => { + res.status(404).json({ + Error: 'Not Found' + }); +}); +app.use(errorHandler); -app.get('/*', (req,res) => { - res.status(404).json({Error:'Not Found'}); +app.listen(3000, () => { + if (!(process.env.NODE_ENV === 'TEST')) console.log('up on 3000'); }); - -app.listen(3000, () => console.log('up on 3000')); diff --git a/dustin/test/company_test.js b/dustin/test/company_test.js new file mode 100644 index 0000000..3edbe93 --- /dev/null +++ b/dustin/test/company_test.js @@ -0,0 +1,152 @@ +'use strict'; + +const chai = require('chai'); +const chaiHTTP = require('chai-http'); +const Company = require('../schema/companies'); +const mongoose = require('mongoose'); +chai.use(chaiHTTP); +const expect = chai.expect; +const request = chai.request; + +const dbPort = process.env.MONGOLAB_URI; +process.env.NODE_ENV = 'TEST'; +process.env.MONGOLAB_URI = 'mongodb://localhost/test_db'; + +require('../server'); + +describe('The /company route', () => { + let testCompany; + beforeEach((done) => { + new Company({ + name: 'Scrub Daddy', + tvDealReached: true, + tvDealAmount: 300000, + tvDealEquity: .33, + tvDealValuation: 1000000, + actualDealReached: true, + season: 4, + episode: 7 + }).save((err, data) => { + if (data) testCompany = data; + if (err) throw err; + }); + + new Company({ + name: 'Squatty Potty', + tvDealReached: true, + tvDealAmount: 350000, + tvDealEquity: .1, + tvDealValuation: 3500000, + actualDealReached: true, + season: 6, + episode: 9 + }).save((err) => { + if (err) throw err; + }); + + new Company({ + name: 'Cousins Maine Lobster', + tvDealReached: true, + tvDealAmount: 55000, + tvDealEquity: .15, + tvDealValuation: 366667, + actualDealReached: true, + season: 4, + episode: 6 + }).save((err) => { + if (err) throw err; + }); + + new Company({ + name: 'Tower Paddle Boards', + tvDealReached: true, + tvDealAmount: 150000, + tvDealEquity: .3, + tvDealValuation: 500000, + actualDealReached: true, + season: 3, + episode: 9 + }).save((err) => { + if (err) throw err; + }); + + new Company({ + name: 'Bantam Bagels', + tvDealReached: true, + tvDealAmount: 275000, + tvDealEquity: .25, + tvDealValuation: 1100000, + actualDealReached: true, + season: 6, + episode: 13 + }).save((err,data) => { + if (err) throw err; + if (data) done(); + }); + }); + afterEach((done) => { + process.env.MONGOLAB_URI = dbPort; + mongoose.connection.db.dropDatabase(() => { + done(); + }); + }); + + it('GET should return a list of companies', () => { + request('localhost:3000') + .get('/companies/') + .end((err, res) => { + expect(err).to.eql(null); + expect(Array.isArray(res.body)).to.eql(true); + }); + }); + + it('POST should accept a post and create a new company', (done) => { + request('localhost:3000') + .post('/companies/') + .send({ + name: 'posty' + }) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.name).to.have.eql('posty'); + expect(res.body).to.have.property('_id'); + done(); + }); + }); + + it('PUT should update a company', (done) => { + testCompany.name = 'updated'; + request('localhost:3000') + .put('/companies/') + .send(testCompany) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully update'); + done(); + }); + }); + + it('DELETE should remove a company', (done) => { + request('localhost:3000') + .delete('/companies/' + testCompany._id) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('sucessfully deleted'); + done(); + }); + }); + + it('/dealstats return deal stats', (done) => { + request('localhost:3000') + .get('/companies/dealstats') + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body).to.eql({averageTvDealValuation:1293333.4, totalTvDealValuation:6466667}); + done(); + }); + }); +}); diff --git a/dustin/test/db_seeds/shark_seeds.js b/dustin/test/db_seeds/shark_seeds.js new file mode 100644 index 0000000..1572bbe --- /dev/null +++ b/dustin/test/db_seeds/shark_seeds.js @@ -0,0 +1,50 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Shark = require('../../schema/sharks'); + +process.env.NODE_ENV = 'DEV'; +if (process.env.NODE_ENV === 'TEST') mongoose.connect('mongodb://localhost/test_db'); +if (process.env.NODE_ENV === 'DEV') mongoose.connect('mongodb://localhost/dev_db'); +console.log("ger"); +new Shark({ + name: 'Kevin O\'Leary' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); + +new Shark({ + name: 'Barbara Corcoran' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); + +new Shark({ + name: 'Daymond John' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); + +new Shark({ + name: 'Robert Herjavec' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); + +new Shark({ + name: 'Lori Greiner' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); + +new Shark({ + name: 'Mark Cuban' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); diff --git a/dustin/test/shark_test.js b/dustin/test/shark_test.js new file mode 100644 index 0000000..0d1a3b9 --- /dev/null +++ b/dustin/test/shark_test.js @@ -0,0 +1,82 @@ +'use strict'; + +const chai = require('chai'); +const chaiHTTP = require('chai-http'); +const Shark = require('../schema/companies'); +const mongoose = require('mongoose'); +chai.use(chaiHTTP); +const expect = chai.expect; +const request = chai.request; + +const dbPort = process.env.MONGOLAB_URI; +process.env.NODE_ENV = 'TEST'; +process.env.MONGOLAB_URI = 'mongodb://localhost/test_db'; + +require('../server'); + +describe('The /shark route', () => { + let testShark; + beforeEach((done) => { + let newShark = new Shark({ + name: 'test' + }); + newShark.save((err, shark) => { + testShark = shark; + done(); + }); + }); + after((done) => { + process.env.MONGOLAB_URI = dbPort; + mongoose.connection.db.dropDatabase(() => { + done(); + }); + }); + + it('GET should return a list of companies', () => { + request('localhost:3000') + .get('/companies/') + .end((err, res) => { + expect(err).to.eql(null); + expect(Array.isArray(res.body)).to.eql(true); + }); + }); + + it('POST should accept a post and create a new shark', (done) => { + request('localhost:3000') + .post('/companies/') + .send({ + name: 'posty' + }) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.name).to.have.eql('posty'); + expect(res.body).to.have.property('_id'); + done(); + }); + }); + + it('PUT should update a shark', (done) => { + testShark.name = 'updated'; + request('localhost:3000') + .put('/companies/') + .send(testShark) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully update'); + done(); + }); + }); + + it('DELETE should remove a shark', (done) => { + request('localhost:3000') + .delete('/companies/' + testShark._id) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('sucessfully deleted'); + done(); + }); + }); +}); diff --git a/dustin/test/test.js b/dustin/test/test.js index 7baea4c..7c812aa 100644 --- a/dustin/test/test.js +++ b/dustin/test/test.js @@ -1,110 +1,110 @@ -'use strict'; - -const chai = require('chai'); -const expect = require('chai').expect; -const chaiHTTP = require('chai-http'); -var fs = require('fs'); -chai.use(chaiHTTP); -const request = chai.request; -require('../server'); - -var dbEntries = fs.readdirSync('./data').length; -var payload = { - company: 'Tanktest', - seek_dollar: '200000', - seek_equity: '.2', - id: (dbEntries + 1) -}; - -describe('Shark tank API should', function () { - it('accept a POST request to /companies', function (done) { - request('localhost:3000') - .post('/companies') - .send(payload) - .end(function (err, res) { - expect(err).to.eql(null); - expect(res).to.have.status(200); - expect(res.text).to.eql('{"Message":"POST received"}'); - done(); - }); - }); - - it('list all companies in the "database"', function (done) { - request('localhost:3000') - .get('/companies') - .end(function (err, res) { - expect(err).to.eql(null); - expect(res).to.have.status(200); - expect(res.body.length).to.eql(dbEntries + 1); - done(); - }); - }); - - it('list a company by id', function (done) { - request('localhost:3000') - .get('/companies/' + (dbEntries + 1)) - .end(function (err, res) { - expect(err).to.eql(null); - expect(res).to.have.status(200); - expect(res.body).to.eql(payload); - done(); - }); - }); - - // it('respond to a PUT request on default route /', function (done) { - // request('localhost:3000') - // .put('/') - // .end(function (err, res) { - // expect(err).to.eql(null); - // expect(res).to.have.status(200); - // expect(res.text).to.eql('{"Message":"PUT request to homepage received"}'); - // done(); - // }); - // }); - - it('properly DELETE', function (done) { - request('localhost:3000') - .delete('/companies/' + (dbEntries + 1)) - .end(function (err, res) { - expect(err).to.eql(null); - expect(res).to.have.status(200); - expect(res.text).to.eql('{"Message":"Entry DELETED"}'); - done(); - }); - }); - - // - - // - // it('respond to a PATCH request on default route /', function (done) { - // request('localhost:3000') - // .patch('/') - // .end(function (err, res) { - // expect(err).to.eql(null); - // expect(res).to.have.status(200); - // expect(res.text).to.eql('{"Message":"PATCH request to homepage received"}'); - // done(); - // }); - // }); - // - it('respond with 404 to an invalid route', function (done) { - request('localhost:3000') - .get('/companies/' + (dbEntries + 1)) - .end(function (err, res) { - expect(res).to.have.status(404); - expect(res.text).to.eql('{"Error":"Not Found"}'); - done(); - }); - }); - // - // it('respond with 400 if an invalid request is made', function (done) { - // request('localhost:3000') - // .copy('/') - // .end(function (err, res) { - // expect(res).to.have.status(400); - // expect(res.text).to.eql('{"Error":"Bad Request"}'); - // done(); - // }); - // }); - -}); +// 'use strict'; +// +// const chai = require('chai'); +// const expect = require('chai').expect; +// const chaiHTTP = require('chai-http'); +// var fs = require('fs'); +// chai.use(chaiHTTP); +// const request = chai.request; +// require('../server'); +// +// var dbEntries = fs.readdirSync('./data').length; +// var payload = { +// company: 'Tanktest', +// seek_dollar: '200000', +// seek_equity: '.2', +// id: (dbEntries + 1) +// }; +// +// describe('Shark tank API should', function () { +// it('accept a POST request to /companies', function (done) { +// request('localhost:3000') +// .post('/companies') +// .send(payload) +// .end(function (err, res) { +// expect(err).to.eql(null); +// expect(res).to.have.status(200); +// expect(res.text).to.eql('{"Message":"POST received"}'); +// done(); +// }); +// }); +// +// it('list all companies in the "database"', function (done) { +// request('localhost:3000') +// .get('/companies') +// .end(function (err, res) { +// expect(err).to.eql(null); +// expect(res).to.have.status(200); +// expect(res.body.length).to.eql(dbEntries + 1); +// done(); +// }); +// }); +// +// it('list a company by id', function (done) { +// request('localhost:3000') +// .get('/companies/' + (dbEntries + 1)) +// .end(function (err, res) { +// expect(err).to.eql(null); +// expect(res).to.have.status(200); +// expect(res.body).to.eql(payload); +// done(); +// }); +// }); +// +// // it('respond to a PUT request on default route /', function (done) { +// // request('localhost:3000') +// // .put('/') +// // .end(function (err, res) { +// // expect(err).to.eql(null); +// // expect(res).to.have.status(200); +// // expect(res.text).to.eql('{"Message":"PUT request to homepage received"}'); +// // done(); +// // }); +// // }); +// +// it('properly DELETE', function (done) { +// request('localhost:3000') +// .delete('/companies/' + (dbEntries + 1)) +// .end(function (err, res) { +// expect(err).to.eql(null); +// expect(res).to.have.status(200); +// expect(res.text).to.eql('{"Message":"Entry DELETED"}'); +// done(); +// }); +// }); +// +// // +// +// // +// // it('respond to a PATCH request on default route /', function (done) { +// // request('localhost:3000') +// // .patch('/') +// // .end(function (err, res) { +// // expect(err).to.eql(null); +// // expect(res).to.have.status(200); +// // expect(res.text).to.eql('{"Message":"PATCH request to homepage received"}'); +// // done(); +// // }); +// // }); +// // +// it('respond with 404 to an invalid route', function (done) { +// request('localhost:3000') +// .get('/companies/' + (dbEntries + 1)) +// .end(function (err, res) { +// expect(res).to.have.status(404); +// expect(res.text).to.eql('{"Error":"Not Found"}'); +// done(); +// }); +// }); +// // +// // it('respond with 400 if an invalid request is made', function (done) { +// // request('localhost:3000') +// // .copy('/') +// // .end(function (err, res) { +// // expect(res).to.have.status(400); +// // expect(res.text).to.eql('{"Error":"Bad Request"}'); +// // done(); +// // }); +// // }); +// +// }); From f9956a331d2a86bdc758351a301e954906bc4ea3 Mon Sep 17 00:00:00 2001 From: Dustin McBride Date: Fri, 27 May 2016 11:15:08 -0700 Subject: [PATCH 6/6] fixed testing error --- dustin/test/shark_test.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dustin/test/shark_test.js b/dustin/test/shark_test.js index 0d1a3b9..a296683 100644 --- a/dustin/test/shark_test.js +++ b/dustin/test/shark_test.js @@ -2,7 +2,7 @@ const chai = require('chai'); const chaiHTTP = require('chai-http'); -const Shark = require('../schema/companies'); +const Shark = require('../schema/sharks'); const mongoose = require('mongoose'); chai.use(chaiHTTP); const expect = chai.expect; @@ -32,9 +32,9 @@ describe('The /shark route', () => { }); }); - it('GET should return a list of companies', () => { + it('GET should return a list of sharks', () => { request('localhost:3000') - .get('/companies/') + .get('/sharks/') .end((err, res) => { expect(err).to.eql(null); expect(Array.isArray(res.body)).to.eql(true); @@ -43,7 +43,7 @@ describe('The /shark route', () => { it('POST should accept a post and create a new shark', (done) => { request('localhost:3000') - .post('/companies/') + .post('/sharks/') .send({ name: 'posty' }) @@ -59,7 +59,7 @@ describe('The /shark route', () => { it('PUT should update a shark', (done) => { testShark.name = 'updated'; request('localhost:3000') - .put('/companies/') + .put('/sharks/') .send(testShark) .end((err, res) => { expect(err).to.eql(null); @@ -71,7 +71,7 @@ describe('The /shark route', () => { it('DELETE should remove a shark', (done) => { request('localhost:3000') - .delete('/companies/' + testShark._id) + .delete('/sharks/' + testShark._id) .end((err, res) => { expect(err).to.eql(null); expect(res).to.have.status(200);