inf scroll tests for topics

v1.18.x
barisusakli 8 years ago
parent bece25cf6a
commit 3ec760ac85

@ -14,78 +14,80 @@ module.exports = function (SocketTopics) {
if (!data || !data.tid || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) { if (!data || !data.tid || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) {
return callback(new Error('[[error:invalid-data]]')); return callback(new Error('[[error:invalid-data]]'));
} }
var userPrivileges;
async.parallel({
privileges: function (next) { async.waterfall([
privileges.topics.get(data.tid, socket.uid, next); function (next) {
async.parallel({
privileges: function (next) {
privileges.topics.get(data.tid, socket.uid, next);
},
topic: function (next) {
topics.getTopicFields(data.tid, ['postcount', 'deleted'], next);
}
}, next);
}, },
topic: function (next) { function (results, next) {
topics.getTopicFields(data.tid, ['postcount', 'deleted'], next); if (!results.privileges.read || (parseInt(results.topic.deleted, 10) && !results.privileges.view_deleted)) {
} return callback(new Error('[[error:no-privileges]]'));
}, function (err, results) { }
if (err) {
return callback(err);
}
if (!results.privileges.read || (parseInt(results.topic.deleted, 10) && !results.privileges.view_deleted)) { userPrivileges = results.privileges;
return callback(new Error('[[error:no-privileges]]'));
}
var set = 'tid:' + data.tid + ':posts'; var set = 'tid:' + data.tid + ':posts';
if (data.topicPostSort === 'most_votes') { if (data.topicPostSort === 'most_votes') {
set = 'tid:' + data.tid + ':posts:votes'; set = 'tid:' + data.tid + ':posts:votes';
} }
var reverse = data.topicPostSort === 'newest_to_oldest' || data.topicPostSort === 'most_votes'; var reverse = data.topicPostSort === 'newest_to_oldest' || data.topicPostSort === 'most_votes';
var start = Math.max(0, parseInt(data.after, 10)); var start = Math.max(0, parseInt(data.after, 10));
var infScrollPostsPerPage = 10; var infScrollPostsPerPage = 10;
if (data.direction > 0) { if (data.direction > 0) {
if (reverse) { if (reverse) {
start = results.topic.postcount - start; start = results.topic.postcount - start;
} }
} else {
if (reverse) {
start = results.topic.postcount - start - infScrollPostsPerPage - 1;
} else { } else {
start = start - infScrollPostsPerPage - 1; if (reverse) {
start = results.topic.postcount - start - infScrollPostsPerPage - 1;
} else {
start = start - infScrollPostsPerPage - 1;
}
} }
}
var stop = start + (infScrollPostsPerPage - 1);
start = Math.max(0, start); var stop = start + (infScrollPostsPerPage - 1);
stop = Math.max(0, stop);
start = Math.max(0, start);
async.parallel({ stop = Math.max(0, stop);
mainPost: function (next) {
if (start > 0) { async.parallel({
return next(); mainPost: function (next) {
if (start > 0) {
return next();
}
topics.getMainPost(data.tid, socket.uid, next);
},
posts: function (next) {
topics.getTopicPosts(data.tid, set, start, stop, socket.uid, reverse, next);
},
postSharing: function (next) {
social.getActivePostSharing(next);
} }
topics.getMainPost(data.tid, socket.uid, next); }, next);
}, },
posts: function (next) { function (topicData, next) {
topics.getTopicPosts(data.tid, set, start, stop, socket.uid, reverse, next);
},
postSharing: function (next) {
social.getActivePostSharing(next);
}
}, function (err, topicData) {
if (err) {
return callback(err);
}
if (topicData.mainPost) { if (topicData.mainPost) {
topicData.posts = [topicData.mainPost].concat(topicData.posts); topicData.posts = [topicData.mainPost].concat(topicData.posts);
} }
topicData.privileges = results.privileges; topicData.privileges = userPrivileges;
topicData['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; topicData['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1;
topicData['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; topicData['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1;
topics.modifyPostsByPrivilege(topicData, results.privileges); topics.modifyPostsByPrivilege(topicData, userPrivileges);
callback(null, topicData); next(null, topicData);
}); }
}); ], callback);
}; };
SocketTopics.loadMoreUnreadTopics = function (socket, data, callback) { SocketTopics.loadMoreUnreadTopics = function (socket, data, callback) {
@ -110,7 +112,6 @@ module.exports = function (SocketTopics) {
topics.getRecentTopics(data.cid, socket.uid, start, stop, data.filter, callback); topics.getRecentTopics(data.cid, socket.uid, start, stop, data.filter, callback);
}; };
SocketTopics.loadMoreFromSet = function (socket, data, callback) { SocketTopics.loadMoreFromSet = function (socket, data, callback) {
if (!data || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0 || !data.set) { if (!data || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0 || !data.set) {
return callback(new Error('[[error:invalid-data]]')); return callback(new Error('[[error:invalid-data]]'));

@ -460,27 +460,23 @@ describe('Topic\'s', function () {
}); });
}); });
describe('.fork', function () { describe('.fork', function () {
var newTopic; var newTopic;
var replies = []; var replies = [];
var topicPids; var topicPids;
var originalBookmark = 5; var originalBookmark = 5;
function postReply( next ) { function postReply(next) {
topics.reply({uid: topic.userId, content: 'test post ' + replies.length, tid: newTopic.tid}, topics.reply({uid: topic.userId, content: 'test post ' + replies.length, tid: newTopic.tid}, function (err, result) {
function (err, result) {
assert.equal(err, null, 'was created with error'); assert.equal(err, null, 'was created with error');
assert.ok(result); assert.ok(result);
replies.push( result ); replies.push(result);
next(); next();
} }
); );
} }
before( function (done) { before(function (done) {
async.waterfall( async.waterfall([
[
function (next) { function (next) {
groups.join('administrators', topic.userId, next); groups.join('administrators', topic.userId, next);
}, },
@ -576,6 +572,90 @@ describe('Topic\'s', function () {
}); });
}); });
describe('infinitescroll', function () {
var socketTopics = require('../src/socket.io/topics');
var tid;
before(function (done) {
topics.post({uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId}, function (err, result) {
assert.ifError(err);
tid = result.topicData.tid;
done();
});
});
it('should error with invalid data', function (done) {
socketTopics.loadMore({uid: adminUid}, {}, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should infinite load topic posts', function (done) {
socketTopics.loadMore({uid: adminUid}, {tid: tid, after: 0}, function (err, data) {
assert.ifError(err);
assert(data.mainPost);
assert(data.posts);
assert(data.privileges);
done();
});
});
it('should error with invalid data', function (done) {
socketTopics.loadMoreUnreadTopics({uid: adminUid}, {after: 'invalid'}, function (err, data) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should load more unread topics', function (done) {
socketTopics.markUnread({uid: adminUid}, tid, function (err) {
assert.ifError(err);
socketTopics.loadMoreUnreadTopics({uid: adminUid}, {cid: topic.categoryId, after: 0}, function (err, data) {
assert.ifError(err);
assert(data);
assert(Array.isArray(data.topics));
done();
});
});
});
it('should error with invalid data', function (done) {
socketTopics.loadMoreRecentTopics({uid: adminUid}, {after: 'invalid'}, function (err, data) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should load more recent topics', function (done) {
socketTopics.loadMoreRecentTopics({uid: adminUid}, {cid: topic.categoryId, after: 0}, function (err, data) {
assert.ifError(err);
assert(data);
assert(Array.isArray(data.topics));
done();
});
});
it('should error with invalid data', function (done) {
socketTopics.loadMoreFromSet({uid: adminUid}, {after: 'invalid'}, function (err, data) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should load more from custom set', function (done) {
socketTopics.loadMoreRecentTopics({uid: adminUid}, {set: 'uid:' + adminUid + ':topics', after: 0}, function (err, data) {
assert.ifError(err);
assert(data);
assert(Array.isArray(data.topics));
done();
});
});
});
after(function (done) { after(function (done) {
db.emptydb(done); db.emptydb(done);
}); });

Loading…
Cancel
Save