diff --git a/app/views/active_storage/blobs/_blob.html.erb b/app/views/active_storage/blobs/_blob.html.erb
new file mode 100644
index 0000000..d0d43b3
--- /dev/null
+++ b/app/views/active_storage/blobs/_blob.html.erb
@@ -0,0 +1,13 @@
+<%# Files are posted as a message's own attachment, which gets its preview when it's posted; the composer adds none to
+ the rich text. One that's there anyway is shown by its name, with no preview: Action Text's partial links to a URL
+ that makes one on view, and nothing else in the app would make it. %>
+
+
+ <% if caption = blob.try(:caption) %>
+ <%= caption %>
+ <% else %>
+ <%= blob.filename %>
+ <%= number_to_human_size blob.byte_size %>
+ <% end %>
+
+
diff --git a/app/views/messages/_message.html.erb b/app/views/messages/_message.html.erb
index 77732cd..45e0898 100644
--- a/app/views/messages/_message.html.erb
+++ b/app/views/messages/_message.html.erb
@@ -1,7 +1,7 @@
<%# Be sure to check/update messages/_template.html.erb when changing this file %>
<%# Bump this version when the message presentation filters change what they emit. Editing this line changes the template digest, which busts BOTH this fragment cache and the collection cache that keys on this partial's digest (helper Ruby changes alone don't). %>
-<% cache [ message, "presentation-v4" ] do %>
+<% cache [ message, "presentation-v5" ] do %>
<%= message_tag message do %>
diff --git a/test/helpers/messages_helper_test.rb b/test/helpers/messages_helper_test.rb
index 488d72a..78a97c9 100644
--- a/test/helpers/messages_helper_test.rb
+++ b/test/helpers/messages_helper_test.rb
@@ -62,6 +62,33 @@ class MessagesHelperTest < ActionView::TestCase
assert_no_match %r{poster=|/representations/}, presentation
end
+ test "message_presentation shows an image in the rich text as a file, rather than making its preview on view" do
+ message = Message.with_attachment_details.find(message_with_file_in_rich_text("moon.jpg", "image/jpeg").id)
+
+ presentation = nil
+ assert_no_queries_match(/active_storage_variant_records/) { presentation = view.message_presentation(message) }
+
+ assert_no_match %r{/representations/}, presentation
+ assert_match %r{moon\.jpg}, presentation
+ end
+
+ test "message_presentation shows an image in the rich text as a file even when its preview was made" do
+ message = message_with_file_in_rich_text("moon.jpg", "image/jpeg")
+ message.body.embeds.first.blob.variant(resize_to_limit: [ 1024, 768 ]).processed
+
+ presentation = view.message_presentation(message.reload)
+
+ assert_no_match %r{/representations/}, presentation
+ assert_match %r{moon\.jpg}, presentation
+ end
+
+ test "message_presentation shows a video in the rich text as a file" do
+ presentation = view.message_presentation(message_with_file_in_rich_text("alpha-centuri.mov", "video/quicktime"))
+
+ assert_no_match %r{/representations/}, presentation
+ assert_match %r{alpha-centuri\.mov}, presentation
+ end
+
private
def attachment_message(file, content_type, processed:)
attributes = { creator: users(:jason), client_message_id: "0015", attachment: fixture_file_upload(file, content_type) }
@@ -72,4 +99,11 @@ class MessagesHelperTest < ActionView::TestCase
rooms(:pets).messages.create!(attributes)
end
end
+
+ def message_with_file_in_rich_text(file, content_type)
+ blob = ActiveStorage::Blob.create_and_upload!(io: file_fixture(file).open, filename: file, content_type: content_type)
+ body = %(
Here:
)
+
+ Message.create! room: rooms(:pets), body: body, client_message_id: "0015", creator: users(:jason)
+ end
end