diff --git a/server/controllers/like.controller.js b/server/controllers/like.controller.js index 28439154..e825b63c 100644 --- a/server/controllers/like.controller.js +++ b/server/controllers/like.controller.js @@ -3,6 +3,10 @@ import Like from '../models/like.model'; import Post from '../models/post.model'; function syncAlgolia(query) { + if (process.env.NODE_ENV === 'test') { + return; + } + const client = algoliasearch( process.env.ALGOLIA_APP_ID, process.env.ALGOLIA_API_KEY, diff --git a/server/controllers/post.controller.js b/server/controllers/post.controller.js index 65f456a0..33692e49 100644 --- a/server/controllers/post.controller.js +++ b/server/controllers/post.controller.js @@ -238,10 +238,9 @@ function search(req, res, next) { let isEnd = false; let nextPage = 0; let slugs = []; - const { - query = '', - page = 0, - } = req.query; + + const { query = '' } = req.query; + const page = parseInt(req.query.page || '0', 10); const client = algoliasearch( process.env.ALGOLIA_APP_ID, @@ -262,12 +261,9 @@ function search(req, res, next) { slugs = reply.hits.map(h => h.slug); Post.list({ slugs }) - .then((posts) => { - res.json({ - posts: getAdFreePostsIfSubscribed(posts, req.fullUser, next), - isEnd, - nextPage - }); + .then(async (posts) => { + posts = await getAdFreePostsIfSubscribed(posts, req.fullUser, next); //eslint-disable-line + res.json({ posts, isEnd, nextPage }); }) .catch(e => next(e)); }) diff --git a/server/routes/post.route.js b/server/routes/post.route.js index 6ae31ce5..b10f66c4 100644 --- a/server/routes/post.route.js +++ b/server/routes/post.route.js @@ -26,9 +26,9 @@ router.route('/') router.route('/search') .get( - expressJwt({ secret: config.jwtSecret, credentialsRequired: false }) - , loadFullUser - , postCtrl.search + expressJwt({ secret: config.jwtSecret, credentialsRequired: false }), + loadFullUser, + postCtrl.search, ); router.route('/recommendations') diff --git a/server/tests/post.test.js b/server/tests/post.test.js index 233587c1..2a42fe99 100644 --- a/server/tests/post.test.js +++ b/server/tests/post.test.js @@ -5,6 +5,7 @@ import httpStatus from 'http-status'; import chai, { expect } from 'chai'; import app from '../../index'; import Post from '../models/post.model'; +import User from '../models/user.model'; chai.config.includeStack = true; @@ -115,4 +116,95 @@ describe('## Post APIs', () => { .catch(done); }); }); + + describe('# POST /api/posts/:postId/like', () => { + const validUserCredentials = { + username: 'react', + password: 'express' + }; + + let userToken; + let postId; + + before((done) => { + request(app) + .post('/api/auth/register') + .send(validUserCredentials) + .expect(httpStatus.CREATED) + .then((res) => { + expect(res.body).to.have.property('token'); + userToken = res.body.token; + const post = new Post(); + return post.save(); + }) + .then((post) => { + postId = post._id; + done(); + }) + .catch(done); + }); + + after((done) => { + User.remove({}) + .exec() + .then(() => Post.remove({}).exec()) + .then(() => { + done(); + }); + }); + + it('errors when not logged in', (done) => { + request(app) + .post(`/api/posts/${postId}/like`) + .expect(httpStatus.UNAUTHORIZED) + .then((res) => { + expect(res.body).to.exist; //eslint-disable-line + done(); + }); + }); + + it('likes a post', (done) => { + request(app) + .post(`/api/posts/${postId}/like`) + .set('Authorization', `Bearer ${userToken}`) + .expect(httpStatus.OK) + .then((res) => { + const like = res.body; + expect(like).to.have.property('likeCount').that.is.a('number'); + expect(like).to.have.property('likeActive').that.is.a('boolean'); + expect(like.likeActive).to.be.true; //eslint-disable-line + done(); + }) + .catch(done); + }); + + it('toggles the like for a post', (done) => { + request(app) + .post(`/api/posts/${postId}/like`) + .set('Authorization', `Bearer ${userToken}`) + .expect(httpStatus.OK) + .then((res) => { + const like = res.body; + expect(like).to.have.property('likeCount').that.is.a('number'); + expect(like).to.have.property('likeActive').that.is.a('boolean'); + expect(like.likeActive).to.be.false; //eslint-disable-line + done(); + }) + .catch(done); + }); + }); + + xdescribe('# GET /api/posts/search', () => { + it('returns search results', (done) => { + request(app) + .get('/api/posts/search?query=apple&page=0') + .then((res) => { + expect(res.body).to.exist; //eslint-disable-line + expect(res.body.posts).to.have.property('length'); //eslint-disable-line + expect(res.body).to.have.property('isEnd').that.is.a('boolean'); + expect(res.body).to.have.property('nextPage', 1).that.is.a('number'); + done(); + }); + }); + }); });