Create message read_mark resource

This commit is contained in:
Anton Khorev 2025-01-23 03:41:19 +03:00
parent 8cf77a2f36
commit cc3bccb9b3
9 changed files with 179 additions and 116 deletions

View file

@ -0,0 +1,126 @@
require "test_helper"
module Messages
class ReadMarksControllerTest < ActionDispatch::IntegrationTest
##
# test all routes which lead to this controller
def test_routes
assert_routing(
{ :path => "/messages/1/read_mark", :method => :post },
{ :controller => "messages/read_marks", :action => "create", :message_id => "1" }
)
assert_routing(
{ :path => "/messages/1/read_mark", :method => :delete },
{ :controller => "messages/read_marks", :action => "destroy", :message_id => "1" }
)
end
def test_create_when_not_logged_in
message = create(:message, :unread)
post message_read_mark_path(message)
assert_response :forbidden
end
def test_create_as_other_user
message = create(:message, :unread)
session_for(create(:user))
post message_read_mark_path(message)
assert_response :not_found
assert_template "no_such_message"
end
def test_create_as_sender
message = create(:message, :unread)
session_for(message.sender)
post message_read_mark_path(message)
assert_response :not_found
assert_template "no_such_message"
end
def test_create_as_recipient
message = create(:message, :unread)
session_for(message.recipient)
post message_read_mark_path(message)
assert_redirected_to messages_inbox_path
assert message.reload.message_read
end
def test_create_on_missing_message
session_for(create(:user))
post message_read_mark_path(99999)
assert_response :not_found
assert_template "no_such_message"
end
def test_create_on_message_from_muted_user
sender_user = create(:user)
recipient_user = create(:user)
create(:user_mute, :owner => recipient_user, :subject => sender_user)
message = create(:message, :unread, :sender => sender_user, :recipient => recipient_user)
session_for(recipient_user)
post message_read_mark_path(message)
assert_redirected_to messages_muted_inbox_path
assert message.reload.message_read
end
def test_destroy_when_not_logged_in
message = create(:message, :read)
delete message_read_mark_path(message)
assert_response :forbidden
end
def test_destroy_as_other_user
message = create(:message, :read)
session_for(create(:user))
delete message_read_mark_path(message)
assert_response :not_found
assert_template "no_such_message"
end
def test_destroy_as_sender
message = create(:message, :read)
session_for(message.sender)
delete message_read_mark_path(message)
assert_response :not_found
assert_template "no_such_message"
end
def test_destroy_as_recipient
message = create(:message, :read)
session_for(message.recipient)
delete message_read_mark_path(message)
assert_redirected_to messages_inbox_path
assert_not message.reload.message_read
end
def test_destroy_on_missing_message
session_for(create(:user))
delete message_read_mark_path(99999)
assert_response :not_found
assert_template "no_such_message"
end
def test_destroy_on_message_from_muted_user
sender_user = create(:user)
recipient_user = create(:user)
create(:user_mute, :owner => recipient_user, :subject => sender_user)
message = create(:message, :read, :sender => sender_user, :recipient => recipient_user)
session_for(recipient_user)
delete message_read_mark_path(message, :mark => "unread")
assert_redirected_to messages_muted_inbox_path
assert_not message.reload.message_read
end
end
end

View file

@ -16,10 +16,6 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
{ :path => "/messages/1", :method => :get },
{ :controller => "messages", :action => "show", :id => "1" }
)
assert_routing(
{ :path => "/messages/1/mark", :method => :post },
{ :controller => "messages", :action => "mark", :message_id => "1" }
)
assert_routing(
{ :path => "/messages/1", :method => :delete },
{ :controller => "messages", :action => "destroy", :id => "1" }
@ -259,84 +255,6 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
assert_template "no_such_message"
end
##
# test the mark action
def test_mark
sender_user = create(:user)
recipient_user = create(:user)
other_user = create(:user)
message = create(:message, :unread, :sender => sender_user, :recipient => recipient_user)
# Check that the marking a message requires us to login
post message_mark_path(message)
assert_response :forbidden
# Login as a user with no messages
session_for(other_user)
# Check that marking a message we didn't send or receive fails
post message_mark_path(message)
assert_response :not_found
assert_template "no_such_message"
# Login as the message sender_user
session_for(sender_user)
# Check that marking a message we sent fails
post message_mark_path(message)
assert_response :not_found
assert_template "no_such_message"
# Login as the message recipient_user
session_for(recipient_user)
# Check that the marking a message read works
post message_mark_path(message, :mark => "read")
assert_redirected_to messages_inbox_path
assert Message.find(message.id).message_read
# Check that the marking a message unread works
post message_mark_path(message, :mark => "unread")
assert_redirected_to messages_inbox_path
assert_not Message.find(message.id).message_read
# Check that the marking a message read works and redirects to inbox from the message page
post message_mark_path(message, :mark => "read"), :headers => { :referer => message_path(message) }
assert_redirected_to messages_inbox_path
assert Message.find(message.id).message_read
# Check that the marking a message unread works and redirects to inbox from the message page
post message_mark_path(message, :mark => "unread"), :headers => { :referer => message_path(message) }
assert_redirected_to messages_inbox_path
assert_not Message.find(message.id).message_read
# Asking to mark a message with a bogus ID should fail
post message_mark_path(99999)
assert_response :not_found
assert_template "no_such_message"
end
##
# test the mark action for messages from muted users
def test_mark_muted
sender_user = create(:user)
recipient_user = create(:user)
create(:user_mute, :owner => recipient_user, :subject => sender_user)
message = create(:message, :unread, :sender => sender_user, :recipient => recipient_user)
session_for(recipient_user)
# Check that the marking a message read works
post message_mark_path(message, :mark => "read")
assert_redirected_to messages_muted_inbox_path
assert Message.find(message.id).message_read
# Check that the marking a message unread works
post message_mark_path(message, :mark => "unread")
assert_redirected_to messages_muted_inbox_path
assert_not Message.find(message.id).message_read
end
##
# test the destroy action
def test_destroy