mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 10:20:58 -06:00
5222247746
This adds the following columns to EmailLog: * cc_addresses * cc_user_ids * topic_id * raw This is to bring the EmailLog table closer in parity to IncomingEmail so it can be better utilized for Group SMTP and IMAP mailing. The raw column contains the full content of the outbound email, but _only_ if the new hidden site setting enable_raw_outbound_email_logging is enabled. Most sites do not need it, and it's mostly required for IMAP and SMTP sending. In the next pull request, there will be a migration to backfill topic_id on the EmailLog table, at which point we can remove the topic fallback method on EmailLog.
142 lines
4.3 KiB
Ruby
142 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
describe EmailLog do
|
|
|
|
it { is_expected.to belong_to :user }
|
|
it { is_expected.to validate_presence_of :to_address }
|
|
it { is_expected.to validate_presence_of :email_type }
|
|
|
|
fab!(:user) { Fabricate(:user) }
|
|
|
|
context 'unique email per post' do
|
|
it 'only allows through one email per post' do
|
|
post = Fabricate(:post)
|
|
user = post.user
|
|
|
|
ran = EmailLog.unique_email_per_post(post, user) do
|
|
true
|
|
end
|
|
|
|
expect(ran).to be(true)
|
|
|
|
Fabricate(:email_log,
|
|
user: user,
|
|
email_type: 'blah',
|
|
post_id: post.id,
|
|
to_address: user.email,
|
|
user_id: user.id
|
|
)
|
|
|
|
ran = EmailLog.unique_email_per_post(post, user) do
|
|
true
|
|
end
|
|
|
|
expect(ran).to be(nil)
|
|
end
|
|
end
|
|
|
|
context 'after_create' do
|
|
context 'with user' do
|
|
it 'updates the last_emailed_at value for the user' do
|
|
expect {
|
|
user.email_logs.create(email_type: 'blah', to_address: user.email)
|
|
user.reload
|
|
}.to change(user, :last_emailed_at)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#reached_max_emails?' do
|
|
before do
|
|
SiteSetting.max_emails_per_day_per_user = 2
|
|
Fabricate(:email_log, user: user, email_type: 'blah', to_address: user.email, user_id: user.id)
|
|
Fabricate(:email_log, user: user, email_type: 'blah', to_address: user.email, user_id: user.id, created_at: 3.days.ago)
|
|
end
|
|
|
|
it "tracks when max emails are reached" do
|
|
expect(EmailLog.reached_max_emails?(user)).to eq(false)
|
|
|
|
Fabricate(:email_log, user: user, email_type: 'blah', to_address: user.email, user_id: user.id)
|
|
expect(EmailLog.reached_max_emails?(user)).to eq(true)
|
|
end
|
|
|
|
it "returns false for critical email" do
|
|
Fabricate(:email_log, user: user, email_type: 'blah', to_address: user.email, user_id: user.id)
|
|
expect(EmailLog.reached_max_emails?(user, 'forgot_password')).to eq(false)
|
|
expect(EmailLog.reached_max_emails?(user, 'confirm_new_email')).to eq(false)
|
|
end
|
|
end
|
|
|
|
describe '#count_per_day' do
|
|
it "counts sent emails" do
|
|
Fabricate(:email_log, user: user, email_type: 'blah', to_address: user.email)
|
|
expect(described_class.count_per_day(1.day.ago, Time.now).first[1]).to eq 1
|
|
end
|
|
end
|
|
|
|
describe ".last_sent_email_address" do
|
|
context "when user's email exist in the logs" do
|
|
before do
|
|
user.email_logs.create(email_type: 'signup', to_address: user.email)
|
|
user.email_logs.create(email_type: 'blah', to_address: user.email)
|
|
user.reload
|
|
end
|
|
|
|
it "the user's last email from the log" do
|
|
expect(user.email_logs.last_sent_email_address).to eq(user.email)
|
|
end
|
|
end
|
|
|
|
context "when user's email does not exist email logs" do
|
|
it "returns nil" do
|
|
expect(user.email_logs.last_sent_email_address).to be_nil
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#bounce_key" do
|
|
it "should format the bounce_key correctly" do
|
|
hex = SecureRandom.hex
|
|
email_log = Fabricate(:email_log, user: user, bounce_key: hex)
|
|
|
|
raw_key = EmailLog.where(id: email_log.id)
|
|
.pluck("bounce_key::text")
|
|
.first
|
|
|
|
expect(raw_key).to_not eq(hex)
|
|
expect(raw_key.delete('-')).to eq(hex)
|
|
expect(EmailLog.find(email_log.id).bounce_key).to eq(hex)
|
|
end
|
|
end
|
|
|
|
describe "cc addresses handling" do
|
|
let!(:email_log) { Fabricate(:email_log, user: user) }
|
|
|
|
describe "#cc_addresses_split" do
|
|
it "returns empty array if there are no cc addresses" do
|
|
expect(email_log.cc_addresses_split).to eq([])
|
|
end
|
|
|
|
it "returns array of cc addresses if there are any" do
|
|
email_log.update(cc_addresses: "test@test.com;test@test2.com")
|
|
expect(email_log.cc_addresses_split).to eq(["test@test.com", "test@test2.com"])
|
|
end
|
|
end
|
|
|
|
describe "#cc_users" do
|
|
it "returns empty array if there are no cc users" do
|
|
expect(email_log.cc_users).to eq([])
|
|
end
|
|
|
|
it "returns array of users if cc_user_ids is present" do
|
|
cc_user = Fabricate(:user, email: "test@test.com")
|
|
cc_user2 = Fabricate(:user, email: "test@test2.com")
|
|
email_log.update(cc_addresses: "test@test.com;test@test2.com", cc_user_ids: [cc_user.id, cc_user2.id])
|
|
expect(email_log.cc_users).to match_array([cc_user, cc_user2])
|
|
end
|
|
end
|
|
end
|
|
end
|