diff --git a/models/asset.js b/models/asset.js index 14d5675df..00251985a 100644 --- a/models/asset.js +++ b/models/asset.js @@ -1,7 +1,8 @@ const mongoose = require('../mongoose'); -const uuid = require('uuid'); const Schema = mongoose.Schema; +const uuid = require('uuid'); + const AssetSchema = new Schema({ id: { type: String, @@ -22,6 +23,10 @@ const AssetSchema = new Schema({ type: Date, default: null }, + settings: { + type: Schema.Types.Mixed, + default: null + }, title: String, description: String, image: String, @@ -90,6 +95,18 @@ AssetSchema.statics.findOrCreateByUrl = (url) => Asset.findOneAndUpdate({url}, { setDefaultsOnInsert: true }); +/** + * Updates the settings for the asset. + * @param {[type]} id [description] + * @param {[type]} settings [description] + * @return {[type]} [description] + */ +AssetSchema.statics.overrideSettings = (id, settings) => Asset.update({id}, { + $set: { + settings + } +}); + /** * Finds assets matching keywords on the model. If `value` is an empty string, * then it will not even perform a text search query. diff --git a/models/user.js b/models/user.js index bde2363c2..845b84d19 100644 --- a/models/user.js +++ b/models/user.js @@ -9,6 +9,7 @@ const SALT_ROUNDS = 10; // USER_ROLES is the array of roles that is permissible as a user role. const USER_ROLES = [ + '', 'admin', 'moderator' ]; diff --git a/routes/api/asset/index.js b/routes/api/asset/index.js index 0c740d32f..96b83a969 100644 --- a/routes/api/asset/index.js +++ b/routes/api/asset/index.js @@ -81,4 +81,19 @@ router.post('/:asset_id/scrape', (req, res, next) => { }); }); +router.put('/:asset_id/settings', (req, res, next) => { + + // Override the settings for the asset. + Asset + .overrideSettings(req.params.asset_id, req.body) + .then(() => { + + res.status(204).end(); + }) + .catch((err) => { + next(err); + }); + +}); + module.exports = router; diff --git a/routes/api/stream/index.js b/routes/api/stream/index.js index 7b793cdb6..ddab5b87b 100644 --- a/routes/api/stream/index.js +++ b/routes/api/stream/index.js @@ -30,16 +30,36 @@ router.get('/', (req, res, next) => { Setting.getModerationSetting() ]) .then(([asset, settings]) => { - // Get the sitewide moderation setting and return the appropriate comments + + // Merge the asset specific settings with the returned settings object in + // the event that the asset that was returned also had settings. + if (asset.settings) { + settings = Object.assign(settings, asset.settings); + } + + // Fetch the appropriate comments stream. let comments; - if (settings.moderation === 'pre') { + + if (settings.moderation === 'post') { comments = Comment.findAcceptedByAssetId(asset.id); } else { comments = Comment.findAcceptedAndNewByAssetId(asset.id); } - return Promise.all([comments, asset, settings]); + return Promise.all([ + + // This is the promised component... Fetch the comments based on the + // moderation settings. + comments, + + // Send back the reference to the asset. + asset, + + // Send back the settings to the stream. + settings + ]); }) + // Get all the users and actions for those comments. .then(([comments, asset, settings]) => { // Get the user id's from the author id's as a unique array that gets @@ -73,14 +93,16 @@ router.get('/', (req, res, next) => { // The users who wrote those comments users, - // The actions on the above items + // And all actions about the asset, comments, and users. actions, - // And the relevant settings + // Pass back the settings that we loaded. settings ]); }) .then(([asset, comments, users, actions, settings]) => { + + // Send back the payload containing all this data. res.json({ assets: [asset], comments, diff --git a/swagger.yaml b/swagger.yaml index 09adb97d6..e819f451c 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -335,6 +335,28 @@ paths: schema: $ref: '#/definitions/Error' + /asset/{asset_id}/settings: + put: + parameters: + - name: asset_id + in: path + required: true + type: string + format: uuid + - name: body + in: body + required: true + schema: + $ref: '#/definitions/Settings' + responses: + 204: + description: The asset settings were updated. + 404: + description: The asset was not found. + 500: + description: An error occured. + schema: + $ref: '#/definitions/Error' /stream: get: diff --git a/tests/models/asset.js b/tests/models/asset.js index a5c4ae62b..69bf99f9d 100644 --- a/tests/models/asset.js +++ b/tests/models/asset.js @@ -1,5 +1,10 @@ const Asset = require('../../models/asset'); -const expect = require('chai').expect; + +const chai = require('chai'); +const expect = chai.expect; + +// Use the chai should. +chai.should(); describe('Asset: model', () => { @@ -53,6 +58,27 @@ describe('Asset: model', () => { }); }); + describe('#overrideSettings', () => { + it('should update the settings', () => { + return Asset + .findOrCreateByUrl('https://override.test.com/asset') + .then((asset) => { + expect(asset).to.have.property('settings'); + expect(asset.settings).to.be.null; + + return Asset.overrideSettings(asset.id, {moderation: 'pre'}); + }) + .then(() => { + return Asset.findOrCreateByUrl('https://override.test.com/asset'); + }) + .then((asset) => { + expect(asset).to.have.property('settings'); + expect(asset.settings).is.an('object'); + expect(asset.settings).to.have.property('moderation', 'pre'); + }); + }); + }); + describe('#findOrCreateByUrl', ()=> { it('should find an asset by a url', () => { return Asset.findOrCreateByUrl('http://test.com') diff --git a/tests/models/setting.js b/tests/models/setting.js index a36b363fb..08a47d7a1 100644 --- a/tests/models/setting.js +++ b/tests/models/setting.js @@ -14,6 +14,7 @@ describe('Setting: model', () => { expect(settings).to.have.property('moderation').and.to.equal('pre'); }); }); + it('should have two infoBox fields defined', () => { return Setting.getSettings().then(settings => { expect(settings).to.have.property('infoBoxEnable').and.to.equal(false); @@ -26,6 +27,7 @@ describe('Setting: model', () => { it('should update the settings with a passed object', () => { const mockSettings = {moderation: 'post', infoBoxEnable: true, infoBoxContent: 'yeah'}; return Setting.updateSettings(mockSettings).then(updatedSettings => { + expect(updatedSettings).to.be.an('object'); expect(updatedSettings).to.have.property('moderation').and.to.equal('post'); expect(updatedSettings).to.have.property('infoBoxEnable', true); expect(updatedSettings).to.have.property('infoBoxContent', 'yeah'); diff --git a/tests/routes/api/assets/index.js b/tests/routes/api/assets/index.js index 667bec0ed..c56e5b1ba 100644 --- a/tests/routes/api/assets/index.js +++ b/tests/routes/api/assets/index.js @@ -10,7 +10,7 @@ chai.use(require('chai-http')); const Asset = require('../../../../models/asset'); -describe('/assets', () => { +describe('/api/v1/assets', () => { beforeEach(() => { return Asset.create([ @@ -27,7 +27,7 @@ describe('/assets', () => { ]); }); - describe('GET', () => { + describe('#get', () => { it('should return all assets without a search query', () => { return chai.request(app) diff --git a/tests/routes/api/auth/index.js b/tests/routes/api/auth/index.js index ddca63fe8..dd408d135 100644 --- a/tests/routes/api/auth/index.js +++ b/tests/routes/api/auth/index.js @@ -6,32 +6,47 @@ chai.use(require('chai-http')); const User = require('../../../../models/user'); -describe('POST /auth/local', () => { +describe('/api/v1/auth', () => { + describe('#get', () => { + it('should return nothing when no user is logged in', () => { + return chai.request(app) + .get('/api/v1/auth') + .then((res) => { + expect(res.status).to.be.equal(204); + expect(res.body).to.be.empty; + }); + }); + }); +}); + +describe('/api/v1/auth/local', () => { beforeEach(() => { return User.createLocalUser('maria@gmail.com', 'password!', 'Maria'); }); - it('should send back the user on a successful login', () => { - return chai.request(app) - .post('/api/v1/auth/local') - .send({email: 'maria@gmail.com', password: 'password!'}) - .catch((res) => { - expect(res).to.have.status(200); - expect(res).to.be.json; - expect(res.body).to.have.property('user'); - expect(res.body.user).to.have.property('displayName', 'Maria'); - }); - }); + describe('#post', () => { + it('should send back the user on a successful login', () => { + return chai.request(app) + .post('/api/v1/auth/local') + .send({email: 'maria@gmail.com', password: 'password!'}) + .catch((res) => { + expect(res).to.have.status(200); + expect(res).to.be.json; + expect(res.body).to.have.property('user'); + expect(res.body.user).to.have.property('displayName', 'Maria'); + }); + }); - it('should not send back the user on a unsuccessful login', () => { - return chai.request(app) - .post('/api/v1/auth/local') - .send({email: 'maria@gmail.com', password: 'password!3'}) - .catch((err) => { - expect(err).to.not.be.null; - expect(err.response).to.have.status(401); - expect(err.response.body).to.have.property('message', 'not authorized'); - }); + it('should not send back the user on a unsuccessful login', () => { + return chai.request(app) + .post('/api/v1/auth/local') + .send({email: 'maria@gmail.com', password: 'password!3'}) + .catch((err) => { + expect(err).to.not.be.null; + expect(err.response).to.have.status(401); + expect(err.response.body).to.have.property('message', 'not authorized'); + }); + }); }); }); diff --git a/tests/routes/api/comments/index.js b/tests/routes/api/comments/index.js index ff7f3a9d4..5ac9af7b7 100644 --- a/tests/routes/api/comments/index.js +++ b/tests/routes/api/comments/index.js @@ -16,11 +16,7 @@ const User = require('../../../../models/user'); const Setting = require('../../../../models/setting'); const settings = {id: '1', moderation: 'pre'}; -beforeEach(() => { - return Setting.create(settings); -}); - -describe('Get /comments', () => { +describe('/api/v1/comments', () => { const comments = [{ id: 'abc', body: 'comment 10', @@ -32,61 +28,11 @@ describe('Get /comments', () => { asset_id: 'asset', author_id: '456' }, { - id: 'hij', - body: 'comment 30', - asset_id: '456' - }]; - - const users = [{ - displayName: 'Ana', - email: 'ana@gmail.com', - password: '123' - }, { - displayName: 'Maria', - email: 'maria@gmail.com', - password: '123' - }]; - - const actions = [{ - action_type: 'flag', - item_id: 'abc' - }, { - action_type: 'like', - item_id: 'hij' - }]; - - beforeEach(() => { - return Promise.all([ - Comment.create(comments), - User.createLocalUsers(users), - Action.create(actions) - ]); - }); - - it('should return all the comments', () => { - return chai.request(app) - .get('/api/v1/comments') - .set(passport.inject({roles: ['admin']})) - .then((res) => { - - expect(res).to.have.status(200); - - }); - }); -}); - -describe('Get comments by status and action', () => { - const comments = [{ - id: 'abc', - body: 'comment 10', - asset_id: 'asset', - author_id: '123', - status: 'rejected' - }, { - id: 'def', + id: 'def-rejected', body: 'comment 20', asset_id: 'asset', - author_id: '456' + author_id: '456', + status: 'rejected' }, { id: 'hij', body: 'comment 30', @@ -117,109 +63,100 @@ describe('Get comments by status and action', () => { beforeEach(() => { return Promise.all([ Comment.create(comments), - User.createLocalUsers(users), - Action.create(actions) - ]); - }); - - it('should return all the rejected comments', () => { - return chai.request(app) - .get('/api/v1/comments?status=rejected') - .set(passport.inject({roles: ['admin']})) - .then((res) => { - expect(res).to.have.status(200); - expect(res.body[0]).to.have.property('id', 'abc'); - }); - }); - - it('should return all the approved comments', () => { - return chai.request(app) - .get('/api/v1/comments?status=accepted') - .set(passport.inject({roles: ['admin']})) - .then((res) => { - expect(res).to.have.status(200); - expect(res.body[0]).to.have.property('id', 'hij'); - }); - }); - - it('should return all the new comments', () => { - return chai.request(app) - .get('/api/v1/comments?status=new') - .set(passport.inject({roles: ['admin']})) - .then((res) => { - expect(res).to.have.status(200); - expect(res.body[0]).to.have.property('id', 'def'); - }); - }); - - it('should return all the flagged comments', () => { - return chai.request(app) - .get('/api/v1/comments?action_type=flag') - .set(passport.inject({roles: ['admin']})) - .then((res) => { - expect(res).to.have.status(200); - - expect(res.body.length).to.equal(1); - expect(res.body[0]).to.have.property('id', 'abc'); - - }); - }); -}); - -describe('Post /comments', () => { - const users = [{ - displayName: 'Ana', - email: 'ana@gmail.com', - password: '123' - }, { - displayName: 'Maria', - email: 'maria@gmail.com', - password: '123' - }]; - - const actions = [{ - action_type: 'flag', - item_id: 'abc' - }, { - action_type: 'like', - item_id: 'hij' - }]; - - beforeEach(() => { - return Promise.all([ User.createLocalUsers(users), Action.create(actions), wordlist.insert([ 'bad words' - ]) + ]), + Setting.create(settings) ]); }); - it('should create a comment', () => { - return chai.request(app) - .post('/api/v1/comments') - .set(passport.inject({roles: []})) - .send({'body': 'Something body.', 'author_id': '123', 'asset_id': '1', 'parent_id': ''}) - .then((res) => { - expect(res).to.have.status(201); - expect(res.body).to.have.property('id'); - }); + describe('#get', () => { + it('should return all the comments', () => { + return chai.request(app) + .get('/api/v1/comments') + .set(passport.inject({roles: ['admin']})) + .then((res) => { + + expect(res).to.have.status(200); + + }); + }); + + it('should return all the rejected comments', () => { + return chai.request(app) + .get('/api/v1/comments?status=rejected') + .set(passport.inject({roles: ['admin']})) + .then((res) => { + expect(res).to.have.status(200); + expect(res.body[0]).to.have.property('id', 'def-rejected'); + }); + }); + + it('should return all the approved comments', () => { + return chai.request(app) + .get('/api/v1/comments?status=accepted') + .set(passport.inject({roles: ['admin']})) + .then((res) => { + expect(res).to.have.status(200); + expect(res.body).to.have.length(1); + expect(res.body[0]).to.have.property('id', 'hij'); + }); + }); + + it('should return all the new comments', () => { + return chai.request(app) + .get('/api/v1/comments?status=new') + .set(passport.inject({roles: ['admin']})) + .then((res) => { + expect(res).to.have.status(200); + expect(res.body).to.have.length(2); + }); + }); + + it('should return all the flagged comments', () => { + return chai.request(app) + .get('/api/v1/comments?action_type=flag') + .set(passport.inject({roles: ['admin']})) + .then((res) => { + expect(res).to.have.status(200); + + expect(res.body).to.have.length(1); + expect(res.body[0]).to.have.property('id', 'abc'); + + }); + }); }); - it('should create a comment with a rejected status if it contains a bad word', () => { - return chai.request(app) - .post('/api/v1/comments') - .set(passport.inject({roles: []})) - .send({'body': 'bad words are the baddest', 'author_id': '123', 'asset_id': '1', 'parent_id': ''}) - .then((res) => { - expect(res).to.have.status(201); - expect(res.body).to.have.property('id'); - expect(res.body).to.have.property('status', 'rejected'); - }); + describe('#post', () => { + + it('should create a comment', () => { + return chai.request(app) + .post('/api/v1/comments') + .set(passport.inject({roles: []})) + .send({'body': 'Something body.', 'author_id': '123', 'asset_id': '1', 'parent_id': ''}) + .then((res) => { + expect(res).to.have.status(201); + expect(res.body).to.have.property('id'); + }); + }); + + it('should create a comment with a rejected status if it contains a bad word', () => { + return chai.request(app) + .post('/api/v1/comments') + .set(passport.inject({roles: []})) + .send({'body': 'bad words are the baddest', 'author_id': '123', 'asset_id': '1', 'parent_id': ''}) + .then((res) => { + expect(res).to.have.status(201); + expect(res.body).to.have.property('id'); + expect(res.body).to.have.property('status', 'rejected'); + }); + }); }); }); -describe('Get /:comment_id', () => { +describe('/api/v1/comments/:comment_id', () => { const comments = [{ id: 'abc', body: 'comment 10', @@ -264,79 +201,65 @@ describe('Get /:comment_id', () => { ]); }); - it('should return the right comment for the comment_id', () => { - return chai.request(app) - .get('/api/v1/comments/abc') - .set(passport.inject({roles: ['admin']})) - .then((res) => { - expect(res).to.have.status(200); - expect(res).to.have.property('body'); - expect(res.body).to.have.property('body', 'comment 10'); + describe('#get', () => { - }); + it('should return the right comment for the comment_id', () => { + return chai.request(app) + .get('/api/v1/comments/abc') + .set(passport.inject({roles: ['admin']})) + .then((res) => { + expect(res).to.have.status(200); + expect(res).to.have.property('body'); + expect(res.body).to.have.property('body', 'comment 10'); + + }); + }); + }); + + describe('#delete', () => { + it('it should remove comment', () => { + return chai.request(app) + .delete('/api/v1/comments/abc') + .set(passport.inject({roles: ['admin']})) + .then((res) => { + expect(res).to.have.status(204); + + return Comment.findById('abc'); + }) + .then((comment) => { + expect(comment).to.be.null; + }); + }); + }); + + describe('#put', () => { + it('it should update status', function() { + return chai.request(app) + .put('/api/v1/comments/abc/status') + .set(passport.inject({roles: ['admin']})) + .send({status: 'accepted'}) + .then((res) => { + expect(res).to.have.status(204); + expect(res.body).to.be.empty; + }); + }); + + it('it should not allow a non-admin to update status', () => { + return chai.request(app) + .put('/api/v1/comments/abc/status') + .set(passport.inject({roles: []})) + .send({status: 'accepted'}) + .then((res) => { + expect(res).to.be.empty; + }) + .catch((err) => { + expect(err).to.have.property('status', 401); + }); + }); }); }); -describe('Remove /:comment_id', () => { - - const comments = [{ - id: 'abc', - body: 'comment 10', - asset_id: 'asset', - author_id: '123' - }, { - id: 'def', - body: 'comment 20', - asset_id: 'asset', - author_id: '456' - }, { - id: 'hij', - body: 'comment 30', - asset_id: '456' - }]; - - const users = [{ - displayName: 'Ana', - email: 'ana@gmail.com', - password: '123' - }, { - displayName: 'Maria', - email: 'maria@gmail.com', - password: '123' - }]; - - const actions = [{ - action_type: 'flag', - item_id: 'abc' - }, { - action_type: 'like', - item_id: 'hij' - }]; - - beforeEach(() => { - return Promise.all([ - Comment.create(comments), - User.createLocalUsers(users), - Action.create(actions) - ]); - }); - - it('it should remove comment', () => { - return chai.request(app) - .delete('/api/v1/comments/abc') - .set(passport.inject({roles: ['admin']})) - .then((res) => { - expect(res).to.have.status(204); - - return Comment.findById('abc'); - }) - .then((comment) => { - expect(comment).to.be.null; - }); - }); -}); - -describe('Put /:comment_id/status', () => { +describe('/api/v1/comments/:comment_id/actions', () => { const comments = [{ id: 'abc', @@ -383,90 +306,20 @@ describe('Put /:comment_id/status', () => { ]); }); - it('it should update status', function() { - return chai.request(app) - .put('/api/v1/comments/abc/status') - .set(passport.inject({roles: ['admin']})) - .send({status: 'accepted'}) - .then((res) => { - expect(res).to.have.status(204); - expect(res.body).to.be.empty; - }); - }); - - it('it should not allow a non-admin to update status', () => { - return chai.request(app) - .put('/api/v1/comments/abc/status') - .set(passport.inject({roles: []})) - .send({status: 'accepted'}) - .then((res) => { - expect(res).to.be.empty; - }) - .catch((err) => { - expect(err).to.have.property('status', 401); - }); - }); -}); - -describe('Post /:comment_id/actions', () => { - - const comments = [{ - id: 'abc', - body: 'comment 10', - asset_id: 'asset', - author_id: '123', - status: '' - }, { - id: 'def', - body: 'comment 20', - asset_id: 'asset', - author_id: '456', - status: 'rejected' - }, { - id: 'hij', - body: 'comment 30', - asset_id: '456', - status: 'accepted' - }]; - - const users = [{ - displayName: 'Ana', - email: 'ana@gmail.com', - password: '123' - }, { - displayName: 'Maria', - email: 'maria@gmail.com', - password: '123' - }]; - - const actions = [{ - action_type: 'flag', - item_id: 'abc' - }, { - action_type: 'like', - item_id: 'hij' - }]; - - beforeEach(() => { - return Promise.all([ - Comment.create(comments), - User.createLocalUsers(users), - Action.create(actions) - ]); - }); - - it('it should update actions', () => { - return chai.request(app) - .post('/api/v1/comments/abc/actions') - .set(passport.inject({id: '456', roles: ['admin']})) - .send({'user_id': '456', 'action_type': 'flag'}) - .then((res) => { - expect(res).to.have.status(201); - expect(res).to.have.body; - expect(res.body).to.have.property('item_type', 'comment'); - expect(res.body).to.have.property('action_type', 'flag'); - expect(res.body).to.have.property('item_id', 'abc'); - expect(res.body).to.have.property('user_id', '456'); - }); + describe('#post', () => { + it('it should update actions', () => { + return chai.request(app) + .post('/api/v1/comments/abc/actions') + .set(passport.inject({id: '456', roles: ['admin']})) + .send({'user_id': '456', 'action_type': 'flag'}) + .then((res) => { + expect(res).to.have.status(201); + expect(res).to.have.body; + expect(res.body).to.have.property('item_type', 'comment'); + expect(res.body).to.have.property('action_type', 'flag'); + expect(res.body).to.have.property('item_id', 'abc'); + expect(res.body).to.have.property('user_id', '456'); + }); + }); }); }); diff --git a/tests/routes/api/queue/index.js b/tests/routes/api/queue/index.js index 74137a49a..733e5a1be 100644 --- a/tests/routes/api/queue/index.js +++ b/tests/routes/api/queue/index.js @@ -15,11 +15,7 @@ const User = require('../../../../models/user'); const Setting = require('../../../../models/setting'); const settings = {id: '1', moderation: 'pre'}; -beforeEach(() => { - return Setting.create(settings); -}); - -describe('Get moderation queues rejected, pending, flags', () => { +describe('/api/v1/queue', () => { const comments = [{ id: 'abc', body: 'comment 10', @@ -62,19 +58,22 @@ describe('Get moderation queues rejected, pending, flags', () => { return Promise.all([ Comment.create(comments), User.createLocalUsers(users), - Action.create(actions) + Action.create(actions), + Setting.create(settings) ]); }); - it('should return all the pending comments', function(done){ - chai.request(app) - .get('/api/v1/queue/comments/pending') - .set(passport.inject({roles: ['admin']})) - .end(function(err, res){ - expect(err).to.be.null; - expect(res).to.have.status(200); - expect(res.body[0]).to.have.property('id', 'def'); - done(); - }); + describe('#get', () => { + it('should return all the pending comments', function(done){ + chai.request(app) + .get('/api/v1/queue/comments/pending') + .set(passport.inject({roles: ['admin']})) + .end(function(err, res){ + expect(err).to.be.null; + expect(res).to.have.status(200); + expect(res.body[0]).to.have.property('id', 'def'); + done(); + }); + }); }); }); diff --git a/tests/routes/api/settings/index.js b/tests/routes/api/settings/index.js index 9f4466a7f..d1a7ba81b 100644 --- a/tests/routes/api/settings/index.js +++ b/tests/routes/api/settings/index.js @@ -10,49 +10,42 @@ chai.use(require('chai-http')); const Setting = require('../../../../models/setting'); const defaults = {id: '1', moderation: 'pre'}; -describe('GET /settings', () => { +describe('/api/v1/settings', () => { - beforeEach(() => { - return Setting.update({id: '1'}, {$setOnInsert: defaults}, {upsert: true}); + beforeEach(() => Setting.create(defaults)); + + describe('#get', () => { + + it('should return a settings object', () => { + return chai.request(app) + .get('/api/v1/settings') + .set(passport.inject({ + roles: ['admin'] + })) + .then((res) => { + expect(res).to.have.status(200); + expect(res).to.be.json; + expect(res.body).to.have.property('moderation', 'pre'); + }); + }); }); - it('should return a settings object', () => { - return chai.request(app) - .get('/api/v1/settings') - .set(passport.inject({ - roles: ['admin'] - })) - .then((res) => { - expect(res).to.have.status(200); - expect(res).to.be.json; - expect(res.body).to.have.property('moderation', 'pre'); - }); - }); -}); - -// update the settings. -describe('update settings', () => { - it('should respond ok to a PUT', () => { - return Setting - .update({id: '1'}, {$setOnInsert: defaults}, {upsert: true}) - .then(() => { - return chai.request(app) - .put('/api/v1/settings') - .set(passport.inject({ - roles: ['admin'] - })) - .send({moderation: 'post'}); - }) - .then(res => { - expect(res).to.have.status(204); - - return Setting.getSettings(); - }) - .then(settings => { - - // confirm updated settings in db - expect(settings).to.have.property('moderation'); - expect(settings.moderation).to.equal('post'); - }); + describe('#put', () => { + + it('should update the settings', () => { + return chai.request(app) + .put('/api/v1/settings') + .set(passport.inject({roles: ['admin']})) + .send({moderation: 'post'}) + .then((res) => { + expect(res).to.have.status(204); + + return Setting.getSettings(); + }) + .then((settings) => { + expect(settings).to.have.property('moderation', 'post'); + }); + }); }); + }); diff --git a/tests/routes/api/stream/index.js b/tests/routes/api/stream/index.js index 2e419a8e1..2b86f00ff 100644 --- a/tests/routes/api/stream/index.js +++ b/tests/routes/api/stream/index.js @@ -13,9 +13,12 @@ const Asset = require('../../../../models/asset'); const Setting = require('../../../../models/setting'); -describe('api/stream: routes', () => { +describe('/api/v1/stream', () => { - const settings = {id: '1', moderation: 'pre'}; + const settings = { + id: '1', + moderation: 'pre' + }; const comments = [{ id: 'abc', @@ -35,7 +38,7 @@ describe('api/stream: routes', () => { asset_id: 'asset', author_id: '456', parent_id: '', - status: '' + status: 'accepted' }, { id: 'hij', body: 'comment 40', @@ -65,15 +68,26 @@ describe('api/stream: routes', () => { return Promise.all([ User.createLocalUsers(users), - Asset.findOrCreateByUrl('http://test.com') + Asset.findOrCreateByUrl('http://test.com'), + Asset + .findOrCreateByUrl('http://coralproject.net/asset2') + .then((asset) => { + return Asset + .overrideSettings(asset.id, {moderation: 'post'}) + .then(() => asset); + }) ]) - .then(([users, asset]) => { + .then(([users, asset1, asset2]) => { comments[0].author_id = users[0].id; comments[1].author_id = users[1].id; + comments[2].author_id = users[0].id; + comments[3].author_id = users[1].id; - comments[0].asset_id = asset.id; - comments[1].asset_id = asset.id; + comments[0].asset_id = asset1.id; + comments[1].asset_id = asset1.id; + comments[2].asset_id = asset2.id; + comments[3].asset_id = asset2.id; return Promise.all([ Comment.create(comments), @@ -83,17 +97,32 @@ describe('api/stream: routes', () => { }); }); - it('should return a stream with comments, users and actions for an existing asset', () => { - return chai.request(app) - .get('/api/v1/stream') - .query({'asset_url': 'http://test.com'}) - .then(res => { - expect(res).to.have.status(200); - expect(res.body.assets[0]).to.have.property('url'); - expect(res.body.comments[0]).to.have.property('body'); - expect(res.body.users[0]).to.have.property('displayName'); - expect(res.body.actions[0]).to.have.property('action_type'); - expect(res.body.settings).to.have.property('moderation'); - }); + describe('#get', () => { + it('should return a stream with comments, users and actions for an existing asset', () => { + return chai.request(app) + .get('/api/v1/stream') + .query({'asset_url': 'http://test.com'}) + .then(res => { + expect(res).to.have.status(200); + expect(res.body.assets.length).to.equal(1); + expect(res.body.comments.length).to.equal(2); + expect(res.body.users.length).to.equal(2); + expect(res.body.actions.length).to.equal(1); + expect(res.body.settings).to.have.property('moderation', 'pre'); + }); + }); + + it('should merge the settings when the asset contains settings to override it with', () => { + return chai.request(app) + .get('/api/v1/stream') + .query({'asset_url': 'http://coralproject.net/asset2'}) + .then((res) => { + expect(res).to.have.status(200); + expect(res.body.assets.length).to.equal(1); + expect(res.body.comments.length).to.equal(1); + expect(res.body.users.length).to.equal(1); + expect(res.body.settings).to.have.property('moderation', 'post'); + }); + }); }); });