mirror of
https://github.com/discourse/discourse.git
synced 2025-09-06 10:50:21 +08:00
Select +Replies for bulk operations
This commit is contained in:
parent
dba1d79de2
commit
f157ec1f91
20 changed files with 282 additions and 77 deletions
|
@ -7,7 +7,7 @@ var avatarSelector = Em.Object.create({
|
|||
module("Discourse.AvatarSelectorController");
|
||||
|
||||
test("avatarTemplate", function() {
|
||||
var avatarSelectorController = controllerFor("avatarSelector");
|
||||
var avatarSelectorController = testController(Discourse.AvatarSelectorController);
|
||||
avatarSelectorController.setProperties(avatarSelector);
|
||||
|
||||
equal(avatarSelectorController.get("avatarTemplate"),
|
||||
|
|
|
@ -16,7 +16,7 @@ var buildAdminUser = function(args) {
|
|||
module("Discourse.FlagController canDeleteSpammer");
|
||||
|
||||
test("canDeleteSpammer not staff", function(){
|
||||
var flagController = controllerFor('flag', buildPost());
|
||||
var flagController = testController(Discourse.FlagController, buildPost());
|
||||
this.stub(Discourse.User, 'currentProp').withArgs('staff').returns(false);
|
||||
flagController.set('selected', Discourse.PostActionType.create({name_key: 'spam'}));
|
||||
equal(flagController.get('canDeleteSpammer'), false, 'false if current user is not staff');
|
||||
|
@ -29,7 +29,7 @@ var canDeleteSpammer = function(test, postActionType, expected, testName) {
|
|||
|
||||
test("canDeleteSpammer spam not selected", function(){
|
||||
this.stub(Discourse.User, 'currentProp').withArgs('staff').returns(true);
|
||||
this.flagController = controllerFor('flag', buildPost());
|
||||
this.flagController = testController(Discourse.FlagController, buildPost());
|
||||
this.flagController.set('userDetails', buildAdminUser({can_delete_all_posts: true, can_be_deleted: true}));
|
||||
canDeleteSpammer(this, 'off_topic', false, 'false if current user is staff, but selected is off_topic');
|
||||
canDeleteSpammer(this, 'inappropriate', false, 'false if current user is staff, but selected is inappropriate');
|
||||
|
@ -39,7 +39,7 @@ test("canDeleteSpammer spam not selected", function(){
|
|||
|
||||
test("canDeleteSpammer spam selected", function(){
|
||||
this.stub(Discourse.User, 'currentProp').withArgs('staff').returns(true);
|
||||
this.flagController = controllerFor('flag', buildPost());
|
||||
this.flagController = testController(Discourse.FlagController, buildPost());
|
||||
|
||||
this.flagController.set('userDetails', buildAdminUser({can_delete_all_posts: true, can_be_deleted: true}));
|
||||
canDeleteSpammer(this, 'spam', true, 'true if current user is staff, selected is spam, posts and user can be deleted');
|
||||
|
|
|
@ -1,22 +1,19 @@
|
|||
module("Discourse.TopicController");
|
||||
|
||||
var topic = Discourse.Topic.create({
|
||||
title: "Qunit Test Topic",
|
||||
participants: [
|
||||
{id: 1234,
|
||||
post_count: 4,
|
||||
username: "eviltrout"}
|
||||
]
|
||||
});
|
||||
|
||||
|
||||
module("Discourse.TopicController", {
|
||||
setup: function() {
|
||||
this.topicController = controllerFor('topic', topic);
|
||||
}
|
||||
});
|
||||
var buildTopic = function() {
|
||||
return Discourse.Topic.create({
|
||||
title: "Qunit Test Topic",
|
||||
participants: [
|
||||
{id: 1234,
|
||||
post_count: 4,
|
||||
username: "eviltrout"}
|
||||
]
|
||||
});
|
||||
};
|
||||
|
||||
test("editingMode", function() {
|
||||
var topicController = this.topicController;
|
||||
var topic = buildTopic(),
|
||||
topicController = testController(Discourse.TopicController, topic);
|
||||
|
||||
ok(!topicController.get('editingTopic'), "we are not editing by default");
|
||||
|
||||
|
@ -32,4 +29,89 @@ test("editingMode", function() {
|
|||
|
||||
topicController.cancelEditingTopic();
|
||||
ok(!topicController.get('editingTopic'), "cancelling edit mode reverts the property value");
|
||||
});
|
||||
});
|
||||
|
||||
test("toggledSelectedPost", function() {
|
||||
var tc = testController(Discourse.TopicController, buildTopic()),
|
||||
post = Discourse.Post.create({id: 123, post_number: 2}),
|
||||
postStream = tc.get('postStream');
|
||||
|
||||
postStream.appendPost(post);
|
||||
postStream.appendPost(Discourse.Post.create({id: 124, post_number: 3}));
|
||||
|
||||
blank(tc.get('selectedPosts'), "there are no selected posts by default");
|
||||
equal(tc.get('selectedPostsCount'), 0, "there is a selected post count of 0");
|
||||
ok(!tc.postSelected(post), "the post is not selected by default");
|
||||
|
||||
tc.toggledSelectedPost(post);
|
||||
present(tc.get('selectedPosts'), "there is a selectedPosts collection");
|
||||
equal(tc.get('selectedPostsCount'), 1, "there is a selected post now");
|
||||
ok(tc.postSelected(post), "the post is now selected");
|
||||
|
||||
tc.toggledSelectedPost(post);
|
||||
ok(!tc.postSelected(post), "the post is no longer selected");
|
||||
|
||||
});
|
||||
|
||||
test("selectAll", function() {
|
||||
var tc = testController(Discourse.TopicController, buildTopic()),
|
||||
post = Discourse.Post.create({id: 123, post_number: 2}),
|
||||
postStream = tc.get('postStream');
|
||||
|
||||
postStream.appendPost(post);
|
||||
|
||||
ok(!tc.postSelected(post), "the post is not selected by default");
|
||||
tc.selectAll();
|
||||
ok(tc.postSelected(post), "the post is now selected");
|
||||
ok(tc.get('allPostsSelected'), "all posts are selected");
|
||||
tc.deselectAll();
|
||||
ok(!tc.postSelected(post), "the post is deselected again");
|
||||
ok(!tc.get('allPostsSelected'), "all posts are not selected");
|
||||
|
||||
});
|
||||
|
||||
test("Automating setting of allPostsSelected", function() {
|
||||
var topic = buildTopic(),
|
||||
tc = testController(Discourse.TopicController, topic),
|
||||
post = Discourse.Post.create({id: 123, post_number: 2}),
|
||||
postStream = tc.get('postStream');
|
||||
|
||||
topic.set('posts_count', 1);
|
||||
postStream.appendPost(post);
|
||||
ok(!tc.get('allPostsSelected'), "all posts are not selected by default");
|
||||
|
||||
tc.toggledSelectedPost(post);
|
||||
ok(tc.get('allPostsSelected'), "all posts are selected if we select the only post");
|
||||
|
||||
tc.toggledSelectedPost(post);
|
||||
ok(!tc.get('allPostsSelected'), "the posts are no longer automatically selected");
|
||||
});
|
||||
|
||||
test("Select Replies when present", function() {
|
||||
var topic = buildTopic(),
|
||||
tc = testController(Discourse.TopicController, topic),
|
||||
p1 = Discourse.Post.create({id: 1, post_number: 1, reply_count: 1}),
|
||||
p2 = Discourse.Post.create({id: 2, post_number: 2}),
|
||||
p3 = Discourse.Post.create({id: 2, post_number: 3, reply_to_post_number: 1}),
|
||||
postStream = tc.get('postStream');
|
||||
|
||||
ok(!tc.postSelected(p3), "replies are not selected by default");
|
||||
tc.toggledSelectedPostReplies(p1);
|
||||
ok(tc.postSelected(p1), "it selects the post");
|
||||
ok(!tc.postSelected(p2), "it doesn't select a post that's not a reply");
|
||||
ok(tc.postSelected(p3), "it selects a post that is a reply");
|
||||
equal(tc.get('selectedPostsCount'), 2, "it has a selected posts count of two");
|
||||
|
||||
// If we deselected the post whose replies are selected...
|
||||
tc.toggledSelectedPost(p1);
|
||||
ok(!tc.postSelected(p1), "it deselects the post");
|
||||
ok(!tc.postSelected(p3), "it deselects the replies too");
|
||||
|
||||
// If we deselect a reply, it should deselect the parent's replies selected attribute. Weird but what else would make sense?
|
||||
tc.toggledSelectedPostReplies(p1);
|
||||
tc.toggledSelectedPost(p3);
|
||||
ok(tc.postSelected(p1), "the post stays selected");
|
||||
ok(!tc.postSelected(p3), "it deselects the replies too");
|
||||
|
||||
});
|
||||
|
||||
|
|
|
@ -14,6 +14,10 @@ function integration(name) {
|
|||
});
|
||||
}
|
||||
|
||||
function testController(klass, model) {
|
||||
return klass.create({model: model, container: Discourse.__container__});
|
||||
}
|
||||
|
||||
function controllerFor(controller, model) {
|
||||
var controller = Discourse.__container__.lookup('controller:' + controller);
|
||||
if (model) { controller.set('model', model ); }
|
||||
|
|
|
@ -122,6 +122,7 @@ var jsHintOpts = {
|
|||
"console",
|
||||
"alert",
|
||||
"controllerFor",
|
||||
"testController",
|
||||
"containsInstance",
|
||||
"deepEqual",
|
||||
"notEqual",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue