From a25d90335ad3738b6831288190132c2f7498465c Mon Sep 17 00:00:00 2001 From: erdgeist Date: Fri, 10 Jul 2026 00:35:24 +0200 Subject: Retire vendored cacycle_diff.js for a diff-lcs-based diff view Revisions#diff now computes an inline or side-by-side word diff server-side (Page#diff_against, lib/html_word_diff.rb) instead of shipping raw/escaped content to the browser for a 2008-era vendored JS differ to mangle. View mode is picked via a `view` param, settable either on the diff page itself or directly from the revisions#index sticky bar next to "Diff revisions". Also fixes a pre-existing bug in RevisionsController#diff's single- revision branch, which set params[:start]/params[:end] instead of params[:start_revision]/params[:end_revision]. --- test/controllers/revisions_controller_test.rb | 29 +++++++++++++++++++++++ test/models/page_test.rb | 34 +++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) (limited to 'test') diff --git a/test/controllers/revisions_controller_test.rb b/test/controllers/revisions_controller_test.rb index b4dcd8f..e2fc976 100644 --- a/test/controllers/revisions_controller_test.rb +++ b/test/controllers/revisions_controller_test.rb @@ -59,4 +59,33 @@ class RevisionsControllerTest < ActionController::TestCase assert_equal @node.head, @node.pages.first assert_equal "first", @node.head.reload.body end + + test "diffing two revisions renders real markup with only the changed words marked" do + login_as :quentin + post( + :diff, params: { + :node_id => @node.id, + :start_revision => @node.pages.first.revision, + :end_revision => @node.pages.last.revision + } + ) + assert_response :success + assert_select "del", "first" + assert_select "ins", "second" + assert_no_match /</, response.body + end + + test "diffing two revisions in side by side view renders two columns" do + login_as :quentin + post( + :diff, params: { + :node_id => @node.id, + :start_revision => @node.pages.first.revision, + :end_revision => @node.pages.last.revision, + :view => "side_by_side" + } + ) + assert_response :success + assert_select ".diff_column", 2 + end end diff --git a/test/models/page_test.rb b/test/models/page_test.rb index ad2742f..ac5691a 100644 --- a/test/models/page_test.rb +++ b/test/models/page_test.rb @@ -176,4 +176,38 @@ class PageTest < ActiveSupport::TestCase assert_not_equal first_page.id, first_page.node.head_id assert first_page.published_at.present? end + + def test_diff_against_inline_keeps_tags_and_marks_only_the_changed_word + n = Node.root.children.create! :slug => "diff_against_test" + d = n.find_or_create_draft @user1 + d.title = "Old heading" + d.save! + n.publish_draft! + + d2 = n.find_or_create_draft @user1 + d2.title = "New heading" + d2.save! + + diff = d2.diff_against(n.head) + + assert_match "Old", diff[:title] + assert_match "New", diff[:title] + end + + def test_diff_against_side_by_side_returns_two_annotated_strings + n = Node.root.children.create! :slug => "diff_against_sbs_test" + d = n.find_or_create_draft @user1 + d.title = "Old heading" + d.save! + n.publish_draft! + + d2 = n.find_or_create_draft @user1 + d2.title = "New heading" + d2.save! + + old_html, new_html = d2.diff_against(n.head, view: :side_by_side)[:title] + + assert_match "Old", old_html + assert_match "New", new_html + end end -- cgit v1.3