2016-10-08 19:09:48 +03:00
'use strict' ;
2017-02-17 21:55:19 -07:00
2016-10-08 19:09:48 +03:00
2021-02-04 00:06:15 -07:00
const assert = require ( 'assert' ) ;
const async = require ( 'async' ) ;
const request = require ( 'request' ) ;
const nconf = require ( 'nconf' ) ;
const crypto = require ( 'crypto' ) ;
const fs = require ( 'fs' ) ;
const path = require ( 'path' ) ;
const db = require ( './mocks/databasemock' ) ;
const topics = require ( '../src/topics' ) ;
const posts = require ( '../src/posts' ) ;
const categories = require ( '../src/categories' ) ;
const privileges = require ( '../src/privileges' ) ;
const user = require ( '../src/user' ) ;
const groups = require ( '../src/groups' ) ;
const socketPosts = require ( '../src/socket.io/posts' ) ;
const socketTopics = require ( '../src/socket.io/topics' ) ;
const meta = require ( '../src/meta' ) ;
const helpers = require ( './helpers' ) ;
2016-11-11 17:28:32 +03:00
2021-02-04 00:01:39 -07:00
describe ( 'Post\'s' , ( ) => {
2021-02-04 00:06:15 -07:00
let voterUid ;
let voteeUid ;
let globalModUid ;
let postData ;
let topicData ;
let cid ;
2016-10-08 19:09:48 +03:00
2021-02-04 00:01:39 -07:00
before ( ( done ) => {
2016-10-17 23:34:09 +03:00
async . series ( {
2016-10-13 11:43:39 +02:00
voterUid : function ( next ) {
2017-02-18 12:30:49 -07:00
user . create ( { username : 'upvoter' } , next ) ;
2016-10-08 19:09:48 +03:00
} ,
2016-10-13 11:43:39 +02:00
voteeUid : function ( next ) {
2017-02-18 12:30:49 -07:00
user . create ( { username : 'upvotee' } , next ) ;
2016-10-08 19:09:48 +03:00
} ,
2016-11-22 15:55:30 +03:00
globalModUid : function ( next ) {
2017-08-27 19:13:19 -04:00
user . create ( { username : 'globalmod' , password : 'globalmodpwd' } , next ) ;
2016-11-22 15:55:30 +03:00
} ,
2016-10-13 11:43:39 +02:00
category : function ( next ) {
2016-10-08 19:09:48 +03:00
categories . create ( {
name : 'Test Category' ,
2017-02-17 19:31:21 -07:00
description : 'Test category created by testing script' ,
2016-10-08 19:09:48 +03:00
} , next ) ;
2017-02-17 19:31:21 -07:00
} ,
2021-02-04 00:01:39 -07:00
} , ( err , results ) => {
2016-10-08 19:09:48 +03:00
if ( err ) {
return done ( err ) ;
}
voterUid = results . voterUid ;
voteeUid = results . voteeUid ;
2016-11-22 15:55:30 +03:00
globalModUid = results . globalModUid ;
2016-10-15 13:36:34 +03:00
cid = results . category . cid ;
2016-10-08 19:09:48 +03:00
topics . post ( {
uid : results . voteeUid ,
cid : results . category . cid ,
title : 'Test Topic Title' ,
2017-02-17 19:31:21 -07:00
content : 'The content of test topic' ,
2021-02-04 00:01:39 -07:00
} , ( err , data ) => {
2016-10-08 19:09:48 +03:00
if ( err ) {
return done ( err ) ;
}
postData = data . postData ;
2016-10-15 13:36:34 +03:00
topicData = data . topicData ;
2016-11-22 15:55:30 +03:00
groups . join ( 'Global Moderators' , globalModUid , done ) ;
2016-10-08 19:09:48 +03:00
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should update category teaser properly' , async ( ) => {
2019-07-23 21:11:04 -04:00
const util = require ( 'util' ) ;
2021-02-04 00:01:39 -07:00
const getCategoriesAsync = util . promisify ( async ( callback ) => {
request ( ` ${ nconf . get ( 'url' ) } /api/categories ` , { json : true } , ( err , res , body ) => {
2019-07-23 21:11:04 -04:00
callback ( err , body ) ;
} ) ;
} ) ;
const postResult = await topics . post ( { uid : globalModUid , cid : cid , title : 'topic title' , content : '123456789' } ) ;
let data = await getCategoriesAsync ( ) ;
assert . equal ( data . categories [ 0 ] . teaser . pid , postResult . postData . pid ) ;
assert . equal ( data . categories [ 0 ] . posts [ 0 ] . content , '123456789' ) ;
assert . equal ( data . categories [ 0 ] . posts [ 0 ] . pid , postResult . postData . pid ) ;
const newUid = await user . create ( { username : 'teaserdelete' } ) ;
const newPostResult = await topics . post ( { uid : newUid , cid : cid , title : 'topic title' , content : 'xxxxxxxx' } ) ;
data = await getCategoriesAsync ( ) ;
assert . equal ( data . categories [ 0 ] . teaser . pid , newPostResult . postData . pid ) ;
assert . equal ( data . categories [ 0 ] . posts [ 0 ] . content , 'xxxxxxxx' ) ;
assert . equal ( data . categories [ 0 ] . posts [ 0 ] . pid , newPostResult . postData . pid ) ;
await user . delete ( 1 , newUid ) ;
data = await getCategoriesAsync ( ) ;
assert . equal ( data . categories [ 0 ] . teaser . pid , postResult . postData . pid ) ;
assert . equal ( data . categories [ 0 ] . posts [ 0 ] . content , '123456789' ) ;
assert . equal ( data . categories [ 0 ] . posts [ 0 ] . pid , postResult . postData . pid ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should change owner of post and topic properly' , async ( ) => {
2019-07-12 14:06:09 -04:00
const oldUid = await user . create ( { username : 'olduser' } ) ;
const newUid = await user . create ( { username : 'newuser' } ) ;
const postResult = await topics . post ( { uid : oldUid , cid : cid , title : 'change owner' , content : 'original post' } ) ;
const postData = await topics . reply ( { uid : oldUid , tid : postResult . topicData . tid , content : 'firstReply' } ) ;
const pid1 = postResult . postData . pid ;
const pid2 = postData . pid ;
2021-02-03 23:59:08 -07:00
assert . deepStrictEqual ( await db . sortedSetScores ( ` tid: ${ postResult . topicData . tid } :posters ` , [ oldUid , newUid ] ) , [ 2 , null ] ) ;
2019-07-12 14:06:09 -04:00
await posts . changeOwner ( [ pid1 , pid2 ] , newUid ) ;
2021-02-03 23:59:08 -07:00
assert . deepStrictEqual ( await db . sortedSetScores ( ` tid: ${ postResult . topicData . tid } :posters ` , [ oldUid , newUid ] ) , [ 0 , 2 ] ) ;
2019-07-12 14:06:09 -04:00
assert . deepStrictEqual ( await posts . isOwner ( [ pid1 , pid2 ] , oldUid ) , [ false , false ] ) ;
assert . deepStrictEqual ( await posts . isOwner ( [ pid1 , pid2 ] , newUid ) , [ true , true ] ) ;
assert . strictEqual ( await user . getUserField ( oldUid , 'postcount' ) , 0 ) ;
assert . strictEqual ( await user . getUserField ( newUid , 'postcount' ) , 2 ) ;
assert . strictEqual ( await user . getUserField ( oldUid , 'topiccount' ) , 0 ) ;
assert . strictEqual ( await user . getUserField ( newUid , 'topiccount' ) , 1 ) ;
assert . strictEqual ( await db . sortedSetScore ( 'users:postcount' , oldUid ) , 0 ) ;
assert . strictEqual ( await db . sortedSetScore ( 'users:postcount' , newUid ) , 2 ) ;
assert . strictEqual ( await topics . isOwner ( postResult . topicData . tid , oldUid ) , false ) ;
assert . strictEqual ( await topics . isOwner ( postResult . topicData . tid , newUid ) , true ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should fail to change owner if new owner does not exist' , async ( ) => {
2020-01-17 11:16:23 -05:00
try {
await posts . changeOwner ( [ 1 ] , '9999999' ) ;
} catch ( err ) {
assert . strictEqual ( err . message , '[[error:no-user]]' ) ;
}
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should fail to change owner if user is not authorized' , async ( ) => {
2020-01-24 15:24:01 -05:00
try {
await socketPosts . changeOwner ( { uid : voterUid } , { pids : [ 1 , 2 ] , toUid : voterUid } ) ;
} catch ( err ) {
assert . strictEqual ( err . message , '[[error:no-privileges]]' ) ;
}
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should return falsy if post does not exist' , ( done ) => {
posts . getPostData ( 9999 , ( err , postData ) => {
2018-10-30 19:41:06 -04:00
assert . ifError ( err ) ;
assert . equal ( postData , null ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'voting' , ( ) => {
it ( 'should fail to upvote post if group does not have upvote permission' , ( done ) => {
privileges . categories . rescind ( [ 'groups:posts:upvote' , 'groups:posts:downvote' ] , cid , 'registered-users' , ( err ) => {
2018-01-09 14:33:23 -05:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
socketPosts . upvote ( { uid : voterUid } , { pid : postData . pid , room _id : 'topic_1' } , ( err ) => {
2018-01-09 14:33:23 -05:00
assert . equal ( err . message , '[[error:no-privileges]]' ) ;
2021-02-04 00:01:39 -07:00
socketPosts . downvote ( { uid : voterUid } , { pid : postData . pid , room _id : 'topic_1' } , ( err ) => {
2018-01-09 14:33:23 -05:00
assert . equal ( err . message , '[[error:no-privileges]]' ) ;
2021-02-04 00:01:39 -07:00
privileges . categories . give ( [ 'groups:posts:upvote' , 'groups:posts:downvote' ] , cid , 'registered-users' , ( err ) => {
2018-01-09 14:33:23 -05:00
assert . ifError ( err ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should upvote a post' , ( done ) => {
socketPosts . upvote ( { uid : voterUid } , { pid : postData . pid , room _id : 'topic_1' } , ( err , result ) => {
2016-10-08 19:09:48 +03:00
assert . ifError ( err ) ;
assert . equal ( result . post . upvotes , 1 ) ;
assert . equal ( result . post . downvotes , 0 ) ;
assert . equal ( result . post . votes , 1 ) ;
assert . equal ( result . user . reputation , 1 ) ;
2021-02-04 00:01:39 -07:00
posts . hasVoted ( postData . pid , voterUid , ( err , data ) => {
2016-10-08 19:09:48 +03:00
assert . ifError ( err ) ;
assert . equal ( data . upvoted , true ) ;
assert . equal ( data . downvoted , false ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should get voters' , ( done ) => {
socketPosts . getVoters ( { uid : globalModUid } , { pid : postData . pid , cid : cid } , ( err , data ) => {
2016-11-23 14:29:55 +03:00
assert . ifError ( err ) ;
assert . equal ( data . upvoteCount , 1 ) ;
assert . equal ( data . downvoteCount , 0 ) ;
assert ( Array . isArray ( data . upvoters ) ) ;
assert . equal ( data . upvoters [ 0 ] . username , 'upvoter' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should get upvoters' , ( done ) => {
socketPosts . getUpvoters ( { uid : globalModUid } , [ postData . pid ] , ( err , data ) => {
2016-11-23 14:29:55 +03:00
assert . ifError ( err ) ;
assert . equal ( data [ 0 ] . otherCount , 0 ) ;
assert . equal ( data [ 0 ] . usernames , 'upvoter' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should unvote a post' , ( done ) => {
socketPosts . unvote ( { uid : voterUid } , { pid : postData . pid , room _id : 'topic_1' } , ( err , result ) => {
2016-10-08 19:09:48 +03:00
assert . ifError ( err ) ;
assert . equal ( result . post . upvotes , 0 ) ;
assert . equal ( result . post . downvotes , 0 ) ;
assert . equal ( result . post . votes , 0 ) ;
assert . equal ( result . user . reputation , 0 ) ;
2021-02-04 00:01:39 -07:00
posts . hasVoted ( postData . pid , voterUid , ( err , data ) => {
2016-10-08 19:09:48 +03:00
assert . ifError ( err ) ;
assert . equal ( data . upvoted , false ) ;
assert . equal ( data . downvoted , false ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should downvote a post' , ( done ) => {
socketPosts . downvote ( { uid : voterUid } , { pid : postData . pid , room _id : 'topic_1' } , ( err , result ) => {
2016-10-08 19:09:48 +03:00
assert . ifError ( err ) ;
assert . equal ( result . post . upvotes , 0 ) ;
assert . equal ( result . post . downvotes , 1 ) ;
assert . equal ( result . post . votes , - 1 ) ;
assert . equal ( result . user . reputation , - 1 ) ;
2021-02-04 00:01:39 -07:00
posts . hasVoted ( postData . pid , voterUid , ( err , data ) => {
2016-10-08 19:09:48 +03:00
assert . ifError ( err ) ;
assert . equal ( data . upvoted , false ) ;
assert . equal ( data . downvoted , true ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2020-07-09 12:51:05 -04:00
it ( 'should prevent downvoting more than total daily limit' , async ( ) => {
const oldValue = meta . config . downvotesPerDay ;
meta . config . downvotesPerDay = 1 ;
let err ;
const p1 = await topics . reply ( {
uid : voteeUid ,
tid : topicData . tid ,
content : 'raw content' ,
} ) ;
try {
await socketPosts . downvote ( { uid : voterUid } , { pid : p1 . pid , room _id : 'topic_1' } ) ;
} catch ( _err ) {
err = _err ;
}
assert . equal ( err . message , '[[error:too-many-downvotes-today, 1]]' ) ;
meta . config . downvotesPerDay = oldValue ;
} ) ;
it ( 'should prevent downvoting target user more than total daily limit' , async ( ) => {
const oldValue = meta . config . downvotesPerUserPerDay ;
meta . config . downvotesPerUserPerDay = 1 ;
let err ;
const p1 = await topics . reply ( {
uid : voteeUid ,
tid : topicData . tid ,
content : 'raw content' ,
} ) ;
try {
await socketPosts . downvote ( { uid : voterUid } , { pid : p1 . pid , room _id : 'topic_1' } ) ;
} catch ( _err ) {
err = _err ;
}
assert . equal ( err . message , '[[error:too-many-downvotes-today-user, 1]]' ) ;
meta . config . downvotesPerUserPerDay = oldValue ;
} ) ;
2016-10-08 19:09:48 +03:00
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'bookmarking' , ( ) => {
it ( 'should bookmark a post' , ( done ) => {
socketPosts . bookmark ( { uid : voterUid } , { pid : postData . pid , room _id : ` topic_ ${ postData . tid } ` } , ( err , data ) => {
2016-10-08 19:09:48 +03:00
assert . ifError ( err ) ;
assert . equal ( data . isBookmarked , true ) ;
2021-02-04 00:01:39 -07:00
posts . hasBookmarked ( postData . pid , voterUid , ( err , hasBookmarked ) => {
2016-10-08 19:09:48 +03:00
assert . ifError ( err ) ;
assert . equal ( hasBookmarked , true ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should unbookmark a post' , ( done ) => {
socketPosts . unbookmark ( { uid : voterUid } , { pid : postData . pid , room _id : ` topic_ ${ postData . tid } ` } , ( err , data ) => {
2016-10-08 19:09:48 +03:00
assert . ifError ( err ) ;
assert . equal ( data . isBookmarked , false ) ;
2021-02-04 00:01:39 -07:00
posts . hasBookmarked ( [ postData . pid ] , voterUid , ( err , hasBookmarked ) => {
2016-10-08 19:09:48 +03:00
assert . ifError ( err ) ;
assert . equal ( hasBookmarked [ 0 ] , false ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'post tools' , ( ) => {
it ( 'should error if data is invalid' , ( done ) => {
socketPosts . loadPostTools ( { uid : globalModUid } , null , ( err ) => {
2016-12-20 16:03:01 +03:00
assert . equal ( err . message , '[[error:invalid-data]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should load post tools' , ( done ) => {
socketPosts . loadPostTools ( { uid : globalModUid } , { pid : postData . pid , cid : cid } , ( err , data ) => {
2016-12-20 16:03:01 +03:00
assert . ifError ( err ) ;
assert ( data . posts . display _edit _tools ) ;
assert ( data . posts . display _delete _tools ) ;
assert ( data . posts . display _moderator _tools ) ;
assert ( data . posts . display _move _tools ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'delete/restore/purge' , ( ) => {
2016-12-21 00:31:15 +03:00
function createTopicWithReply ( callback ) {
2016-12-20 16:03:01 +03:00
topics . post ( {
2016-10-15 13:36:34 +03:00
uid : voterUid ,
2016-12-20 16:03:01 +03:00
cid : cid ,
title : 'topic to delete/restore/purge' ,
2017-02-17 19:31:21 -07:00
content : 'A post to delete/restore/purge' ,
2021-02-04 00:01:39 -07:00
} , ( err , topicPostData ) => {
2016-10-15 13:36:34 +03:00
assert . ifError ( err ) ;
2016-12-20 16:03:01 +03:00
topics . reply ( {
uid : voterUid ,
2016-12-21 00:31:15 +03:00
tid : topicPostData . topicData . tid ,
2016-12-20 16:03:01 +03:00
timestamp : Date . now ( ) ,
2017-02-17 19:31:21 -07:00
content : 'A post to delete/restore and purge' ,
2021-02-04 00:01:39 -07:00
} , ( err , replyData ) => {
2016-12-20 16:03:01 +03:00
assert . ifError ( err ) ;
2016-12-21 00:31:15 +03:00
callback ( topicPostData , replyData ) ;
2016-12-20 16:03:01 +03:00
} ) ;
} ) ;
2016-12-21 00:31:15 +03:00
}
2021-02-04 00:06:15 -07:00
let tid ;
let mainPid ;
let replyPid ;
2016-12-21 00:31:15 +03:00
2021-02-04 00:01:39 -07:00
before ( ( done ) => {
createTopicWithReply ( ( topicPostData , replyData ) => {
2016-12-21 00:31:15 +03:00
tid = topicPostData . topicData . tid ;
mainPid = topicPostData . postData . pid ;
replyPid = replyData . pid ;
2020-05-26 21:57:38 -04:00
privileges . categories . give ( [ 'groups:purge' ] , cid , 'registered-users' , done ) ;
2016-12-21 00:31:15 +03:00
} ) ;
2016-12-20 16:03:01 +03:00
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error with invalid data' , ( done ) => {
socketPosts . delete ( { uid : voterUid } , null , ( err ) => {
2016-12-20 16:03:01 +03:00
assert . equal ( err . message , '[[error:invalid-data]]' ) ;
done ( ) ;
2016-10-15 13:36:34 +03:00
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should delete a post' , ( done ) => {
socketPosts . delete ( { uid : voterUid } , { pid : replyPid , tid : tid } , ( err ) => {
2016-10-15 13:36:34 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
posts . getPostField ( replyPid , 'deleted' , ( err , isDeleted ) => {
2016-10-15 13:36:34 +03:00
assert . ifError ( err ) ;
2018-10-21 19:33:46 -04:00
assert . strictEqual ( isDeleted , 1 ) ;
2016-10-15 13:36:34 +03:00
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should not see post content if global mod does not have posts:view_deleted privilege' , ( done ) => {
2019-05-30 19:30:47 -04:00
async . waterfall ( [
function ( next ) {
user . create ( { username : 'global mod' , password : '123456' } , next ) ;
} ,
function ( uid , next ) {
groups . join ( 'Global Moderators' , uid , next ) ;
} ,
function ( next ) {
2020-05-26 21:57:38 -04:00
privileges . categories . rescind ( [ 'groups:posts:view_deleted' ] , cid , 'Global Moderators' , next ) ;
2019-05-30 19:30:47 -04:00
} ,
function ( next ) {
2021-02-04 00:01:39 -07:00
helpers . loginUser ( 'global mod' , '123456' , ( err , _jar ) => {
2019-05-30 19:30:47 -04:00
assert . ifError ( err ) ;
2021-02-04 00:06:15 -07:00
const jar = _jar ;
2019-05-30 19:30:47 -04:00
2021-02-04 00:01:39 -07:00
request ( ` ${ nconf . get ( 'url' ) } /api/topic/ ${ tid } ` , { jar : jar , json : true } , ( err , res , body ) => {
2019-05-30 19:30:47 -04:00
assert . ifError ( err ) ;
assert . equal ( body . posts [ 1 ] . content , '[[topic:post_is_deleted]]' ) ;
2020-05-26 21:57:38 -04:00
privileges . categories . give ( [ 'groups:posts:view_deleted' ] , cid , 'Global Moderators' , next ) ;
2019-05-30 19:30:47 -04:00
} ) ;
} ) ;
} ,
] , done ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should restore a post' , ( done ) => {
socketPosts . restore ( { uid : voterUid } , { pid : replyPid , tid : tid } , ( err ) => {
2016-10-15 13:36:34 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
posts . getPostField ( replyPid , 'deleted' , ( err , isDeleted ) => {
2016-10-15 13:36:34 +03:00
assert . ifError ( err ) ;
2018-10-21 19:33:46 -04:00
assert . strictEqual ( isDeleted , 0 ) ;
2016-10-15 13:36:34 +03:00
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should delete posts' , ( done ) => {
socketPosts . deletePosts ( { uid : globalModUid } , { pids : [ replyPid , mainPid ] } , ( err ) => {
2016-10-15 13:36:34 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
posts . getPostField ( replyPid , 'deleted' , ( err , deleted ) => {
2016-10-15 13:36:34 +03:00
assert . ifError ( err ) ;
2018-10-25 17:02:59 -04:00
assert . strictEqual ( deleted , 1 ) ;
2021-02-04 00:01:39 -07:00
posts . getPostField ( mainPid , 'deleted' , ( err , deleted ) => {
2016-12-21 00:31:15 +03:00
assert . ifError ( err ) ;
2018-10-25 17:02:59 -04:00
assert . strictEqual ( deleted , 1 ) ;
2016-12-21 00:31:15 +03:00
done ( ) ;
} ) ;
2016-10-15 13:36:34 +03:00
} ) ;
} ) ;
} ) ;
2016-12-20 16:03:01 +03:00
2021-02-04 00:01:39 -07:00
it ( 'should delete topic if last main post is deleted' , ( done ) => {
topics . post ( { uid : voterUid , cid : cid , title : 'test topic' , content : 'test topic' } , ( err , data ) => {
2016-12-20 16:03:01 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
socketPosts . deletePosts ( { uid : globalModUid } , { pids : [ data . postData . pid ] } , ( err ) => {
2016-12-20 16:03:01 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
topics . getTopicField ( data . topicData . tid , 'deleted' , ( err , deleted ) => {
2016-12-20 16:03:01 +03:00
assert . ifError ( err ) ;
2018-10-25 17:02:59 -04:00
assert . strictEqual ( deleted , 1 ) ;
2016-12-20 16:03:01 +03:00
done ( ) ;
} ) ;
} ) ;
} ) ;
} ) ;
2016-12-21 00:31:15 +03:00
2021-02-04 00:01:39 -07:00
it ( 'should purge posts and purge topic' , ( done ) => {
createTopicWithReply ( ( topicPostData , replyData ) => {
2021-02-04 02:07:29 -07:00
socketPosts . purgePosts ( { uid : voterUid } , {
pids : [ replyData . pid , topicPostData . postData . pid ] ,
tid : topicPostData . topicData . tid ,
} , ( err ) => {
2016-12-21 00:31:15 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
posts . exists ( ` post: ${ replyData . pid } ` , ( err , exists ) => {
2016-12-21 00:31:15 +03:00
assert . ifError ( err ) ;
assert . equal ( exists , false ) ;
2021-02-04 00:01:39 -07:00
topics . exists ( topicPostData . topicData . tid , ( err , exists ) => {
2016-12-21 00:31:15 +03:00
assert . ifError ( err ) ;
2017-04-26 14:19:48 -04:00
assert ( ! exists ) ;
2016-12-21 00:31:15 +03:00
done ( ) ;
} ) ;
} ) ;
} ) ;
} ) ;
} ) ;
2016-10-15 13:36:34 +03:00
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'edit' , ( ) => {
2021-02-04 00:06:15 -07:00
let pid ;
let replyPid ;
let tid ;
2021-02-04 00:01:39 -07:00
before ( ( done ) => {
2016-11-11 17:28:32 +03:00
topics . post ( {
uid : voterUid ,
cid : cid ,
title : 'topic to edit' ,
2017-02-17 19:31:21 -07:00
content : 'A post to edit' ,
2021-02-04 00:01:39 -07:00
} , ( err , data ) => {
2016-11-11 17:28:32 +03:00
assert . ifError ( err ) ;
pid = data . postData . pid ;
tid = data . topicData . tid ;
topics . reply ( {
uid : voterUid ,
tid : tid ,
timestamp : Date . now ( ) ,
2017-02-17 19:31:21 -07:00
content : 'A reply to edit' ,
2021-02-04 00:01:39 -07:00
} , ( err , data ) => {
2016-11-11 17:28:32 +03:00
assert . ifError ( err ) ;
replyPid = data . pid ;
2020-05-26 21:57:38 -04:00
privileges . categories . give ( [ 'groups:posts:edit' ] , cid , 'registered-users' , done ) ;
2016-11-11 17:28:32 +03:00
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error if user is not logged in' , ( done ) => {
socketPosts . edit ( { uid : 0 } , { } , ( err ) => {
2016-11-11 17:28:32 +03:00
assert . equal ( err . message , '[[error:not-logged-in]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error if data is invalid or missing' , ( done ) => {
socketPosts . edit ( { uid : voterUid } , { } , ( err ) => {
2016-11-11 17:28:32 +03:00
assert . equal ( err . message , '[[error:invalid-data]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error if title is too short' , ( done ) => {
socketPosts . edit ( { uid : voterUid } , { pid : pid , content : 'edited post content' , title : 'a' } , ( err ) => {
2021-02-03 23:59:08 -07:00
assert . equal ( err . message , ` [[error:title-too-short, ${ meta . config . minimumTitleLength } ]] ` ) ;
2016-11-11 17:28:32 +03:00
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error if title is too long' , ( done ) => {
2021-02-04 00:06:15 -07:00
const longTitle = new Array ( meta . config . maximumTitleLength + 2 ) . join ( 'a' ) ;
2021-02-04 00:01:39 -07:00
socketPosts . edit ( { uid : voterUid } , { pid : pid , content : 'edited post content' , title : longTitle } , ( err ) => {
2021-02-03 23:59:08 -07:00
assert . equal ( err . message , ` [[error:title-too-long, ${ meta . config . maximumTitleLength } ]] ` ) ;
2016-11-11 17:28:32 +03:00
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error with too few tags' , ( done ) => {
2021-02-04 00:06:15 -07:00
const oldValue = meta . config . minimumTagsPerTopic ;
2016-11-11 17:28:32 +03:00
meta . config . minimumTagsPerTopic = 1 ;
2021-02-04 00:01:39 -07:00
socketPosts . edit ( { uid : voterUid } , { pid : pid , content : 'edited post content' , tags : [ ] } , ( err ) => {
2021-02-03 23:59:08 -07:00
assert . equal ( err . message , ` [[error:not-enough-tags, ${ meta . config . minimumTagsPerTopic } ]] ` ) ;
2016-11-11 17:28:32 +03:00
meta . config . minimumTagsPerTopic = oldValue ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error with too many tags' , ( done ) => {
2021-02-04 00:06:15 -07:00
const tags = [ ] ;
for ( let i = 0 ; i < meta . config . maximumTagsPerTopic + 1 ; i += 1 ) {
2021-02-03 23:59:08 -07:00
tags . push ( ` tag ${ i } ` ) ;
2016-11-11 17:28:32 +03:00
}
2021-02-04 00:01:39 -07:00
socketPosts . edit ( { uid : voterUid } , { pid : pid , content : 'edited post content' , tags : tags } , ( err ) => {
2021-02-03 23:59:08 -07:00
assert . equal ( err . message , ` [[error:too-many-tags, ${ meta . config . maximumTagsPerTopic } ]] ` ) ;
2016-11-11 17:28:32 +03:00
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error if content is too short' , ( done ) => {
socketPosts . edit ( { uid : voterUid } , { pid : pid , content : 'e' } , ( err ) => {
2021-02-03 23:59:08 -07:00
assert . equal ( err . message , ` [[error:content-too-short, ${ meta . config . minimumPostLength } ]] ` ) ;
2016-11-11 17:28:32 +03:00
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error if content is too long' , ( done ) => {
2021-02-04 00:06:15 -07:00
const longContent = new Array ( meta . config . maximumPostLength + 2 ) . join ( 'a' ) ;
2021-02-04 00:01:39 -07:00
socketPosts . edit ( { uid : voterUid } , { pid : pid , content : longContent } , ( err ) => {
2021-02-03 23:59:08 -07:00
assert . equal ( err . message , ` [[error:content-too-long, ${ meta . config . maximumPostLength } ]] ` ) ;
2016-11-11 17:28:32 +03:00
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should edit post' , async ( ) => {
2020-09-21 15:15:30 -04:00
const data = await socketPosts . edit ( { uid : voterUid } , {
pid : pid ,
content : 'edited post content' ,
title : 'edited title' ,
tags : [ 'edited' ] ,
} ) ;
assert . strictEqual ( data . content , 'edited post content' ) ;
assert . strictEqual ( data . editor , voterUid ) ;
assert . strictEqual ( data . topic . title , 'edited title' ) ;
assert . strictEqual ( data . topic . tags [ 0 ] . value , 'edited' ) ;
2021-02-03 23:59:08 -07:00
const res = await db . getObject ( ` post: ${ pid } ` ) ;
2020-09-21 15:15:30 -04:00
assert ( ! res . hasOwnProperty ( 'bookmarks' ) ) ;
2016-11-11 17:28:32 +03:00
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should disallow post editing for new users if post was made past the threshold for editing' , ( done ) => {
2019-07-04 13:28:36 -04:00
meta . config . newbiePostEditDuration = 1 ;
2021-02-04 00:01:39 -07:00
setTimeout ( ( ) => {
socketPosts . edit ( { uid : voterUid } , { pid : pid , content : 'edited post content again' , title : 'edited title again' , tags : [ 'edited-twice' ] } , ( err , data ) => {
2019-07-04 13:28:36 -04:00
assert . equal ( err . message , '[[error:post-edit-duration-expired, 1]]' ) ;
2019-07-30 13:03:01 -04:00
meta . config . newbiePostEditDuration = 3600 ;
2019-07-04 13:28:36 -04:00
done ( ) ;
} ) ;
} , 1000 ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should edit a deleted post' , ( done ) => {
socketPosts . delete ( { uid : voterUid } , { pid : pid , tid : tid } , ( err ) => {
2016-11-11 17:28:32 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
socketPosts . edit ( { uid : voterUid } , { pid : pid , content : 'edited deleted content' , title : 'edited deleted title' , tags : [ 'deleted' ] } , ( err , data ) => {
2016-11-11 17:28:32 +03:00
assert . ifError ( err ) ;
assert . equal ( data . content , 'edited deleted content' ) ;
assert . equal ( data . editor , voterUid ) ;
assert . equal ( data . topic . title , 'edited deleted title' ) ;
assert . equal ( data . topic . tags [ 0 ] . value , 'deleted' ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should edit a reply post' , ( done ) => {
socketPosts . edit ( { uid : voterUid } , { pid : replyPid , content : 'edited reply' } , ( err , data ) => {
2016-11-11 17:28:32 +03:00
assert . ifError ( err ) ;
assert . equal ( data . content , 'edited reply' ) ;
assert . equal ( data . editor , voterUid ) ;
assert . equal ( data . topic . isMainPost , false ) ;
assert . equal ( data . topic . renamed , false ) ;
done ( ) ;
} ) ;
} ) ;
2018-05-26 13:50:31 -04:00
2021-02-04 00:01:39 -07:00
it ( 'should return diffs' , ( done ) => {
posts . diffs . get ( replyPid , 0 , ( err , data ) => {
2018-05-26 13:50:31 -04:00
assert . ifError ( err ) ;
assert ( Array . isArray ( data ) ) ;
assert ( data [ 0 ] . pid , replyPid ) ;
assert ( data [ 0 ] . patch ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should load diffs and reconstruct post' , ( done ) => {
posts . diffs . load ( replyPid , 0 , voterUid , ( err , data ) => {
2018-05-26 13:50:31 -04:00
assert . ifError ( err ) ;
2019-01-07 12:07:28 -05:00
assert . equal ( data . content , 'A reply to edit' ) ;
2018-05-26 13:50:31 -04:00
done ( ) ;
} ) ;
} ) ;
2018-06-08 11:52:25 -04:00
2021-02-04 00:01:39 -07:00
it ( 'should not allow guests to view diffs' , ( done ) => {
socketPosts . getDiffs ( { uid : 0 } , { pid : 1 } , ( err ) => {
2018-06-08 11:52:25 -04:00
assert . equal ( err . message , '[[error:no-privileges]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should allow registered-users group to view diffs' , ( done ) => {
socketPosts . getDiffs ( { uid : 1 } , { pid : 1 } , ( err , data ) => {
2018-06-08 11:52:25 -04:00
assert . ifError ( err ) ;
2020-06-15 17:16:44 -04:00
2020-06-15 14:09:44 -04:00
assert . strictEqual ( 'boolean' , typeof data . editable ) ;
assert . strictEqual ( false , data . editable ) ;
2020-06-15 17:16:44 -04:00
2020-06-15 14:09:44 -04:00
assert . equal ( true , Array . isArray ( data . timestamps ) ) ;
assert . strictEqual ( 1 , data . timestamps . length ) ;
2020-06-15 17:16:44 -04:00
assert . equal ( true , Array . isArray ( data . revisions ) ) ;
assert . strictEqual ( data . timestamps . length , data . revisions . length ) ;
[ 'timestamp' , 'username' ] . every ( prop => Object . keys ( data . revisions [ 0 ] ) . includes ( prop ) ) ;
2018-06-08 11:52:25 -04:00
done ( ) ;
} ) ;
} ) ;
2021-01-29 08:26:50 +03:00
2021-02-04 00:01:39 -07:00
it ( 'should not delete first diff of a post' , async ( ) => {
2021-01-29 08:26:50 +03:00
const timestamps = await posts . diffs . list ( replyPid ) ;
await assert . rejects ( async ( ) => {
await posts . diffs . delete ( replyPid , timestamps [ 0 ] , voterUid ) ;
} , {
message : '[[error:invalid-data]]' ,
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should delete a post diff' , async ( ) => {
2021-01-29 08:26:50 +03:00
await socketPosts . edit ( { uid : voterUid } , { pid : replyPid , content : 'another edit has been made' } ) ;
await socketPosts . edit ( { uid : voterUid } , { pid : replyPid , content : 'most recent edit' } ) ;
const timestamp = ( await posts . diffs . list ( replyPid ) ) . pop ( ) ;
await posts . diffs . delete ( replyPid , timestamp , voterUid ) ;
const differentTimestamp = ( await posts . diffs . list ( replyPid ) ) . pop ( ) ;
assert . notStrictEqual ( timestamp , differentTimestamp ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should load (oldest) diff and reconstruct post correctly after a diff deletion' , async ( ) => {
2021-01-29 08:26:50 +03:00
const data = await posts . diffs . load ( replyPid , 0 , voterUid ) ;
assert . strictEqual ( data . content , 'A reply to edit' ) ;
} ) ;
2016-11-11 17:28:32 +03:00
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'move' , ( ) => {
2021-02-04 00:06:15 -07:00
let replyPid ;
let tid ;
let moveTid ;
2016-12-02 18:22:30 +03:00
2021-02-04 00:01:39 -07:00
before ( ( done ) => {
2016-12-02 18:22:30 +03:00
async . waterfall ( [
function ( next ) {
topics . post ( {
uid : voterUid ,
cid : cid ,
title : 'topic 1' ,
2017-02-17 19:31:21 -07:00
content : 'some content' ,
2016-12-02 18:22:30 +03:00
} , next ) ;
} ,
function ( data , next ) {
tid = data . topicData . tid ;
topics . post ( {
uid : voterUid ,
cid : cid ,
title : 'topic 2' ,
2017-02-17 19:31:21 -07:00
content : 'some content' ,
2016-12-02 18:22:30 +03:00
} , next ) ;
} ,
function ( data , next ) {
moveTid = data . topicData . tid ;
topics . reply ( {
uid : voterUid ,
tid : tid ,
timestamp : Date . now ( ) ,
2017-02-17 19:31:21 -07:00
content : 'A reply to move' ,
2021-02-04 00:01:39 -07:00
} , ( err , data ) => {
2016-12-02 18:22:30 +03:00
assert . ifError ( err ) ;
replyPid = data . pid ;
2016-12-05 16:30:30 +03:00
next ( ) ;
2016-12-02 18:22:30 +03:00
} ) ;
2017-02-17 19:31:21 -07:00
} ,
2016-12-02 18:22:30 +03:00
] , done ) ;
} ) ;
2016-12-05 16:30:30 +03:00
2021-02-04 00:01:39 -07:00
it ( 'should error if uid is not logged in' , ( done ) => {
socketPosts . movePost ( { uid : 0 } , { } , ( err ) => {
2016-12-05 16:30:30 +03:00
assert . equal ( err . message , '[[error:not-logged-in]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error if data is invalid' , ( done ) => {
socketPosts . movePost ( { uid : globalModUid } , { } , ( err ) => {
2016-12-05 16:30:30 +03:00
assert . equal ( err . message , '[[error:invalid-data]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error if user does not have move privilege' , ( done ) => {
socketPosts . movePost ( { uid : voterUid } , { pid : replyPid , tid : moveTid } , ( err ) => {
2016-12-05 16:30:30 +03:00
assert . equal ( err . message , '[[error:no-privileges]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should move a post' , ( done ) => {
socketPosts . movePost ( { uid : globalModUid } , { pid : replyPid , tid : moveTid } , ( err ) => {
2016-12-05 16:30:30 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
posts . getPostField ( replyPid , 'tid' , ( err , tid ) => {
2016-12-05 16:30:30 +03:00
assert . ifError ( err ) ;
assert ( tid , moveTid ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2020-11-26 12:45:02 -05:00
2021-02-04 00:01:39 -07:00
it ( 'should fail to move post if not moderator of target category' , async ( ) => {
2020-11-26 12:45:02 -05:00
const cat1 = await categories . create ( { name : 'Test Category' , description : 'Test category created by testing script' } ) ;
const cat2 = await categories . create ( { name : 'Test Category' , description : 'Test category created by testing script' } ) ;
const result = await socketTopics . post ( { uid : globalModUid } , { title : 'target topic' , content : 'queued topic' , cid : cat2 . cid } ) ;
const modUid = await user . create ( { username : 'modofcat1' } ) ;
2021-02-24 18:10:34 -05:00
await privileges . categories . give ( privileges . categories . userPrivilegeList , cat1 . cid , modUid ) ;
2020-11-26 12:45:02 -05:00
let err ;
try {
await socketPosts . movePost ( { uid : modUid } , { pid : replyPid , tid : result . tid } ) ;
} catch ( _err ) {
err = _err ;
}
assert . strictEqual ( err . message , '[[error:no-privileges]]' ) ;
} ) ;
2016-12-02 18:22:30 +03:00
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'getPostSummaryByPids' , ( ) => {
it ( 'should return empty array for empty pids' , ( done ) => {
posts . getPostSummaryByPids ( [ ] , 0 , { } , ( err , data ) => {
2016-10-16 23:48:24 +03:00
assert . ifError ( err ) ;
assert . equal ( data . length , 0 ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should get post summaries' , ( done ) => {
posts . getPostSummaryByPids ( [ postData . pid ] , 0 , { } , ( err , data ) => {
2016-10-16 23:48:24 +03:00
assert . ifError ( err ) ;
assert ( data [ 0 ] . user ) ;
assert ( data [ 0 ] . topic ) ;
assert ( data [ 0 ] . category ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2016-10-08 19:09:48 +03:00
2021-02-04 00:01:39 -07:00
it ( 'should get recent poster uids' , ( done ) => {
2017-02-10 15:26:17 +03:00
topics . reply ( {
uid : voterUid ,
tid : topicData . tid ,
timestamp : Date . now ( ) ,
2017-02-17 19:31:21 -07:00
content : 'some content' ,
2021-02-04 00:01:39 -07:00
} , ( err ) => {
2017-02-10 15:26:17 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
posts . getRecentPosterUids ( 0 , 1 , ( err , uids ) => {
2017-02-10 15:26:17 +03:00
assert . ifError ( err ) ;
assert ( Array . isArray ( uids ) ) ;
assert . equal ( uids . length , 2 ) ;
assert . equal ( uids [ 0 ] , voterUid ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'parse' , ( ) => {
it ( 'should not crash and return falsy if post data is falsy' , ( done ) => {
posts . parsePost ( null , ( err , postData ) => {
2018-10-21 19:33:46 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( postData , null ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should store post content in cache' , ( done ) => {
2021-02-04 00:06:15 -07:00
const oldValue = global . env ;
2017-03-09 19:52:48 +03:00
global . env = 'production' ;
2021-02-04 00:06:15 -07:00
const postData = {
2017-03-09 19:52:48 +03:00
pid : 9999 ,
content : 'some post content' ,
} ;
2021-02-04 00:01:39 -07:00
posts . parsePost ( postData , ( err ) => {
2017-03-09 19:52:48 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
posts . parsePost ( postData , ( err ) => {
2017-03-09 19:52:48 +03:00
assert . ifError ( err ) ;
global . env = oldValue ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should parse signature and remove links and images' , ( done ) => {
2017-03-09 19:52:48 +03:00
meta . config [ 'signatures:disableLinks' ] = 1 ;
meta . config [ 'signatures:disableImages' ] = 1 ;
2021-02-04 00:06:15 -07:00
const userData = {
2017-03-09 19:52:48 +03:00
signature : '<img src="boop"/><a href="link">test</a> derp' ,
} ;
2021-02-04 00:01:39 -07:00
posts . parseSignature ( userData , 1 , ( err , data ) => {
2017-03-09 19:52:48 +03:00
assert . ifError ( err ) ;
assert . equal ( data . userData . signature , 'test derp' ) ;
2017-03-09 20:18:30 +03:00
meta . config [ 'signatures:disableLinks' ] = 0 ;
meta . config [ 'signatures:disableImages' ] = 0 ;
2017-03-09 19:52:48 +03:00
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should turn relative links in post body to absolute urls' , ( done ) => {
2021-02-04 00:06:15 -07:00
const nconf = require ( 'nconf' ) ;
const content = '<a href="/users">test</a> <a href="youtube.com">youtube</a>' ;
const parsedContent = posts . relativeToAbsolute ( content , posts . urlRegex ) ;
2021-02-03 23:59:08 -07:00
assert . equal ( parsedContent , ` <a href=" ${ nconf . get ( 'base_url' ) } /users">test</a> <a href="//youtube.com">youtube</a> ` ) ;
2017-05-28 01:26:56 -04:00
done ( ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should turn relative links in post body to absolute urls' , ( done ) => {
2021-02-04 00:06:15 -07:00
const nconf = require ( 'nconf' ) ;
const content = '<a href="/users">test</a> <a href="youtube.com">youtube</a> some test <img src="/path/to/img"/>' ;
let parsedContent = posts . relativeToAbsolute ( content , posts . urlRegex ) ;
2017-05-28 01:26:56 -04:00
parsedContent = posts . relativeToAbsolute ( parsedContent , posts . imgRegex ) ;
2021-02-03 23:59:08 -07:00
assert . equal ( parsedContent , ` <a href=" ${ nconf . get ( 'base_url' ) } /users">test</a> <a href="//youtube.com">youtube</a> some test <img src=" ${ nconf . get ( 'base_url' ) } /path/to/img"/> ` ) ;
2017-03-09 19:52:48 +03:00
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'socket methods' , ( ) => {
2021-02-04 00:06:15 -07:00
let pid ;
2021-02-04 00:01:39 -07:00
before ( ( done ) => {
2017-02-23 17:02:54 +03:00
topics . reply ( {
uid : voterUid ,
tid : topicData . tid ,
timestamp : Date . now ( ) ,
2017-02-23 18:31:49 -07:00
content : 'raw content' ,
2021-02-04 00:01:39 -07:00
} , ( err , postData ) => {
2017-02-23 17:02:54 +03:00
assert . ifError ( err ) ;
pid = postData . pid ;
2020-05-26 21:57:38 -04:00
privileges . categories . rescind ( [ 'groups:topics:read' ] , cid , 'guests' , done ) ;
2017-02-23 17:02:54 +03:00
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error with invalid data' , ( done ) => {
socketPosts . reply ( { uid : 0 } , null , ( err ) => {
2017-02-23 17:02:54 +03:00
assert . equal ( err . message , '[[error:invalid-data]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error with invalid tid' , ( done ) => {
socketPosts . reply ( { uid : 0 } , { tid : 0 , content : 'derp' } , ( err ) => {
2017-02-23 17:02:54 +03:00
assert . equal ( err . message , '[[error:invalid-data]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should fail to get raw post because of privilege' , ( done ) => {
socketPosts . getRawPost ( { uid : 0 } , pid , ( err ) => {
2017-02-23 17:02:54 +03:00
assert . equal ( err . message , '[[error:no-privileges]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should fail to get raw post because post is deleted' , ( done ) => {
posts . setPostField ( pid , 'deleted' , 1 , ( err ) => {
2017-02-23 17:02:54 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
socketPosts . getRawPost ( { uid : voterUid } , pid , ( err ) => {
2017-02-23 17:02:54 +03:00
assert . equal ( err . message , '[[error:no-post]]' ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should get raw post content' , ( done ) => {
posts . setPostField ( pid , 'deleted' , 0 , ( err ) => {
2017-02-23 17:02:54 +03:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
socketPosts . getRawPost ( { uid : voterUid } , pid , ( err , postContent ) => {
2017-02-23 17:02:54 +03:00
assert . ifError ( err ) ;
assert . equal ( postContent , 'raw content' ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should get post' , ( done ) => {
socketPosts . getPost ( { uid : voterUid } , pid , ( err , postData ) => {
2017-02-23 17:02:54 +03:00
assert . ifError ( err ) ;
assert ( postData ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should get post category' , ( done ) => {
socketPosts . getCategory ( { uid : voterUid } , pid , ( err , postCid ) => {
2017-02-23 17:02:54 +03:00
assert . ifError ( err ) ;
assert . equal ( cid , postCid ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error with invalid data' , ( done ) => {
socketPosts . getPidIndex ( { uid : voterUid } , null , ( err ) => {
2017-02-23 17:02:54 +03:00
assert . equal ( err . message , '[[error:invalid-data]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should get pid index' , ( done ) => {
socketPosts . getPidIndex ( { uid : voterUid } , { pid : pid , tid : topicData . tid , topicPostSort : 'oldest_to_newest' } , ( err , index ) => {
2017-02-23 17:02:54 +03:00
assert . ifError ( err ) ;
2020-07-09 12:51:05 -04:00
assert . equal ( index , 4 ) ;
2017-02-23 17:02:54 +03:00
done ( ) ;
} ) ;
} ) ;
2019-07-03 12:48:26 -04:00
2021-02-04 00:01:39 -07:00
it ( 'should get pid index in reverse' , ( done ) => {
2019-07-03 12:48:26 -04:00
topics . reply ( {
uid : voterUid ,
tid : topicData . tid ,
content : 'raw content' ,
2021-02-04 00:01:39 -07:00
} , ( err , postData ) => {
2019-07-03 12:48:26 -04:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
socketPosts . getPidIndex ( { uid : voterUid } , { pid : postData . pid , tid : topicData . tid , topicPostSort : 'newest_to_oldest' } , ( err , index ) => {
2019-07-03 12:48:26 -04:00
assert . ifError ( err ) ;
assert . equal ( index , 1 ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2017-02-23 17:02:54 +03:00
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'filterPidsByCid' , ( ) => {
it ( 'should return pids as is if cid is falsy' , ( done ) => {
posts . filterPidsByCid ( [ 1 , 2 , 3 ] , null , ( err , pids ) => {
2017-05-11 17:16:22 -04:00
assert . ifError ( err ) ;
assert . deepEqual ( [ 1 , 2 , 3 ] , pids ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should filter pids by single cid' , ( done ) => {
posts . filterPidsByCid ( [ postData . pid , 100 , 101 ] , cid , ( err , pids ) => {
2017-05-11 17:16:22 -04:00
assert . ifError ( err ) ;
assert . deepEqual ( [ postData . pid ] , pids ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should filter pids by multiple cids' , ( done ) => {
posts . filterPidsByCid ( [ postData . pid , 100 , 101 ] , [ cid , 2 , 3 ] , ( err , pids ) => {
2017-05-11 17:16:22 -04:00
assert . ifError ( err ) ;
assert . deepEqual ( [ postData . pid ] , pids ) ;
done ( ) ;
} ) ;
} ) ;
2019-07-17 00:17:21 -04:00
2021-02-04 00:01:39 -07:00
it ( 'should filter pids by multiple cids' , ( done ) => {
posts . filterPidsByCid ( [ postData . pid , 100 , 101 ] , [ cid ] , ( err , pids ) => {
2019-07-17 00:17:21 -04:00
assert . ifError ( err ) ;
assert . deepEqual ( [ postData . pid ] , pids ) ;
done ( ) ;
} ) ;
} ) ;
2017-05-11 17:16:22 -04:00
} ) ;
2017-08-15 12:59:40 -04:00
2021-02-04 00:01:39 -07:00
it ( 'should error if user does not exist' , ( done ) => {
user . isReadyToPost ( 21123123 , 1 , ( err ) => {
2017-10-31 09:43:11 -04:00
assert . equal ( err . message , '[[error:no-user]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
describe ( 'post queue' , ( ) => {
2021-02-04 00:06:15 -07:00
let uid ;
let queueId ;
let topicQueueId ;
let jar ;
2021-02-04 00:01:39 -07:00
before ( ( done ) => {
2017-08-15 12:59:40 -04:00
meta . config . postQueue = 1 ;
2021-02-04 00:01:39 -07:00
user . create ( { username : 'newuser' } , ( err , _uid ) => {
2017-08-15 12:59:40 -04:00
assert . ifError ( err ) ;
uid = _uid ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
after ( ( done ) => {
2017-08-15 12:59:40 -04:00
meta . config . postQueue = 0 ;
2019-10-28 14:36:14 -04:00
meta . config . groupsExemptFromPostQueue = [ ] ;
2017-08-15 12:59:40 -04:00
done ( ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should add topic to post queue' , ( done ) => {
socketTopics . post ( { uid : uid } , { title : 'should be queued' , content : 'queued topic content' , cid : cid } , ( err , result ) => {
2017-08-15 12:59:40 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( result . queued , true ) ;
assert . equal ( result . message , '[[success:post-queued]]' ) ;
2020-07-20 21:28:17 -04:00
topicQueueId = result . id ;
2017-10-31 10:53:28 -04:00
2017-08-15 12:59:40 -04:00
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should add reply to post queue' , ( done ) => {
socketPosts . reply ( { uid : uid } , { content : 'this is a queued reply' , tid : topicData . tid } , ( err , result ) => {
2017-08-15 12:59:40 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( result . queued , true ) ;
assert . equal ( result . message , '[[success:post-queued]]' ) ;
2017-10-31 10:53:28 -04:00
queueId = result . id ;
2017-08-15 12:59:40 -04:00
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should load queued posts' , ( done ) => {
helpers . loginUser ( 'globalmod' , 'globalmodpwd' , ( err , _jar ) => {
2017-10-31 10:53:28 -04:00
jar = _jar ;
2017-08-27 19:13:19 -04:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
request ( ` ${ nconf . get ( 'url' ) } /api/post-queue ` , { jar : jar , json : true } , ( err , res , body ) => {
2017-08-27 19:13:19 -04:00
assert . ifError ( err ) ;
assert . equal ( body . posts [ 0 ] . type , 'topic' ) ;
assert . equal ( body . posts [ 0 ] . data . content , 'queued topic content' ) ;
assert . equal ( body . posts [ 1 ] . type , 'reply' ) ;
assert . equal ( body . posts [ 1 ] . data . content , 'this is a queued reply' ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should error if data is invalid' , ( done ) => {
socketPosts . editQueuedContent ( { uid : globalModUid } , null , ( err ) => {
2017-10-31 10:53:28 -04:00
assert . equal ( err . message , '[[error:invalid-data]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should edit post in queue' , ( done ) => {
socketPosts . editQueuedContent ( { uid : globalModUid } , { id : queueId , content : 'newContent' } , ( err ) => {
2017-10-31 10:53:28 -04:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
request ( ` ${ nconf . get ( 'url' ) } /api/post-queue ` , { jar : jar , json : true } , ( err , res , body ) => {
2017-10-31 10:53:28 -04:00
assert . ifError ( err ) ;
assert . equal ( body . posts [ 1 ] . type , 'reply' ) ;
assert . equal ( body . posts [ 1 ] . data . content , 'newContent' ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should edit topic title in queue' , ( done ) => {
socketPosts . editQueuedContent ( { uid : globalModUid } , { id : topicQueueId , title : 'new topic title' } , ( err ) => {
2020-07-20 21:28:17 -04:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
request ( ` ${ nconf . get ( 'url' ) } /api/post-queue ` , { jar : jar , json : true } , ( err , res , body ) => {
2020-07-20 21:28:17 -04:00
assert . ifError ( err ) ;
assert . equal ( body . posts [ 0 ] . type , 'topic' ) ;
assert . equal ( body . posts [ 0 ] . data . title , 'new topic title' ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should edit topic category in queue' , ( done ) => {
socketPosts . editQueuedContent ( { uid : globalModUid } , { id : topicQueueId , cid : 2 } , ( err ) => {
2020-07-23 16:43:56 -04:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
request ( ` ${ nconf . get ( 'url' ) } /api/post-queue ` , { jar : jar , json : true } , ( err , res , body ) => {
2020-07-23 16:43:56 -04:00
assert . ifError ( err ) ;
assert . equal ( body . posts [ 0 ] . type , 'topic' ) ;
assert . equal ( body . posts [ 0 ] . data . cid , 2 ) ;
2021-02-04 00:01:39 -07:00
socketPosts . editQueuedContent ( { uid : globalModUid } , { id : topicQueueId , cid : cid } , ( err ) => {
2020-07-23 16:43:56 -04:00
assert . ifError ( err ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should prevent regular users from approving posts' , ( done ) => {
socketPosts . accept ( { uid : uid } , { id : queueId } , ( err ) => {
2017-10-31 16:04:25 -04:00
assert . equal ( err . message , '[[error:no-privileges]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should prevent regular users from approving non existing posts' , ( done ) => {
socketPosts . accept ( { uid : uid } , { id : 123123 } , ( err ) => {
2017-10-31 16:04:25 -04:00
assert . equal ( err . message , '[[error:no-privileges]]' ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should accept queued posts and submit' , ( done ) => {
2021-02-04 00:06:15 -07:00
let ids ;
2017-08-15 12:59:40 -04:00
async . waterfall ( [
function ( next ) {
db . getSortedSetRange ( 'post:queue' , 0 , - 1 , next ) ;
} ,
function ( _ids , next ) {
ids = _ids ;
socketPosts . accept ( { uid : globalModUid } , { id : ids [ 0 ] } , next ) ;
} ,
function ( next ) {
socketPosts . accept ( { uid : globalModUid } , { id : ids [ 1 ] } , next ) ;
} ,
] , done ) ;
} ) ;
2019-04-01 08:27:37 -04:00
2021-02-04 00:01:39 -07:00
it ( 'should not crash if id does not exist' , ( done ) => {
socketPosts . reject ( { uid : globalModUid } , { id : '123123123' } , ( err ) => {
2019-07-17 19:05:55 -04:00
assert . equal ( err . message , '[[error:no-privileges]]' ) ;
2019-04-01 08:27:37 -04:00
done ( ) ;
} ) ;
} ) ;
2019-10-28 14:36:14 -04:00
2021-02-04 00:01:39 -07:00
it ( 'should bypass post queue if user is in exempt group' , ( done ) => {
2019-10-28 14:36:14 -04:00
meta . config . groupsExemptFromPostQueue = [ 'registered-users' ] ;
2021-02-04 00:01:39 -07:00
socketTopics . post ( { uid : uid , emit : ( ) => { } } , { title : 'should not be queued' , content : 'topic content' , cid : cid } , ( err , result ) => {
2019-10-28 14:36:14 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( result . title , 'should not be queued' ) ;
done ( ) ;
} ) ;
} ) ;
2017-08-15 12:59:40 -04:00
} ) ;
2018-04-16 12:46:20 -04:00
2021-02-04 00:01:39 -07:00
describe ( 'upload methods' , ( ) => {
2019-09-04 16:58:58 -04:00
let pid ;
let purgePid ;
2018-04-16 12:46:20 -04:00
2019-09-04 16:58:58 -04:00
before ( async ( ) => {
2018-04-17 13:31:54 -04:00
// Create stub files for testing
[ 'abracadabra.png' , 'shazam.jpg' , 'whoa.gif' , 'amazeballs.jpg' , 'wut.txt' , 'test.bmp' ]
2019-03-18 12:09:10 -04:00
. forEach ( filename => fs . closeSync ( fs . openSync ( path . join ( nconf . get ( 'upload_path' ) , 'files' , filename ) , 'w' ) ) ) ;
2018-04-17 13:31:54 -04:00
2019-09-04 16:58:58 -04:00
const topicPostData = await topics . post ( {
2018-04-16 12:46:20 -04:00
uid : 1 ,
cid : 1 ,
title : 'topic with some images' ,
content : 'here is an image [alt text](/assets/uploads/files/abracadabra.png) and another [alt text](/assets/uploads/files/shazam.jpg)' ,
} ) ;
2019-09-04 16:58:58 -04:00
pid = topicPostData . postData . pid ;
const purgePostData = await topics . post ( {
uid : 1 ,
cid : 1 ,
title : 'topic with some images, to be purged' ,
content : 'here is an image [alt text](/assets/uploads/files/whoa.gif) and another [alt text](/assets/uploads/files/amazeballs.jpg)' ,
} ) ;
purgePid = purgePostData . postData . pid ;
2018-04-16 12:46:20 -04:00
} ) ;
2021-02-04 00:01:39 -07:00
describe ( '.sync()' , ( ) => {
it ( 'should properly add new images to the post\'s zset' , ( done ) => {
posts . uploads . sync ( pid , ( err ) => {
2018-04-16 12:46:20 -04:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
db . sortedSetCard ( ` post: ${ pid } :uploads ` , ( err , length ) => {
2018-04-16 12:46:20 -04:00
assert . ifError ( err ) ;
2019-03-18 12:09:10 -04:00
assert . strictEqual ( length , 2 ) ;
2018-04-16 12:46:20 -04:00
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should remove an image if it is edited out of the post' , ( done ) => {
2018-04-16 12:46:20 -04:00
async . series ( [
function ( next ) {
posts . edit ( {
pid : pid ,
uid : 1 ,
content : 'here is an image [alt text](/assets/uploads/files/abracadabra.png)... AND NO MORE!' ,
} , next ) ;
} ,
async . apply ( posts . uploads . sync , pid ) ,
2021-02-04 00:01:39 -07:00
] , ( err ) => {
2018-04-16 12:46:20 -04:00
assert . ifError ( err ) ;
2021-02-04 00:01:39 -07:00
db . sortedSetCard ( ` post: ${ pid } :uploads ` , ( err , length ) => {
2018-04-16 12:46:20 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( 1 , length ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
describe ( '.list()' , ( ) => {
it ( 'should display the uploaded files for a specific post' , ( done ) => {
posts . uploads . list ( pid , ( err , uploads ) => {
2018-04-16 12:46:20 -04:00
assert . ifError ( err ) ;
assert . equal ( true , Array . isArray ( uploads ) ) ;
assert . strictEqual ( 1 , uploads . length ) ;
assert . equal ( 'string' , typeof uploads [ 0 ] ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
describe ( '.isOrphan()' , ( ) => {
it ( 'should return false if upload is not an orphan' , ( done ) => {
posts . uploads . isOrphan ( 'abracadabra.png' , ( err , isOrphan ) => {
2018-04-16 16:44:17 -04:00
assert . ifError ( err ) ;
assert . equal ( false , isOrphan ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should return true if upload is an orphan' , ( done ) => {
posts . uploads . isOrphan ( 'shazam.jpg' , ( err , isOrphan ) => {
2018-04-16 16:44:17 -04:00
assert . ifError ( err ) ;
assert . equal ( true , isOrphan ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
describe ( '.associate()' , ( ) => {
it ( 'should add an image to the post\'s maintained list of uploads' , ( done ) => {
2018-04-16 12:46:20 -04:00
async . waterfall ( [
async . apply ( posts . uploads . associate , pid , 'whoa.gif' ) ,
async . apply ( posts . uploads . list , pid ) ,
2021-02-04 00:01:39 -07:00
] , ( err , uploads ) => {
2018-04-16 12:46:20 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( 2 , uploads . length ) ;
2018-04-16 15:21:48 -04:00
assert . strictEqual ( true , uploads . includes ( 'whoa.gif' ) ) ;
2018-04-16 12:46:20 -04:00
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should allow arrays to be passed in' , ( done ) => {
2018-04-16 12:46:20 -04:00
async . waterfall ( [
async . apply ( posts . uploads . associate , pid , [ 'amazeballs.jpg' , 'wut.txt' ] ) ,
async . apply ( posts . uploads . list , pid ) ,
2021-02-04 00:01:39 -07:00
] , ( err , uploads ) => {
2018-04-16 12:46:20 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( 4 , uploads . length ) ;
2018-04-16 15:21:48 -04:00
assert . strictEqual ( true , uploads . includes ( 'amazeballs.jpg' ) ) ;
assert . strictEqual ( true , uploads . includes ( 'wut.txt' ) ) ;
2018-04-16 12:46:20 -04:00
done ( ) ;
} ) ;
} ) ;
2018-04-16 16:22:20 -04:00
2021-02-04 00:01:39 -07:00
it ( 'should save a reverse association of md5sum to pid' , ( done ) => {
2018-04-16 16:22:20 -04:00
const md5 = filename => crypto . createHash ( 'md5' ) . update ( filename ) . digest ( 'hex' ) ;
async . waterfall ( [
async . apply ( posts . uploads . associate , pid , [ 'test.bmp' ] ) ,
function ( next ) {
2021-02-03 23:59:08 -07:00
db . getSortedSetRange ( ` upload: ${ md5 ( 'test.bmp' ) } :pids ` , 0 , - 1 , next ) ;
2018-04-16 16:22:20 -04:00
} ,
2021-02-04 00:01:39 -07:00
] , ( err , pids ) => {
2018-04-16 16:22:20 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( true , Array . isArray ( pids ) ) ;
assert . strictEqual ( true , pids . length > 0 ) ;
assert . equal ( pid , pids [ 0 ] ) ;
done ( ) ;
} ) ;
} ) ;
2018-04-17 13:31:54 -04:00
2021-02-04 00:01:39 -07:00
it ( 'should not associate a file that does not exist on the local disk' , ( done ) => {
2018-04-17 13:31:54 -04:00
async . waterfall ( [
async . apply ( posts . uploads . associate , pid , [ 'nonexistant.xls' ] ) ,
async . apply ( posts . uploads . list , pid ) ,
2021-02-04 00:01:39 -07:00
] , ( err , uploads ) => {
2018-04-17 13:31:54 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( uploads . length , 5 ) ;
assert . strictEqual ( false , uploads . includes ( 'nonexistant.xls' ) ) ;
done ( ) ;
} ) ;
} ) ;
2018-04-16 12:46:20 -04:00
} ) ;
2021-02-04 00:01:39 -07:00
describe ( '.dissociate()' , ( ) => {
it ( 'should remove an image from the post\'s maintained list of uploads' , ( done ) => {
2018-04-16 12:46:20 -04:00
async . waterfall ( [
async . apply ( posts . uploads . dissociate , pid , 'whoa.gif' ) ,
async . apply ( posts . uploads . list , pid ) ,
2021-02-04 00:01:39 -07:00
] , ( err , uploads ) => {
2018-04-16 12:46:20 -04:00
assert . ifError ( err ) ;
2018-04-16 16:22:20 -04:00
assert . strictEqual ( 4 , uploads . length ) ;
2018-04-16 12:46:20 -04:00
assert . strictEqual ( false , uploads . includes ( 'whoa.gif' ) ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should allow arrays to be passed in' , ( done ) => {
2018-04-16 12:46:20 -04:00
async . waterfall ( [
async . apply ( posts . uploads . dissociate , pid , [ 'amazeballs.jpg' , 'wut.txt' ] ) ,
async . apply ( posts . uploads . list , pid ) ,
2021-02-04 00:01:39 -07:00
] , ( err , uploads ) => {
2018-04-16 12:46:20 -04:00
assert . ifError ( err ) ;
2018-04-16 16:22:20 -04:00
assert . strictEqual ( 2 , uploads . length ) ;
2018-04-16 12:46:20 -04:00
assert . strictEqual ( false , uploads . includes ( 'amazeballs.jpg' ) ) ;
assert . strictEqual ( false , uploads . includes ( 'wut.txt' ) ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2019-09-04 16:58:58 -04:00
describe ( '.dissociateAll()' , ( ) => {
it ( 'should remove all images from a post\'s maintained list of uploads' , async ( ) => {
await posts . uploads . dissociateAll ( pid ) ;
const uploads = await posts . uploads . list ( pid ) ;
assert . equal ( uploads . length , 0 ) ;
} ) ;
} ) ;
describe ( 'Dissociation on purge' , ( ) => {
it ( 'should not dissociate images on post deletion' , async ( ) => {
await posts . delete ( purgePid , 1 ) ;
const uploads = await posts . uploads . list ( purgePid ) ;
assert . equal ( uploads . length , 2 ) ;
} ) ;
it ( 'should dissociate images on post purge' , async ( ) => {
await posts . purge ( purgePid , 1 ) ;
const uploads = await posts . uploads . list ( purgePid ) ;
assert . equal ( uploads . length , 0 ) ;
} ) ;
} ) ;
2018-04-16 12:46:20 -04:00
} ) ;
2018-04-16 15:21:48 -04:00
2021-02-04 00:01:39 -07:00
describe ( 'post uploads management' , ( ) => {
2018-04-16 15:21:48 -04:00
let topic ;
let reply ;
2021-02-04 00:01:39 -07:00
before ( ( done ) => {
2018-04-16 15:21:48 -04:00
topics . post ( {
uid : 1 ,
cid : cid ,
title : 'topic to test uploads with' ,
content : '[abcdef](/assets/uploads/files/abracadabra.png)' ,
2021-02-04 00:01:39 -07:00
} , ( err , topicPostData ) => {
2018-04-16 15:21:48 -04:00
assert . ifError ( err ) ;
topics . reply ( {
uid : 1 ,
tid : topicPostData . topicData . tid ,
timestamp : Date . now ( ) ,
2018-04-17 13:31:54 -04:00
content : '[abcdef](/assets/uploads/files/shazam.jpg)' ,
2021-02-04 00:01:39 -07:00
} , ( err , replyData ) => {
2018-04-16 15:21:48 -04:00
assert . ifError ( err ) ;
topic = topicPostData ;
reply = replyData ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should automatically sync uploads on topic create and reply' , ( done ) => {
db . sortedSetsCard ( [ ` post: ${ topic . topicData . mainPid } :uploads ` , ` post: ${ reply . pid } :uploads ` ] , ( err , lengths ) => {
2018-04-16 15:21:48 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( 1 , lengths [ 0 ] ) ;
assert . strictEqual ( 1 , lengths [ 1 ] ) ;
done ( ) ;
} ) ;
} ) ;
2021-02-04 00:01:39 -07:00
it ( 'should automatically sync uploads on post edit' , ( done ) => {
2018-04-16 15:21:48 -04:00
async . waterfall ( [
async . apply ( posts . edit , {
pid : reply . pid ,
uid : 1 ,
content : 'no uploads' ,
} ) ,
function ( postData , next ) {
posts . uploads . list ( reply . pid , next ) ;
} ,
2021-02-04 00:01:39 -07:00
] , ( err , uploads ) => {
2018-04-16 15:21:48 -04:00
assert . ifError ( err ) ;
assert . strictEqual ( true , Array . isArray ( uploads ) ) ;
assert . strictEqual ( 0 , uploads . length ) ;
done ( ) ;
} ) ;
} ) ;
} ) ;
2016-10-08 19:09:48 +03:00
} ) ;