diff --git a/api/v1/topic_collect.js b/api/v1/topic_collect.js index 4091bc2..ce2126e 100644 --- a/api/v1/topic_collect.js +++ b/api/v1/topic_collect.js @@ -71,7 +71,7 @@ function collect(req, res, next) { return next(err); } if (doc) { - res.json({success: true}); + res.json({success: false}); return; } @@ -113,23 +113,28 @@ function de_collect(req, res, next) { res.status(404); return res.json({success: false, error_msg: '主题不存在'}); } - TopicCollectProxy.remove(req.user.id, topic._id, function (err) { + TopicCollectProxy.remove(req.user.id, topic._id, function (err, removeResult) { if (err) { return next(err); } + if (removeResult.result.n == 0) { + return res.json({success: false}) + } + + UserProxy.getUserById(req.user.id, function (err, user) { + if (err) { + return next(err); + } + user.collect_topic_count -= 1; + user.save(); + }); + + topic.collect_count -= 1; + topic.save(); + res.json({success: true}); }); - UserProxy.getUserById(req.user.id, function (err, user) { - if (err) { - return next(err); - } - user.collect_topic_count -= 1; - user.save(); - }); - - topic.collect_count -= 1; - topic.save(); }); } diff --git a/controllers/topic.js b/controllers/topic.js index 2ffab95..cb28a2d 100644 --- a/controllers/topic.js +++ b/controllers/topic.js @@ -380,7 +380,7 @@ exports.collect = function (req, res, next) { return next(err); } if (doc) { - res.json({status: 'success'}); + res.json({status: 'failed'}); return; } @@ -414,25 +414,28 @@ exports.de_collect = function (req, res, next) { if (!topic) { res.json({status: 'failed'}); } - TopicCollect.remove(req.session.user._id, topic._id, function (err) { + TopicCollect.remove(req.session.user._id, topic._id, function (err, removeResult) { if (err) { return next(err); } + if (removeResult.result.n == 0) { + return res.json({status: 'failed'}) + } + + User.getUserById(req.session.user._id, function (err, user) { + if (err) { + return next(err); + } + user.collect_topic_count -= 1; + req.session.user = user; + user.save(); + }); + + topic.collect_count -= 1; + topic.save(); + res.json({status: 'success'}); }); - - User.getUserById(req.session.user._id, function (err, user) { - if (err) { - return next(err); - } - user.collect_topic_count -= 1; - user.save(); - }); - - topic.collect_count -= 1; - topic.save(); - - req.session.user.collect_topic_count -= 1; }); }; diff --git a/test/api/v1/topic_collect.test.js b/test/api/v1/topic_collect.test.js index ff77eb2..4b7e3bd 100644 --- a/test/api/v1/topic_collect.test.js +++ b/test/api/v1/topic_collect.test.js @@ -4,9 +4,9 @@ var should = require('should'); var support = require('../../support/support'); describe('test/api/v1/topic_collect.test.js', function () { - + var mockUser, mockTopic; - + before(function (done) { support.createUser(function (err, user) { mockUser = user; @@ -82,6 +82,19 @@ describe('test/api/v1/topic_collect.test.js', function () { }); }); + it('should not collect topic twice', function (done) { + request.post('/api/v1/topic_collect/collect') + .send({ + accesstoken: mockUser.accessToken, + topic_id: mockTopic.id + }) + .end(function (err, res) { + should.not.exists(err); + res.body.success.should.false(); + done(); + }); + }); + it('should fail when topic_id is not valid', function (done) { request.post('/api/v1/topic_collect/collect') .send({ @@ -114,9 +127,9 @@ describe('test/api/v1/topic_collect.test.js', function () { done(); }); }); - + }); - + // 主题被收藏之后 describe('after collect topic', function () { @@ -132,7 +145,7 @@ describe('test/api/v1/topic_collect.test.js', function () { done(); }); }); - + it('should fail when user not found', function (done) { request.get('/api/v1/topic_collect/' + mockUser.loginname + 'not_found') .end(function (err, res) { @@ -142,7 +155,7 @@ describe('test/api/v1/topic_collect.test.js', function () { done(); }); }); - + }); describe('get /api/v1/topic/:topicid', function () { @@ -163,7 +176,7 @@ describe('test/api/v1/topic_collect.test.js', function () { }); }); - + // 取消收藏主题 describe('post /topic_collect/de_collect', function () { @@ -179,7 +192,7 @@ describe('test/api/v1/topic_collect.test.js', function () { done(); }); }); - + it('should decollect topic with correct accessToken', function (done) { request.post('/api/v1/topic_collect/de_collect') .send({ @@ -192,7 +205,20 @@ describe('test/api/v1/topic_collect.test.js', function () { done(); }); }); - + + it('should not decollect topic twice', function (done) { + request.post('/api/v1/topic_collect/de_collect') + .send({ + accesstoken: mockUser.accessToken, + topic_id: mockTopic.id + }) + .end(function (err, res) { + should.not.exists(err); + res.body.success.should.false(); + done(); + }); + }); + it('should fail when topic_id is not valid', function (done) { request.post('/api/v1/topic_collect/de_collect') .send({ @@ -225,9 +251,9 @@ describe('test/api/v1/topic_collect.test.js', function () { done(); }); }); - + }); - + // 主题被取消收藏之后 describe('after decollect topic', function () { diff --git a/test/controllers/topic.test.js b/test/controllers/topic.test.js index 9ccc574..270aa68 100644 --- a/test/controllers/topic.test.js +++ b/test/controllers/topic.test.js @@ -214,6 +214,18 @@ describe('test/controllers/topic.test.js', function () { done(err); }) }) + + it('should not collect a topic twice', function (done) { + request.post('/topic/collect') + .send({ + topic_id: support.testTopic._id, + }) + .set('Cookie', support.normalUser2Cookie) + .expect(200, function (err, res) { + res.body.should.eql({status: 'failed'}); + done(err); + }) + }) }) describe('#de_collect', function () { @@ -228,6 +240,18 @@ describe('test/controllers/topic.test.js', function () { done(err); }); }); + + it('should not decollect a non-exist topic_collect', function (done) { + request.post('/topic/de_collect') + .send({ + topic_id: support.testTopic._id, + }) + .set('Cookie', support.normalUser2Cookie) + .expect(200, function (err, res) { + res.body.should.eql({status: 'failed'}); + done(err); + }); + }); }); describe('#upload', function () {