diff options
| author | erdgeist <erdgeist@erdgeist.org> | 2026-07-10 02:03:19 +0200 |
|---|---|---|
| committer | erdgeist <erdgeist@erdgeist.org> | 2026-07-10 02:03:19 +0200 |
| commit | 205e6216fc7850fe717122c189e5003d1f9e8afe (patch) | |
| tree | 8627354f3577f0a974949e759b0e93662840ade7 /test | |
| parent | 81769557804ce59ce3e4603e8f47e731b61b180d (diff) | |
Add head/draft/autosave layer comparison at three UI entry points
Node#resolve_page_reference and #available_layer_pairs let
Page#diff_against compare named layers (head/draft/autosave), not
just numbered revisions -- autosave was never part of Node#pages, so
this was the missing piece.
Wired into nodes#show's Status section, nodes#edit right after an
autosave gets resurrected ("What changed?"), and the admin wizard's
current-drafts table, which now also lists autosave-only nodes it
previously never showed.
revisions#diff hides the numbered-revision picker when comparing
named layers (it can't represent them), shows a plain label instead,
and offers buttons to switch between whichever other pairs make
sense for the node's current state. Destroying the topmost layer is
available directly from the diff view, reusing the existing revert!
path.
"Discard changes" is renamed "Discard Autosave" everywhere it
appears, to match "Destroy Draft".
Diffstat (limited to 'test')
| -rw-r--r-- | test/controllers/admin_controller_test.rb | 15 | ||||
| -rw-r--r-- | test/controllers/revisions_controller_test.rb | 39 | ||||
| -rw-r--r-- | test/models/node_test.rb | 22 |
3 files changed, 73 insertions, 3 deletions
diff --git a/test/controllers/admin_controller_test.rb b/test/controllers/admin_controller_test.rb index 9bbf29b..d6005ba 100644 --- a/test/controllers/admin_controller_test.rb +++ b/test/controllers/admin_controller_test.rb | |||
| @@ -1,8 +1,17 @@ | |||
| 1 | require 'test_helper' | 1 | require 'test_helper' |
| 2 | 2 | ||
| 3 | class AdminControllerTest < ActionController::TestCase | 3 | class AdminControllerTest < ActionController::TestCase |
| 4 | # Replace this with your real tests. | 4 | test "current drafts includes nodes with only an autosave" do |
| 5 | test "the truth" do | 5 | node = Node.root.children.create!(:slug => "admin_autosave_only") |
| 6 | assert true | 6 | node.lock_for_editing!(User.find_by_login("aaron")) |
| 7 | node.autosave!({title: "in progress"}, User.find_by_login("aaron")) | ||
| 8 | node.save_draft!(User.find_by_login("aaron")) | ||
| 9 | node.publish_draft! | ||
| 10 | node.lock_for_editing!(User.find_by_login("aaron")) | ||
| 11 | node.autosave!({title: "editing again"}, User.find_by_login("aaron")) | ||
| 12 | |||
| 13 | login_as :quentin | ||
| 14 | get :index | ||
| 15 | assert_includes assigns(:drafts), node | ||
| 7 | end | 16 | end |
| 8 | end | 17 | end |
diff --git a/test/controllers/revisions_controller_test.rb b/test/controllers/revisions_controller_test.rb index caca6bf..162e6f1 100644 --- a/test/controllers/revisions_controller_test.rb +++ b/test/controllers/revisions_controller_test.rb | |||
| @@ -100,4 +100,43 @@ class RevisionsControllerTest < ActionController::TestCase | |||
| 100 | assert_response :success | 100 | assert_response :success |
| 101 | assert_select ".diff_column", 2 | 101 | assert_select ".diff_column", 2 |
| 102 | end | 102 | end |
| 103 | |||
| 104 | test "diffing head against draft by name" do | ||
| 105 | login_as :quentin | ||
| 106 | @node.find_or_create_draft(@user) | ||
| 107 | @node.draft.update(:body => "draft body") | ||
| 108 | |||
| 109 | post(:diff, params: { :node_id => @node.id, :start_revision => "head", :end_revision => "draft" }) | ||
| 110 | assert_response :success | ||
| 111 | end | ||
| 112 | |||
| 113 | test "diffing a layer pair that no longer exists redirects with a flash" do | ||
| 114 | login_as :quentin | ||
| 115 | post(:diff, params: { :node_id => @node.id, :start_revision => "draft", :end_revision => "autosave" }) | ||
| 116 | assert_redirected_to node_path(@node) | ||
| 117 | assert flash[:error].present? | ||
| 118 | end | ||
| 119 | |||
| 120 | test "diffing by name shows a clear comparison label instead of a misleading revision picker" do | ||
| 121 | login_as :quentin | ||
| 122 | @node.find_or_create_draft(@user) | ||
| 123 | |||
| 124 | post(:diff, params: { :node_id => @node.id, :start_revision => "head", :end_revision => "draft" }) | ||
| 125 | assert_response :success | ||
| 126 | assert_select "strong", "Head" | ||
| 127 | assert_select "strong", "Draft" | ||
| 128 | assert_select "select[name=?]", "start_revision", :count => 0 | ||
| 129 | end | ||
| 130 | |||
| 131 | test "pair-switcher buttons carry their params as real hidden fields, not a query string" do | ||
| 132 | login_as :quentin | ||
| 133 | @node.find_or_create_draft(@user) | ||
| 134 | @node.lock_for_editing!(@user) | ||
| 135 | @node.autosave!({ :body => "unsaved" }, @user) | ||
| 136 | |||
| 137 | post(:diff, params: { :node_id => @node.id, :start_revision => "head", :end_revision => "draft" }) | ||
| 138 | assert_response :success | ||
| 139 | assert_select "form.computation input[type=hidden][name=start_revision]" | ||
| 140 | assert_select "form.computation input[type=hidden][name=end_revision]" | ||
| 141 | end | ||
| 103 | end | 142 | end |
diff --git a/test/models/node_test.rb b/test/models/node_test.rb index 2138c19..9e71dec 100644 --- a/test/models/node_test.rb +++ b/test/models/node_test.rb | |||
| @@ -473,4 +473,26 @@ class NodeTest < ActiveSupport::TestCase | |||
| 473 | node.publish_draft! | 473 | node.publish_draft! |
| 474 | end | 474 | end |
| 475 | end | 475 | end |
| 476 | |||
| 477 | test "available_layer_pairs matches the six-state table" do | ||
| 478 | node = Node.root.children.create!(:slug => "layer_pairs_test") | ||
| 479 | user = @user1 || User.find_by_login("aaron") | ||
| 480 | |||
| 481 | assert_equal [[:draft, :autosave]], (node.lock_for_editing!(user); node.autosave!({title: "v1"}, user); node.available_layer_pairs) # state F | ||
| 482 | |||
| 483 | node.save_draft!(user) | ||
| 484 | node.publish_draft! | ||
| 485 | assert_equal [], node.available_layer_pairs # state A | ||
| 486 | |||
| 487 | node.lock_for_editing!(user) | ||
| 488 | node.autosave!({title: "v2"}, user) | ||
| 489 | assert_equal [[:head, :autosave]], node.available_layer_pairs # state B | ||
| 490 | |||
| 491 | node.save_draft!(user) | ||
| 492 | assert_equal [[:head, :draft]], node.available_layer_pairs # state C | ||
| 493 | |||
| 494 | node.lock_for_editing!(user) | ||
| 495 | node.autosave!({title: "v3"}, user) | ||
| 496 | assert_equal [[:head, :draft], [:draft, :autosave]], node.available_layer_pairs # state D | ||
| 497 | end | ||
| 476 | end | 498 | end |
