diff --git a/src/socket.io/flags.js b/src/socket.io/flags.js
index 18294b2a8c..481fae3936 100644
--- a/src/socket.io/flags.js
+++ b/src/socket.io/flags.js
@@ -22,13 +22,15 @@ SocketFlags.update = async function (socket, data) {
}
// Old socket method took input directly from .serializeArray(), v3 expects fully-formed obj.
- let payload = {};
+ let payload = {
+ flagId: data.flagId,
+ };
payload = data.data.reduce((memo, cur) => {
memo[cur.name] = cur.value;
return memo;
}, payload);
- return api.flags.update(socket, payload);
+ return await api.flags.update(socket, payload);
};
SocketFlags.appendNote = async function (socket, data) {
diff --git a/test/flags.js b/test/flags.js
index 575f4139a0..071e0fd6c5 100644
--- a/test/flags.js
+++ b/test/flags.js
@@ -1,12 +1,16 @@
'use strict';
const assert = require('assert');
+const nconf = require('nconf');
const async = require('async');
+const request = require('request-promise-native');
const util = require('util');
const sleep = util.promisify(setTimeout);
const db = require('./mocks/databasemock');
+const helpers = require('./helpers');
+
const Flags = require('../src/flags');
const Categories = require('../src/categories');
const Topics = require('../src/topics');
@@ -697,34 +701,47 @@ describe('Flags', () => {
const SocketFlags = require('../src/socket.io/flags');
let pid;
let tid;
- before((done) => {
- Topics.post({
+ let jar;
+ let csrfToken;
+ before(async () => {
+ const login = util.promisify(helpers.loginUser);
+ jar = await login('testUser2', 'abcdef');
+ const config = await request({
+ url: `${nconf.get('url')}/api/config`,
+ json: true,
+ jar: jar,
+ });
+ csrfToken = config.csrf_token;
+
+ const result = await Topics.post({
cid: 1,
uid: 1,
title: 'Another topic',
content: 'This is flaggable content',
- }, (err, result) => {
- pid = result.postData.pid;
- tid = result.topicData.tid;
- done(err);
});
+ pid = result.postData.pid;
+ tid = result.topicData.tid;
});
describe('.create()', () => {
- it('should create a flag with no errors', (done) => {
- SocketFlags.create({ uid: 2 }, {
- type: 'post',
- id: pid,
- reason: 'foobar',
- }, (err) => {
- assert.ifError(err);
-
- Flags.exists('post', pid, 1, (err, exists) => {
- assert.ifError(err);
- assert(true);
- done();
- });
+ it('should create a flag with no errors', async () => {
+ await request({
+ method: 'post',
+ uri: `${nconf.get('url')}/api/v3/flags`,
+ jar,
+ headers: {
+ 'x-csrf-token': csrfToken,
+ },
+ body: {
+ type: 'post',
+ id: pid,
+ reason: 'foobar',
+ },
+ json: true,
});
+
+ const exists = await Flags.exists('post', pid, 2);
+ assert(exists);
});
it('should escape flag reason', async () => {
@@ -734,13 +751,22 @@ describe('Flags', () => {
content: 'This is flaggable content',
});
- const flagId = await SocketFlags.create({ uid: 2 }, {
- type: 'post',
- id: postData.pid,
- reason: '"',
+ const { response } = await request({
+ method: 'post',
+ uri: `${nconf.get('url')}/api/v3/flags`,
+ jar,
+ headers: {
+ 'x-csrf-token': csrfToken,
+ },
+ body: {
+ type: 'post',
+ id: postData.pid,
+ reason: '"',
+ },
+ json: true,
});
- const flagData = await Flags.get(flagId);
+ const flagData = await Flags.get(response.flagId);
assert.strictEqual(flagData.reports[0].value, '"<script>alert('ok');</script>');
});
@@ -755,29 +781,59 @@ describe('Flags', () => {
title: 'private topic',
content: 'private post',
});
- try {
- await SocketFlags.create({ uid: uid3 }, { type: 'post', id: result.postData.pid, reason: 'foobar' });
- } catch (err) {
- assert.equal(err.message, '[[error:no-privileges]]');
- }
+ const jar3 = await util.promisify(helpers.loginUser)('unprivileged', 'abcdef');
+ const config = await request({
+ url: `${nconf.get('url')}/api/config`,
+ json: true,
+ jar: jar3,
+ });
+ const csrfToken = config.csrf_token;
+ const { statusCode, body } = await request({
+ method: 'post',
+ uri: `${nconf.get('url')}/api/v3/flags`,
+ jar: jar3,
+ headers: {
+ 'x-csrf-token': csrfToken,
+ },
+ body: {
+ type: 'post',
+ id: result.postData.pid,
+ reason: 'foobar',
+ },
+ json: true,
+ simple: false,
+ resolveWithFullResponse: true,
+ });
+ assert.strictEqual(statusCode, 403);
+ assert.deepStrictEqual(body, {
+ status: {
+ code: 'forbidden',
+ message: 'You do not have enough privileges for this action.',
+ },
+ response: {},
+ });
});
});
describe('.update()', () => {
- it('should update a flag\'s properties', (done) => {
- SocketFlags.update({ uid: 2 }, {
- flagId: 2,
- data: [{
- name: 'state',
- value: 'wip',
- }],
- }, (err, history) => {
- assert.ifError(err);
- assert(Array.isArray(history));
- assert(history[0].fields.hasOwnProperty('state'));
- assert.strictEqual('[[flags:state-wip]]', history[0].fields.state);
- done();
+ it('should update a flag\'s properties', async () => {
+ const { response } = await request({
+ method: 'put',
+ uri: `${nconf.get('url')}/api/v3/flags/2`,
+ jar,
+ headers: {
+ 'x-csrf-token': csrfToken,
+ },
+ body: {
+ state: 'wip',
+ },
+ json: true,
});
+
+ const { history } = response;
+ assert(Array.isArray(history));
+ assert(history[0].fields.hasOwnProperty('state'));
+ assert.strictEqual('[[flags:state-wip]]', history[0].fields.state);
});
});