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();
+ });
+ });
+ });
+ });
});