diff --git a/app/controllers/items.js b/app/controllers/items.js index 32f80f8..e5dc750 100644 --- a/app/controllers/items.js +++ b/app/controllers/items.js @@ -9,3 +9,9 @@ exports.create = function(req, res){ }); }; +exports.markonsale = function(req, res){ + Item.markOnSale(req.params.itemId, function(){ + res.redirect('/profile'); + }); +}; + diff --git a/app/models/item.js b/app/models/item.js index cbabc44..e517100 100644 --- a/app/models/item.js +++ b/app/models/item.js @@ -38,6 +38,11 @@ Item.create = function(data, cb){ Item.collection.save(i, cb); }; +Item.markOnSale = function(itemId, cb){ + var _id = Mongo.ObjectID(itemId); + Item.collection.update({_id:_id}, {$set: {onSale: true}}, cb); +}; + module.exports = Item; function getNumberOfBids(item, cb){ diff --git a/app/routes/routes.js b/app/routes/routes.js index 888e3a1..76055b9 100644 --- a/app/routes/routes.js +++ b/app/routes/routes.js @@ -33,6 +33,7 @@ module.exports = function(app, express){ app.delete('/logout', users.logout); app.get('/profile', users.profile); app.post('/items', items.create); + app.put('/items/:itemId', items.markonsale); console.log('Express: Routes Loaded'); }; diff --git a/app/static/js/user/profile.js b/app/static/js/user/profile.js index 3d9cc2f..505a306 100644 --- a/app/static/js/user/profile.js +++ b/app/static/js/user/profile.js @@ -5,16 +5,16 @@ 'use strict'; $(document).ready(function(){ - $('button[type=submit]').click(geocodeAndSubmit); + $('#submitItem').click(geocodeAndSubmit); }); function geocodeAndSubmit(e){ var location = $('input[name=location]').val(); geocode(location, function(name, lat, lng){ $('input[name=location]').val(name); - $('form').append(''); - $('form').append(''); - $('form').submit(); + $('#newItem').append(''); + $('#newItem').append(''); + $('#newItem').submit(); }); e.preventDefault(); } diff --git a/app/views/users/profile.jade b/app/views/users/profile.jade index a8bf2ca..28df16c 100644 --- a/app/views/users/profile.jade +++ b/app/views/users/profile.jade @@ -23,7 +23,7 @@ block content if user.photo .profile-photo(style='background-image:url(#{user.photo});') .col-xs-4 - form(role='form', method='post', action='/items') + form#newItem(role='form', method='post', action='/items') .form-group label Name input.form-control(name='name', type='text', placeholder='Red Wine') @@ -39,7 +39,7 @@ block content .form-group label Description textarea.form-control(name='description') - button.btn.btn-default(type='submit') Add Vintage + button#submitItem.btn.btn-default(type='submit') Add Vintage .row .col-xs-6 table.table @@ -48,15 +48,22 @@ block content th Photo th Name th Out for Trade? - th Mark For Sale + th Want to Trade? tbody each item in items unless item.onSale tr td.item-photo(style='background-image:url(#{item.photo});') td= item.name - td= item.isBiddable - td Checkbox + submit button + if(!item.isBiddable) + td No + if(item.isBiddable) + td Yes + td + form(method='post', action='/items/#{item._id}') + input(type='hidden', name='_method', value='put') + button(type='submit') Trade + .col-xs-1 .col-xs-5 table.table diff --git a/test/acceptance/items.js b/test/acceptance/items.js new file mode 100644 index 0000000..16b9658 --- /dev/null +++ b/test/acceptance/items.js @@ -0,0 +1,59 @@ +/* global describe, before, beforeEach, it */ + +'use strict'; + +process.env.DB = 'wine-seller-test'; + +var expect = require('chai').expect, + cp = require('child_process'), + app = require('../../app/index'), + cookie = null, + request = require('supertest'); + +describe('users', function(){ + before(function(done){ + request(app).get('/').end(done); + }); + + beforeEach(function(done){ + cp.execFile(__dirname + '/../scripts/clean-db.sh', [process.env.DB], {cwd:__dirname + '/../scripts'}, function(err, stdout, stderr){ + request(app) + .post('/login') + .send('email=nodeapptest%2Bbob%40gmail.com&password=1234') + .end(function(err, res){ + cookie = res.headers['set-cookie'][0]; + done(); + }); + }); + }); + + describe('post /items', function(){ + it('should redirect to the profile page', function(done){ + request(app) + .post('/items') + .set('cookie', cookie) + .send('name=Red+Wine&photo=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fc%2Fcc%2FFrench_beaujolais_red_wine_bottle.jpg&tags=red%2C+wine&location=Nashville%2C+TN%2C+USA&description=Red+Wine') + .end(function(err, res){ + expect(res.status).to.equal(302); + expect(res.headers.location).to.equal('/profile'); + done(); + }); + }); + }); + + describe('put /profile', function(){ + it('should redirect to the profile page after item is put on sale', function(done){ + request(app) + .post('/items/a00000000000000000000001') + .send('_method=put') + .set('cookie', cookie) + .end(function(err, res){ + expect(res.status).to.equal(302); + expect(res.headers.location).to.equal('/profile'); + done(); + }); + }); + }); + +}); + diff --git a/test/acceptance/users.js b/test/acceptance/users.js index 56f275b..eb26eb0 100644 --- a/test/acceptance/users.js +++ b/test/acceptance/users.js @@ -2,7 +2,7 @@ 'use strict'; -process.env.DB = 'template-test'; +process.env.DB = 'wine-seller-test'; var expect = require('chai').expect, cp = require('child_process'), @@ -89,20 +89,5 @@ describe('users', function(){ }); }); }); - - describe('post /items', function(){ - it('should redirect to the profile page', function(done){ - request(app) - .post('/items') - .set('cookie', cookie) - .send('name=Red+Wine&photo=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fc%2Fcc%2FFrench_beaujolais_red_wine_bottle.jpg&tags=red%2C+wine&location=Nashville%2C+TN%2C+USA&description=Red+Wine') - .end(function(err, res){ - expect(res.status).to.equal(302); - expect(res.headers.location).to.equal('/profile'); - done(); - }); - }); - }); - }); diff --git a/test/unit/item.js b/test/unit/item.js index bb6197f..dea650d 100644 --- a/test/unit/item.js +++ b/test/unit/item.js @@ -62,5 +62,15 @@ describe('Item', function(){ }); }); + describe('.markForSale', function(){ + it('should set an item onSale to true', function(done){ + Item.markOnSale('a00000000000000000000001', function(){ + Item.findById('a00000000000000000000001', function(err, item){ + expect(item.onSale).to.be.true; + done(); + }); + }); + }); + }); });