eBooru/test/unit/dmail_test.rb

199 lines
6.3 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
require "test_helper"
2010-02-20 18:08:22 -05:00
class DmailTest < ActiveSupport::TestCase
context "A dmail" do
setup do
@user = create(:user)
2010-11-19 17:20:13 -05:00
CurrentUser.user = @user
CurrentUser.ip_addr = "1.2.3.4"
2010-02-20 18:08:22 -05:00
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.deliveries = []
end
2013-03-19 08:10:10 -04:00
2014-11-20 00:28:26 -05:00
context "filter" do
setup do
@recipient = create(:user)
@recipient.create_dmail_filter(words: "banned")
@dmail = build(:dmail, title: "xxx", owner: @recipient, body: "banned word here", to: @recipient, from: @user)
2014-11-20 00:28:26 -05:00
end
should "detect banned words" do
assert(@recipient.dmail_filter.filtered?(@dmail))
end
should "autoread if it has a banned word" do
2014-11-20 00:28:26 -05:00
@dmail.save
2014-12-12 20:36:48 -05:00
assert_equal(true, @dmail.is_read?)
end
should "not update the recipient's has_mail if filtered" do
@dmail.save
@recipient.reload
assert_equal(false, @recipient.has_mail?)
2014-11-20 00:28:26 -05:00
end
2014-12-12 20:32:33 -05:00
should "be ignored when sender is a moderator" do
as(create(:moderator_user)) do
@dmail = create(:dmail, owner: @recipient, body: "banned word here", to: @recipient)
end
assert_equal(false, !!@recipient.dmail_filter.filtered?(@dmail))
assert_equal(false, @dmail.is_read?)
assert_equal(true, @recipient.has_mail?)
end
2014-12-12 20:32:33 -05:00
context "that is empty" do
setup do
@recipient.dmail_filter.update(words: " ")
2014-12-12 20:32:33 -05:00
end
should "not filter everything" do
assert_not(@recipient.dmail_filter.filtered?(@dmail))
2014-12-12 20:32:33 -05:00
end
end
2014-11-20 00:28:26 -05:00
end
2010-02-20 18:08:22 -05:00
context "search" do
should "return results based on title contents" do
dmail = create(:dmail, title: "xxx", body: "bbb", owner: @user)
2017-04-29 12:48:32 -04:00
matches = Dmail.search(title_matches: "x*")
2017-04-29 12:48:32 -04:00
assert_equal([dmail.id], matches.map(&:id))
matches = Dmail.search(title_matches: "X*")
assert_equal([dmail.id], matches.map(&:id))
2017-04-29 12:48:32 -04:00
matches = Dmail.search(message_matches: "aaa")
2010-02-20 18:08:22 -05:00
assert(matches.empty?)
end
2013-03-19 08:10:10 -04:00
2010-02-20 18:08:22 -05:00
should "return results based on body contents" do
dmail = create(:dmail, body: "xxx", owner: @user)
matches = Dmail.search(message_matches: "xxx")
2010-02-20 18:08:22 -05:00
assert(matches.any?)
matches = Dmail.search(message_matches: "aaa")
2010-02-20 18:08:22 -05:00
assert(matches.empty?)
end
end
2013-03-19 08:10:10 -04:00
should "not create a senders copy when validations fail" do
Danbooru.config.stubs(:disable_throttles?).returns(false)
@user = create(:user, created_at: 2.weeks.ago)
@recipient = create(:user)
as(@user) do
(Danbooru.config.dmail_minute_limit + 1).times do
Dmail.create_split(attributes_for(:dmail, from_id: @user.id, to_id: @recipient.id))
end
end
assert_equal(Danbooru.config.dmail_minute_limit * 2, Dmail.count)
end
2010-02-20 18:08:22 -05:00
should "should parse user names" do
dmail = build(:dmail, owner: @user)
2010-02-20 18:08:22 -05:00
dmail.to_id = nil
2010-11-19 17:20:13 -05:00
dmail.to_name = @user.name
assert(dmail.to_id == @user.id)
2010-02-20 18:08:22 -05:00
end
2013-03-19 08:10:10 -04:00
2010-02-20 18:08:22 -05:00
should "construct a response" do
dmail = create(:dmail, owner: @user)
2010-02-20 18:08:22 -05:00
response = dmail.build_response
assert_equal("Re: #{dmail.title}", response.title)
assert_equal(dmail.from_id, response.to_id)
assert_equal(dmail.to_id, response.from_id)
end
2013-03-19 08:10:10 -04:00
2010-02-20 18:08:22 -05:00
should "create a copy for each user" do
@new_user = create(:user)
assert_difference(-> { Dmail.count }, 2) do
Dmail.create_split(to_id: @new_user.id, title: "foo", body: "foo")
2010-02-20 18:08:22 -05:00
end
end
should "record the creator's ip addr" do
dmail = create(:dmail, owner: @user)
assert_equal(CurrentUser.ip_addr, dmail.creator_ip_addr.to_s)
end
2010-02-20 18:08:22 -05:00
should "send an email if the user wants it" do
user = create(:user, receive_email_notifications: true)
assert_difference(-> { ActionMailer::Base.deliveries.size }, 1) do
create(:dmail, to: user, owner: user)
2010-02-20 18:08:22 -05:00
end
end
2013-03-02 22:45:15 -05:00
should "not send an email if no_email_notification is set" do
user = create(:user, receive_email_notifications: true)
assert_no_difference(-> { ActionMailer::Base.deliveries.size }) do
create(:dmail, to: user, owner: user, no_email_notification: true)
Dmail.create_automated(to: user, title: "test", body: "abc", no_email_notification: true)
end
assert_equal(2, Dmail.count)
end
2013-03-02 22:45:15 -05:00
should "create only one message for a split response" do
user = create(:user, receive_email_notifications: true)
assert_difference(-> { ActionMailer::Base.deliveries.size }, 1) do
Dmail.create_split(to_id: user.id, title: "foo", body: "foo")
2013-03-02 22:45:15 -05:00
end
end
2013-03-19 08:10:10 -04:00
2010-02-20 18:08:22 -05:00
should "be marked as read after the user reads it" do
dmail = create(:dmail, owner: @user)
assert_not(dmail.is_read?)
2010-02-20 18:08:22 -05:00
dmail.mark_as_read!
assert(dmail.is_read?)
end
2013-03-19 08:10:10 -04:00
2010-02-20 18:08:22 -05:00
should "notify the recipient he has mail" do
recipient = create(:user)
2018-04-25 17:31:11 -04:00
Dmail.create_split(title: "hello", body: "hello", to_id: recipient.id)
dmail = Dmail.where(owner_id: recipient.id).last
2014-03-26 19:01:10 -04:00
recipient.reload
assert(recipient.has_mail?)
2018-04-25 17:31:11 -04:00
assert_equal(1, recipient.unread_dmail_count)
2014-03-26 19:01:10 -04:00
as(recipient) do
2014-03-26 19:01:10 -04:00
dmail.mark_as_read!
end
recipient.reload
assert_not(recipient.has_mail?)
2018-04-25 17:31:11 -04:00
assert_equal(0, recipient.unread_dmail_count)
2010-02-20 18:08:22 -05:00
end
context "that is automated" do
setup do
@bot = create(:user)
User.stubs(:system).returns(@bot)
end
should "only create a copy for the recipient" do
Dmail.create_automated(to: @user, title: "test", body: "test")
assert @user.dmails.where(from: @bot, title: "test", body: "test").exists?
assert_not @bot.dmails.where(from: @bot, title: "test", body: "test").exists?
end
should "fail gracefully if recipient doesn't exist" do
assert_nothing_raised do
dmail = Dmail.create_automated(to_name: "this_name_does_not_exist", title: "test", body: "test")
2018-09-24 18:34:08 -04:00
assert_equal(["must exist"], dmail.errors[:to])
end
end
end
context "during validation" do
subject { build(:dmail) }
should_not allow_value(" ").for(:title)
should_not allow_value(" ").for(:body)
should_not allow_value(nil).for(:to)
should_not allow_value(nil).for(:owner)
end
2010-02-20 18:08:22 -05:00
end
end