49c4f2adc6
When ActiveStorage::Record uses `connects_to` for read replica support, it creates a separate connection pool from ApplicationRecord. This causes `after_commit` callbacks to fire in non-deterministic order - the Attachment's `create_variants` callback can fire before the User model's upload callback completes, resulting in FileNotFoundError. The fix removes replica connection configuration from ActiveStorage::Record so it shares the same connection pool as application models, ensuring proper callback ordering. Also reverts test workarounds that were added to work around this issue, since the root cause is now fixed. See: https://github.com/rails/rails/issues/53694
57 lines
1.8 KiB
Ruby
57 lines
1.8 KiB
Ruby
require "test_helper"
|
|
|
|
class Users::AvatarsControllerTest < ActionDispatch::IntegrationTest
|
|
setup do
|
|
sign_in_as :david
|
|
end
|
|
|
|
test "show system user" do
|
|
get user_avatar_path(users(:system))
|
|
|
|
assert_response :redirect
|
|
assert_redirected_to ActionController::Base.helpers.image_path("system_user.png")
|
|
end
|
|
|
|
test "show own initials without caching" do
|
|
get user_avatar_path(users(:david))
|
|
assert_match "image/svg+xml", @response.content_type
|
|
assert @response.cache_control[:private]
|
|
assert_equal "0", @response.cache_control[:max_age]
|
|
end
|
|
|
|
test "show other initials with caching" do
|
|
get user_avatar_path(users(:kevin))
|
|
assert_match "image/svg+xml", @response.content_type
|
|
assert @response.cache_control[:private]
|
|
assert_equal 30.minutes.to_s, @response.cache_control[:max_age]
|
|
end
|
|
|
|
test "show own image redirects to the blob url" do
|
|
users(:david).avatar.attach(io: File.open(file_fixture("moon.jpg")), filename: "moon.jpg", content_type: "image/jpeg")
|
|
assert users(:david).avatar.attached?
|
|
|
|
get user_avatar_path(users(:david))
|
|
|
|
assert_redirected_to rails_blob_url(users(:david).avatar_thumbnail, disposition: "inline")
|
|
end
|
|
|
|
test "show other image redirects to the blob url" do
|
|
users(:kevin).avatar.attach(io: File.open(file_fixture("moon.jpg")), filename: "moon.jpg", content_type: "image/jpeg")
|
|
assert users(:kevin).avatar.attached?
|
|
|
|
get user_avatar_path(users(:kevin))
|
|
|
|
assert_redirected_to rails_blob_url(users(:kevin).avatar_thumbnail, disposition: "inline")
|
|
end
|
|
|
|
test "delete self" do
|
|
delete user_avatar_path(users(:david))
|
|
assert_redirected_to users(:david)
|
|
end
|
|
|
|
test "unable to delete other" do
|
|
delete user_avatar_path(users(:kevin))
|
|
assert_response :forbidden
|
|
end
|
|
end
|