Import scenarios with agents which need a service

Dominik Sander 10 years ago
parent
commit
a846154c7d

+ 18 - 5
app/models/scenario_import.rb

@@ -76,17 +76,19 @@ class ScenarioImport
76 76
         agent.schedule = agent_diff.schedule.updated if agent_diff.schedule.present?
77 77
         agent.keep_events_for = agent_diff.keep_events_for.updated if agent_diff.keep_events_for.present?
78 78
         agent.propagate_immediately = agent_diff.propagate_immediately.updated if agent_diff.propagate_immediately.present? # == "true"
79
+        agent.service_id = agent_diff.service_id.updated if agent_diff.service_id.present?
79 80
         unless agent.save
80 81
           success = false
81 82
           errors.add(:base, "Errors when saving '#{agent_diff.name.incoming}': #{agent.errors.full_messages.to_sentence}")
82 83
         end
83 84
         agent
84 85
       end
85
-
86
-      links.each do |link|
87
-        receiver = created_agents[link['receiver']]
88
-        source = created_agents[link['source']]
89
-        receiver.sources << source unless receiver.sources.include?(source)
86
+      if success
87
+        links.each do |link|
88
+          receiver = created_agents[link['receiver']]
89
+          source = created_agents[link['source']]
90
+          receiver.sources << source unless receiver.sources.include?(source)
91
+        end
90 92
       end
91 93
     end
92 94
 
@@ -149,6 +151,9 @@ class ScenarioImport
149 151
           errors.add(:base, "Your updated options for '#{agent_data['name']}' were unparsable.")
150 152
         end
151 153
       end
154
+      if agent_diff.requires_service? && merges.present? && merges[index.to_s].present? && merges[index.to_s]['service_id'].present?
155
+        agent_diff.service_id = AgentDiff::FieldDiff.new(merges[index.to_s]['service_id'].to_i)
156
+      end
152 157
       agent_diff
153 158
     end
154 159
   end
@@ -192,6 +197,10 @@ class ScenarioImport
192 197
       @requires_merge
193 198
     end
194 199
 
200
+    def requires_service?
201
+      !!agent_instance.try(:oauthable?)
202
+    end
203
+
195 204
     def store!(agent_data)
196 205
       self.type = FieldDiff.new(agent_data["type"].split("::").pop)
197 206
       self.options = FieldDiff.new(agent_data['options'] || {})
@@ -252,5 +261,9 @@ class ScenarioImport
252 261
         key.gsub(/[^a-zA-Z0-9_-]/, '')
253 262
       end
254 263
     end
264
+
265
+    def agent_instance
266
+      "Agents::#{self.type.updated}".constantize.new
267
+    end
255 268
   end
256 269
 end

+ 10 - 0
app/views/scenario_imports/_step_two.html.erb

@@ -120,6 +120,16 @@
120 120
           </div>
121 121
         <% end %>
122 122
       </div>
123
+      <% if agent_diff.requires_service? %>
124
+        <div class='row'>
125
+          <div class='col-md-4'>
126
+            <div class="form-group type-select">
127
+              <%= label_tag "scenario_import[merges][#{index}][service_id]", 'Service' %>
128
+              <%= select_tag "scenario_import[merges][#{index}][service_id]", options_for_select(agent_diff.agent_instance.valid_services(current_user).collect { |s| ["(#{s.provider}) #{s.name}", s.id]}, agent_diff.service_id.try(:current)), class: 'form-control' %>
129
+            </div>
130
+          </div>
131
+        </div>
132
+      <% end %>
123 133
     </div>
124 134
   <% end %>
125 135
 </div>

+ 1 - 1
db/schema.rb

@@ -11,7 +11,7 @@
11 11
 #
12 12
 # It's strongly recommended that you check this file into your version control system.
13 13
 
14
-ActiveRecord::Schema.define(version: 20140605032822) do
14
+ActiveRecord::Schema.define(version: 20140723110551) do
15 15
 
16 16
   # These are extensions that must be enabled in order to support this database
17 17
   enable_extension "plpgsql"

+ 55 - 0
spec/models/scenario_import_spec.rb

@@ -45,6 +45,18 @@ describe ScenarioImport do
45 45
       :options => trigger_agent_options
46 46
     }
47 47
   end
48
+  let(:valid_parsed_basecamp_agent_data) do
49
+    {
50
+      :type => "Agents::BasecampAgent",
51
+      :name => "Basecamp test",
52
+      :schedule => "every_2m",
53
+      :keep_events_for => 0,
54
+      :propagate_immediately => true,
55
+      :disabled => false,
56
+      :guid => "a-basecamp-agent",
57
+      :options => {project_id: 12345}
58
+    }
59
+  end
48 60
   let(:valid_parsed_data) do
49 61
     { 
50 62
       :name => name,
@@ -407,5 +419,48 @@ describe ScenarioImport do
407 419
         end
408 420
       end
409 421
     end
422
+
423
+    context "agents which require a service" do
424
+      let(:valid_parsed_services) do
425
+        data = valid_parsed_data
426
+        data[:agents] = [valid_parsed_basecamp_agent_data,
427
+                         valid_parsed_trigger_agent_data]
428
+        data
429
+      end
430
+
431
+      let(:valid_parsed_services_data) { valid_parsed_services.to_json }
432
+
433
+      let(:services_scenario_import) {
434
+        _import = ScenarioImport.new(:data => valid_parsed_services_data)
435
+        _import.set_user users(:bob)
436
+        _import
437
+      }
438
+
439
+      describe "#generate_diff" do
440
+        it "should check if the agent requires a service" do
441
+          agent_diffs = services_scenario_import.agent_diffs
442
+          basecamp_agent_diff = agent_diffs[0]
443
+          basecamp_agent_diff.requires_service?.should == true
444
+        end
445
+
446
+        it "should add an error when no service is selected" do
447
+          services_scenario_import.import.should == false
448
+          services_scenario_import.errors[:base].length.should == 1
449
+        end
450
+      end
451
+
452
+      describe "#import" do
453
+        it "should import" do
454
+          services_scenario_import.merges = {
455
+            "0" => {
456
+              "service_id" => "0",
457
+            }
458
+          }
459
+          lambda {
460
+            services_scenario_import.import.should == true
461
+          }.should change { users(:bob).agents.count }.by(2)
462
+        end
463
+      end
464
+    end
410 465
   end
411 466
 end