Ensure user toggles on board edit page are cached properly

Not including the disabled flag as part of the cache resulted in
issues like the one described in #1992
This commit is contained in:
Mike Dalessio
2025-12-08 14:21:56 -05:00
parent c2380dc057
commit abe48f0efa
4 changed files with 40 additions and 2 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ module AccessesHelper
render partial: "boards/access_toggle",
collection: users, as: :user,
locals: { selected: selected, disabled: disabled },
cached: ->(user) { [ user, selected ] }
cached: ->(user) { [ user, selected, disabled ] }
end
def access_involvement_advance_button(board, user, show_watchers: true, icon_only: false)
@@ -166,4 +166,28 @@ class BoardsControllerTest < ActionDispatch::IntegrationTest
assert_select "button:not([disabled])", text: "Select all"
assert_select "button:not([disabled])", text: "Select none"
end
test "access toggle disabled state is cached correctly" do
board = boards(:writebook)
david = users(:david)
with_actionview_partial_caching do
# privileged user
assert users(:kevin).can_administer_board?(board)
get edit_board_path(board)
assert_response :success
assert_select "input.switch__input[name='user_ids[]'][value='#{david.id}']:not([disabled])"
# unprivileged user
logout_and_sign_in_as :jz
assert_not users(:jz).can_administer_board?(board)
get edit_board_path(board)
assert_response :success
assert_select "input.switch__input[name='user_ids[]'][value='#{david.id}'][disabled]"
end
end
end
+1 -1
View File
@@ -44,7 +44,7 @@ module ActiveSupport
fixtures :all
include ActiveJob::TestHelper
include ActionTextTestHelper, CardTestHelper, ChangeTestHelper, SessionTestHelper
include ActionTextTestHelper, CachingTestHelper, CardTestHelper, ChangeTestHelper, SessionTestHelper
include Turbo::Broadcastable::TestHelper
setup do
+14
View File
@@ -0,0 +1,14 @@
module CachingTestHelper
def with_actionview_partial_caching
was_cache = ActionView::PartialRenderer.collection_cache
was_perform_caching = ApplicationController.perform_caching
begin
ActionView::PartialRenderer.collection_cache = ActiveSupport::Cache.lookup_store(:memory_store)
ApplicationController.perform_caching = true
yield
ensure
ActionView::PartialRenderer.collection_cache = was_cache
ApplicationController.perform_caching = was_perform_caching
end
end
end