discourse/spec/jobs/poll_mailbox_spec.rb

203 lines
5.2 KiB
Ruby

require 'spec_helper'
require_dependency 'jobs/regular/process_post'
describe Jobs::PollMailbox do
let!(:poller) { Jobs::PollMailbox.new }
describe ".execute" do
it "does no polling if pop3s_polling_enabled is false" do
SiteSetting.expects(:pop3s_polling_enabled?).returns(false)
poller.expects(:poll_pop3s).never
poller.execute({})
end
describe "with pop3s_polling_enabled" do
it "calls poll_pop3s" do
SiteSetting.expects(:pop3s_polling_enabled?).returns(true)
poller.expects(:poll_pop3s).once
poller.execute({})
end
end
end
describe ".poll_pop3s" do
it "logs an error on pop authentication error" do
error = Net::POPAuthenticationError.new
data = { limit_once_per: 1.hour, message_params: { error: error }}
Net::POP3.expects(:start).raises(error)
Discourse.expects(:handle_exception)
poller.poll_pop3s
end
end
# Testing mock for the email objects that you get
# from Net::POP3.start { |pop| pop.mails }
class MockPop3EmailObject
def initialize(mail_string)
@message = mail_string
@delete_called = 0
end
def pop
@message
end
def delete
@delete_called += 1
end
# call 'assert email.deleted?' at the end of the test
def deleted?
@delete_called == 1
end
end
def expect_success
Jobs::PollMailbox.expects(:handle_failure).never
end
describe "processing email B" do
let(:category) { Fabricate(:category) }
let(:user) { Fabricate(:user) }
before do
SiteSetting.email_in = true
SiteSetting.reply_by_email_address = 'reply+%{reply_key}@discourse.example.com'
category.email_in = 'incoming+amazing@discourse.example.com'
category.save
user.change_trust_level! :regular
user.username = 'Jake'
user.email = 'jake@email.example.com'
user.save
end
describe "valid incoming email" do
let(:email) { MockPop3EmailObject.new fixture_file('emails/valid_incoming.eml')}
let(:expected_post) { fixture_file('emails/valid_incoming.cooked') }
it "posts a new topic with the correct content" do
expect_success
poller.handle_mail(email)
topic = Topic.where(category: category).where.not(id: category.topic_id).first
assert topic.present?
post = topic.posts.first
assert_equal expected_post.strip, post.cooked.strip
assert email.deleted?
end
end
describe "valid reply" do
let(:email) { MockPop3EmailObject.new fixture_file('emails/valid_reply.eml')}
let(:expected_post) { fixture_file('emails/valid_reply.cooked')}
let(:topic) { Fabricate(:topic) }
let(:first_post) { Fabricate(:post, topic: topic, post_number: 1)}
before do
first_post.save
EmailLog.create(to_address: 'jake@email.example.com',
email_type: 'user_posted',
reply_key: '59d8df8370b7e95c5a49fbf86aeb2c93',
post: first_post,
topic: topic)
end
pending "creates a new post with the correct content" do
expect_success
poller.handle_mail(email)
new_post = Post.where(topic: topic, post_number: 2)
assert new_post.present?
assert_equal expected_post.strip, new_post.cooked.strip
assert email.deleted?
end
end
end
describe "processing email" do
let!(:receiver) { mock }
let!(:email_string) { fixture_file("emails/valid_incoming.eml") }
let!(:email) { mock }
before do
email.stubs(:pop).returns(email_string)
Email::Receiver.expects(:new).with(email_string).returns(receiver)
end
describe "all goes fine" do
it "email gets deleted" do
receiver.expects(:process)
email.expects(:delete)
poller.handle_mail(email)
end
end
describe "raises Untrusted error" do
it "sends a reply and deletes the email" do
receiver.expects(:process).raises(Email::Receiver::UserNotSufficientTrustLevelError)
email.expects(:delete)
message = Mail::Message.new(email_string)
Mail::Message.expects(:new).with(email_string).returns(message)
client_message = mock
sender_object = mock
RejectionMailer.expects(:send_rejection).with(
message.from, message.body, message.subject, message.to, :email_reject_trust_level
).returns(client_message)
Email::Sender.expects(:new).with(client_message, :email_reject_trust_level).returns(sender_object)
sender_object.expects(:send)
poller.handle_mail(email)
end
end
describe "raises error" do
[ Email::Receiver::ProcessingError,
Email::Receiver::EmailUnparsableError,
Email::Receiver::EmptyEmailError,
Email::Receiver::UserNotFoundError,
Email::Receiver::EmailLogNotFound,
ActiveRecord::Rollback,
TypeError
].each do |exception|
it "deletes email on #{exception}" do
receiver.expects(:process).raises(exception)
email.expects(:delete)
Discourse.stubs(:handle_exception)
poller.handle_mail(email)
end
end
end
end
end