| 
									
										
										
										
											2016-11-25 15:09:52 -05:00
										 |  |  | 'use strict'; | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-01 13:32:20 -04:00
										 |  |  | const assert = require('assert'); | 
					
						
							|  |  |  | const async = require('async'); | 
					
						
							|  |  |  | const util = require('util'); | 
					
						
							|  |  |  | const sleep = util.promisify(setTimeout); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const db = require('./mocks/databasemock'); | 
					
						
							|  |  |  | const Flags = require('../src/flags'); | 
					
						
							|  |  |  | const Categories = require('../src/categories'); | 
					
						
							|  |  |  | const Topics = require('../src/topics'); | 
					
						
							|  |  |  | const Posts = require('../src/posts'); | 
					
						
							|  |  |  | const User = require('../src/user'); | 
					
						
							|  |  |  | const Groups = require('../src/groups'); | 
					
						
							|  |  |  | const Meta = require('../src/meta'); | 
					
						
							|  |  |  | const Privileges = require('../src/privileges'); | 
					
						
							| 
									
										
										
										
											2016-11-25 15:09:52 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe('Flags', function () { | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 	let uid1; | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 	let adminUid; | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 	let uid3; | 
					
						
							|  |  |  | 	let category; | 
					
						
							|  |  |  | 	before(async () => { | 
					
						
							| 
									
										
										
										
											2016-11-25 15:09:52 -05:00
										 |  |  | 		// Create some stuff to flag
 | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 		uid1 = await User.create({ username: 'testUser', password: 'abcdef', email: 'b@c.com' }); | 
					
						
							| 
									
										
										
										
											2016-11-25 15:09:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 		adminUid = await User.create({ username: 'testUser2', password: 'abcdef', email: 'c@d.com' }); | 
					
						
							|  |  |  | 		await Groups.join('administrators', adminUid); | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		category = await Categories.create({ | 
					
						
							|  |  |  | 			name: 'test category', | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		await Topics.post({ | 
					
						
							|  |  |  | 			cid: category.cid, | 
					
						
							|  |  |  | 			uid: uid1, | 
					
						
							|  |  |  | 			title: 'Topic to flag', | 
					
						
							|  |  |  | 			content: 'This is flaggable content', | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		uid3 = await User.create({ | 
					
						
							|  |  |  | 			username: 'unprivileged', password: 'abcdef', email: 'd@e.com', | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-11-25 15:09:52 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	describe('.create()', function () { | 
					
						
							|  |  |  | 		it('should create a flag and return its data', function (done) { | 
					
						
							|  |  |  | 			Flags.create('post', 1, 1, 'Test flag', function (err, flagData) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				var compare = { | 
					
						
							|  |  |  | 					flagId: 1, | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							|  |  |  | 					targetId: 1, | 
					
						
							|  |  |  | 					type: 'post', | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					description: 'Test flag', | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2017-11-02 08:58:51 -04:00
										 |  |  | 				assert(flagData); | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				for (var key in compare) { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					if (compare.hasOwnProperty(key)) { | 
					
						
							| 
									
										
										
										
											2017-11-02 08:58:51 -04:00
										 |  |  | 						assert.ok(flagData[key], 'undefined key ' + key); | 
					
						
							| 
									
										
										
										
											2016-12-19 12:31:55 -05:00
										 |  |  | 						assert.equal(flagData[key], compare[key]); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		it('should add the flag to the byCid zset for category 1 if it is of type post', function (done) { | 
					
						
							|  |  |  | 			db.isSortedSetMember('flags:byCid:' + 1, 1, function (err, isMember) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.ok(isMember); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-12 11:31:59 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		it('should add the flag to the byPid zset for pid 1 if it is of type post', function (done) { | 
					
						
							|  |  |  | 			db.isSortedSetMember('flags:byPid:' + 1, 1, function (err, isMember) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.ok(isMember); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-19 11:16:03 -05:00
										 |  |  | 	describe('.exists()', function () { | 
					
						
							|  |  |  | 		it('should return Boolean True if a flag matching the flag hash already exists', function (done) { | 
					
						
							|  |  |  | 			Flags.exists('post', 1, 1, function (err, exists) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.strictEqual(true, exists); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should return Boolean False if a flag matching the flag hash does not already exists', function (done) { | 
					
						
							|  |  |  | 			Flags.exists('post', 1, 2, function (err, exists) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.strictEqual(false, exists); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	describe('.targetExists()', function () { | 
					
						
							|  |  |  | 		it('should return Boolean True if the targeted element exists', function (done) { | 
					
						
							|  |  |  | 			Flags.targetExists('post', 1, function (err, exists) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.strictEqual(true, exists); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should return Boolean False if the targeted element does not exist', function (done) { | 
					
						
							|  |  |  | 			Flags.targetExists('post', 15, function (err, exists) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.strictEqual(false, exists); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	describe('.get()', function () { | 
					
						
							|  |  |  | 		it('should retrieve and display a flag\'s data', function (done) { | 
					
						
							|  |  |  | 			Flags.get(1, function (err, flagData) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				var compare = { | 
					
						
							|  |  |  | 					flagId: 1, | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							|  |  |  | 					targetId: 1, | 
					
						
							|  |  |  | 					type: 'post', | 
					
						
							|  |  |  | 					description: 'Test flag', | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					state: 'open', | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2017-11-02 08:58:51 -04:00
										 |  |  | 				assert(flagData); | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				for (var key in compare) { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					if (compare.hasOwnProperty(key)) { | 
					
						
							| 
									
										
										
										
											2017-11-02 08:58:51 -04:00
										 |  |  | 						assert.ok(flagData[key], 'undefined key ' + key); | 
					
						
							| 
									
										
										
										
											2016-12-19 12:31:55 -05:00
										 |  |  | 						assert.equal(flagData[key], compare[key]); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	describe('.list()', function () { | 
					
						
							|  |  |  | 		it('should show a list of flags (with one item)', function (done) { | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 			Flags.list({}, 1, function (err, payload) { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 				assert.ok(payload.hasOwnProperty('flags')); | 
					
						
							|  |  |  | 				assert.ok(payload.hasOwnProperty('page')); | 
					
						
							|  |  |  | 				assert.ok(payload.hasOwnProperty('pageCount')); | 
					
						
							|  |  |  | 				assert.ok(Array.isArray(payload.flags)); | 
					
						
							|  |  |  | 				assert.equal(payload.flags.length, 1); | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 				Flags.get(payload.flags[0].flagId, function (err, flagData) { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 					assert.equal(payload.flags[0].flagId, flagData.flagId); | 
					
						
							|  |  |  | 					assert.equal(payload.flags[0].description, flagData.description); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-14 15:00:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 		describe('(with filters)', function () { | 
					
						
							|  |  |  | 			it('should return a filtered list of flags if said filters are passed in', function (done) { | 
					
						
							|  |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					state: 'open', | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 				}, 1, function (err, payload) { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 					assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 					assert.ok(payload.hasOwnProperty('flags')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('page')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('pageCount')); | 
					
						
							|  |  |  | 					assert.ok(Array.isArray(payload.flags)); | 
					
						
							|  |  |  | 					assert.strictEqual(1, parseInt(payload.flags[0].flagId, 10)); | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			it('should return no flags if a filter with no matching flags is used', function (done) { | 
					
						
							|  |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					state: 'rejected', | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 				}, 1, function (err, payload) { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 					assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 					assert.ok(payload.hasOwnProperty('flags')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('page')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('pageCount')); | 
					
						
							|  |  |  | 					assert.ok(Array.isArray(payload.flags)); | 
					
						
							|  |  |  | 					assert.strictEqual(0, payload.flags.length); | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			it('should return a flag when filtered by cid 1', function (done) { | 
					
						
							|  |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					cid: 1, | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 				}, 1, function (err, payload) { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 					assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 					assert.ok(payload.hasOwnProperty('flags')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('page')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('pageCount')); | 
					
						
							|  |  |  | 					assert.ok(Array.isArray(payload.flags)); | 
					
						
							|  |  |  | 					assert.strictEqual(1, payload.flags.length); | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			it('shouldn\'t return a flag when filtered by cid 2', function (done) { | 
					
						
							|  |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					cid: 2, | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 				}, 1, function (err, payload) { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 					assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 					assert.ok(payload.hasOwnProperty('flags')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('page')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('pageCount')); | 
					
						
							|  |  |  | 					assert.ok(Array.isArray(payload.flags)); | 
					
						
							|  |  |  | 					assert.strictEqual(0, payload.flags.length); | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2016-12-14 15:00:41 -05:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2017-01-03 13:38:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			it('should return a flag when filtered by both cid 1 and 2', function (done) { | 
					
						
							|  |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					cid: [1, 2], | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 				}, 1, function (err, payload) { | 
					
						
							| 
									
										
										
										
											2017-01-03 13:38:06 -05:00
										 |  |  | 					assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 					assert.ok(payload.hasOwnProperty('flags')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('page')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('pageCount')); | 
					
						
							|  |  |  | 					assert.ok(Array.isArray(payload.flags)); | 
					
						
							|  |  |  | 					assert.strictEqual(1, payload.flags.length); | 
					
						
							| 
									
										
										
										
											2017-01-03 13:38:06 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			it('should return one flag if filtered by both cid 1 and 2 and open state', function (done) { | 
					
						
							|  |  |  | 				Flags.list({ | 
					
						
							|  |  |  | 					cid: [1, 2], | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					state: 'open', | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 				}, 1, function (err, payload) { | 
					
						
							| 
									
										
										
										
											2017-01-03 13:38:06 -05:00
										 |  |  | 					assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 					assert.ok(payload.hasOwnProperty('flags')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('page')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('pageCount')); | 
					
						
							|  |  |  | 					assert.ok(Array.isArray(payload.flags)); | 
					
						
							|  |  |  | 					assert.strictEqual(1, payload.flags.length); | 
					
						
							| 
									
										
										
										
											2017-01-03 13:38:06 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			it('should return no flag if filtered by both cid 1 and 2 and non-open state', function (done) { | 
					
						
							|  |  |  | 				Flags.list({ | 
					
						
							|  |  |  | 					cid: [1, 2], | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					state: 'resolved', | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 				}, 1, function (err, payload) { | 
					
						
							| 
									
										
										
										
											2017-01-03 13:38:06 -05:00
										 |  |  | 					assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2018-03-09 14:31:59 -05:00
										 |  |  | 					assert.ok(payload.hasOwnProperty('flags')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('page')); | 
					
						
							|  |  |  | 					assert.ok(payload.hasOwnProperty('pageCount')); | 
					
						
							|  |  |  | 					assert.ok(Array.isArray(payload.flags)); | 
					
						
							|  |  |  | 					assert.strictEqual(0, payload.flags.length); | 
					
						
							| 
									
										
										
										
											2017-01-03 13:38:06 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2016-12-14 15:00:41 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	describe('.update()', function () { | 
					
						
							|  |  |  | 		it('should alter a flag\'s various attributes and persist them to the database', function (done) { | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 			Flags.update(1, adminUid, { | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				state: 'wip', | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 				assignee: adminUid, | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 			}, function (err) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				db.getObjectFields('flag:1', ['state', 'assignee'], function (err, data) { | 
					
						
							|  |  |  | 					if (err) { | 
					
						
							|  |  |  | 						throw err; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					assert.strictEqual('wip', data.state); | 
					
						
							| 
									
										
										
										
											2016-12-19 12:31:55 -05:00
										 |  |  | 					assert.ok(!isNaN(parseInt(data.assignee, 10))); | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 					assert.strictEqual(adminUid, parseInt(data.assignee, 10)); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should persist to the flag\'s history', function (done) { | 
					
						
							|  |  |  | 			Flags.getHistory(1, function (err, history) { | 
					
						
							|  |  |  | 				if (err) { | 
					
						
							|  |  |  | 					throw err; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				history.forEach(function (change) { | 
					
						
							|  |  |  | 					switch (change.attribute) { | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					case 'state': | 
					
						
							|  |  |  | 						assert.strictEqual('[[flags:state-wip]]', change.value); | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					case 'assignee': | 
					
						
							|  |  |  | 						assert.strictEqual(1, change.value); | 
					
						
							|  |  |  | 						break; | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		it('should allow assignment if user is an admin and do nothing otherwise', async () => { | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 			await Flags.update(1, adminUid, { | 
					
						
							|  |  |  | 				assignee: adminUid, | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 			let assignee = await db.getObjectField('flag:1', 'assignee'); | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 			assert.strictEqual(adminUid, parseInt(assignee, 10)); | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 			await Flags.update(1, adminUid, { | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 				assignee: uid3, | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			assignee = await db.getObjectField('flag:1', 'assignee'); | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 			assert.strictEqual(adminUid, parseInt(assignee, 10)); | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should allow assignment if user is a global mod and do nothing otherwise', async () => { | 
					
						
							|  |  |  | 			await Groups.join('Global Moderators', uid3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			await Flags.update(1, uid3, { | 
					
						
							|  |  |  | 				assignee: uid3, | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			let assignee = await db.getObjectField('flag:1', 'assignee'); | 
					
						
							|  |  |  | 			assert.strictEqual(uid3, parseInt(assignee, 10)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			await Flags.update(1, uid3, { | 
					
						
							|  |  |  | 				assignee: uid1, | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			assignee = await db.getObjectField('flag:1', 'assignee'); | 
					
						
							|  |  |  | 			assert.strictEqual(uid3, parseInt(assignee, 10)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			await Groups.leave('Global Moderators', uid3); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should allow assignment if user is a mod of the category, do nothing otherwise', async () => { | 
					
						
							|  |  |  | 			await Groups.join('cid:' + category.cid + ':privileges:moderate', uid3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			await Flags.update(1, uid3, { | 
					
						
							|  |  |  | 				assignee: uid3, | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			let assignee = await db.getObjectField('flag:1', 'assignee'); | 
					
						
							|  |  |  | 			assert.strictEqual(uid3, parseInt(assignee, 10)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			await Flags.update(1, uid3, { | 
					
						
							|  |  |  | 				assignee: uid1, | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			assignee = await db.getObjectField('flag:1', 'assignee'); | 
					
						
							|  |  |  | 			assert.strictEqual(uid3, parseInt(assignee, 10)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			await Groups.leave('cid:' + category.cid + ':privileges:moderate', uid3); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should do nothing when you attempt to set a bogus state', async () => { | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 			await Flags.update(1, adminUid, { | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 				state: 'hocus pocus', | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			const state = await db.getObjectField('flag:1', 'state'); | 
					
						
							|  |  |  | 			assert.strictEqual('wip', state); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2020-05-01 13:32:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		it('should rescind notification if flag is resolved', async () => { | 
					
						
							|  |  |  | 			const SocketFlags = require('../src/socket.io/flags.js'); | 
					
						
							|  |  |  | 			const result = await Topics.post({ | 
					
						
							|  |  |  | 				cid: category.cid, | 
					
						
							|  |  |  | 				uid: uid3, | 
					
						
							|  |  |  | 				title: 'Topic to flag', | 
					
						
							|  |  |  | 				content: 'This is flaggable content', | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 			const flagId = await SocketFlags.create({ uid: uid1 }, { type: 'post', id: result.postData.pid, reason: 'spam' }); | 
					
						
							|  |  |  | 			await sleep(2000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			let userNotifs = await User.notifications.getAll(adminUid); | 
					
						
							|  |  |  | 			assert(userNotifs.includes('flag:post:' + result.postData.pid + ':uid:' + uid1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			await Flags.update(flagId, adminUid, { | 
					
						
							|  |  |  | 				state: 'resolved', | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			userNotifs = await User.notifications.getAll(adminUid); | 
					
						
							|  |  |  | 			assert(!userNotifs.includes('flag:post:' + result.postData.pid + ':uid:' + uid1)); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	describe('.getTarget()', function () { | 
					
						
							|  |  |  | 		it('should return a post\'s data if queried with type "post"', function (done) { | 
					
						
							|  |  |  | 			Flags.getTarget('post', 1, 1, function (err, data) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				var compare = { | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							|  |  |  | 					pid: 1, | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					content: 'This is flaggable content', | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				for (var key in compare) { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					if (compare.hasOwnProperty(key)) { | 
					
						
							|  |  |  | 						assert.ok(data[key]); | 
					
						
							| 
									
										
										
										
											2016-12-19 12:31:55 -05:00
										 |  |  | 						assert.equal(data[key], compare[key]); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should return a user\'s data if queried with type "user"', function (done) { | 
					
						
							|  |  |  | 			Flags.getTarget('user', 1, 1, function (err, data) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				var compare = { | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							|  |  |  | 					username: 'testUser', | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					email: 'b@c.com', | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				for (var key in compare) { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					if (compare.hasOwnProperty(key)) { | 
					
						
							|  |  |  | 						assert.ok(data[key]); | 
					
						
							| 
									
										
										
										
											2016-12-19 12:31:55 -05:00
										 |  |  | 						assert.equal(data[key], compare[key]); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-19 11:16:03 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		it('should return a plain object with no properties if the target no longer exists', function (done) { | 
					
						
							|  |  |  | 			Flags.getTarget('user', 15, 1, function (err, data) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.strictEqual(0, Object.keys(data).length); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	describe('.validate()', function () { | 
					
						
							|  |  |  | 		it('should error out if type is post and post is deleted', function (done) { | 
					
						
							|  |  |  | 			Posts.delete(1, 1, function (err) { | 
					
						
							|  |  |  | 				if (err) { | 
					
						
							|  |  |  | 					throw err; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Flags.validate({ | 
					
						
							|  |  |  | 					type: 'post', | 
					
						
							|  |  |  | 					id: 1, | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					uid: 1, | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}, function (err) { | 
					
						
							|  |  |  | 					assert.ok(err); | 
					
						
							|  |  |  | 					assert.strictEqual('[[error:post-deleted]]', err.message); | 
					
						
							|  |  |  | 					Posts.restore(1, 1, done); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should not pass validation if flag threshold is set and user rep does not meet it', function (done) { | 
					
						
							| 
									
										
										
										
											2018-01-12 17:29:47 -05:00
										 |  |  | 			Meta.configs.set('min:rep:flag', '50', function (err) { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Flags.validate({ | 
					
						
							|  |  |  | 					type: 'post', | 
					
						
							|  |  |  | 					id: 1, | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					uid: 3, | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}, function (err) { | 
					
						
							|  |  |  | 					assert.ok(err); | 
					
						
							|  |  |  | 					assert.strictEqual('[[error:not-enough-reputation-to-flag]]', err.message); | 
					
						
							| 
									
										
										
										
											2018-01-12 17:29:47 -05:00
										 |  |  | 					Meta.configs.set('min:rep:flag', 0, done); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2018-12-09 15:25:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		it('should not error if user blocked target', function (done) { | 
					
						
							|  |  |  | 			var SocketFlags = require('../src/socket.io/flags.js'); | 
					
						
							|  |  |  | 			var reporterUid; | 
					
						
							|  |  |  | 			var reporteeUid; | 
					
						
							|  |  |  | 			async.waterfall([ | 
					
						
							|  |  |  | 				function (next) { | 
					
						
							|  |  |  | 					User.create({ username: 'reporter' }, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function (uid, next) { | 
					
						
							|  |  |  | 					reporterUid = uid; | 
					
						
							|  |  |  | 					User.create({ username: 'reportee' }, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function (uid, next) { | 
					
						
							|  |  |  | 					reporteeUid = uid; | 
					
						
							|  |  |  | 					User.blocks.add(reporteeUid, reporterUid, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function (next) { | 
					
						
							|  |  |  | 					Topics.post({ | 
					
						
							|  |  |  | 						cid: 1, | 
					
						
							|  |  |  | 						uid: reporteeUid, | 
					
						
							|  |  |  | 						title: 'Another topic', | 
					
						
							|  |  |  | 						content: 'This is flaggable content', | 
					
						
							|  |  |  | 					}, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				function (data, next) { | 
					
						
							|  |  |  | 					SocketFlags.create({ uid: reporterUid }, { type: 'post', id: data.postData.pid, reason: 'spam' }, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			], done); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should send back error if reporter does not exist', function (done) { | 
					
						
							|  |  |  | 			Flags.validate({ uid: 123123123, id: 1, type: 'post' }, function (err) { | 
					
						
							|  |  |  | 				assert.equal(err.message, '[[error:no-user]]'); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	describe('.appendNote()', function () { | 
					
						
							|  |  |  | 		it('should add a note to a flag', function (done) { | 
					
						
							|  |  |  | 			Flags.appendNote(1, 1, 'this is my note', function (err) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				db.getSortedSetRange('flag:1:notes', 0, -1, function (err, notes) { | 
					
						
							|  |  |  | 					if (err) { | 
					
						
							|  |  |  | 						throw err; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					assert.strictEqual('[1,"this is my note"]', notes[0]); | 
					
						
							| 
									
										
										
										
											2019-07-23 21:11:04 -04:00
										 |  |  | 					setTimeout(done, 10); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should be a JSON string', function (done) { | 
					
						
							|  |  |  | 			db.getSortedSetRange('flag:1:notes', 0, -1, function (err, notes) { | 
					
						
							|  |  |  | 				if (err) { | 
					
						
							|  |  |  | 					throw err; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				try { | 
					
						
							|  |  |  | 					JSON.parse(notes[0]); | 
					
						
							|  |  |  | 				} catch (e) { | 
					
						
							|  |  |  | 					assert.ifError(e); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	describe('.getNotes()', function () { | 
					
						
							|  |  |  | 		before(function (done) { | 
					
						
							|  |  |  | 			// Add a second note
 | 
					
						
							|  |  |  | 			Flags.appendNote(1, 1, 'this is the second note', done); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('return should match a predefined spec', function (done) { | 
					
						
							|  |  |  | 			Flags.getNotes(1, function (err, notes) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				var compare = { | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					content: 'this is my note', | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				var data = notes[1]; | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				for (var key in compare) { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					if (compare.hasOwnProperty(key)) { | 
					
						
							|  |  |  | 						assert.ok(data[key]); | 
					
						
							|  |  |  | 						assert.strictEqual(data[key], compare[key]); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should retrieve a list of notes, from newest to oldest', function (done) { | 
					
						
							|  |  |  | 			Flags.getNotes(1, function (err, notes) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2017-11-05 10:16:02 -05:00
										 |  |  | 				assert(notes[0].datetime > notes[1].datetime, notes[0].datetime + '-' + notes[1].datetime); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.strictEqual('this is the second note', notes[0].content); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	describe('.appendHistory()', function () { | 
					
						
							|  |  |  | 		var entries; | 
					
						
							|  |  |  | 		before(function (done) { | 
					
						
							|  |  |  | 			db.sortedSetCard('flag:1:history', function (err, count) { | 
					
						
							|  |  |  | 				entries = count; | 
					
						
							|  |  |  | 				done(err); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		it('should add a new entry into a flag\'s history', function (done) { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:00:41 -05:00
										 |  |  | 			Flags.appendHistory(1, 1, { | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				state: 'rejected', | 
					
						
							| 
									
										
										
										
											2016-12-14 15:00:41 -05:00
										 |  |  | 			}, function (err) { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Flags.getHistory(1, function (err, history) { | 
					
						
							|  |  |  | 					if (err) { | 
					
						
							|  |  |  | 						throw err; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					assert.strictEqual(entries + 1, history.length); | 
					
						
							|  |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	describe('.getHistory()', function () { | 
					
						
							|  |  |  | 		it('should retrieve a flag\'s history', function (done) { | 
					
						
							|  |  |  | 			Flags.getHistory(1, function (err, history) { | 
					
						
							|  |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2016-12-14 15:00:41 -05:00
										 |  |  | 				assert.strictEqual(history[0].fields.state, '[[flags:state-rejected]]'); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	describe('(websockets)', function () { | 
					
						
							|  |  |  | 		var SocketFlags = require('../src/socket.io/flags.js'); | 
					
						
							| 
									
										
										
										
											2017-02-24 12:55:07 -05:00
										 |  |  | 		var pid; | 
					
						
							| 
									
										
										
										
											2016-12-01 09:24:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 		before(function (done) { | 
					
						
							|  |  |  | 			Topics.post({ | 
					
						
							|  |  |  | 				cid: 1, | 
					
						
							|  |  |  | 				uid: 1, | 
					
						
							|  |  |  | 				title: 'Another topic', | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				content: 'This is flaggable content', | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 			}, function (err, topic) { | 
					
						
							|  |  |  | 				pid = topic.postData.pid; | 
					
						
							| 
									
										
										
										
											2016-12-01 09:24:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 				done(err); | 
					
						
							| 
									
										
										
										
											2016-12-01 09:24:49 -05:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 		describe('.create()', function () { | 
					
						
							|  |  |  | 			it('should create a flag with no errors', function (done) { | 
					
						
							|  |  |  | 				SocketFlags.create({ uid: 2 }, { | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 					type: 'post', | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 					id: pid, | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					reason: 'foobar', | 
					
						
							| 
									
										
										
										
											2020-01-23 12:48:21 -05:00
										 |  |  | 				}, function (err) { | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 					assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 					Flags.exists('post', pid, 1, function (err, exists) { | 
					
						
							|  |  |  | 						assert.ifError(err); | 
					
						
							|  |  |  | 						assert(true); | 
					
						
							|  |  |  | 						done(); | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			it('should not allow flagging post in private category', async function () { | 
					
						
							|  |  |  | 				const category = await Categories.create({ name: 'private category' }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				await Privileges.categories.rescind(['topics:read'], category.cid, 'registered-users'); | 
					
						
							|  |  |  | 				const result = await Topics.post({ | 
					
						
							|  |  |  | 					cid: category.cid, | 
					
						
							|  |  |  | 					uid: adminUid, | 
					
						
							|  |  |  | 					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]]'); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 		describe('.update()', function () { | 
					
						
							|  |  |  | 			it('should update a flag\'s properties', function (done) { | 
					
						
							|  |  |  | 				SocketFlags.update({ uid: 2 }, { | 
					
						
							| 
									
										
										
										
											2016-12-19 12:31:55 -05:00
										 |  |  | 					flagId: 2, | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 					data: [{ | 
					
						
							|  |  |  | 						name: 'state', | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 						value: 'wip', | 
					
						
							|  |  |  | 					}], | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 				}, function (err, history) { | 
					
						
							|  |  |  | 					assert.ifError(err); | 
					
						
							|  |  |  | 					assert(Array.isArray(history)); | 
					
						
							|  |  |  | 					assert(history[0].fields.hasOwnProperty('state')); | 
					
						
							|  |  |  | 					assert.strictEqual('[[flags:state-wip]]', history[0].fields.state); | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 		describe('.appendNote()', function () { | 
					
						
							|  |  |  | 			it('should append a note to the flag', function (done) { | 
					
						
							|  |  |  | 				SocketFlags.appendNote({ uid: 2 }, { | 
					
						
							| 
									
										
										
										
											2016-12-19 12:31:55 -05:00
										 |  |  | 					flagId: 2, | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					note: 'lorem ipsum dolor sit amet', | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 				}, function (err, data) { | 
					
						
							| 
									
										
										
										
											2016-12-19 09:50:46 -05:00
										 |  |  | 					assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 					assert(data.hasOwnProperty('notes')); | 
					
						
							|  |  |  | 					assert(Array.isArray(data.notes)); | 
					
						
							|  |  |  | 					assert.strictEqual('lorem ipsum dolor sit amet', data.notes[0].content); | 
					
						
							|  |  |  | 					assert.strictEqual(2, data.notes[0].uid); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					assert(data.hasOwnProperty('history')); | 
					
						
							|  |  |  | 					assert(Array.isArray(data.history)); | 
					
						
							|  |  |  | 					assert.strictEqual(1, Object.keys(data.history[0].fields).length); | 
					
						
							|  |  |  | 					assert(data.history[0].fields.hasOwnProperty('notes')); | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2016-11-25 15:09:52 -05:00
										 |  |  | }); |