| 
									
										
										
										
											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'); | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | const nconf = require('nconf'); | 
					
						
							| 
									
										
										
										
											2020-05-01 13:32:20 -04:00
										 |  |  | const async = require('async'); | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | const request = require('request-promise-native'); | 
					
						
							| 
									
										
										
										
											2020-05-01 13:32:20 -04:00
										 |  |  | const util = require('util'); | 
					
						
							| 
									
										
										
										
											2021-02-03 23:53:16 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-01 13:32:20 -04:00
										 |  |  | const sleep = util.promisify(setTimeout); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const db = require('./mocks/databasemock'); | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | const helpers = require('./helpers'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-01 13:32:20 -04:00
										 |  |  | 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | describe('Flags', () => { | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.create()', () => { | 
					
						
							|  |  |  | 		it('should create a flag and return its data', (done) => { | 
					
						
							|  |  |  | 			Flags.create('post', 1, 1, 'Test flag', (err, flagData) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2021-02-04 00:06:15 -07:00
										 |  |  | 				const compare = { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					flagId: 1, | 
					
						
							|  |  |  | 					targetId: 1, | 
					
						
							|  |  |  | 					type: 'post', | 
					
						
							| 
									
										
										
										
											2020-07-24 14:10:37 -04:00
										 |  |  | 					state: 'open', | 
					
						
							|  |  |  | 					target_readable: 'Post 1', | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2017-11-02 08:58:51 -04:00
										 |  |  | 				assert(flagData); | 
					
						
							| 
									
										
										
										
											2021-02-04 01:34:30 -07:00
										 |  |  | 				for (const key of Object.keys(compare)) { | 
					
						
							|  |  |  | 					assert.ok(flagData[key], `undefined key ${key}`); | 
					
						
							|  |  |  | 					assert.equal(flagData[key], compare[key]); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should add the flag to the byCid zset for category 1 if it is of type post', (done) => { | 
					
						
							|  |  |  | 			db.isSortedSetMember(`flags:byCid:${1}`, 1, (err, isMember) => { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.ok(isMember); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-12 11:31:59 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should add the flag to the byPid zset for pid 1 if it is of type post', (done) => { | 
					
						
							|  |  |  | 			db.isSortedSetMember(`flags:byPid:${1}`, 1, (err, isMember) => { | 
					
						
							| 
									
										
										
										
											2017-01-12 11:31:59 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.ok(isMember); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.exists()', () => { | 
					
						
							|  |  |  | 		it('should return Boolean True if a flag matching the flag hash already exists', (done) => { | 
					
						
							|  |  |  | 			Flags.exists('post', 1, 1, (err, exists) => { | 
					
						
							| 
									
										
										
										
											2016-12-19 11:16:03 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.strictEqual(true, exists); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should return Boolean False if a flag matching the flag hash does not already exists', (done) => { | 
					
						
							|  |  |  | 			Flags.exists('post', 1, 2, (err, exists) => { | 
					
						
							| 
									
										
										
										
											2016-12-19 11:16:03 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.strictEqual(false, exists); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.targetExists()', () => { | 
					
						
							|  |  |  | 		it('should return Boolean True if the targeted element exists', (done) => { | 
					
						
							|  |  |  | 			Flags.targetExists('post', 1, (err, exists) => { | 
					
						
							| 
									
										
										
										
											2016-12-19 11:16:03 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.strictEqual(true, exists); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should return Boolean False if the targeted element does not exist', (done) => { | 
					
						
							|  |  |  | 			Flags.targetExists('post', 15, (err, exists) => { | 
					
						
							| 
									
										
										
										
											2016-12-19 11:16:03 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.strictEqual(false, exists); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.get()', () => { | 
					
						
							|  |  |  | 		it('should retrieve and display a flag\'s data', (done) => { | 
					
						
							|  |  |  | 			Flags.get(1, (err, flagData) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2021-02-04 00:06:15 -07:00
										 |  |  | 				const compare = { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					flagId: 1, | 
					
						
							|  |  |  | 					targetId: 1, | 
					
						
							|  |  |  | 					type: 'post', | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					state: 'open', | 
					
						
							| 
									
										
										
										
											2020-07-24 14:10:37 -04:00
										 |  |  | 					target_readable: 'Post 1', | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2017-11-02 08:58:51 -04:00
										 |  |  | 				assert(flagData); | 
					
						
							| 
									
										
										
										
											2021-02-04 01:34:30 -07:00
										 |  |  | 				for (const key of Object.keys(compare)) { | 
					
						
							|  |  |  | 					assert.ok(flagData[key], `undefined key ${key}`); | 
					
						
							|  |  |  | 					assert.equal(flagData[key], compare[key]); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.list()', () => { | 
					
						
							|  |  |  | 		it('should show a list of flags (with one item)', (done) => { | 
					
						
							| 
									
										
										
										
											2020-08-19 08:38:09 -04:00
										 |  |  | 			Flags.list({ | 
					
						
							|  |  |  | 				filters: {}, | 
					
						
							|  |  |  | 				uid: 1, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 			}, (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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				Flags.get(payload.flags[0].flagId, (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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		describe('(with filters)', () => { | 
					
						
							|  |  |  | 			it('should return a filtered list of flags if said filters are passed in', (done) => { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2020-08-19 08:38:09 -04:00
										 |  |  | 					filters: { | 
					
						
							|  |  |  | 						state: 'open', | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				}, (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(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 			it('should return no flags if a filter with no matching flags is used', (done) => { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2020-08-19 08:38:09 -04:00
										 |  |  | 					filters: { | 
					
						
							|  |  |  | 						state: 'rejected', | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				}, (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(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 			it('should return a flag when filtered by cid 1', (done) => { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2020-08-19 08:38:09 -04:00
										 |  |  | 					filters: { | 
					
						
							|  |  |  | 						cid: 1, | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				}, (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(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 			it('shouldn\'t return a flag when filtered by cid 2', (done) => { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:53:57 -05:00
										 |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2020-08-19 08:38:09 -04:00
										 |  |  | 					filters: { | 
					
						
							|  |  |  | 						cid: 2, | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				}, (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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 			it('should return a flag when filtered by both cid 1 and 2', (done) => { | 
					
						
							| 
									
										
										
										
											2017-01-03 13:38:06 -05:00
										 |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2020-08-19 08:38:09 -04:00
										 |  |  | 					filters: { | 
					
						
							|  |  |  | 						cid: [1, 2], | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				}, (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(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 			it('should return one flag if filtered by both cid 1 and 2 and open state', (done) => { | 
					
						
							| 
									
										
										
										
											2017-01-03 13:38:06 -05:00
										 |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2020-08-19 08:38:09 -04:00
										 |  |  | 					filters: { | 
					
						
							|  |  |  | 						cid: [1, 2], | 
					
						
							|  |  |  | 						state: 'open', | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				}, (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(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 			it('should return no flag if filtered by both cid 1 and 2 and non-open state', (done) => { | 
					
						
							| 
									
										
										
										
											2017-01-03 13:38:06 -05:00
										 |  |  | 				Flags.list({ | 
					
						
							| 
									
										
										
										
											2020-08-19 08:38:09 -04:00
										 |  |  | 					filters: { | 
					
						
							|  |  |  | 						cid: [1, 2], | 
					
						
							|  |  |  | 						state: 'resolved', | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				}, (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
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2020-08-19 09:04:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		describe('(with sort)', () => { | 
					
						
							|  |  |  | 			before(async () => { | 
					
						
							|  |  |  | 				// Create a second flag to test sorting
 | 
					
						
							|  |  |  | 				const post = await Topics.reply({ | 
					
						
							|  |  |  | 					tid: 1, | 
					
						
							|  |  |  | 					uid: uid1, | 
					
						
							|  |  |  | 					content: 'this is a reply -- flag me', | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				await Flags.create('post', post.pid, adminUid, 'another flag'); | 
					
						
							|  |  |  | 				await Flags.create('post', 1, uid3, 'additional flag report'); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			it('should return sorted flags latest first if no sort is passed in', async () => { | 
					
						
							|  |  |  | 				const payload = await Flags.list({ | 
					
						
							|  |  |  | 					uid: adminUid, | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				assert(payload.flags.every((cur, idx) => { | 
					
						
							|  |  |  | 					if (idx === payload.flags.length - 1) { | 
					
						
							|  |  |  | 						return true; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					const next = payload.flags[idx + 1]; | 
					
						
							|  |  |  | 					return parseInt(cur.datetime, 10) > parseInt(next.datetime, 10); | 
					
						
							|  |  |  | 				})); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			it('should return sorted flags oldest first if "oldest" sort is passed in', async () => { | 
					
						
							|  |  |  | 				const payload = await Flags.list({ | 
					
						
							|  |  |  | 					uid: adminUid, | 
					
						
							|  |  |  | 					sort: 'oldest', | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				assert(payload.flags.every((cur, idx) => { | 
					
						
							|  |  |  | 					if (idx === payload.flags.length - 1) { | 
					
						
							|  |  |  | 						return true; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					const next = payload.flags[idx + 1]; | 
					
						
							|  |  |  | 					return parseInt(cur.datetime, 10) < parseInt(next.datetime, 10); | 
					
						
							|  |  |  | 				})); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			it('should return flags with more reports first if "reports" sort is passed in', async () => { | 
					
						
							|  |  |  | 				const payload = await Flags.list({ | 
					
						
							|  |  |  | 					uid: adminUid, | 
					
						
							|  |  |  | 					sort: 'reports', | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				assert(payload.flags.every((cur, idx) => { | 
					
						
							|  |  |  | 					if (idx === payload.flags.length - 1) { | 
					
						
							|  |  |  | 						return true; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					const next = payload.flags[idx + 1]; | 
					
						
							|  |  |  | 					return parseInt(cur.heat, 10) >= parseInt(next.heat, 10); | 
					
						
							|  |  |  | 				})); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.update()', () => { | 
					
						
							|  |  |  | 		it('should alter a flag\'s various attributes and persist them to the database', (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, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 			}, (err) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				db.getObjectFields('flag:1', ['state', 'assignee'], (err, data) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					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(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should persist to the flag\'s history', (done) => { | 
					
						
							|  |  |  | 			Flags.getHistory(1, (err, history) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				if (err) { | 
					
						
							|  |  |  | 					throw err; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				history.forEach((change) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					switch (change.attribute) { | 
					
						
							| 
									
										
										
										
											2020-06-03 11:46:44 -04:00
										 |  |  | 						case 'state': | 
					
						
							|  |  |  | 							assert.strictEqual('[[flags:state-wip]]', change.value); | 
					
						
							|  |  |  | 							break; | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-03 11:46:44 -04:00
										 |  |  | 						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 () => { | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			await Groups.join(`cid:${category.cid}:privileges:moderate`, uid3); | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			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)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			await Groups.leave(`cid:${category.cid}:privileges:moderate`, uid3); | 
					
						
							| 
									
										
										
										
											2020-01-20 10:19:23 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		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 () => { | 
					
						
							| 
									
										
										
										
											2021-05-28 12:17:48 -04:00
										 |  |  | 			const SocketFlags = require('../src/socket.io/flags'); | 
					
						
							| 
									
										
										
										
											2020-05-01 13:32:20 -04:00
										 |  |  | 			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); | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			assert(userNotifs.includes(`flag:post:${result.postData.pid}`)); | 
					
						
							| 
									
										
										
										
											2020-05-01 13:32:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			await Flags.update(flagId, adminUid, { | 
					
						
							|  |  |  | 				state: 'resolved', | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			userNotifs = await User.notifications.getAll(adminUid); | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07:00
										 |  |  | 			assert(!userNotifs.includes(`flag:post:${result.postData.pid}`)); | 
					
						
							| 
									
										
										
										
											2020-05-01 13:32:20 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.getTarget()', () => { | 
					
						
							|  |  |  | 		it('should return a post\'s data if queried with type "post"', (done) => { | 
					
						
							|  |  |  | 			Flags.getTarget('post', 1, 1, (err, data) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2021-02-04 00:06:15 -07:00
										 |  |  | 				const compare = { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					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
										 |  |  | 				}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 01:34:30 -07:00
										 |  |  | 				for (const key of Object.keys(compare)) { | 
					
						
							|  |  |  | 					assert.ok(data[key]); | 
					
						
							|  |  |  | 					assert.equal(data[key], compare[key]); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should return a user\'s data if queried with type "user"', (done) => { | 
					
						
							|  |  |  | 			Flags.getTarget('user', 1, 1, (err, data) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2021-02-04 00:06:15 -07:00
										 |  |  | 				const compare = { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					uid: 1, | 
					
						
							|  |  |  | 					username: 'testUser', | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					email: 'b@c.com', | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 01:34:30 -07:00
										 |  |  | 				for (const key of Object.keys(compare)) { | 
					
						
							|  |  |  | 					assert.ok(data[key]); | 
					
						
							|  |  |  | 					assert.equal(data[key], compare[key]); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-19 11:16:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should return a plain object with no properties if the target no longer exists', (done) => { | 
					
						
							|  |  |  | 			Flags.getTarget('user', 15, 1, (err, data) => { | 
					
						
							| 
									
										
										
										
											2016-12-19 11:16:03 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 				assert.strictEqual(0, Object.keys(data).length); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.validate()', () => { | 
					
						
							|  |  |  | 		it('should error out if type is post and post is deleted', (done) => { | 
					
						
							|  |  |  | 			Posts.delete(1, 1, (err) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				if (err) { | 
					
						
							|  |  |  | 					throw err; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Flags.validate({ | 
					
						
							|  |  |  | 					type: 'post', | 
					
						
							|  |  |  | 					id: 1, | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 					uid: 1, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				}, (err) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					assert.ok(err); | 
					
						
							|  |  |  | 					assert.strictEqual('[[error:post-deleted]]', err.message); | 
					
						
							|  |  |  | 					Posts.restore(1, 1, done); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should not pass validation if flag threshold is set and user rep does not meet it', (done) => { | 
					
						
							|  |  |  | 			Meta.configs.set('min:rep:flag', '50', (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, | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				}, (err) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should not error if user blocked target', (done) => { | 
					
						
							| 
									
										
										
										
											2021-05-28 12:17:48 -04:00
										 |  |  | 			const SocketFlags = require('../src/socket.io/flags'); | 
					
						
							| 
									
										
										
										
											2021-02-04 00:06:15 -07:00
										 |  |  | 			let reporterUid; | 
					
						
							|  |  |  | 			let reporteeUid; | 
					
						
							| 
									
										
										
										
											2018-12-09 15:25:43 -05:00
										 |  |  | 			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); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should send back error if reporter does not exist', (done) => { | 
					
						
							|  |  |  | 			Flags.validate({ uid: 123123123, id: 1, type: 'post' }, (err) => { | 
					
						
							| 
									
										
										
										
											2018-12-09 15:25:43 -05:00
										 |  |  | 				assert.equal(err.message, '[[error:no-user]]'); | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.appendNote()', () => { | 
					
						
							|  |  |  | 		it('should add a note to a flag', (done) => { | 
					
						
							|  |  |  | 			Flags.appendNote(1, 1, 'this is my note', (err) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				db.getSortedSetRange('flag:1:notes', 0, -1, (err, notes) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					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
										 |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should be a JSON string', (done) => { | 
					
						
							|  |  |  | 			db.getSortedSetRange('flag:1:notes', 0, -1, (err, notes) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				if (err) { | 
					
						
							|  |  |  | 					throw err; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				try { | 
					
						
							|  |  |  | 					JSON.parse(notes[0]); | 
					
						
							|  |  |  | 				} catch (e) { | 
					
						
							|  |  |  | 					assert.ifError(e); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		it('should insert a note in the past if a datetime is passed in', async () => { | 
					
						
							|  |  |  | 			await Flags.appendNote(1, 1, 'this is the first note', 1626446956652); | 
					
						
							|  |  |  | 			const note = (await db.getSortedSetRange('flag:1:notes', 0, 0)).pop(); | 
					
						
							|  |  |  | 			assert.strictEqual('[1,"this is the first note"]', note); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.getNotes()', () => { | 
					
						
							|  |  |  | 		before((done) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 			// Add a second note
 | 
					
						
							|  |  |  | 			Flags.appendNote(1, 1, 'this is the second note', done); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('return should match a predefined spec', (done) => { | 
					
						
							|  |  |  | 			Flags.getNotes(1, (err, notes) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2021-02-04 00:06:15 -07:00
										 |  |  | 				const compare = { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:06:15 -07:00
										 |  |  | 				const data = notes[1]; | 
					
						
							| 
									
										
										
										
											2021-02-04 01:34:30 -07:00
										 |  |  | 				for (const key of Object.keys(compare)) { | 
					
						
							|  |  |  | 					assert.ok(data[key]); | 
					
						
							|  |  |  | 					assert.strictEqual(data[key], compare[key]); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				done(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should retrieve a list of notes, from newest to oldest', (done) => { | 
					
						
							|  |  |  | 			Flags.getNotes(1, (err, notes) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							| 
									
										
										
										
											2021-02-03 23:59:08 -07: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(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.appendHistory()', () => { | 
					
						
							| 
									
										
										
										
											2021-02-04 00:06:15 -07:00
										 |  |  | 		let entries; | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		before((done) => { | 
					
						
							|  |  |  | 			db.sortedSetCard('flag:1:history', (err, count) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				entries = count; | 
					
						
							|  |  |  | 				done(err); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		it('should add a new entry into a flag\'s history', (done) => { | 
					
						
							| 
									
										
										
										
											2016-12-14 15:00:41 -05:00
										 |  |  | 			Flags.appendHistory(1, 1, { | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				state: 'rejected', | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 			}, (err) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				assert.ifError(err); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 				Flags.getHistory(1, (err, history) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					if (err) { | 
					
						
							|  |  |  | 						throw err; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-27 00:11:50 -04:00
										 |  |  | 					// 1 for the new event appended, 2 for username and email change
 | 
					
						
							|  |  |  | 					assert.strictEqual(entries + 3, history.length); | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 					done(); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 	describe('.getHistory()', () => { | 
					
						
							|  |  |  | 		it('should retrieve a flag\'s history', (done) => { | 
					
						
							|  |  |  | 			Flags.getHistory(1, (err, history) => { | 
					
						
							| 
									
										
										
										
											2016-12-13 14:24:09 -05:00
										 |  |  | 				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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 	describe('(v3 API)', () => { | 
					
						
							| 
									
										
										
										
											2021-05-28 12:17:48 -04:00
										 |  |  | 		const SocketFlags = require('../src/socket.io/flags'); | 
					
						
							| 
									
										
										
										
											2021-02-04 00:06:15 -07:00
										 |  |  | 		let pid; | 
					
						
							| 
									
										
										
										
											2021-04-09 14:20:42 -04:00
										 |  |  | 		let tid; | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 		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({ | 
					
						
							| 
									
										
										
										
											2016-12-13 12:11:51 -05:00
										 |  |  | 				cid: 1, | 
					
						
							|  |  |  | 				uid: 1, | 
					
						
							|  |  |  | 				title: 'Another topic', | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				content: 'This is flaggable content', | 
					
						
							| 
									
										
										
										
											2016-12-01 09:24:49 -05:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 			pid = result.postData.pid; | 
					
						
							|  |  |  | 			tid = result.topicData.tid; | 
					
						
							| 
									
										
										
										
											2016-12-01 09:24:49 -05:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		describe('.create()', () => { | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 			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, | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				const exists = await Flags.exists('post', pid, 2); | 
					
						
							|  |  |  | 				assert(exists); | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 14:20:42 -04:00
										 |  |  | 			it('should escape flag reason', async () => { | 
					
						
							|  |  |  | 				const postData = await Topics.reply({ | 
					
						
							|  |  |  | 					tid: tid, | 
					
						
							|  |  |  | 					uid: 1, | 
					
						
							|  |  |  | 					content: 'This is flaggable content', | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 				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: '"<script>alert(\'ok\');</script>', | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					json: true, | 
					
						
							| 
									
										
										
										
											2021-04-09 14:20:42 -04:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 				const flagData = await Flags.get(response.flagId); | 
					
						
							| 
									
										
										
										
											2021-04-09 14:20:42 -04:00
										 |  |  | 				assert.strictEqual(flagData.reports[0].value, '"<script>alert('ok');</script>'); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 			it('should not allow flagging post in private category', async () => { | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 				const category = await Categories.create({ name: 'private category' }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-26 21:57:38 -04:00
										 |  |  | 				await Privileges.categories.rescind(['groups:topics:read'], category.cid, 'registered-users'); | 
					
						
							| 
									
										
										
										
											2020-11-27 16:26:32 -05:00
										 |  |  | 				await Groups.join('private category', uid3); | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 				const result = await Topics.post({ | 
					
						
							|  |  |  | 					cid: category.cid, | 
					
						
							| 
									
										
										
										
											2020-11-27 16:26:32 -05:00
										 |  |  | 					uid: uid3, | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 					title: 'private topic', | 
					
						
							|  |  |  | 					content: 'private post', | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 				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); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// Handle dev mode test
 | 
					
						
							|  |  |  | 				delete body.stack; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				assert.deepStrictEqual(body, { | 
					
						
							|  |  |  | 					status: { | 
					
						
							|  |  |  | 						code: 'forbidden', | 
					
						
							|  |  |  | 						message: 'You do not have enough privileges for this action.', | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					response: {}, | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2020-01-22 12:14:50 -05:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		describe('.update()', () => { | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 			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, | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				const { history } = response; | 
					
						
							|  |  |  | 				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
										 |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-04 00:01:39 -07:00
										 |  |  | 		describe('.appendNote()', () => { | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 			it('should append a note to the flag', async () => { | 
					
						
							|  |  |  | 				const { response } = await request({ | 
					
						
							|  |  |  | 					method: 'post', | 
					
						
							|  |  |  | 					uri: `${nconf.get('url')}/api/v3/flags/2/notes`, | 
					
						
							|  |  |  | 					jar, | 
					
						
							|  |  |  | 					headers: { | 
					
						
							|  |  |  | 						'x-csrf-token': csrfToken, | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					body: { | 
					
						
							|  |  |  | 						note: 'lorem ipsum dolor sit amet', | 
					
						
							|  |  |  | 						datetime: 1626446956652, | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					json: true, | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2021-07-16 13:44:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				assert(response.hasOwnProperty('notes')); | 
					
						
							|  |  |  | 				assert(Array.isArray(response.notes)); | 
					
						
							|  |  |  | 				assert.strictEqual('lorem ipsum dolor sit amet', response.notes[0].content); | 
					
						
							|  |  |  | 				assert.strictEqual(2, response.notes[0].uid); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				assert(response.hasOwnProperty('history')); | 
					
						
							|  |  |  | 				assert(Array.isArray(response.history)); | 
					
						
							|  |  |  | 				assert.strictEqual(1, Object.keys(response.history[response.history.length - 1].fields).length); | 
					
						
							|  |  |  | 				assert(response.history[response.history.length - 1].fields.hasOwnProperty('notes')); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		describe('.deleteNote()', () => { | 
					
						
							|  |  |  | 			it('should delete a note from a flag', async () => { | 
					
						
							|  |  |  | 				const { response } = await request({ | 
					
						
							|  |  |  | 					method: 'delete', | 
					
						
							|  |  |  | 					uri: `${nconf.get('url')}/api/v3/flags/2/notes/1626446956652`, | 
					
						
							|  |  |  | 					jar, | 
					
						
							|  |  |  | 					headers: { | 
					
						
							|  |  |  | 						'x-csrf-token': csrfToken, | 
					
						
							|  |  |  | 					}, | 
					
						
							|  |  |  | 					json: true, | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				assert(Array.isArray(response.history)); | 
					
						
							|  |  |  | 				assert(Array.isArray(response.notes)); | 
					
						
							|  |  |  | 				assert.strictEqual(response.notes.length, 0); | 
					
						
							| 
									
										
										
										
											2016-12-06 20:28:54 -05:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2016-11-25 15:09:52 -05:00
										 |  |  | }); |