mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-03 11:47:35 +08:00
Adds a simple Policy plugin support to the rich editor. Not editable within it yet, but supports parsing and serializing a policy content. It doesn't use a `GlimmerNodeView` yet, it'll need changes from https://github.com/discourse/discourse/pull/36675 to support `GlimmerNodeViews` without importing from the `/static/` boundary. <img width="735" height="199" alt="image" src="https://github.com/user-attachments/assets/10bc02df-a86f-4f5f-bcb9-b94716106584" />
121 lines
5.5 KiB
JavaScript
121 lines
5.5 KiB
JavaScript
import { module, test } from "qunit";
|
|
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
|
|
import { setupRichEditor } from "discourse/tests/helpers/rich-editor-helper";
|
|
|
|
module(
|
|
"Integration | Component | prosemirror-editor - policy plugin extension",
|
|
function (hooks) {
|
|
setupRenderingTest(hooks);
|
|
|
|
hooks.beforeEach(function () {
|
|
this.siteSettings.policy_enabled = true;
|
|
});
|
|
|
|
test("policy with multiple groups", async function (assert) {
|
|
const markdown = `[policy groups="staff,admins" version="2"]\nI accept the terms\n\n[/policy]\n\n`;
|
|
const [{ value }] = await setupRichEditor(assert, markdown);
|
|
|
|
const policyElement = document.querySelector(".ProseMirror .policy");
|
|
assert.dom(policyElement).hasAttribute("data-groups", "staff,admins");
|
|
assert.dom(policyElement).hasAttribute("data-version", "2");
|
|
assert.dom("p", policyElement).hasText("I accept the terms");
|
|
|
|
assert.strictEqual(value, markdown);
|
|
});
|
|
|
|
test("policy with all attributes", async function (assert) {
|
|
const markdown = `[policy group="staff" version="1" accept="true" revoke="false" reminder="daily" renew-start="2023-01-01" private="true"]\nComplex policy\n\n[/policy]\n\n`;
|
|
const [{ value }] = await setupRichEditor(assert, markdown);
|
|
|
|
const policyElement = document.querySelector(".ProseMirror .policy");
|
|
assert.dom(policyElement).hasAttribute("data-group", "staff");
|
|
assert.dom(policyElement).hasAttribute("data-version", "1");
|
|
assert.dom(policyElement).hasAttribute("data-accept", "true");
|
|
assert.dom(policyElement).hasAttribute("data-revoke", "false");
|
|
assert.dom(policyElement).hasAttribute("data-reminder", "daily");
|
|
assert.dom(policyElement).hasAttribute("data-renew-start", "2023-01-01");
|
|
assert.dom(policyElement).hasAttribute("data-private", "true");
|
|
assert.dom("p", policyElement).hasText("Complex policy");
|
|
|
|
assert.strictEqual(value, markdown);
|
|
});
|
|
|
|
test("policy with content around", async function (assert) {
|
|
const markdown = `Hello world\n\n[policy group="everyone" version="1"]\nI accept\n\n[/policy]\n\nGoodbye world`;
|
|
const [{ value }] = await setupRichEditor(assert, markdown);
|
|
|
|
const policyElement = document.querySelector(".ProseMirror .policy");
|
|
assert.dom(policyElement).hasAttribute("data-group", "everyone");
|
|
assert.dom("p", policyElement).hasText("I accept");
|
|
|
|
assert.strictEqual(value, markdown);
|
|
});
|
|
|
|
test("empty policy", async function (assert) {
|
|
const markdown = `[policy group="staff" version="1"]\n[/policy]\n\n`;
|
|
const [{ value }] = await setupRichEditor(assert, markdown);
|
|
|
|
const policyElement = document.querySelector(".ProseMirror .policy");
|
|
assert.dom(policyElement).hasAttribute("data-group", "staff");
|
|
assert.dom(policyElement).hasAttribute("data-version", "1");
|
|
assert.dom("p", policyElement).doesNotExist();
|
|
|
|
assert.strictEqual(value, markdown);
|
|
});
|
|
|
|
test("policy with multiline content", async function (assert) {
|
|
const markdown = `[policy group="staff" version="1"]\nFirst line\n\nSecond paragraph\n\n[/policy]\n\n`;
|
|
const [{ value }] = await setupRichEditor(assert, markdown);
|
|
|
|
const policyElement = document.querySelector(".ProseMirror .policy");
|
|
assert.dom("p", policyElement).exists({ count: 2 });
|
|
assert.dom("p:first-child", policyElement).hasText("First line");
|
|
assert.dom("p:last-child", policyElement).hasText("Second paragraph");
|
|
|
|
assert.strictEqual(value, markdown);
|
|
});
|
|
|
|
test("policy filters out empty attributes", async function (assert) {
|
|
const inputMarkdown = `[policy group="staff" version="1" accept="" revoke=""]\nTest\n[/policy]`;
|
|
const expectedMarkdown = `[policy group="staff" version="1"]\nTest\n\n[/policy]\n\n`;
|
|
const [{ value }] = await setupRichEditor(assert, inputMarkdown);
|
|
|
|
const policyElement = document.querySelector(".ProseMirror .policy");
|
|
assert.dom(policyElement).hasAttribute("data-group", "staff");
|
|
assert.dom(policyElement).hasAttribute("data-version", "1");
|
|
assert.dom(policyElement).doesNotHaveAttribute("data-accept");
|
|
assert.dom(policyElement).doesNotHaveAttribute("data-revoke");
|
|
assert.dom("p", policyElement).hasText("Test");
|
|
|
|
assert.strictEqual(value, expectedMarkdown);
|
|
});
|
|
|
|
test("policy renders basic structure in rich editor", async function (assert) {
|
|
const markdown = `[policy group="staff" version="1"]\nI accept this policy\n\n[/policy]\n\n`;
|
|
const [{ value }] = await setupRichEditor(assert, markdown);
|
|
|
|
const policyElement = document.querySelector(".ProseMirror .policy");
|
|
assert.dom(policyElement).exists();
|
|
assert.dom(policyElement).hasClass("policy");
|
|
assert.dom(policyElement).hasAttribute("data-group", "staff");
|
|
assert.dom(policyElement).hasAttribute("data-version", "1");
|
|
|
|
// Check that content is preserved
|
|
assert.dom("p", policyElement).hasText("I accept this policy");
|
|
|
|
assert.strictEqual(value, markdown);
|
|
});
|
|
|
|
test("policy handles empty content", async function (assert) {
|
|
const markdown = `[policy groups="admins" version="2"]\n[/policy]\n\n`;
|
|
const [{ value }] = await setupRichEditor(assert, markdown);
|
|
|
|
const policyElement = document.querySelector(".ProseMirror .policy");
|
|
assert.dom(policyElement).exists();
|
|
assert.dom(policyElement).hasAttribute("data-groups", "admins");
|
|
assert.dom(policyElement).hasAttribute("data-version", "2");
|
|
|
|
assert.strictEqual(value, markdown);
|
|
});
|
|
}
|
|
);
|