mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-07 23:30:08 +09:00
6cdcb459b9
The search box keeps only word characters, but FTS5 still reads AND, OR, NOT and NEAR in the query as operators, so searching for "AND" or for "salt AND" raised "fts5: syntax error" and answered with a 500. Quoting each word makes FTS5 look for it as text, which is how it already treats the same words in lower case. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NuTtwJKhb77Dv7EQqv2C3C
79 lines
3.4 KiB
Ruby
79 lines
3.4 KiB
Ruby
require "test_helper"
|
|
require "active_record/testing/query_assertions"
|
|
|
|
class MessageTest < ActiveSupport::TestCase
|
|
include ActionCable::TestHelper, ActiveJob::TestHelper, ActiveRecord::Assertions::QueryAssertions
|
|
|
|
test "creating a message enqueues to push later" do
|
|
assert_enqueued_jobs 1, only: [ Room::PushMessageJob ] do
|
|
create_new_message_in rooms(:designers)
|
|
end
|
|
end
|
|
|
|
test "all emoji" do
|
|
assert Message.new(body: "😄🤘").plain_text_body.all_emoji?
|
|
assert_not Message.new(body: "Haha! 😄🤘").plain_text_body.all_emoji?
|
|
assert_not Message.new(body: "🔥\nmultiple lines\n💯").plain_text_body.all_emoji?
|
|
assert_not Message.new(body: "🔥 💯").plain_text_body.all_emoji?
|
|
end
|
|
|
|
test "mentionees" do
|
|
message = Message.new room: rooms(:pets), body: "<div>Hey #{mention_attachment_for(:david)}</div>", creator: users(:jason), client_message_id: "earth"
|
|
assert_equal [ users(:david) ], message.mentionees
|
|
|
|
message_with_duplicate_mentions = Message.new room: rooms(:pets), body: "<div>Hey #{mention_attachment_for(:david)} #{mention_attachment_for(:david)}</div>", creator: users(:jason), client_message_id: "earth"
|
|
assert_equal [ users(:david) ], message.mentionees
|
|
|
|
message_mentioning_a_non_member = Message.new room: rooms(:pets), body: "<div>Hey #{mention_attachment_for(:kevin)}</div>", creator: users(:jason), client_message_id: "earth"
|
|
assert_equal [], message_mentioning_a_non_member.mentionees
|
|
end
|
|
|
|
test "presentation associations load together" do
|
|
messages(:first).attachment.attach io: StringIO.new("hello"), filename: "hello.txt", content_type: "text/plain"
|
|
presented = Message.where(id: [ messages(:first).id, messages(:thirteenth).id ]).with_presentation.to_a
|
|
|
|
assert_no_queries do
|
|
presented.each do |message|
|
|
message.room.name
|
|
message.creator.avatar.attached?
|
|
message.body.body.to_html
|
|
message.body.embeds.each(&:filename)
|
|
message.attachment.blob&.filename
|
|
message.boosts.each { |boost| boost.booster.avatar.attached? }
|
|
end
|
|
end
|
|
end
|
|
|
|
test "presentation pages preload only the rendered messages" do
|
|
page = rooms(:watercooler).messages.with_presentation.last_page
|
|
assert_kind_of Array, page
|
|
assert page.all? { |message| !message.association(:rich_text_body).loaded? }
|
|
|
|
rendered = page.first(2)
|
|
page.preload_associations(rendered)
|
|
|
|
assert_no_queries { rendered.each { |message| message.body.to_plain_text } }
|
|
assert page.drop(2).all? { |message| !message.association(:rich_text_body).loaded? }
|
|
end
|
|
|
|
test "pagination retains the original ordering even when timestamps tie" do
|
|
room = rooms(:watercooler)
|
|
room.messages.update_all(created_at: Time.current)
|
|
expected = room.messages.ordered.last(Message::Pagination::PAGE_SIZE).map(&:id)
|
|
|
|
assert_equal expected, room.messages.last_page.map(&:id)
|
|
assert_equal room.messages.ordered.first(Message::Pagination::PAGE_SIZE).map(&:id), room.messages.first_page.map(&:id)
|
|
end
|
|
|
|
test "search reads quotes and operator words in the query as text" do
|
|
message = rooms(:designers).messages.create!(body: "Say hi, NOT bye", client_message_id: "quoted", creator: users(:david))
|
|
|
|
assert_equal [ message ], Message.search(%(say "hi NOT)).to_a
|
|
end
|
|
|
|
private
|
|
def create_new_message_in(room)
|
|
room.messages.create!(creator: users(:jason), body: "Hello", client_message_id: "123")
|
|
end
|
|
end
|