mirror of
https://github.com/wassname/talk.git
synced 2026-07-01 18:40:35 +08:00
346 lines
9.0 KiB
JavaScript
346 lines
9.0 KiB
JavaScript
const passport = require('../../../passport');
|
||
|
||
const app = require('../../../../app');
|
||
const chai = require('chai');
|
||
const expect = chai.expect;
|
||
|
||
// Setup chai.
|
||
chai.should();
|
||
chai.use(require('chai-http'));
|
||
|
||
const CommentModel = require('../../../../models/comment');
|
||
const ActionModel = require('../../../../models/action');
|
||
|
||
const CommentsService = require('../../../../services/comments');
|
||
const UsersService = require('../../../../services/users');
|
||
const SettingsService = require('../../../../services/settings');
|
||
|
||
const settings = {id: '1', moderation: 'PRE', wordlist: {banned: ['bad words'], suspect: ['suspect words']}};
|
||
|
||
describe('/api/v1/comments', () => {
|
||
|
||
// Ensure that the settings are always available.
|
||
beforeEach(() => SettingsService.init(settings));
|
||
|
||
describe('#get', () => {
|
||
const comments = [{
|
||
body: 'comment 10',
|
||
asset_id: 'asset',
|
||
author_id: '123'
|
||
}, {
|
||
body: 'comment 20',
|
||
asset_id: 'asset',
|
||
author_id: '456'
|
||
}, {
|
||
body: 'comment 20',
|
||
asset_id: 'asset',
|
||
author_id: '456',
|
||
status: 'REJECTED',
|
||
status_history: [{
|
||
type: 'REJECTED'
|
||
}]
|
||
}, {
|
||
body: 'comment 30',
|
||
asset_id: '456',
|
||
status: 'ACCEPTED',
|
||
status_history: [{
|
||
type: 'ACCEPTED'
|
||
}]
|
||
}];
|
||
|
||
const users = [{
|
||
displayName: 'Ana',
|
||
email: 'ana@gmail.com',
|
||
password: '123456789'
|
||
}, {
|
||
displayName: 'Maria',
|
||
email: 'maria@gmail.com',
|
||
password: '123456789'
|
||
}];
|
||
|
||
const actions = [{
|
||
action_type: 'FLAG',
|
||
item_id: 'abc',
|
||
item_type: 'COMMENTS'
|
||
}, {
|
||
action_type: 'LIKE',
|
||
item_id: 'hij',
|
||
item_type: 'COMMENTS'
|
||
}];
|
||
|
||
beforeEach(() => {
|
||
return Promise.all([
|
||
CommentModel.create(comments).then((newComments) => {
|
||
newComments.forEach((comment, i) => {
|
||
comments[i].id = comment.id;
|
||
});
|
||
|
||
actions[0].item_id = comments[0].id;
|
||
actions[1].item_id = comments[1].id;
|
||
|
||
return ActionModel.create(actions);
|
||
}),
|
||
UsersService.createLocalUsers(users)
|
||
]);
|
||
});
|
||
|
||
it('should return only the owner’s published comments if the user is not an admin', () => {
|
||
return chai.request(app)
|
||
.get('/api/v1/comments?user_id=456')
|
||
.set(passport.inject({id: '456', roles: []}))
|
||
.then(res => {
|
||
expect(res).to.have.status(200);
|
||
expect(res.body.comments).to.have.length(1);
|
||
expect(res.body.comments[0]).to.have.property('author_id', '456');
|
||
});
|
||
});
|
||
|
||
it('should fail if a non-admin requests comments not owned by them', () => {
|
||
return chai.request(app)
|
||
.get('/api/v1/comments?user_id=456')
|
||
.set(passport.inject({id: '123', roles: []}))
|
||
.then((res) => {
|
||
expect(res).to.be.empty;
|
||
})
|
||
.catch((err) => {
|
||
expect(err).to.have.status(401);
|
||
});
|
||
});
|
||
|
||
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).to.have.property('comments');
|
||
expect(res.body.comments).to.have.length(1);
|
||
expect(res.body.comments[0]).to.have.property('id', comments[2].id);
|
||
});
|
||
});
|
||
|
||
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.comments).to.have.length(1);
|
||
expect(res.body.comments[0]).to.have.property('id', comments[3].id);
|
||
});
|
||
});
|
||
|
||
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.comments).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.comments).to.have.length(1);
|
||
expect(res.body.comments[0]).to.have.property('id', comments[0].id);
|
||
});
|
||
});
|
||
});
|
||
});
|
||
|
||
describe('/api/v1/comments/: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: '123456789'
|
||
}, {
|
||
displayName: 'Maria',
|
||
email: 'maria@gmail.com',
|
||
password: '123456789'
|
||
}];
|
||
|
||
const actions = [{
|
||
action_type: 'FLAG',
|
||
item_id: 'abc',
|
||
item_type: 'COMMENTS'
|
||
}, {
|
||
action_type: 'LIKE',
|
||
item_id: 'hij',
|
||
item_type: 'COMMENTS'
|
||
}];
|
||
|
||
beforeEach(() => {
|
||
return SettingsService.init(settings).then(() => {
|
||
return Promise.all([
|
||
CommentModel.create(comments),
|
||
UsersService.createLocalUsers(users),
|
||
ActionModel.create(actions)
|
||
]);
|
||
});
|
||
});
|
||
|
||
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 CommentsService.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('/api/v1/comments/:comment_id/actions', () => {
|
||
|
||
const comments = [{
|
||
id: 'abc',
|
||
body: 'comment 10',
|
||
asset_id: 'asset',
|
||
author_id: '123',
|
||
status_history: []
|
||
}, {
|
||
id: 'def',
|
||
body: 'comment 20',
|
||
asset_id: 'asset',
|
||
author_id: '456',
|
||
status: 'REJECTED',
|
||
status_history: [{
|
||
type: 'REJECTED'
|
||
}]
|
||
}, {
|
||
id: 'hij',
|
||
body: 'comment 30',
|
||
asset_id: '456',
|
||
status: 'ACCEPTED',
|
||
status_history: [{
|
||
type: 'ACCEPTED'
|
||
}]
|
||
}];
|
||
|
||
const users = [{
|
||
displayName: 'Ana',
|
||
email: 'ana@gmail.com',
|
||
password: '123456789'
|
||
}, {
|
||
displayName: 'Maria',
|
||
email: 'maria@gmail.com',
|
||
password: '123456789'
|
||
}];
|
||
|
||
const actions = [{
|
||
action_type: 'FLAG',
|
||
item_type: 'COMMENTS',
|
||
item_id: 'abc'
|
||
}, {
|
||
action_type: 'LIKE',
|
||
item_type: 'COMMENTS',
|
||
item_id: 'hij'
|
||
}];
|
||
|
||
beforeEach(() => {
|
||
return SettingsService.init(settings).then(() => {
|
||
return Promise.all([
|
||
CommentModel.create(comments),
|
||
UsersService.createLocalUsers(users),
|
||
ActionModel.create(actions)
|
||
]);
|
||
});
|
||
});
|
||
|
||
describe('#post', () => {
|
||
it('it should create an action', () => {
|
||
return chai.request(app)
|
||
.post('/api/v1/comments/abc/actions')
|
||
.set(passport.inject({id: '456', roles: ['ADMIN']}))
|
||
.send({'action_type': 'flag', 'metadata': {'reason': 'Comment is too awesome.'}})
|
||
.then((res) => {
|
||
expect(res).to.have.status(201);
|
||
expect(res).to.have.body;
|
||
|
||
expect(res.body).to.have.property('action_type', 'flag');
|
||
expect(res.body).to.have.property('metadata');
|
||
expect(res.body.metadata).to.deep.equal({'reason': 'Comment is too awesome.'});
|
||
expect(res.body).to.have.property('item_id', 'abc');
|
||
});
|
||
});
|
||
});
|
||
});
|