twitter_action_agent_spec.rb 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. require 'rails_helper'
  2. describe Agents::TwitterActionAgent do
  3. describe '#receive' do
  4. before do
  5. @event1 = Event.new
  6. @event1.agent = agents(:bob_twitter_user_agent)
  7. @event1.payload = { id: 123, text: 'So awesome.. gotta retweet' }
  8. @event1.save!
  9. @tweet1 = Twitter::Tweet.new(
  10. id: @event1.payload[:id],
  11. text: @event1.payload[:text]
  12. )
  13. @event2 = Event.new
  14. @event2.agent = agents(:bob_twitter_user_agent)
  15. @event2.payload = { id: 456, text: 'Something Justin Bieber said' }
  16. @event2.save!
  17. @tweet2 = Twitter::Tweet.new(
  18. id: @event2.payload[:id],
  19. text: @event2.payload[:text]
  20. )
  21. end
  22. context 'when set up to retweet' do
  23. before do
  24. @agent = build_agent({
  25. 'expected_receive_period_in_days' => '2',
  26. 'favorite' => 'false',
  27. 'retweet' => 'true',
  28. })
  29. @agent.save!
  30. end
  31. context 'when the twitter client succeeds retweeting' do
  32. it 'should retweet the tweets from the payload' do
  33. mock(@agent.twitter).retweet([@tweet1, @tweet2])
  34. @agent.receive([@event1, @event2])
  35. end
  36. end
  37. context 'when the twitter client fails retweeting' do
  38. it 'creates an event with tweet info and the error message' do
  39. stub(@agent.twitter).retweet(anything) {
  40. raise Twitter::Error.new('uh oh')
  41. }
  42. @agent.receive([@event1, @event2])
  43. failure_event = @agent.events.last
  44. expect(failure_event.payload[:error]).to eq('uh oh')
  45. expect(failure_event.payload[:tweets]).to eq(
  46. {
  47. @event1.payload[:id].to_s => @event1.payload[:text],
  48. @event2.payload[:id].to_s => @event2.payload[:text]
  49. }
  50. )
  51. expect(failure_event.payload[:agent_ids]).to match_array(
  52. [@event1.agent_id, @event2.agent_id]
  53. )
  54. expect(failure_event.payload[:event_ids]).to match_array(
  55. [@event2.id, @event1.id]
  56. )
  57. end
  58. end
  59. end
  60. context 'when set up to favorite' do
  61. before do
  62. @agent = build_agent(
  63. 'expected_receive_period_in_days' => '2',
  64. 'favorite' => 'true',
  65. 'retweet' => 'false',
  66. )
  67. @agent.save!
  68. end
  69. context 'when the twitter client succeeds favoriting' do
  70. it 'should favorite the tweets from the payload' do
  71. mock(@agent.twitter).favorite([@tweet1, @tweet2])
  72. @agent.receive([@event1, @event2])
  73. end
  74. end
  75. context 'when the twitter client fails retweeting' do
  76. it 'creates an event with tweet info and the error message' do
  77. stub(@agent.twitter).favorite(anything) {
  78. raise Twitter::Error.new('uh oh')
  79. }
  80. @agent.receive([@event1, @event2])
  81. failure_event = @agent.events.last
  82. expect(failure_event.payload[:error]).to eq('uh oh')
  83. expect(failure_event.payload[:tweets]).to eq(
  84. {
  85. @event1.payload[:id].to_s => @event1.payload[:text],
  86. @event2.payload[:id].to_s => @event2.payload[:text]
  87. }
  88. )
  89. expect(failure_event.payload[:agent_ids]).to match_array(
  90. [@event1.agent_id, @event2.agent_id]
  91. )
  92. expect(failure_event.payload[:event_ids]).to match_array(
  93. [@event2.id, @event1.id]
  94. )
  95. end
  96. end
  97. end
  98. end
  99. describe "#validate_options" do
  100. context 'when set up to neither favorite or retweet' do
  101. it 'is invalid' do
  102. agent = build_agent(
  103. 'expected_receive_period_in_days' => '2',
  104. 'favorite' => 'false',
  105. 'retweet' => 'false',
  106. )
  107. expect(agent).not_to be_valid
  108. end
  109. end
  110. end
  111. describe '#working?' do
  112. before do
  113. stub.any_instance_of(Twitter::REST::Client).retweet(anything)
  114. end
  115. it 'checks if events have been received within the expected time period' do
  116. agent = build_agent(
  117. 'expected_receive_period_in_days' => '2',
  118. 'favorite' => 'false',
  119. 'retweet' => 'true',
  120. )
  121. agent.save!
  122. expect(agent).not_to be_working # No events received
  123. described_class.async_receive(agent.id, [events(:bob_website_agent_event)])
  124. expect(agent.reload).to be_working # Just received events
  125. two_days_from_now = 2.days.from_now
  126. stub(Time).now { two_days_from_now }
  127. expect(agent.reload).not_to be_working # Too much time has passed
  128. end
  129. end
  130. def build_agent(options)
  131. described_class.new do |agent|
  132. agent.name = 'twitter stuff'
  133. agent.options = options
  134. agent.service = services(:generic)
  135. agent.user = users(:bob)
  136. end
  137. end
  138. end