123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- # encoding: utf-8
- require 'spec_helper'
- describe Agents::DataOutputAgent do
- let(:agent) do
- _agent = Agents::DataOutputAgent.new(:name => 'My Data Output Agent')
- _agent.options = _agent.default_options.merge('secrets' => ['secret1', 'secret2'], 'events_to_show' => 3)
- _agent.options['template']['item']['pubDate'] = "{{date}}"
- _agent.user = users(:bob)
- _agent.sources << agents(:bob_website_agent)
- _agent.save!
- _agent
- end
- describe "#working?" do
- it "checks if events have been received within expected receive period" do
- expect(agent).not_to be_working
- Agents::DataOutputAgent.async_receive agent.id, [events(:bob_website_agent_event).id]
- expect(agent.reload).to be_working
- two_days_from_now = 2.days.from_now
- stub(Time).now { two_days_from_now }
- expect(agent.reload).not_to be_working
- end
- end
- describe "validation" do
- before do
- expect(agent).to be_valid
- end
- it "should validate presence and length of secrets" do
- agent.options[:secrets] = ""
- expect(agent).not_to be_valid
- agent.options[:secrets] = "foo"
- expect(agent).not_to be_valid
- agent.options[:secrets] = []
- expect(agent).not_to be_valid
- agent.options[:secrets] = ["hello"]
- expect(agent).to be_valid
- agent.options[:secrets] = ["hello", "world"]
- expect(agent).to be_valid
- end
- it "should validate presence of expected_receive_period_in_days" do
- agent.options[:expected_receive_period_in_days] = ""
- expect(agent).not_to be_valid
- agent.options[:expected_receive_period_in_days] = 0
- expect(agent).not_to be_valid
- agent.options[:expected_receive_period_in_days] = -1
- expect(agent).not_to be_valid
- end
- it "should validate presence of template and template.item" do
- agent.options[:template] = ""
- expect(agent).not_to be_valid
- agent.options[:template] = {}
- expect(agent).not_to be_valid
- agent.options[:template] = { 'item' => 'foo' }
- expect(agent).not_to be_valid
- agent.options[:template] = { 'item' => { 'title' => 'hi' } }
- expect(agent).to be_valid
- end
- end
- describe "#receive_web_request" do
- before do
- current_time = Time.now
- stub(Time).now { current_time }
- agents(:bob_website_agent).events.destroy_all
- end
- it "requires a valid secret" do
- content, status, content_type = agent.receive_web_request({ 'secret' => 'fake' }, 'get', 'text/xml')
- expect(status).to eq(401)
- expect(content).to eq("Not Authorized")
- content, status, content_type = agent.receive_web_request({ 'secret' => 'fake' }, 'get', 'application/json')
- expect(status).to eq(401)
- expect(content).to eq({ :error => "Not Authorized" })
- content, status, content_type = agent.receive_web_request({ 'secret' => 'secret1' }, 'get', 'application/json')
- expect(status).to eq(200)
- end
- describe "returning events as RSS and JSON" do
- let!(:event1) do
- agents(:bob_website_agent).create_event :payload => {
- "url" => "http://imgs.xkcd.com/comics/evolving.png",
- "title" => "Evolving",
- "hovertext" => "Biologists play reverse Pokemon, trying to avoid putting any one team member on the front lines long enough for the experience to cause evolution."
- }
- end
- let!(:event2) do
- agents(:bob_website_agent).create_event :payload => {
- "url" => "http://imgs.xkcd.com/comics/evolving2.png",
- "title" => "Evolving again",
- "date" => '',
- "hovertext" => "Something else"
- }
- end
- let!(:event3) do
- agents(:bob_website_agent).create_event :payload => {
- "url" => "http://imgs.xkcd.com/comics/evolving0.png",
- "title" => "Evolving yet again with a past date",
- "date" => '2014/05/05',
- "hovertext" => "Something else"
- }
- end
- it "can output RSS" do
- stub(agent).feed_link { "https://yoursite.com" }
- content, status, content_type = agent.receive_web_request({ 'secret' => 'secret1' }, 'get', 'text/xml')
- expect(status).to eq(200)
- expect(content_type).to eq('text/xml')
- expect(content.gsub(/\s+/, '')).to eq Utils.unindent(<<-XML).gsub(/\s+/, '')
- <?xml version="1.0" encoding="UTF-8" ?>
- <rss version="2.0">
- <channel>
- <title>XKCD comics as a feed</title>
- <description>This is a feed of recent XKCD comics, generated by Huginn</description>
- <link>https://yoursite.com</link>
- <lastBuildDate>#{Time.now.rfc2822}</lastBuildDate>
- <pubDate>#{Time.now.rfc2822}</pubDate>
- <ttl>60</ttl>
- <item>
- <title>Evolving yet again with a past date</title>
- <description>Secret hovertext: Something else</description>
- <link>http://imgs.xkcd.com/comics/evolving0.png</link>
- <pubDate>#{Time.zone.parse(event3.payload['date']).rfc2822}</pubDate>
- <guid>#{event3.id}</guid>
- </item>
- <item>
- <title>Evolving again</title>
- <description>Secret hovertext: Something else</description>
- <link>http://imgs.xkcd.com/comics/evolving2.png</link>
- <pubDate>#{event2.created_at.rfc2822}</pubDate>
- <guid>#{event2.id}</guid>
- </item>
- <item>
- <title>Evolving</title>
- <description>Secret hovertext: Biologists play reverse Pokemon, trying to avoid putting any one team member on the front lines long enough for the experience to cause evolution.</description>
- <link>http://imgs.xkcd.com/comics/evolving.png</link>
- <pubDate>#{event1.created_at.rfc2822}</pubDate>
- <guid>#{event1.id}</guid>
- </item>
- </channel>
- </rss>
- XML
- end
- it "can output JSON" do
- agent.options['template']['item']['foo'] = "hi"
- content, status, content_type = agent.receive_web_request({ 'secret' => 'secret2' }, 'get', 'application/json')
- expect(status).to eq(200)
- expect(content).to eq({
- 'title' => 'XKCD comics as a feed',
- 'description' => 'This is a feed of recent XKCD comics, generated by Huginn',
- 'pubDate' => Time.now,
- 'items' => [
- {
- 'title' => 'Evolving yet again with a past date',
- 'description' => 'Secret hovertext: Something else',
- 'link' => 'http://imgs.xkcd.com/comics/evolving0.png',
- 'guid' => event3.id,
- 'pubDate' => Time.zone.parse(event3.payload['date']).rfc2822,
- 'foo' => 'hi'
- },
- {
- 'title' => 'Evolving again',
- 'description' => 'Secret hovertext: Something else',
- 'link' => 'http://imgs.xkcd.com/comics/evolving2.png',
- 'guid' => event2.id,
- 'pubDate' => event2.created_at.rfc2822,
- 'foo' => 'hi'
- },
- {
- 'title' => 'Evolving',
- 'description' => 'Secret hovertext: Biologists play reverse Pokemon, trying to avoid putting any one team member on the front lines long enough for the experience to cause evolution.',
- 'link' => 'http://imgs.xkcd.com/comics/evolving.png',
- 'guid' => event1.id,
- 'pubDate' => event1.created_at.rfc2822,
- 'foo' => 'hi'
- }
- ]
- })
- end
- end
- end
- end
|