mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-08 15:50:08 +09:00
9912e63d69
A video's preview and a picture's thumbnail are made inside the request that posts the message, and nothing bounded how long either could take. - The video preview filter also selects any frame from 5 seconds on. Rails' filter takes the second frame it selects, which a video with a single keyframe and no scene change only gives at its end, so ffmpeg decoded all of it. - TimeLimitedVideoPreviewer gives ffmpeg 10 seconds of wall-clock time, kills it past that, and reports a failed preview, so the message is posted without one. - Pictures and videos above 250 megapixels, or whose size couldn't be read, get no preview: decoding costs in proportion to the pixels, however small the file. - The view shows a preview only if it was made when the message was posted. Its URL used to make it on view, so a preview that failed or was skipped would be attempted again on every view. The cached presentation's version goes up, so cached messages pick this up. - A video's poster is made, when the message is posted, at the size the view shows it. The full-size WebP made until now wasn't shown anywhere, and encoding it costs in proportion to the frame's pixels. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bj8KnxpTf9sj2Ysa8aLAVa
65 lines
2.3 KiB
Ruby
65 lines
2.3 KiB
Ruby
require "test_helper"
|
|
require "active_record/testing/query_assertions"
|
|
|
|
class MessagesCachingTest < ActionDispatch::IntegrationTest
|
|
include ActiveRecord::Assertions::QueryAssertions
|
|
|
|
setup do
|
|
sign_in :david
|
|
end
|
|
|
|
test "cached pages skip presentation queries and refresh edited messages" do
|
|
with_memory_cache do
|
|
get room_messages_url(rooms(:watercooler))
|
|
assert_response :success
|
|
original = response.body
|
|
|
|
assert_no_queries_match(/action_text_rich_texts|active_storage_attachments|boosts/) do
|
|
get room_messages_url(rooms(:watercooler))
|
|
end
|
|
assert_response :success
|
|
assert_equal original, response.body
|
|
|
|
messages(:fourth).update! body: "Updated cached message"
|
|
get room_messages_url(rooms(:watercooler))
|
|
assert_response :success
|
|
assert_select "#" + dom_id(messages(:fourth)), text: /Updated cached message/
|
|
end
|
|
end
|
|
|
|
test "a page of messages loads whether their previews were made along with the messages, not one at a time" do
|
|
room = rooms(:watercooler)
|
|
2.times do |copy|
|
|
{ "moon.jpg" => "image/jpeg", "alpha-centuri.mov" => "video/quicktime" }.each do |file, content_type|
|
|
room.messages.create_with_attachment! creator: users(:david), client_message_id: "#{copy}-#{file}", attachment: fixture_file_upload(file, content_type)
|
|
end
|
|
end
|
|
|
|
assert_no_queries_match(/"active_storage_\w+"\."(id|blob_id|record_id)" = \?/) do
|
|
get room_messages_url(room)
|
|
end
|
|
assert_response :success
|
|
assert_select "img[src*='moon.jpg']", count: 2
|
|
assert_select "video[poster]", count: 2
|
|
end
|
|
|
|
private
|
|
def with_memory_cache
|
|
old_cache = Rails.cache
|
|
old_collection_cache = ActionView::PartialRenderer.collection_cache
|
|
old_controller_cache = MessagesController.cache_store
|
|
old_caching = MessagesController.perform_caching
|
|
|
|
Rails.cache = ActiveSupport::Cache::MemoryStore.new
|
|
ActionView::PartialRenderer.collection_cache = Rails.cache
|
|
MessagesController.cache_store = Rails.cache
|
|
MessagesController.perform_caching = true
|
|
yield
|
|
ensure
|
|
Rails.cache = old_cache
|
|
ActionView::PartialRenderer.collection_cache = old_collection_cache
|
|
MessagesController.cache_store = old_controller_cache
|
|
MessagesController.perform_caching = old_caching
|
|
end
|
|
end
|