email_digest_agent_spec.rb 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. require 'rails_helper'
  2. describe Agents::EmailDigestAgent do
  3. it_behaves_like EmailConcern
  4. def get_message_part(mail, content_type)
  5. mail.body.parts.find { |p| p.content_type.match content_type }.body.raw_source
  6. end
  7. before do
  8. @checker = Agents::EmailDigestAgent.new(:name => "something", :options => { :expected_receive_period_in_days => "2", :subject => "something interesting" })
  9. @checker.user = users(:bob)
  10. @checker.save!
  11. @checker1 = Agents::EmailDigestAgent.new(:name => "something", :options => { :expected_receive_period_in_days => "2", :subject => "something interesting", :content_type => "text/plain" })
  12. @checker1.user = users(:bob)
  13. @checker1.save!
  14. end
  15. after do
  16. ActionMailer::Base.deliveries = []
  17. end
  18. describe "#receive" do
  19. it "queues any payloads it receives" do
  20. event1 = Event.new
  21. event1.agent = agents(:bob_rain_notifier_agent)
  22. event1.payload = { :data => "Something you should know about" }
  23. event1.save!
  24. event2 = Event.new
  25. event2.agent = agents(:bob_weather_agent)
  26. event2.payload = { :data => "Something else you should know about" }
  27. event2.save!
  28. Agents::EmailDigestAgent.async_receive(@checker.id, [event1.id, event2.id])
  29. expect(@checker.reload.memory[:queue]).to eq([{ 'data' => "Something you should know about" }, { 'data' => "Something else you should know about" }])
  30. end
  31. end
  32. describe "#check" do
  33. it "should send an email" do
  34. Agents::EmailDigestAgent.async_check(@checker.id)
  35. expect(ActionMailer::Base.deliveries).to eq([])
  36. @checker.memory[:queue] = [{ :data => "Something you should know about" },
  37. { :title => "Foo", :url => "http://google.com", :bar => 2 },
  38. { "message" => "hi", :woah => "there" },
  39. { "test" => 2 }]
  40. @checker.memory[:events] = [1,2,3,4]
  41. @checker.save!
  42. Agents::EmailDigestAgent.async_check(@checker.id)
  43. expect(ActionMailer::Base.deliveries.last.to).to eq(["bob@example.com"])
  44. expect(ActionMailer::Base.deliveries.last.subject).to eq("something interesting")
  45. expect(get_message_part(ActionMailer::Base.deliveries.last, /plain/).strip).to eq("Event\n data: Something you should know about\n\nFoo\n bar: 2\n url: http://google.com\n\nhi\n woah: there\n\nEvent\n test: 2")
  46. expect(@checker.reload.memory[:queue]).to be_empty
  47. end
  48. it "logs and re-raises mailer errors" do
  49. mock(SystemMailer).send_message(anything) { raise Net::SMTPAuthenticationError.new("Wrong password") }
  50. @checker.memory[:queue] = [{ :data => "Something you should know about" }]
  51. @checker.memory[:events] = [1]
  52. @checker.save!
  53. expect {
  54. Agents::EmailDigestAgent.async_check(@checker.id)
  55. }.to raise_error(/Wrong password/)
  56. expect(@checker.reload.memory[:events]).not_to be_empty
  57. expect(@checker.reload.memory[:queue]).not_to be_empty
  58. expect(@checker.logs.last.message).to match(/Error sending digest mail .* Wrong password/)
  59. end
  60. it "can receive complex events and send them on" do
  61. stub_request(:any, /wunderground/).to_return(:body => File.read(Rails.root.join("spec/data_fixtures/weather.json")), :status => 200)
  62. stub.any_instance_of(Agents::WeatherAgent).is_tomorrow?(anything) { true }
  63. @checker.sources << agents(:bob_weather_agent)
  64. Agent.async_check(agents(:bob_weather_agent).id)
  65. Agent.receive!
  66. expect(@checker.reload.memory[:queue]).not_to be_empty
  67. Agents::EmailDigestAgent.async_check(@checker.id)
  68. plain_email_text = get_message_part(ActionMailer::Base.deliveries.last, /plain/).strip
  69. html_email_text = get_message_part(ActionMailer::Base.deliveries.last, /html/).strip
  70. expect(plain_email_text).to match(/avehumidity/)
  71. expect(html_email_text).to match(/avehumidity/)
  72. expect(@checker.reload.memory[:queue]).to be_empty
  73. end
  74. it "should send email with correct content type" do
  75. Agents::EmailDigestAgent.async_check(@checker1.id)
  76. expect(ActionMailer::Base.deliveries).to eq([])
  77. @checker1.memory[:queue] = [{ :data => "Something you should know about" },
  78. { :title => "Foo", :url => "http://google.com", :bar => 2 },
  79. { "message" => "hi", :woah => "there" },
  80. { "test" => 2 }]
  81. @checker1.memory[:events] = [1,2,3,4]
  82. @checker1.save!
  83. Agents::EmailDigestAgent.async_check(@checker1.id)
  84. expect(ActionMailer::Base.deliveries.last.content_type).to eq("text/plain; charset=UTF-8")
  85. end
  86. end
  87. end