website_agent_spec.rb 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. require 'spec_helper'
  2. describe Agents::WebsiteAgent do
  3. before do
  4. stub_request(:any, /xkcd/).to_return(:body => File.read(Rails.root.join("spec/data_fixtures/xkcd.html")), :status => 200)
  5. @site = {
  6. :name => "XKCD",
  7. :expected_update_period_in_days => 2,
  8. :type => "html",
  9. :url => "http://xkcd.com",
  10. :mode => :on_change,
  11. :extract => {
  12. :url => {:css => "#comic img", :attr => "src"},
  13. :title => {:css => "#comic img", :attr => "title"}
  14. }
  15. }
  16. @checker = Agents::WebsiteAgent.new(:name => "xkcd", :options => @site)
  17. @checker.user = users(:bob)
  18. @checker.save!
  19. end
  20. describe "#check" do
  21. it "should check for changes" do
  22. lambda { @checker.check }.should change { Event.count }.by(1)
  23. lambda { @checker.check }.should_not change { Event.count }
  24. end
  25. it "should always save events when in :all mode" do
  26. lambda {
  27. @site[:mode] = :all
  28. @checker.options = @site
  29. @checker.check
  30. @checker.check
  31. }.should change { Event.count }.by(2)
  32. end
  33. it "should log an error if the number of results for a set of extraction patterns differs" do
  34. @site[:extract][:url][:css] = "div"
  35. @checker.options = @site
  36. @checker.check
  37. @checker.logs.first.message.should =~ /Got an uneven number of matches/
  38. end
  39. end
  40. describe '#working?' do
  41. it 'checks if events have been received within the expected receive period' do
  42. @checker.should_not be_working # No events created
  43. @checker.check
  44. @checker.reload.should be_working # Just created events
  45. @checker.error "oh no!"
  46. @checker.reload.should_not be_working # The most recent log is an error
  47. @checker.log "ok now"
  48. @checker.reload.should be_working # The most recent log is no longer an error
  49. two_days_from_now = 2.days.from_now
  50. stub(Time).now { two_days_from_now }
  51. @checker.reload.should_not be_working # Two days have passed without a new event having been created
  52. end
  53. end
  54. describe "parsing" do
  55. it "parses CSS" do
  56. @checker.check
  57. event = Event.last
  58. event.payload[:url].should == "http://imgs.xkcd.com/comics/evolving.png"
  59. event.payload[:title].should =~ /^Biologists play reverse/
  60. end
  61. it "should turn relative urls to absolute" do
  62. rel_site = {
  63. :name => "XKCD",
  64. :expected_update_period_in_days => 2,
  65. :type => "html",
  66. :url => "http://xkcd.com",
  67. :mode => :on_change,
  68. :extract => {
  69. :url => {:css => "#topLeft a", :attr => "href"},
  70. :title => {:css => "#topLeft a", :text => "true"}
  71. }
  72. }
  73. rel = Agents::WebsiteAgent.new(:name => "xkcd", :options => rel_site)
  74. rel.user = users(:bob)
  75. rel.save!
  76. rel.check
  77. event = Event.last
  78. event.payload[:url].should == "http://xkcd.com/about"
  79. end
  80. describe "JSON" do
  81. it "works with paths" do
  82. json = {
  83. :response => {
  84. :version => 2,
  85. :title => "hello!"
  86. }
  87. }
  88. stub_request(:any, /json-site/).to_return(:body => json.to_json, :status => 200)
  89. site = {
  90. :name => "Some JSON Response",
  91. :expected_update_period_in_days => 2,
  92. :type => "json",
  93. :url => "http://json-site.com",
  94. :mode => :on_change,
  95. :extract => {
  96. :version => { :path => "response.version" },
  97. :title => { :path => "response.title" }
  98. }
  99. }
  100. checker = Agents::WebsiteAgent.new(:name => "Weather Site", :options => site)
  101. checker.user = users(:bob)
  102. checker.save!
  103. checker.check
  104. event = Event.last
  105. event.payload[:version].should == 2
  106. event.payload[:title].should == "hello!"
  107. end
  108. it "can handle arrays" do
  109. json = {
  110. :response => {
  111. :data => [
  112. { :title => "first", :version => 2 },
  113. { :title => "second", :version => 2.5 }
  114. ]
  115. }
  116. }
  117. stub_request(:any, /json-site/).to_return(:body => json.to_json, :status => 200)
  118. site = {
  119. :name => "Some JSON Response",
  120. :expected_update_period_in_days => 2,
  121. :type => "json",
  122. :url => "http://json-site.com",
  123. :mode => :on_change,
  124. :extract => {
  125. :title => { :path => "response.data[*].title" },
  126. :version => { :path => "response.data[*].version" }
  127. }
  128. }
  129. checker = Agents::WebsiteAgent.new(:name => "Weather Site", :options => site)
  130. checker.user = users(:bob)
  131. checker.save!
  132. lambda {
  133. checker.check
  134. }.should change { Event.count }.by(2)
  135. event = Event.all[-1]
  136. event.payload[:version].should == 2.5
  137. event.payload[:title].should == "second"
  138. event = Event.all[-2]
  139. event.payload[:version].should == 2
  140. event.payload[:title].should == "first"
  141. end
  142. end
  143. end
  144. end