FIX: only show edit history when navigating via edit notification for posts which have revisions and can have its edit history viewed (#26418)

This commit is contained in:
Kelv 2024-04-01 11:00:28 +08:00 committed by GitHub
parent a84757fd91
commit 07605e52c2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 123 additions and 54 deletions

View File

@ -172,11 +172,10 @@ export default Controller.extend(bufferedProperty("model"), {
_showRevision(postNumber, revision) {
const post = this.model.get("postStream").postForPostNumber(postNumber);
if (!post) {
return;
}
schedule("afterRender", () => this.send("showHistory", post, revision));
if (post && post.version > 1 && post.can_view_edit_history) {
schedule("afterRender", () => this.send("showHistory", post, revision));
}
},
showCategoryChooser: not("model.isPrivateMessage"),

View File

@ -1,59 +1,129 @@
import { click, visit } from "@ember/test-helpers";
import { test } from "qunit";
import topicFixtures from "discourse/tests/fixtures/topic";
import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers";
import { cloneJSON } from "discourse-common/lib/object";
acceptance("Edit Notification Click", function (needs) {
needs.user();
needs.pretender((server, helper) => {
server.get("/posts/133/revisions/1.json", () => {
return helper.response({
created_at: "2021-07-30T11:19:59.549Z",
post_id: 133,
previous_hidden: false,
current_hidden: false,
first_revision: 2,
previous_revision: null,
current_revision: 2,
next_revision: null,
last_revision: 2,
current_version: 2,
version_count: 2,
username: "velesin",
display_username: "velesin",
avatar_template: "/letter_avatar_proxy/v4/letter/j/13edae/{size}.png",
edit_reason: null,
body_changes: {
inline:
'<div class="inline-diff"><p>Hello world this is a test</p><p class="diff-ins">another edit!</p></div>',
side_by_side:
'<div class="revision-content"><p>Hello world this is a test</p></div><div class="revision-content"><p>Hello world this is a test</p><p class="diff-ins">This is an edit!</p></div>',
side_by_side_markdown:
'<table class="markdown"><tr><td class="diff-del">Hello world this is a test</td><td class="diff-ins">Hello world this is a test<ins>\n\nThis is an edit!</ins></td></tr></table>',
},
title_changes: null,
user_changes: null,
wiki: false,
can_edit: true,
const revisionResponse = {
created_at: "2021-07-30T11:19:59.549Z",
post_id: 133,
previous_hidden: false,
current_hidden: false,
first_revision: 2,
previous_revision: null,
current_revision: 2,
next_revision: null,
last_revision: 2,
current_version: 2,
version_count: 2,
username: "velesin",
display_username: "velesin",
avatar_template: "/letter_avatar_proxy/v4/letter/j/13edae/{size}.png",
edit_reason: null,
body_changes: {
inline:
'<div class="inline-diff"><p>Hello world this is a test</p><p class="diff-ins">another edit!</p></div>',
side_by_side:
'<div class="revision-content"><p>Hello world this is a test</p></div><div class="revision-content"><p>Hello world this is a test</p><p class="diff-ins">This is an edit!</p></div>',
side_by_side_markdown:
'<table class="markdown"><tr><td class="diff-del">Hello world this is a test</td><td class="diff-ins">Hello world this is a test<ins>\n\nThis is an edit!</ins></td></tr></table>',
},
title_changes: null,
user_changes: null,
wiki: false,
can_edit: true,
};
acceptance(
"Edit Notification Click - when post revisions are present",
function (needs) {
needs.user();
needs.pretender((server, helper) => {
const topicRef = "/t/130.json";
const topicResponse = cloneJSON(topicFixtures[topicRef]);
const originalPost = topicResponse.post_stream.posts[0];
originalPost.version = 2;
server.get(topicRef, () => helper.response(topicResponse));
server.get(`/posts/${originalPost.id}/revisions/1.json`, () => {
return helper.response(revisionResponse);
});
});
});
test("history modal is shown when navigating from a non-topic page", async function (assert) {
await visit("/");
await click(".header-dropdown-toggle.current-user");
await click(".notification.edited a");
const [v1, v2] = queryAll(".history-modal .revision-content");
test("history modal is shown when navigating from a non-topic page", async function (assert) {
await visit("/");
await click(".header-dropdown-toggle.current-user");
await click(".notification.edited a");
const [v1, v2] = queryAll(".history-modal .revision-content");
assert.strictEqual(
v1.textContent.trim(),
"Hello world this is a test",
"history modal for the edited post is shown"
);
assert.strictEqual(
v1.textContent.trim(),
"Hello world this is a test",
"history modal for the edited post is shown"
);
assert.strictEqual(
v2.textContent.trim(),
"Hello world this is a testThis is an edit!",
"history modal for the edited post is shown"
);
});
});
assert.strictEqual(
v2.textContent.trim(),
"Hello world this is a testThis is an edit!",
"history modal for the edited post is shown"
);
});
}
);
acceptance(
"Edit Notification Click - when post has no revisions",
function (needs) {
needs.user();
needs.pretender((server, helper) => {
const topicRef = "/t/130.json";
const topicResponse = cloneJSON(topicFixtures[topicRef]);
const originalPost = topicResponse.post_stream.posts[0];
originalPost.version = 1;
originalPost.can_view_edit_history = true;
server.get(topicRef, () => helper.response(topicResponse));
server.get(`/posts/${originalPost.id}/revisions/1.json`, () => {
return helper.response(revisionResponse);
});
});
test("history modal is not shown when navigating from a non-topic page", async function (assert) {
await visit("/");
await click(".header-dropdown-toggle.current-user");
await click(".notification.edited a");
assert
.dom(".history-modal")
.doesNotExist(
"history modal should not open for post on its first version"
);
});
}
);
acceptance(
"Edit Notification Click - when post edit history cannot be viewed",
function (needs) {
needs.user();
needs.pretender((server, helper) => {
const topicRef = "/t/130.json";
const topicResponse = cloneJSON(topicFixtures[topicRef]);
const originalPost = topicResponse.post_stream.posts[0];
originalPost.version = 2;
originalPost.can_view_edit_history = false;
server.get(topicRef, () => helper.response(topicResponse));
server.get(`/posts/${originalPost.id}/revisions/1.json`, () => {
return helper.response(revisionResponse);
});
});
test("history modal is not shown when navigating from a non-topic page", async function (assert) {
await visit("/");
await click(".header-dropdown-toggle.current-user");
await click(".notification.edited a");
assert
.dom(".history-modal")
.doesNotExist(
"history modal should not open for post which cannot have edit history viewed"
);
});
}
);