Files
zulip/frontend_tests/node_tests/message_edit.js
sahil839 909a3cde76 realm: Replace allow_message_deleting with delete_own_message_policy.
This commit replaces 'allow_message_deleting' boolean setting
with an integer setting 'delete_own_message_policy'. We have a
separate dropdown now for deciding which user-roles can delete
messages sent by themselves and the time-limit setting droddown
is different.

This new setting has two options - everyone and admins only. Other
options including moderators will be added further.

We also remove the "Never" option from the original time-limit
dropdown, as admins are always allowed to delete message. This
never option resembled the case of only admins being allowed to
delete but this state is now resembled by setting the dropdown
to "admins only" and we also disable the time-limit dropdown in
this case as admins are allowed to delete irrespective of limit.

Note, this setting is only for deleting messages sent by the
deleting user themselves, and only admins are allowed to delete
messages sent by others as before.
2021-09-30 14:59:31 -07:00

163 lines
5.9 KiB
JavaScript

"use strict";
const {strict: assert} = require("assert");
const {mock_esm, zrequire} = require("../zjsunit/namespace");
const {run_test} = require("../zjsunit/test");
const {page_params} = require("../zjsunit/zpage_params");
page_params.realm_community_topic_editing_limit_seconds = 259200;
const message_edit = zrequire("message_edit");
const settings_config = zrequire("settings_config");
const get_editability = message_edit.get_editability;
const editability_types = message_edit.editability_types;
const settings_data = mock_esm("../../static/js/settings_data");
run_test("get_editability", ({override}) => {
override(settings_data, "user_can_edit_topic_of_any_message", () => true);
// You can't edit a null message
assert.equal(get_editability(null), editability_types.NO);
// You can't edit a message you didn't send
assert.equal(
get_editability({
sent_by_me: false,
}),
editability_types.NO,
);
// Failed request are currently not editable (though we want to
// change this back).
assert.equal(
get_editability({
sent_by_me: true,
failed_request: true,
}),
editability_types.NO,
);
// Locally echoed messages are not editable, since the message hasn't
// finished being sent yet.
assert.equal(
get_editability({
sent_by_me: true,
local_id: "25",
}),
editability_types.NO,
);
// For the rest of these tests, we only consider messages sent by the
// user, and that were successfully sent (i.e. no failed_request or local_id)
let message = {
sent_by_me: true,
};
page_params.realm_allow_message_editing = false;
assert.equal(get_editability(message), editability_types.NO);
page_params.realm_allow_message_editing = true;
// Limit of 0 means no time limit on editing messages
page_params.realm_message_content_edit_limit_seconds = 0;
assert.equal(get_editability(message), editability_types.FULL);
page_params.realm_message_content_edit_limit_seconds = 10;
const now = new Date();
const current_timestamp = now / 1000;
message.timestamp = current_timestamp - 60;
// Have 55+10 > 60 seconds from message.timestamp to edit the message; we're good!
assert.equal(get_editability(message, 55), editability_types.FULL);
// It's been 60 > 45+10 since message.timestamp. When realm_allow_message_editing
// is true, we can edit the topic if there is one.
message.type = "stream";
assert.equal(get_editability(message, 45), editability_types.TOPIC_ONLY);
// Right now, we prevent users from editing widgets.
message.submessages = ["/poll"];
assert.equal(get_editability(message, 45), editability_types.TOPIC_ONLY);
delete message.submessages;
message.type = "private";
assert.equal(get_editability(message, 45), editability_types.NO_LONGER);
// If we don't pass a second argument, treat it as 0
assert.equal(get_editability(message), editability_types.NO_LONGER);
message = {
sent_by_me: false,
type: "stream",
};
page_params.realm_edit_topic_policy =
settings_config.common_message_policy_values.by_everyone.code;
page_params.realm_allow_message_editing = true;
page_params.realm_message_content_edit_limit_seconds = 0;
page_params.realm_community_topic_editing_limit_seconds = 259200;
page_params.is_admin = false;
message.timestamp = current_timestamp - 60;
assert.equal(get_editability(message), editability_types.TOPIC_ONLY);
// Test `message_edit.is_topic_editable()`
assert.equal(message_edit.is_topic_editable(message), true);
message.sent_by_me = true;
override(settings_data, "user_can_edit_topic_of_any_message", () => false);
assert.equal(message_edit.is_topic_editable(message), true);
message.sent_by_me = false;
assert.equal(message_edit.is_topic_editable(message), false);
message.sent_by_me = false;
page_params.is_admin = true;
assert.equal(message_edit.is_topic_editable(message), true);
page_params.is_admin = false;
override(settings_data, "user_can_edit_topic_of_any_message", () => true);
assert.equal(message_edit.is_topic_editable(message), true);
message.timestamp = current_timestamp - 600000;
assert.equal(message_edit.is_topic_editable(message), false);
page_params.is_moderator = true;
assert.equal(message_edit.is_topic_editable(message), true);
page_params.realm_allow_message_editing = false;
assert.equal(message_edit.is_topic_editable(message), false);
});
run_test("get_deletability", () => {
page_params.is_admin = true;
page_params.realm_delete_own_message_policy =
settings_config.delete_own_message_policy_values.by_admins_only.code;
page_params.realm_message_content_delete_limit_seconds = null;
const message = {
sent_by_me: false,
locally_echoed: true,
};
// Admin can always delete any message
assert.equal(message_edit.get_deletability(message), true);
// Non-admin can't delete message sent by others
page_params.is_admin = false;
assert.equal(message_edit.get_deletability(message), false);
// Locally echoed messages are not deletable
message.sent_by_me = true;
assert.equal(message_edit.get_deletability(message), false);
message.locally_echoed = false;
assert.equal(message_edit.get_deletability(message), false);
page_params.realm_delete_own_message_policy =
settings_config.delete_own_message_policy_values.by_everyone.code;
assert.equal(message_edit.get_deletability(message), true);
const now = new Date();
const current_timestamp = now / 1000;
message.timestamp = current_timestamp - 5;
page_params.realm_message_content_delete_limit_seconds = 10;
assert.equal(message_edit.get_deletability(message), true);
message.timestamp = current_timestamp - 60;
assert.equal(message_edit.get_deletability(message), false);
});