DEV: Add test to cover proofreading in rich editor (#1259)

This core PR must be merged for this to work
https://github.com/discourse/discourse/pull/32280

We want to make sure we don't have regressions with this
functionality in the rich editor, which uses contendeditable
and other APIs than the old composer.
This commit is contained in:
Martin Brennan 2025-04-15 14:05:09 +10:00 committed by GitHub
parent 1300cc8a36
commit e81108abb6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 37 additions and 3 deletions

View File

@ -12,8 +12,10 @@ RSpec.describe "AI Composer Proofreading Features", type: :system, js: true do
end
let(:composer) { PageObjects::Components::Composer.new }
let(:rich) { composer.rich_editor }
let(:toasts) { PageObjects::Components::Toasts.new }
let(:diff_modal) { PageObjects::Modals::DiffModal.new }
let(:keyboard_shortcut) { [PLATFORM_KEY_MODIFIER, :alt, "p"] }
context "when triggering via keyboard shortcut" do
it "proofreads selected text using" do
@ -24,7 +26,7 @@ RSpec.describe "AI Composer Proofreading Features", type: :system, js: true do
composer.select_range(6, 12)
DiscourseAi::Completions::Llm.with_prepared_responses(["world"]) do
composer.composer_input.send_keys([PLATFORM_KEY_MODIFIER, :alt, "p"])
composer.composer_input.send_keys(keyboard_shortcut)
diff_modal.confirm_changes
expect(composer.composer_input.value).to eq("hello world !")
end
@ -37,7 +39,7 @@ RSpec.describe "AI Composer Proofreading Features", type: :system, js: true do
# Simulate AI response
DiscourseAi::Completions::Llm.with_prepared_responses(["hello world"]) do
composer.composer_input.send_keys([PLATFORM_KEY_MODIFIER, :alt, "p"])
composer.composer_input.send_keys(keyboard_shortcut)
diff_modal.confirm_changes
expect(composer.composer_input.value).to eq("hello world")
end
@ -48,9 +50,41 @@ RSpec.describe "AI Composer Proofreading Features", type: :system, js: true do
# Simulate AI response
DiscourseAi::Completions::Llm.with_prepared_responses(["hello world"]) do
composer.composer_input.send_keys([PLATFORM_KEY_MODIFIER, :alt, "p"])
composer.composer_input.send_keys(keyboard_shortcut)
expect(toasts).to have_error(I18n.t("js.discourse_ai.ai_helper.no_content_error"))
end
end
context "when using rich text editor" do
before { SiteSetting.rich_editor = true }
it "proofreads selected text and replaces it" do
visit "/new-topic"
expect(composer).to be_opened
composer.toggle_rich_editor
composer.type_content("hello worldd !")
# NOTE: The rich text editor cannot use select_range on the page object since it is
# a contenteditable element. It would be hard to make this generic enough to put in
# the page object, maybe at some point in the future we can refactor this.
execute_script(<<~JS, text)
const composer = document.querySelector("#reply-control .d-editor-input");
const startNode = composer.firstChild.firstChild;
composer.focus();
const range = document.createRange();
range.setStart(startNode, 6);
range.setEnd(startNode, 12);
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
JS
DiscourseAi::Completions::Llm.with_prepared_responses(["world"]) do
composer.composer_input.send_keys(keyboard_shortcut)
diff_modal.confirm_changes
expect(rich).to have_css("p", text: "hello world !")
end
end
end
end
end