diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..05b1cf3 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +**/node_modules/* +**/vendor/* +**/*.min.js +**/coverage/* +**/build/* diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..8dc6807 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,21 @@ +{ + "rules": { + "no-console": "off", + "indent": [ "error", 2 ], + "quotes": [ "error", "single" ], + "semi": ["error", "always"], + "linebreak-style": [ "error", "unix" ] + }, + "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..345130c --- /dev/null +++ b/.gitignore @@ -0,0 +1,136 @@ +# Created by https://www.gitignore.io/api/osx,vim,node,macos,windows + +### macOS ### +*.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 + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# 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 ### + +# Icon must end with two \r + +# Thumbnails + +# Files that might appear in the root of a volume + +# Directories potentially created on remote AFP share + +### Vim ### +# swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] +# session +Session.vim +# temporary +.netrwhist +*~ +# auto-generated tag files +tags + +### 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,vim,node,macos,windows diff --git a/README.md b/README.md index 0aaf9f2..253f8e8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,17 @@ -![cf](https://i.imgur.com/7v5ASc8.png) Lab 09: Vanilla REST API w/ Persistence +This application is a presistant database for cataloging your cars and there make you can preform: +--- +-GET +-POST +-PUT +-Delete +--- +Methods to minipulate this data to do so I made the default port 3000 for id you have a designated PORT it will use that. Start the server and lof in with another terminal and use http to preform requests. + + + + + + diff --git a/data/car/0160a3c2-9b28-4671-86d5-2f989d79182a.json b/data/car/0160a3c2-9b28-4671-86d5-2f989d79182a.json new file mode 100644 index 0000000..7b6d164 --- /dev/null +++ b/data/car/0160a3c2-9b28-4671-86d5-2f989d79182a.json @@ -0,0 +1 @@ +{"id":"0160a3c2-9b28-4671-86d5-2f989d79182a","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/03bb7278-d85e-474c-9e27-565a9e6c425f.json b/data/car/03bb7278-d85e-474c-9e27-565a9e6c425f.json new file mode 100644 index 0000000..08d3be1 --- /dev/null +++ b/data/car/03bb7278-d85e-474c-9e27-565a9e6c425f.json @@ -0,0 +1 @@ +{"id":"03bb7278-d85e-474c-9e27-565a9e6c425f","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/131f2405-4589-4c34-8fcf-02bdbe6530c4.json b/data/car/131f2405-4589-4c34-8fcf-02bdbe6530c4.json new file mode 100644 index 0000000..1ce4c0b --- /dev/null +++ b/data/car/131f2405-4589-4c34-8fcf-02bdbe6530c4.json @@ -0,0 +1 @@ +{"id":"131f2405-4589-4c34-8fcf-02bdbe6530c4","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/18f8bb5b-de6c-4ebf-8be6-49f644845e54.json b/data/car/18f8bb5b-de6c-4ebf-8be6-49f644845e54.json new file mode 100644 index 0000000..bf5b875 --- /dev/null +++ b/data/car/18f8bb5b-de6c-4ebf-8be6-49f644845e54.json @@ -0,0 +1 @@ +{"id":"18f8bb5b-de6c-4ebf-8be6-49f644845e54","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/1a7fec69-fe76-4e5e-a93b-96e3d8b6e812.json b/data/car/1a7fec69-fe76-4e5e-a93b-96e3d8b6e812.json new file mode 100644 index 0000000..992fe1f --- /dev/null +++ b/data/car/1a7fec69-fe76-4e5e-a93b-96e3d8b6e812.json @@ -0,0 +1 @@ +{"id":"1a7fec69-fe76-4e5e-a93b-96e3d8b6e812","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/1d80ac8f-f6d2-46f8-95a1-b8fb4a91f44e.json b/data/car/1d80ac8f-f6d2-46f8-95a1-b8fb4a91f44e.json new file mode 100644 index 0000000..76128dc --- /dev/null +++ b/data/car/1d80ac8f-f6d2-46f8-95a1-b8fb4a91f44e.json @@ -0,0 +1 @@ +{"id":"1d80ac8f-f6d2-46f8-95a1-b8fb4a91f44e","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/1dd66b6e-e32b-48e6-9087-9d900702c31c.json b/data/car/1dd66b6e-e32b-48e6-9087-9d900702c31c.json new file mode 100644 index 0000000..0aedd5a --- /dev/null +++ b/data/car/1dd66b6e-e32b-48e6-9087-9d900702c31c.json @@ -0,0 +1 @@ +{"id":"1dd66b6e-e32b-48e6-9087-9d900702c31c","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/20c90a97-d0a2-4b30-9651-a428c381a608.json b/data/car/20c90a97-d0a2-4b30-9651-a428c381a608.json new file mode 100644 index 0000000..dfeb139 --- /dev/null +++ b/data/car/20c90a97-d0a2-4b30-9651-a428c381a608.json @@ -0,0 +1 @@ +{"id":"20c90a97-d0a2-4b30-9651-a428c381a608","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/38bf1909-148d-4c88-afe5-463767498ca2.json b/data/car/38bf1909-148d-4c88-afe5-463767498ca2.json new file mode 100644 index 0000000..1c6673e --- /dev/null +++ b/data/car/38bf1909-148d-4c88-afe5-463767498ca2.json @@ -0,0 +1 @@ +{"id":"38bf1909-148d-4c88-afe5-463767498ca2","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/3aba906b-eb96-45d3-81d5-872613799283.json b/data/car/3aba906b-eb96-45d3-81d5-872613799283.json new file mode 100644 index 0000000..1b1b174 --- /dev/null +++ b/data/car/3aba906b-eb96-45d3-81d5-872613799283.json @@ -0,0 +1 @@ +{"id":"3aba906b-eb96-45d3-81d5-872613799283","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/46e3ccfd-c620-4762-899e-13287040ff87.json b/data/car/46e3ccfd-c620-4762-899e-13287040ff87.json new file mode 100644 index 0000000..4039c14 --- /dev/null +++ b/data/car/46e3ccfd-c620-4762-899e-13287040ff87.json @@ -0,0 +1 @@ +{"id":"46e3ccfd-c620-4762-899e-13287040ff87","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/4cd8d386-1ad6-495f-9411-582aff9d512c.json b/data/car/4cd8d386-1ad6-495f-9411-582aff9d512c.json new file mode 100644 index 0000000..e3f14ad --- /dev/null +++ b/data/car/4cd8d386-1ad6-495f-9411-582aff9d512c.json @@ -0,0 +1 @@ +{"id":"4cd8d386-1ad6-495f-9411-582aff9d512c","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/629b7e16-6a3a-4c82-aa67-ee224838c827.json b/data/car/629b7e16-6a3a-4c82-aa67-ee224838c827.json new file mode 100644 index 0000000..dd3bb77 --- /dev/null +++ b/data/car/629b7e16-6a3a-4c82-aa67-ee224838c827.json @@ -0,0 +1 @@ +{"id":"629b7e16-6a3a-4c82-aa67-ee224838c827","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/6680aeec-5fac-455e-b806-b5a7ba274fe2.json b/data/car/6680aeec-5fac-455e-b806-b5a7ba274fe2.json new file mode 100644 index 0000000..f65f766 --- /dev/null +++ b/data/car/6680aeec-5fac-455e-b806-b5a7ba274fe2.json @@ -0,0 +1 @@ +{"id":"6680aeec-5fac-455e-b806-b5a7ba274fe2","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/81061b1b-01cc-4884-a239-bbe58bf4fb37.json b/data/car/81061b1b-01cc-4884-a239-bbe58bf4fb37.json new file mode 100644 index 0000000..e1456f6 --- /dev/null +++ b/data/car/81061b1b-01cc-4884-a239-bbe58bf4fb37.json @@ -0,0 +1 @@ +{"id":"81061b1b-01cc-4884-a239-bbe58bf4fb37","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/876555ca-b44c-4d56-b904-c60981312c10.json b/data/car/876555ca-b44c-4d56-b904-c60981312c10.json new file mode 100644 index 0000000..270e65d --- /dev/null +++ b/data/car/876555ca-b44c-4d56-b904-c60981312c10.json @@ -0,0 +1 @@ +{"id":"876555ca-b44c-4d56-b904-c60981312c10","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/90849579-c071-4aff-b37e-f68843d2a20c.json b/data/car/90849579-c071-4aff-b37e-f68843d2a20c.json new file mode 100644 index 0000000..2491e33 --- /dev/null +++ b/data/car/90849579-c071-4aff-b37e-f68843d2a20c.json @@ -0,0 +1 @@ +{"id":"90849579-c071-4aff-b37e-f68843d2a20c","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/c5b1baba-30b5-4f51-b9f3-197896670b12.json b/data/car/c5b1baba-30b5-4f51-b9f3-197896670b12.json new file mode 100644 index 0000000..f6ac1fd --- /dev/null +++ b/data/car/c5b1baba-30b5-4f51-b9f3-197896670b12.json @@ -0,0 +1 @@ +{"id":"c5b1baba-30b5-4f51-b9f3-197896670b12","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/c761e0a8-000c-4226-aa7e-679cd4e8774d.json b/data/car/c761e0a8-000c-4226-aa7e-679cd4e8774d.json new file mode 100644 index 0000000..078cc85 --- /dev/null +++ b/data/car/c761e0a8-000c-4226-aa7e-679cd4e8774d.json @@ -0,0 +1 @@ +{"id":"c761e0a8-000c-4226-aa7e-679cd4e8774d","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/f16369cd-f252-4609-bda5-d5a60181f5f3.json b/data/car/f16369cd-f252-4609-bda5-d5a60181f5f3.json new file mode 100644 index 0000000..4f4db33 --- /dev/null +++ b/data/car/f16369cd-f252-4609-bda5-d5a60181f5f3.json @@ -0,0 +1 @@ +{"id":"f16369cd-f252-4609-bda5-d5a60181f5f3","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/f5d750d8-cfe1-43cf-bf4f-4e6967393edd.json b/data/car/f5d750d8-cfe1-43cf-bf4f-4e6967393edd.json new file mode 100644 index 0000000..ea919cf --- /dev/null +++ b/data/car/f5d750d8-cfe1-43cf-bf4f-4e6967393edd.json @@ -0,0 +1 @@ +{"id":"f5d750d8-cfe1-43cf-bf4f-4e6967393edd","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/data/car/f9bca2f3-6d7a-4b7d-b05b-94aaf377beb4.json b/data/car/f9bca2f3-6d7a-4b7d-b05b-94aaf377beb4.json new file mode 100644 index 0000000..5cbe561 --- /dev/null +++ b/data/car/f9bca2f3-6d7a-4b7d-b05b-94aaf377beb4.json @@ -0,0 +1 @@ +{"id":"f9bca2f3-6d7a-4b7d-b05b-94aaf377beb4","name":"325xi","brand":"bmw"} \ No newline at end of file diff --git a/data/car/fda59da0-3d05-42c5-a5e3-9d6828a143b6.json b/data/car/fda59da0-3d05-42c5-a5e3-9d6828a143b6.json new file mode 100644 index 0000000..d43d139 --- /dev/null +++ b/data/car/fda59da0-3d05-42c5-a5e3-9d6828a143b6.json @@ -0,0 +1 @@ +{"id":"fda59da0-3d05-42c5-a5e3-9d6828a143b6","name":"Miata","brand":"Mazda"} \ No newline at end of file diff --git a/lib/parse-json.js b/lib/parse-json.js new file mode 100644 index 0000000..b515efd --- /dev/null +++ b/lib/parse-json.js @@ -0,0 +1,33 @@ +'use strict'; + +module.exports = function (req) { + return new Promise((resolve, reject) => { + if (req.method === 'POST' || req.method === 'PUT') { + var body = ''; + + req.on('data', data => { + body += data.toString(); + }); + + req.on('end', () => { + try { + req.body = JSON.parse(body); + resolve(req); + } catch (err) { + console.error(err); + reject(err); + } + }); + + req.on('error', err => { + console.error(err); + reject(err); + }); + + return; + }; + + resolve(); + }); +} + diff --git a/lib/parse-url.js b/lib/parse-url.js new file mode 100644 index 0000000..b45faa5 --- /dev/null +++ b/lib/parse-url.js @@ -0,0 +1,10 @@ +'use strict'; + +const parseUrl = require('url').parse; +const parseQuery = require('querystring').parse; + +module.exports = function (req) { + req.url = parseUrl(req.url); + req.url.query = parseQuery(req.url.query); + return Promise.resolve(req); +} diff --git a/lib/response.js b/lib/response.js new file mode 100644 index 0000000..1f72fd9 --- /dev/null +++ b/lib/response.js @@ -0,0 +1,21 @@ +'use strict'; + +module.exports = exports = {}; + +exports.sendJSON = function(res, status, data) { + res.writeHead(status, { + 'Content-Type': 'application/json' + }); + + res.write(JSON.stringify(data)); + res.end(); +} + +exports.sendText = function(res, status, msg) { + res.writeHead(status, { + 'Content-Type': 'plain/text' + }) + + res.write(msg); + res.end(); +} \ No newline at end of file diff --git a/lib/router.js b/lib/router.js new file mode 100644 index 0000000..a4187ee --- /dev/null +++ b/lib/router.js @@ -0,0 +1,63 @@ +'use strict'; + +const parseUrl = require('./parse-url.js'); +const parseJSON = require('./parse-json.js'); + +const Router = module.exports = function () { + this.routes = { + GET: {}, + POST: {}, + PUT: {}, + DELETE: {} + } +} + +Router.prototype.get = function (endpoint, callback) { + this.routes.GET[endpoint] = callback; +} + +Router.prototype.post = function (endpoint, callback) { + this.routes.POST[endpoint] = callback; +} + +Router.prototype.put = function (endpoint, callback) { + this.routes.PUT[endpoint] = callback; +} + +Router.prototype.delete = function (endpoint, callback) { + this.routes.DELETE[endpoint] = callback; +} + +Router.prototype.route = function () { + return (req, res) => { + Promise.all([ + parseUrl(req), + parseJSON(req) + ]) + .then(() => { + if (typeof this.routes[req.method][req.url.pathname] === 'function') { + this.routes[req.method][req.url.pathname](req, res); + return; + } + + console.error('route not found'); + + res.writeHead(404, { + 'Content-Type': 'text/plain' + }); + + res.write('route not found'); + res.end(); + }) + .catch(err => { + console.error(err); + + res.writeHead(400, { + 'Content-Type': 'text/plain' + }); + + res.write('bad request'); + res.end(); + }); + } +} diff --git a/lib/storage.js b/lib/storage.js new file mode 100644 index 0000000..8c54ee1 --- /dev/null +++ b/lib/storage.js @@ -0,0 +1,42 @@ +'use strict'; + +const Promise = require('bluebird'); +const fs = Promise.promisifyAll(require('fs'), { suffix: 'Prom' }); + +module.exports = exports = {}; + +exports.createItem = function (schemaName, item) { + if (!schemaName) return Promise.reject(new Error('expected schema name')); + if (!item) return Promise.reject(new Error('expected item')); + + let json = JSON.stringify(item); + return fs.writeFileProm(`${__dirname}/../data/${schemaName}/${item.id}.json`, json) + .then(() => item) + .catch(err => Promise.reject(err)) +} + +exports.fetchItem = function (schemaName, id) { + if (!schemaName) return Promise.reject(new Error('expected schema name')); + if (!id) return Promise.reject(new Error('expected id')); + + return fs.readFileProm(`${__dirname}/../data/${schemaName}/${id}.json`) + .then(data => { + try { + let item = JSON.parse(data.toString()); + return item; + } catch (err) { + return Promise.reject(err); + } + }) + .catch(err => Promise.reject(err)); +} + +exports.deleteItem = function (schemaName, item) { + if (!schemaName) return Promise.reject(new Error('expected schema name')); + if (!item) return Promise.reject(new Error('expected item')); + + let json = JSON.stringify(item); + return fs.unlinkProm(`${__dirname}/../data/${schemaName}/${item.id}.json`, json) + .then(() => item) + .catch(err => Promise.reject(err)) +} \ No newline at end of file diff --git a/model/car.js b/model/car.js new file mode 100644 index 0000000..70035b6 --- /dev/null +++ b/model/car.js @@ -0,0 +1,11 @@ +'use strict'; +const uuidv4 = require('uuid/v4'); + +module.exports = function(name, brand) { + if(!name) throw new Error('expected name'); + if(!brand) throw new Error('expected brand'); + + this.id = uuidv4(); + this.name = name; + this.brand = brand; +}; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..a949c09 --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "09-vanilla_api_persistence", + "version": "1.0.0", + "description": "![cf](https://i.imgur.com/7v5ASc8.png) Lab 09: Vanilla REST API w/ Persistence ======", + "main": "server.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "mocha", + "start": "node server.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/JohnScarrow/09-vanilla_api_persistence.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/JohnScarrow/09-vanilla_api_persistence/issues" + }, + "devDependencies": { + "chai": "^4.1.0", + "mocha": "^3.4.2", + "superagent": "^3.5.2" + }, + "dependencies": { + "bluebird": "^3.5.0", + "uuid": "^3.1.0" + }, + "homepage": "https://github.com/JohnScarrow/09-vanilla_api_persistence#readme" +} diff --git a/route/car-route.js b/route/car-route.js new file mode 100644 index 0000000..d12c7d4 --- /dev/null +++ b/route/car-route.js @@ -0,0 +1,46 @@ +'use strict'; + +const storage = require('../lib/storage.js'); +const response = require('../lib/response.js'); +const Car = require('../model/car.js'); + +module.exports = function(router) { + router.get('/api/car', function(req, res) { + if (req.url.query.id) { + storage.fetchItem('car', req.url.query.id) + .then(car => { + response.sendJSON(res, 200, car); + }) + .catch(err => { + response.sendText(res, 404, 'not found'); + }); + + return; + } + response.sendText(res, 400, 'bad request'); + }); + + router.post('/api/car', function(req, res) { + try { + var car = new Car(req.body.name, req.body.brand); + storage.createItem('car', car); + response.sendJSON(res, 200, car); + } catch (err) { + console.error(err); + response.sendText(res, 400, 'bad request'); + } + }); + router.delete('/api/car', function(req, res) { + if (req.url.query.id) { + storage.deleteItem('car', req.url.query.id) + .then(car => { + response.sendJSON(res, 204, car); + }).catch(err => { + console.error(err); + response.sendText(res, 404, 'not found'); + }); + return; + } + response.sendText(res, 400, 'bad request'); + }); +} \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 0000000..cea9bf3 --- /dev/null +++ b/server.js @@ -0,0 +1,14 @@ +'use strict'; + +const http = require('http'); +const Router = require('./lib/router.js'); +const PORT = process.env.PORT || 3000; +const router = new Router(); + +require('./route/car-route.js')(router); + +const server = http.createServer(router.route()); + +server.listen(PORT, () => { + console.log('server up:', PORT); +}); diff --git a/test/car-route-test.js b/test/car-route-test.js new file mode 100644 index 0000000..5a7f3f6 --- /dev/null +++ b/test/car-route-test.js @@ -0,0 +1,73 @@ +'use strict'; + +const expect = require('chai').expect; +const request = require('superagent'); + +require('../server.js'); + +describe('Car Routes', function(){ + var car = null; + describe('Post: /api/car', function(){ + it('should POST: 200', function(done){ + request.post('localhost:3000/api/car') + .send({name: 'Miata', brand: 'Mazda'}) + .end((err, res) => { + console.log('POST request note:', res.body); + expect(res.status).to.equal(200); + expect(res.body.name).to.equal('Miata'); + expect(res.body.brand).to.equal('Mazda'); + car = res.body; + done(); + }); + }); + + }); + describe('Get: /api/car', function(){ + it('should GET :200 ', function(done){ + request.get(`localhost:3000/api/car?id=${car.id}`) + .end((err, res) =>{ + expect(res.status).to.equal(200); + expect(res.body.id).to.equal(car.id); + expect(res.body.name).to.equal('Miata'); + expect(res.body.brand).to.equal('Mazda'); + done(); + }); + }); + }); + describe('Delete: /api/car', function(){ + it('should delete', function(done){ + request.delete(`localhost:3000/api/car?id=${car.id}`) + .end((err, res) =>{ + expect(res.status).to.equal(204); + expect(res.body.id).to.equal(undefined); + expect(res.body.name).to.equal(undefined); + expect(res.body.brand).to.equal(undefined); + done(); + }); + }); + }); + + it('should POST: 400', function (done) { + request.post('localhost:3000/api/car') + .send({ name: 'Miata', notBrand: 'Mazda' }) + .end((err, res) => { + expect(res.status).to.equal(400); + car = res.body; + done(); + }); + }); + it('should GET: 404', function (done) { + request.get(`localhost:3000/api/car?id=${car.id+1}`) + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + it('should GET: 400', function (done) { + request.get(`localhost:3000/api/car?notID=${car.id}`) + .end((err, res) => { + expect(res.status).to.equal(400); + done(); + }); + }); +}); \ No newline at end of file