123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- require 'rails_helper'
- describe Agents::DryRunsController do
- def valid_attributes(options = {})
- {
- type: "Agents::WebsiteAgent",
- name: "Something",
- options: agents(:bob_website_agent).options,
- source_ids: [agents(:bob_weather_agent).id, ""]
- }.merge(options)
- end
- before do
- sign_in users(:bob)
- end
- describe "GET index" do
- it "does not load any events without specifing sources" do
- get :index, params: {type: 'Agents::WebsiteAgent', source_ids: []}
- expect(assigns(:events)).to eq([])
- end
- context "does not load events when the agent is owned by a different user" do
- before do
- @agent = agents(:jane_website_agent)
- @agent.sources << @agent
- @agent.save!
- expect(@agent.events.count).not_to be(0)
- end
- it "for new agents" do
- get :index, params: {type: 'Agents::WebsiteAgent', source_ids: [@agent.id]}
- expect(assigns(:events)).to eq([])
- end
- it "for existing agents" do
- expect(@agent.events.count).not_to be(0)
- expect { get :index, params: {agent_id: @agent} }.to raise_error(NoMethodError)
- end
- end
- context "loads the most recent events" do
- before do
- @agent = agents(:bob_website_agent)
- @agent.sources << @agent
- @agent.save!
- end
- it "load the most recent events when providing source ids" do
- get :index, params: {type: 'Agents::WebsiteAgent', source_ids: [@agent.id]}
- expect(assigns(:events)).to eq([@agent.events.first])
- end
- it "loads the most recent events for a saved agent" do
- get :index, params: {agent_id: @agent}
- expect(assigns(:events)).to eq([@agent.events.first])
- end
- end
- end
- describe "POST create" do
- before do
- stub_request(:any, /xkcd/).to_return(body: File.read(Rails.root.join("spec/data_fixtures/xkcd.html")), status: 200)
- end
- it "does not actually create any agent, event or log" do
- expect {
- post :create, params: {agent: valid_attributes}
- }.not_to change {
- [users(:bob).agents.count, users(:bob).events.count, users(:bob).logs.count]
- }
- results = assigns(:results)
- expect(results[:log]).to be_a(String)
- expect(results[:log]).to include('Extracting html at')
- expect(results[:events]).to be_a(Array)
- expect(results[:events].length).to eq(1)
- expect(results[:events].map(&:class)).to eq([ActiveSupport::HashWithIndifferentAccess])
- expect(results[:memory]).to be_a(Hash)
- end
- it "does not actually update an agent" do
- agent = agents(:bob_weather_agent)
- expect {
- post :create, params: {agent_id: agent, agent: valid_attributes(name: 'New Name')}
- }.not_to change {
- [users(:bob).agents.count, users(:bob).events.count, users(:bob).logs.count, agent.name, agent.updated_at]
- }
- end
- it "accepts an event" do
- agent = agents(:bob_website_agent)
- agent.options['url_from_event'] = '{{ url }}'
- agent.save!
- url_from_event = "http://xkcd.com/?from_event=1".freeze
- expect {
- post :create, params: {agent_id: agent, event: { url: url_from_event }.to_json}
- }.not_to change {
- [users(:bob).agents.count, users(:bob).events.count, users(:bob).logs.count, agent.name, agent.updated_at]
- }
- results = assigns(:results)
- expect(results[:log]).to match(/^\[\d\d:\d\d:\d\d\] INFO -- : Fetching #{Regexp.quote(url_from_event)}$/)
- end
- it "uses the memory of an existing Agent" do
- valid_params = {
- :name => "somename",
- :options => {
- :code => "Agent.check = function() { this.createEvent({ 'message': this.memory('fu') }); };",
- }
- }
- agent = Agents::JavaScriptAgent.new(valid_params)
- agent.memory = {fu: "bar"}
- agent.user = users(:bob)
- agent.save!
- post :create, params: {agent_id: agent, agent: valid_params}
- results = assigns(:results)
- expect(results[:events][0]).to eql({"message" => "bar"})
- end
- it 'sets created_at of the dry-runned event' do
- agent = agents(:bob_formatting_agent)
- agent.options['instructions'] = {'created_at' => '{{created_at | date: "%a, %b %d, %y"}}'}
- agent.save
- post :create, params: {agent_id: agent, event: {test: 1}.to_json}
- results = assigns(:results)
- expect(results[:events]).to be_a(Array)
- expect(results[:events].length).to eq(1)
- expect(results[:events].first['created_at']).to eq(Date.today.strftime('%a, %b %d, %y'))
- end
- end
- end
|