Files
once-campfire/test/controllers/messages_controller_test.rb
Kevin McConnell df76a227dc Hello world
First open source release of Campfire 🎉
2025-08-21 09:31:59 +01:00

153 lines
5.0 KiB
Ruby

require "test_helper"
class MessagesControllerTest < ActionDispatch::IntegrationTest
setup do
host! "once.campfire.test"
sign_in :david
@room = rooms(:watercooler)
@messages = @room.messages.ordered.to_a
end
test "index returns the last page by default" do
get room_messages_url(@room)
assert_response :success
ensure_messages_present @messages.last
end
test "index returns a page before the specified message" do
get room_messages_url(@room, before: @messages.third)
assert_response :success
ensure_messages_present @messages.first, @messages.second
ensure_messages_not_present @messages.third, @messages.fourth, @messages.fifth
end
test "index returns a page after the specified message" do
get room_messages_url(@room, after: @messages.third)
assert_response :success
ensure_messages_present @messages.fourth, @messages.fifth
ensure_messages_not_present @messages.first, @messages.second, @messages.third
end
test "index returns no_content when there are no messages" do
@room.messages.destroy_all
get room_messages_url(@room)
assert_response :no_content
end
test "get renders a single message belonging to the user" do
message = @room.messages.where(creator: users(:david)).first
get room_message_url(@room, message)
assert_response :success
end
test "creating a message broadcasts the message to the room" do
post room_messages_url(@room, format: :turbo_stream), params: { message: { body: "New one", client_message_id: 999 } }
assert_rendered_turbo_stream_broadcast @room, :messages, action: "append", target: [ @room, :messages ] do
assert_select ".message__body", text: /New one/
assert_copy_link_button room_at_message_url(@room, Message.last, host: "once.campfire.test")
end
end
test "creating a message broadcasts unread room" do
assert_broadcasts "unread_rooms", 1 do
post room_messages_url(@room, format: :turbo_stream), params: { message: { body: "New one", client_message_id: 999 } }
end
end
test "update updates a message belonging to the user" do
message = @room.messages.where(creator: users(:david)).first
Turbo::StreamsChannel.expects(:broadcast_replace_to).once
put room_message_url(@room, message), params: { message: { body: "Updated body" } }
assert_redirected_to room_message_url(@room, message)
assert_equal "Updated body", message.reload.plain_text_body
end
test "admin updates a message belonging to another user" do
message = @room.messages.where(creator: users(:jason)).first
Turbo::StreamsChannel.expects(:broadcast_replace_to).once
put room_message_url(@room, message), params: { message: { body: "Updated body" } }
assert_redirected_to room_message_url(@room, message)
assert_equal "Updated body", message.reload.plain_text_body
end
test "destroy destroys a message belonging to the user" do
message = @room.messages.where(creator: users(:david)).first
assert_difference -> { Message.count }, -1 do
Turbo::StreamsChannel.expects(:broadcast_remove_to).once
delete room_message_url(@room, message, format: :turbo_stream)
assert_response :success
end
end
test "admin destroy destroys a message belonging to another user" do
assert users(:david).administrator?
message = @room.messages.where(creator: users(:jason)).first
assert_difference -> { Message.count }, -1 do
Turbo::StreamsChannel.expects(:broadcast_remove_to).once
delete room_message_url(@room, message, format: :turbo_stream)
assert_response :success
end
end
test "ensure non-admin can't update a message belonging to another user" do
sign_in :jz
assert_not users(:jz).administrator?
room = rooms(:designers)
message = room.messages.where(creator: users(:jason)).first
put room_message_url(room, message), params: { message: { body: "Updated body" } }
assert_response :forbidden
end
test "ensure non-admin can't destroy a message belonging to another user" do
sign_in :jz
assert_not users(:jz).administrator?
room = rooms(:designers)
message = room.messages.where(creator: users(:jason)).first
delete room_message_url(room, message, format: :turbo_stream)
assert_response :forbidden
end
test "mentioning a bot triggers a webhook" do
WebMock.stub_request(:post, webhooks(:bender).url).to_return(status: 200)
assert_enqueued_jobs 1, only: Bot::WebhookJob do
post room_messages_url(@room, format: :turbo_stream), params: { message: {
body: "<div>Hey #{mention_attachment_for(:bender)}</div>", client_message_id: 999 } }
end
end
private
def ensure_messages_present(*messages, count: 1)
messages.each do |message|
assert_select "#" + dom_id(message), count:
end
end
def ensure_messages_not_present(*messages)
ensure_messages_present *messages, count: 0
end
def assert_copy_link_button(url)
assert_select ".btn[title='Copy link'][data-copy-to-clipboard-content-value='#{url}']"
end
end