From e81108abb6819d36eb3c6b9f539c56eb47d34e59 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Tue, 15 Apr 2025 14:05:09 +1000 Subject: [PATCH] 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. --- spec/system/ai_helper/ai_proofreading_spec.rb | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/spec/system/ai_helper/ai_proofreading_spec.rb b/spec/system/ai_helper/ai_proofreading_spec.rb index 96b17127..299e4160 100644 --- a/spec/system/ai_helper/ai_proofreading_spec.rb +++ b/spec/system/ai_helper/ai_proofreading_spec.rb @@ -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