Commit c4fa829dd0f278e917be723c5aa4f6c7c41eca2d

Authored by Rafael Manzo
2 parents 4e9c082c 473d215e

Merge pull request #304 from mezuro/hotspot_metric_configuration_creation

Hotspot metric configuration creation
Showing 31 changed files with 514 additions and 416 deletions   Show diff stats
app/assets/javascripts/metric_collector.js.coffee
1 class @MetricCollector 1 class @MetricCollector
2 2
3 # Static Method 3 # Static Method
4 - @choose_metric: (metric_code, metric_collector_name) -> 4 + @choose_metric: (metric_code, metric_collector_name, action_path) ->
5 $("#metric_code").val(metric_code) 5 $("#metric_code").val(metric_code)
6 $("#metric_collector_name").val(metric_collector_name) 6 $("#metric_collector_name").val(metric_collector_name)
  7 + $("form").attr('action', action_path)
7 $("form").submit() 8 $("form").submit()
app/controllers/base_metric_configurations_controller.rb
1 -include OwnershipAuthentication  
2 -include MetricConfigurationsConcern  
3 -  
4 class BaseMetricConfigurationsController < ApplicationController 1 class BaseMetricConfigurationsController < ApplicationController
5 - before_action :authenticate_user!, except: [:show, :index] 2 + include OwnershipAuthentication
  3 + include MetricConfigurationsConcern
  4 +
  5 + before_action :authenticate_user!, except: [:show]
6 before_action :metric_configuration_owner?, only: [:edit, :update, :destroy] 6 before_action :metric_configuration_owner?, only: [:edit, :update, :destroy]
7 before_action :kalibro_configuration_owner?, only: [:new, :create, :choose_metric] 7 before_action :kalibro_configuration_owner?, only: [:new, :create, :choose_metric]
8 - before_action :set_metric_configuration, only: [:show, :edit, :update, :destroy] 8 + before_action :set_kalibro_configuration!
  9 + before_action :find_metric_configuration!, only: [:show, :edit, :update, :destroy]
  10 + before_action :new_metric_configuration!, only: [:create]
  11 + before_action :set_metric!, only: [:create, :update]
  12 + before_action :set_reading_group!, only: [:show, :edit, :create, :update]
  13 +
  14 + def show
  15 + @kalibro_ranges = @metric_configuration.kalibro_ranges
  16 + end
9 17
10 def new 18 def new
11 - update_metric_configuration(MetricConfiguration.new) 19 + @metric_configuration = MetricConfiguration.new
12 end 20 end
13 21
14 - def show  
15 - if metric_configuration  
16 - @reading_group = ReadingGroup.find(metric_configuration.reading_group_id)  
17 - @kalibro_ranges = metric_configuration.kalibro_ranges  
18 - else  
19 - raise NotImplementedError  
20 - end 22 + def edit
21 end 23 end
22 24
23 def create 25 def create
24 - update_metric_configuration(MetricConfiguration.new(metric_configuration_params)) 26 + respond_to { |format| save_and_redir(format) }
  27 + end
  28 +
  29 + def update
  30 + respond_to do |format|
  31 + save_and_redir(format) do |metric_configuration|
  32 + metric_configuration.update(metric_configuration_params)
  33 + end
  34 + end
  35 + end
  36 +
  37 + def destroy
  38 + @metric_configuration.destroy
  39 + clear_caches
  40 +
  41 + respond_to do |format|
  42 + format.html { redirect_to kalibro_configuration_path(@kalibro_configuration.id) }
  43 + format.json { head :no_content }
  44 + end
25 end 45 end
26 46
27 protected 47 protected
28 48
29 - def metric_configuration  
30 - raise NotImplementedError 49 + def save_and_redir(format)
  50 + new_record = @metric_configuration.id.nil?
  51 + result = block_given? ? (yield @metric_configuration) : @metric_configuration.save
  52 +
  53 + if result
  54 + clear_caches
  55 +
  56 + format.html do
  57 + redirect_to kalibro_configuration_path(@kalibro_configuration.id),
  58 + notice: t(new_record ? 'successfully_created' : 'successfully_updated',
  59 + record: t(@metric_configuration.class))
  60 + end
  61 + format.json { render json: @metric_configuration, status: new_record ? :created : :ok }
  62 + else
  63 + failed_action(format)
  64 + end
31 end 65 end
32 66
33 - def update_metric_configuration (new_metric_configuration)  
34 - raise NotImplementedError 67 + def failed_action(format, error = nil)
  68 + errors = @metric_configuration.kalibro_errors
  69 + errors << error unless error.nil?
  70 +
  71 + flash[:notice] = errors.join(', ')
  72 +
  73 + format.json { render json: { errors: errors }, status: :unprocessable_entity }
  74 + render_failure_html(format)
  75 + end
  76 +
  77 + def render_failure_html(format)
  78 + if action_name == 'create'
  79 + format.html { render 'new' }
  80 + elsif action_name == 'update'
  81 + format.html { render 'edit' }
  82 + else
  83 + format.html { redirect_to kalibro_configuration_path(@kalibro_configuration.id) }
  84 + end
  85 + end
  86 +
  87 + def clear_caches
  88 + Rails.cache.delete("#{@kalibro_configuration.id}_tree_metric_configurations")
  89 + Rails.cache.delete("#{@kalibro_configuration.id}_hotspot_metric_configurations")
35 end 90 end
36 91
37 - # Never trust parameters from the scary internet, only allow the white list through.  
38 - # TODO: this should be refactored to the concern metric configuration 92 + # Notice: If you add some logic to this method, remove the :nocov: below
  93 + # :nocov:
39 def metric_configuration_params 94 def metric_configuration_params
40 - params[:metric_configuration] 95 + raise NotImplementedError
  96 + end
  97 + # :nocov:
  98 +
  99 + def set_kalibro_configuration!
  100 + @kalibro_configuration = KalibroConfiguration.find params[:kalibro_configuration_id].to_i
  101 + end
  102 +
  103 + def new_metric_configuration!
  104 + @metric_configuration = MetricConfiguration.new metric_configuration_params
  105 + @metric_configuration.kalibro_configuration_id = @kalibro_configuration.id
  106 + end
  107 +
  108 + def find_metric_configuration!
  109 + @metric_configuration = MetricConfiguration.find params[:id].to_i
  110 +
  111 + # Make sure the metric configuration is really from the kalibro configuration we're being told it is
  112 + if @metric_configuration.kalibro_configuration_id != @kalibro_configuration.id
  113 + raise KalibroClient::Errors::RecordNotFound
  114 + end
  115 + end
  116 +
  117 + def set_metric!
  118 + collector = KalibroClient::Entities::Processor::MetricCollectorDetails.find_by_name(params[:metric_collector_name])
  119 + # FIXME: Some view pass metric code as a parameter instead of metric name
  120 + if params.key?(:metric_code)
  121 + metric = collector.find_metric_by_code(params[:metric_code])
  122 + else
  123 + metric = collector.find_metric_by_name(params[:metric_name])
  124 + end
  125 +
  126 + if !metric.nil? && metric.type == self.metric_type
  127 + @metric_configuration.metric = metric
  128 + return
  129 + end
  130 +
  131 + respond_to do |format|
  132 + failed_action(format, t('invalid_metric_or_collector'))
  133 + end
  134 + end
  135 +
  136 + def set_reading_group!
  137 + begin
  138 + @reading_group = ReadingGroup.find(@metric_configuration.reading_group_id)
  139 + rescue KalibroClient::Errors::RecordNotFound
  140 + respond_to do |format|
  141 + failed_action(format, t('invalid_model', model: ReadingGroup.model_name.human))
  142 + end
  143 + end
  144 + end
  145 +
  146 + # Notice: If you add some logic to this method, remove the :nocov: below
  147 + # :nocov:
  148 + def metric_type
  149 + raise NotImplementedError
41 end 150 end
  151 + # :nocov:
42 end 152 end
app/controllers/compound_metric_configurations_controller.rb
1 class CompoundMetricConfigurationsController < BaseMetricConfigurationsController 1 class CompoundMetricConfigurationsController < BaseMetricConfigurationsController
2 before_action :set_metric_configurations, only: [:new, :edit] 2 before_action :set_metric_configurations, only: [:new, :edit]
3 3
4 - def create  
5 - super  
6 - @compound_metric_configuration.metric.type = "CompoundMetricSnapshot"  
7 - respond_to do |format|  
8 - create_and_redir(format)  
9 - end  
10 - Rails.cache.delete("#{params[:kalibro_configuration_id].to_i}_tree_metric_configurations")  
11 - end  
12 -  
13 - def show  
14 - update_metric_configuration(@metric_configuration)  
15 - super  
16 - end  
17 -  
18 - def edit  
19 - @compound_metric_configuration = @metric_configuration  
20 - @kalibro_configuration_id = params[:kalibro_configuration_id].to_i  
21 - @compound_metric_configuration.kalibro_configuration_id = @kalibro_configuration_id  
22 - end  
23 -  
24 - def update  
25 - respond_to do |format|  
26 - edit  
27 - if @compound_metric_configuration.update(metric_configuration_params)  
28 - format.html { redirect_to kalibro_configuration_path(@compound_metric_configuration.kalibro_configuration_id), notice: t('successfully_updated', :record => t('compound') + " " + @compound_metric_configuration.class.model_name.human) }  
29 - format.json { head :no_content }  
30 - else  
31 - failed_action(format, 'edit')  
32 - end  
33 - Rails.cache.delete("#{@compound_metric_configuration.kalibro_configuration_id}_tree_metric_configurations")  
34 - end  
35 - end  
36 -  
37 protected 4 protected
38 5
39 - def metric_configuration  
40 - @compound_metric_configuration 6 + def set_metric!
  7 + @metric_configuration.metric.type = self.metric_type
41 end 8 end
42 9
43 - def update_metric_configuration (new_metric_configuration)  
44 - @kalibro_configuration_id = params[:kalibro_configuration_id]  
45 - @compound_metric_configuration = new_metric_configuration  
46 - end  
47 -  
48 - private  
49 -  
50 - # Duplicated code on create and update actions extracted here  
51 - def failed_action(format, destiny_action)  
52 - @kalibro_configuration_id = params[:kalibro_configuration_id]  
53 -  
54 - set_metric_configurations  
55 - format.html { render action: destiny_action }  
56 - format.json { render json: @compound_metric_configuration.kalibro_errors, status: :unprocessable_entity }  
57 - end  
58 -  
59 - #Code extracted from create action  
60 - def create_and_redir(format)  
61 - if @compound_metric_configuration.save  
62 - format.html { redirect_to kalibro_configuration_path(@compound_metric_configuration.kalibro_configuration_id), notice: t('successfully_created', :record => t('compound') + " " + @compound_metric_configuration.class.model_name.human) }  
63 - else  
64 - failed_action(format, 'new')  
65 - end 10 + def metric_configuration_params
  11 + params.require(:metric_configuration).permit(:reading_group_id, :weight, :metric => [:name, :description, :script, :scope, :code])
66 end 12 end
67 13
68 def set_metric_configurations 14 def set_metric_configurations
69 - @metric_configurations = MetricConfiguration.metric_configurations_of(params[:kalibro_configuration_id].to_i) 15 + @metric_configurations = MetricConfiguration.metric_configurations_of(@kalibro_configuration.id)
70 end 16 end
71 17
  18 + def metric_type
  19 + 'CompoundMetricSnapshot'
  20 + end
72 end 21 end
app/controllers/hotspot_metric_configurations_controller.rb 0 → 100644
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +class HotspotMetricConfigurationsController < BaseMetricConfigurationsController
  2 + skip_before_action :set_reading_group!
  3 +
  4 + def metric_configuration_params
  5 + # Hotspot metric configurations don't accept any parameters on creation
  6 + # But we must make that explicit as the method isn't implemented in the parent class
  7 + params.permit
  8 + end
  9 +
  10 + def render_failure_html(format)
  11 + format.html { redirect_to kalibro_configuration_path(@kalibro_configuration.id) }
  12 + end
  13 +
  14 + protected
  15 +
  16 + def metric_type
  17 + 'HotspotMetricSnapshot'
  18 + end
  19 +end
app/controllers/metric_configurations_controller.rb
1 class MetricConfigurationsController < BaseMetricConfigurationsController 1 class MetricConfigurationsController < BaseMetricConfigurationsController
2 - def choose_metric  
3 - @kalibro_configuration = KalibroConfiguration.find(params[:kalibro_configuration_id].to_i)  
4 - @metric_configuration_id = params[:metric_configuration_id].to_i  
5 - @metric_collectors_names = KalibroClient::Entities::Processor::MetricCollectorDetails.all_names  
6 - end 2 + before_action :set_reading_groups!, only: [:new, :edit]
7 3
8 def new 4 def new
9 super 5 super
10 - # FIXME: find_by_name throws an exception instead of returning nil, unlike ActiveRecord's API  
11 - metric_configuration.metric = KalibroClient::Entities::Processor::MetricCollectorDetails.find_by_name(params[:metric_collector_name]).find_metric_by_code params[:metric_code]  
12 - @reading_groups = ReadingGroup.public_or_owned_by_user(current_user).map { |reading_group|  
13 - [reading_group.name, reading_group.id]  
14 - }  
15 - end  
16 -  
17 - def create  
18 - super  
19 - @metric_configuration.metric = KalibroClient::Entities::Processor::MetricCollectorDetails.find_by_name(params[:metric_collector_name]).find_metric_by_name params[:metric_name]  
20 - respond_to do |format|  
21 - create_and_redir(format)  
22 - end  
23 - clear_caches  
24 - end  
25 -  
26 - def edit  
27 - # FIXME: set the configuration id just once!  
28 - @kalibro_configuration_id = params[:kalibro_configuration_id]  
29 - @metric_configuration.kalibro_configuration_id = @kalibro_configuration_id  
30 - @reading_groups = ReadingGroup.public_or_owned_by_user(current_user).map { |reading_group|  
31 - [reading_group.name, reading_group.id]  
32 - } 6 + # The metric parameter comes from the choose metric form
  7 + set_metric!
33 end 8 end
34 9
35 - def update  
36 - respond_to do |format|  
37 - @metric_configuration.kalibro_configuration_id = params[:kalibro_configuration_id]  
38 - if @metric_configuration.update(metric_configuration_params)  
39 - format.html { redirect_to(kalibro_configuration_path(@metric_configuration.kalibro_configuration_id), notice: t('successfully_updated', :record => t(metric_configuration.class))) }  
40 - format.json { head :no_content }  
41 - clear_caches  
42 - else  
43 - failed_action(format, 'edit')  
44 - end  
45 - end  
46 - end  
47 -  
48 - def destroy  
49 - @metric_configuration.destroy  
50 - respond_to do |format|  
51 - format.html { redirect_to kalibro_configuration_path(params[:kalibro_configuration_id]) }  
52 - format.json { head :no_content }  
53 - end  
54 - clear_caches 10 + def choose_metric
  11 + @metric_collectors_names = KalibroClient::Entities::Processor::MetricCollectorDetails.all_names
55 end 12 end
56 13
57 protected 14 protected
58 15
59 - def metric_configuration  
60 - @metric_configuration 16 + def metric_configuration_params
  17 + params.require(:metric_configuration).permit(:reading_group_id, :weight, :aggregation_form)
61 end 18 end
62 19
63 - def update_metric_configuration (new_metric_configuration)  
64 - @kalibro_configuration_id = params[:kalibro_configuration_id]  
65 - @metric_configuration = new_metric_configuration 20 + def metric_type
  21 + 'NativeMetricSnapshot'
66 end 22 end
67 23
68 private 24 private
69 25
70 - def clear_caches  
71 - Rails.cache.delete("#{params[:kalibro_configuration_id]}_tree_metric_configurations")  
72 - Rails.cache.delete("#{params[:kalibro_configuration_id]}_hotspot_metric_configurations")  
73 - end  
74 -  
75 - # FIXME: Duplicated code on create and update actions extracted here  
76 - def failed_action(format, destiny_action)  
77 - @kalibro_configuration_id = params[:kalibro_configuration_id]  
78 -  
79 - format.html { render action: destiny_action }  
80 - format.json { render json: @metric_configuration.kalibro_errors, status: :unprocessable_entity }  
81 - end  
82 -  
83 - # Code extracted from create action  
84 - def create_and_redir(format)  
85 - if @metric_configuration.save  
86 - format.html { redirect_to kalibro_configuration_path(@metric_configuration.kalibro_configuration_id), notice: t('successfully_created', :record => t(metric_configuration.class)) }  
87 - else  
88 - failed_action(format, 'new') 26 + def set_reading_groups!
  27 + @reading_groups = ReadingGroup.public_or_owned_by_user(current_user).map do |reading_group|
  28 + [reading_group.name, reading_group.id]
89 end 29 end
90 end 30 end
91 end 31 end
app/helpers/metric_configurations_helper.rb
@@ -17,4 +17,16 @@ module MetricConfigurationsHelper @@ -17,4 +17,16 @@ module MetricConfigurationsHelper
17 # find_by_name throws an exception instead of returning nil, unlike ActiveRecord's API 17 # find_by_name throws an exception instead of returning nil, unlike ActiveRecord's API
18 KalibroClient::Entities::Processor::MetricCollectorDetails.find_by_name(metric_collector_name).supported_metrics 18 KalibroClient::Entities::Processor::MetricCollectorDetails.find_by_name(metric_collector_name).supported_metrics
19 end 19 end
  20 +
  21 + def choose_metric_path(metric, kalibro_configuration_id)
  22 + if metric.type == 'HotspotMetricSnapshot'
  23 + kalibro_configuration_hotspot_metric_configurations_path(kalibro_configuration_id: kalibro_configuration_id)
  24 + else
  25 + kalibro_configuration_new_metric_configuration_path(kalibro_configuration_id: kalibro_configuration_id)
  26 + end
  27 + end
  28 +
  29 + def hotspot_metric_configuration?(metric_configuration)
  30 + metric_configuration.metric.type == 'HotspotMetricSnapshot'
  31 + end
20 end 32 end
app/views/compound_metric_configurations/_form.html.erb
1 -<%= render :partial => 'shared/form_errors', :locals => {:object => @compound_metric_configuration} %> 1 +<%= render :partial => 'shared/form_errors', :locals => {:object => @metric_configuration} %>
2 <div class="row margin-left-none"> 2 <div class="row margin-left-none">
3 <div class="form-table col-md-9"> 3 <div class="form-table col-md-9">
4 4
5 <%= f.fields_for :metric do |metric| %> 5 <%= f.fields_for :metric do |metric| %>
6 - <%= render partial: "metric_options", :locals => {:f => metric, :metric => @compound_metric_configuration.metric} %> 6 + <%= render partial: "metric_options", :locals => {:f => metric, :metric => @metric_configuration.metric} %>
7 <% end %> 7 <% end %>
8 8
9 <div class="form-row"> 9 <div class="form-row">
@@ -18,10 +18,10 @@ @@ -18,10 +18,10 @@
18 </div> 18 </div>
19 </div> 19 </div>
20 20
21 - <% if @compound_metric_configuration.persisted? %>  
22 - <%= hidden_field_tag(:reading_group_id, @compound_metric_configuration.reading_group_id) %>  
23 - <%= hidden_field_tag(:kalibro_configuration_id, @compound_metric_configuration.kalibro_configuration_id) %>  
24 - <%= link_to t('back'), kalibro_configuration_path(@compound_metric_configuration.kalibro_configuration_id), class: 'btn btn-default' %> 21 + <% if @metric_configuration.persisted? %>
  22 + <%= hidden_field_tag(:reading_group_id, @metric_configuration.reading_group_id) %>
  23 + <%= hidden_field_tag(:kalibro_configuration_id, @metric_configuration.kalibro_configuration_id) %>
  24 + <%= link_to t('back'), kalibro_configuration_path(@metric_configuration.kalibro_configuration_id), class: 'btn btn-default' %>
25 <% else %> 25 <% else %>
26 <div class="form-row"> 26 <div class="form-row">
27 <div class="field-container"> 27 <div class="field-container">
@@ -34,8 +34,8 @@ @@ -34,8 +34,8 @@
34 </p> 34 </p>
35 </div> 35 </div>
36 </div> 36 </div>
37 - <%= f.hidden_field(:kalibro_configuration_id, value: @kalibro_configuration_id) %>  
38 - <%= link_to t('back'), kalibro_configuration_path(@kalibro_configuration_id), class: 'btn btn-default' %> 37 + <%= f.hidden_field(:kalibro_configuration_id, value: @kalibro_configuration.id) %>
  38 + <%= link_to t('back'), kalibro_configuration_path(@kalibro_configuration.id), class: 'btn btn-default' %>
39 <% end %> 39 <% end %>
40 <%= f.submit t('save'), class: 'btn btn-primary' %> 40 <%= f.submit t('save'), class: 'btn btn-primary' %>
41 </div> 41 </div>
app/views/compound_metric_configurations/edit.html.erb
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 6
7 <br> 7 <br>
8 8
9 -<%= form_for(@compound_metric_configuration, :url => kalibro_configuration_compound_metric_configuration_update_path(@compound_metric_configuration.kalibro_configuration_id, @compound_metric_configuration.id), method: :put) do |f| %> 9 +<%= form_for(@metric_configuration, :url => kalibro_configuration_compound_metric_configuration_update_path(@metric_configuration.kalibro_configuration_id, @metric_configuration.id), method: :put) do |f| %>
10 <%= render partial: 'form', locals: {f: f} %> 10 <%= render partial: 'form', locals: {f: f} %>
11 <% end %> 11 <% end %>
12 12
app/views/compound_metric_configurations/new.html.erb
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 6
7 <br> 7 <br>
8 8
9 -<%= form_for(@compound_metric_configuration, :url => kalibro_configuration_compound_metric_configurations_path(@kalibro_configuration_id)) do |f| %> 9 +<%= form_for(@metric_configuration, :url => kalibro_configuration_compound_metric_configurations_path(@kalibro_configuration.id)) do |f| %>
10 <%= render partial: 'form', locals: {f: f} %> 10 <%= render partial: 'form', locals: {f: f} %>
11 <% end %> 11 <% end %>
12 12
app/views/compound_metric_configurations/show.html.erb
1 <div class="page-header"> 1 <div class="page-header">
2 - <h1><%=@compound_metric_configuration.metric.name %></h1> 2 + <h1><%=@metric_configuration.metric.name %></h1>
3 </div> 3 </div>
4 4
5 <p> 5 <p>
6 <strong> <%= t('description') %>:</strong> 6 <strong> <%= t('description') %>:</strong>
7 - <% if @compound_metric_configuration.metric.description.nil? %> 7 + <% if @metric_configuration.metric.description.nil? %>
8 <%= t('no_description') %> 8 <%= t('no_description') %>
9 <% else %> 9 <% else %>
10 - <%= @compound_metric_configuration.metric.description %> 10 + <%= @metric_configuration.metric.description %>
11 <% end %> 11 <% end %>
12 </p> 12 </p>
13 13
14 <p> 14 <p>
15 <strong> <%= t('script') %>:</strong> 15 <strong> <%= t('script') %>:</strong>
16 - <%= @compound_metric_configuration.metric.script %> 16 + <%= @metric_configuration.metric.script %>
17 </p> 17 </p>
18 18
19 <p> 19 <p>
20 <strong> <%= t('scope') %>:</strong> 20 <strong> <%= t('scope') %>:</strong>
21 - <%= @compound_metric_configuration.metric.scope %> 21 + <%= @metric_configuration.metric.scope %>
22 </p> 22 </p>
23 23
24 <p> 24 <p>
25 <strong> <%= t('code') %>:</strong> 25 <strong> <%= t('code') %>:</strong>
26 - <%= @compound_metric_configuration.metric.code %> 26 + <%= @metric_configuration.metric.code %>
27 </p> 27 </p>
28 28
29 <p> 29 <p>
30 <strong> <%= t('weight') %>:</strong> 30 <strong> <%= t('weight') %>:</strong>
31 - <%= @compound_metric_configuration.weight %> 31 + <%= @metric_configuration.weight %>
32 </p> 32 </p>
33 33
34 <p> 34 <p>
35 <strong> <%= t('metric_configurations_aggregation') %>:</strong> 35 <strong> <%= t('metric_configurations_aggregation') %>:</strong>
36 - <%= @compound_metric_configuration.aggregation_form %> 36 + <%= @metric_configuration.aggregation_form %>
37 </p> 37 </p>
38 38
39 <p> 39 <p>
@@ -44,9 +44,9 @@ @@ -44,9 +44,9 @@
44 <hr> 44 <hr>
45 45
46 <h2> <%= t('ranges') %> </h2> 46 <h2> <%= t('ranges') %> </h2>
47 -<% if kalibro_configuration_owner? @compound_metric_configuration.kalibro_configuration_id %>  
48 - <%= link_to t_action(:add, KalibroRange), kalibro_configuration_metric_configuration_new_kalibro_range_path(@compound_metric_configuration.kalibro_configuration_id,  
49 - @compound_metric_configuration.id), class: 'btn btn-info' %> 47 +<% if kalibro_configuration_owner? @metric_configuration.kalibro_configuration_id %>
  48 + <%= link_to t_action(:add, KalibroRange), kalibro_configuration_metric_configuration_new_kalibro_range_path(@metric_configuration.kalibro_configuration_id,
  49 + @metric_configuration.id), class: 'btn btn-info' %>
50 <% end %> 50 <% end %>
51 51
52 <table class="table table-hover"> 52 <table class="table table-hover">
@@ -69,10 +69,10 @@ @@ -69,10 +69,10 @@
69 <hr> 69 <hr>
70 70
71 <p> 71 <p>
72 - <%= link_to t('back'), kalibro_configuration_path(@compound_metric_configuration.kalibro_configuration_id), class: 'btn btn-default' %>  
73 -<% if kalibro_configuration_owner? @compound_metric_configuration.kalibro_configuration_id %>  
74 - <%= link_to t_action(:destroy, MetricConfiguration), kalibro_configuration_metric_configuration_path(@compound_metric_configuration.kalibro_configuration_id,  
75 - @compound_metric_configuration.id), method: :delete, data: { confirm: t('want_destroy_metric_configuration') }, 72 + <%= link_to t('back'), kalibro_configuration_path(@metric_configuration.kalibro_configuration_id), class: 'btn btn-default' %>
  73 +<% if kalibro_configuration_owner? @metric_configuration.kalibro_configuration_id %>
  74 + <%= link_to t_action(:destroy, MetricConfiguration), kalibro_configuration_metric_configuration_path(@metric_configuration.kalibro_configuration_id,
  75 + @metric_configuration.id), method: :delete, data: { confirm: t('want_destroy_metric_configuration') },
76 class: 'btn btn-danger' %> 76 class: 'btn btn-danger' %>
77 <% end %> 77 <% end %>
78 </p> 78 </p>
app/views/kalibro_configurations/_metric_configurations.html.erb
@@ -8,13 +8,15 @@ @@ -8,13 +8,15 @@
8 <%= link_to_show_page(metric_configuration, @kalibro_configuration.id) %> 8 <%= link_to_show_page(metric_configuration, @kalibro_configuration.id) %>
9 </td> 9 </td>
10 <% if kalibro_configuration_owner? @kalibro_configuration.id %> 10 <% if kalibro_configuration_owner? @kalibro_configuration.id %>
  11 + <% unless hotspot_metric_configuration?(metric_configuration) %>
  12 + <td>
  13 + <%= link_to_edit_form(metric_configuration, @kalibro_configuration.id) %>
  14 + </td>
  15 + <% end %>
11 <td> 16 <td>
12 - <%= link_to_edit_form(metric_configuration, @kalibro_configuration.id) %>  
13 - </td>  
14 - <td>  
15 - <%= link_to t_action(:destroy, MetricConfiguration), kalibro_configuration_metric_configuration_path(@kalibro_configuration.id, metric_configuration.id),  
16 - method: :delete, data: { confirm: t('want_destroy_metric_configuration') },  
17 - class: 'btn btn-danger' %> 17 + <%= link_to t_action(:destroy, MetricConfiguration), kalibro_configuration_metric_configuration_path(@kalibro_configuration.id, metric_configuration.id),
  18 + method: :delete, data: { confirm: t('want_destroy_metric_configuration') },
  19 + class: 'btn btn-danger' %>
18 </td> 20 </td>
19 <% end %> 21 <% end %>
20 </tr> 22 </tr>
app/views/metric_configurations/_form.html.erb
@@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
42 </p> 42 </p>
43 </div> 43 </div>
44 </div> 44 </div>
45 - <%= f.hidden_field(:kalibro_configuration_id, value: @kalibro_configuration_id) %> 45 + <%= f.hidden_field(:kalibro_configuration_id, value: @kalibro_configuration.id) %>
46 <% end %> 46 <% end %>
47 47
48 </div> 48 </div>
app/views/metric_configurations/choose_metric.html.erb
@@ -12,7 +12,9 @@ @@ -12,7 +12,9 @@
12 <h3 class="jquery-ui-accordion"><%= metric_collector_name %></h3> 12 <h3 class="jquery-ui-accordion"><%= metric_collector_name %></h3>
13 <div> 13 <div>
14 <% supported_metrics_of(metric_collector_name).each do |code, metric| %> 14 <% supported_metrics_of(metric_collector_name).each do |code, metric| %>
15 - <%= link_to metric.name, '#', onclick: "MetricCollector.choose_metric(\"#{code}\", \"#{metric_collector_name}\");", remote: true %><br> 15 + <%= link_to metric.name, "#",
  16 + onclick: "MetricCollector.choose_metric(\"#{code}\", \"#{metric_collector_name}\", \"#{choose_metric_path(metric, @kalibro_configuration.id)}\");",
  17 + remote: true %><br>
16 <% end %> 18 <% end %>
17 </div> 19 </div>
18 <% end %> 20 <% end %>
app/views/metric_configurations/edit.html.erb
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <h1><%= t('editing_metric_configuration') %></h1> 2 <h1><%= t('editing_metric_configuration') %></h1>
3 </div> 3 </div>
4 4
5 -<%= form_for(@metric_configuration, :url => kalibro_configuration_metric_configuration_update_path(@kalibro_configuration_id, @metric_configuration.id), method: :put) do |f| %> 5 +<%= form_for(@metric_configuration, :url => kalibro_configuration_metric_configuration_update_path(@kalibro_configuration.id, @metric_configuration.id), method: :put) do |f| %>
6 <%= render partial: 'form', locals: {f: f} %> 6 <%= render partial: 'form', locals: {f: f} %>
7 <div class="row margin-left-none" style="margin-top: 20px"> 7 <div class="row margin-left-none" style="margin-top: 20px">
8 <%= f.submit t('save'), class: 'btn btn-primary' %> 8 <%= f.submit t('save'), class: 'btn btn-primary' %>
app/views/metric_configurations/new.html.erb
@@ -24,10 +24,10 @@ @@ -24,10 +24,10 @@
24 24
25 <br> 25 <br>
26 26
27 -<%= form_for(@metric_configuration, :url => kalibro_configuration_metric_configurations_path(@kalibro_configuration_id)) do |f| %> 27 +<%= form_for(@metric_configuration, :url => kalibro_configuration_metric_configurations_path(@kalibro_configuration.id)) do |f| %>
28 <%= render partial: 'form', locals: {f: f} %> 28 <%= render partial: 'form', locals: {f: f} %>
29 <div class="row margin-left-none" style="margin-top: 20px"> 29 <div class="row margin-left-none" style="margin-top: 20px">
30 <%= f.submit t('save'), class: 'btn btn-primary' %> 30 <%= f.submit t('save'), class: 'btn btn-primary' %>
31 - <%= link_to t('back'), kalibro_configuration_choose_metric_path(@kalibro_configuration_id), class: 'btn btn-default' %> 31 + <%= link_to t('back'), kalibro_configuration_choose_metric_path(@kalibro_configuration.id), class: 'btn btn-default' %>
32 </div> 32 </div>
33 <% end %> 33 <% end %>
config/locales/views/metric_configurations/en.yml
@@ -37,6 +37,8 @@ en: @@ -37,6 +37,8 @@ en:
37 reading_group_helper_html: "The %{href} associated with this metric." 37 reading_group_helper_html: "The %{href} associated with this metric."
38 no_models: "There are no %{model} yet!" 38 no_models: "There are no %{model} yet!"
39 choose_metric: "Choose a metric from a Base Tool:" 39 choose_metric: "Choose a metric from a Base Tool:"
  40 + invalid_metric_or_collector: "Invalid combination of metric collector, name/code and type"
  41 + invalid_model: "Invalid %{model}"
40 scopes: 42 scopes:
41 METHOD: "Method" 43 METHOD: "Method"
42 CLASS: "Class" 44 CLASS: "Class"
config/locales/views/metric_configurations/pt.yml
@@ -41,6 +41,8 @@ pt: @@ -41,6 +41,8 @@ pt:
41 reading_group_helper_html: "O %{href} associado com esta métrica." 41 reading_group_helper_html: "O %{href} associado com esta métrica."
42 no_models: "Não há %{model} ainda!" 42 no_models: "Não há %{model} ainda!"
43 choose_metric: "Escolha uma métrica de um Coletor:" 43 choose_metric: "Escolha uma métrica de um Coletor:"
  44 + invalid_metric_or_collector: "Combinação inválida de coletor de métricas, nome/código e tipo"
  45 + invalid_model: "%{model} inválido"
44 scopes: 46 scopes:
45 METHOD: "Método" 47 METHOD: "Método"
46 CLASS: "Classe" 48 CLASS: "Classe"
config/routes.rb
@@ -32,6 +32,8 @@ Rails.application.routes.draw do @@ -32,6 +32,8 @@ Rails.application.routes.draw do
32 32
33 resources :compound_metric_configurations, except: [:destroy, :update] 33 resources :compound_metric_configurations, except: [:destroy, :update]
34 put '/compound_metric_configurations/:id' => 'compound_metric_configurations#update', as: :compound_metric_configuration_update 34 put '/compound_metric_configurations/:id' => 'compound_metric_configurations#update', as: :compound_metric_configuration_update
  35 +
  36 + resources :hotspot_metric_configurations, only: [:create]
35 end 37 end
36 38
37 resources :reading_groups do 39 resources :reading_groups do
features/compound_metric_configuration/create.feature
@@ -23,7 +23,7 @@ Feature: Compound Metric Configuration Creation @@ -23,7 +23,7 @@ Feature: Compound Metric Configuration Creation
23 And I set the select field "Scope" as "Class" 23 And I set the select field "Scope" as "Class"
24 And I set the select field "Reading Group" as "Scholar" 24 And I set the select field "Reading Group" as "Scholar"
25 And I press the Save button 25 And I press the Save button
26 - Then I should see "Compound Metric Configuration was successfully created." 26 + Then I should see "Metric Configuration was successfully created."
27 And I click the show link of "My Compound Metric" 27 And I click the show link of "My Compound Metric"
28 Then I should see "My Compound Metric" 28 Then I should see "My Compound Metric"
29 And I should see "mcm" 29 And I should see "mcm"
@@ -38,7 +38,6 @@ Feature: Compound Metric Configuration Creation @@ -38,7 +38,6 @@ Feature: Compound Metric Configuration Creation
38 And I have another compound metric configuration with code "Another_Code" within the given mezuro configuration 38 And I have another compound metric configuration with code "Another_Code" within the given mezuro configuration
39 And I am at the Sample Configuration page 39 And I am at the Sample Configuration page
40 And I click the Add Metric link 40 And I click the Add Metric link
41 - And I take a picture of the page  
42 And I click the Compound Metric link 41 And I click the Compound Metric link
43 When I fill the Name field with "My Compound Metric" 42 When I fill the Name field with "My Compound Metric"
44 And I fill the Description field with "Some description" 43 And I fill the Description field with "Some description"
features/compound_metric_configuration/edition.feature
@@ -23,12 +23,12 @@ Feature: Compound Metric Configuration edition @@ -23,12 +23,12 @@ Feature: Compound Metric Configuration edition
23 And I have a sample tree metric configuration within the given mezuro configuration 23 And I have a sample tree metric configuration within the given mezuro configuration
24 And I have a sample compound metric configuration within the given mezuro configuration 24 And I have a sample compound metric configuration within the given mezuro configuration
25 And I am at the Sample Configuration page 25 And I am at the Sample Configuration page
26 - When I click the edit link of the Coumpound Metric 26 + When I click the edit link of the Compound Metric
27 And I fill the Script field with "Another javascript" 27 And I fill the Script field with "Another javascript"
28 And I fill the Code field with "Another_code" 28 And I fill the Code field with "Another_code"
29 And I press the Save button 29 And I press the Save button
30 Then I should see "Another_code" 30 Then I should see "Another_code"
31 - And I should see "Compound Metric Configuration was successfully updated." 31 + And I should see "Metric Configuration was successfully updated."
32 32
33 @kalibro_configuration_restart @javascript 33 @kalibro_configuration_restart @javascript
34 Scenario: trying to edit with blank fields 34 Scenario: trying to edit with blank fields
features/hotspot_metric_configuration/create.feature
@@ -11,8 +11,6 @@ Feature: Hotspot Metric Configuration Creation @@ -11,8 +11,6 @@ Feature: Hotspot Metric Configuration Creation
11 And I am at the Sample Configuration page 11 And I am at the Sample Configuration page
12 And I click the Add Metric link 12 And I click the Add Metric link
13 And I click the "MetricFu" h3 13 And I click the "MetricFu" h3
14 - And I click the Duplicate Code link  
15 - When I fill the Weight field with "2"  
16 - And I press the Save button 14 + When I click the Duplicate Code link
17 Then I should see "Hotspot Metrics" 15 Then I should see "Hotspot Metrics"
18 And I should see "Duplicate Code" 16 And I should see "Duplicate Code"
features/repository/show/hotspot_metric_results.feature
@@ -12,8 +12,6 @@ Feature: Repository hotspot metric results @@ -12,8 +12,6 @@ Feature: Repository hotspot metric results
12 And I click the Add Metric link 12 And I click the Add Metric link
13 And I click the "MetricFu" h3 13 And I click the "MetricFu" h3
14 And I click the Duplicate Code link 14 And I click the Duplicate Code link
15 - When I fill the Weight field with "2"  
16 - And I press the Save button  
17 Given I have a sample project 15 Given I have a sample project
18 And I have a sample ruby repository within the sample project 16 And I have a sample ruby repository within the sample project
19 And I start to process that repository 17 And I start to process that repository
features/repository/show/modules_tree.feature
@@ -65,5 +65,4 @@ Feature: Repository modules tree @@ -65,5 +65,4 @@ Feature: Repository modules tree
65 And I ask for the module result of the given processing 65 And I ask for the module result of the given processing
66 When I visit the repository show page 66 When I visit the repository show page
67 And I click the "Modules Tree" h3 67 And I click the "Modules Tree" h3
68 - And I take a picture of the page  
69 Then I should see the given module result 68 Then I should see the given module result
features/step_definitions/compound_metric_configuration_steps.rb
@@ -22,7 +22,7 @@ When(/^I visit the sample compound metric configuration edit page$/) do @@ -22,7 +22,7 @@ When(/^I visit the sample compound metric configuration edit page$/) do
22 visit edit_kalibro_configuration_compound_metric_configuration_path(kalibro_configuration_id: @compound_metric_configuration.kalibro_configuration_id, id: @compound_metric_configuration.id) 22 visit edit_kalibro_configuration_compound_metric_configuration_path(kalibro_configuration_id: @compound_metric_configuration.kalibro_configuration_id, id: @compound_metric_configuration.id)
23 end 23 end
24 24
25 -When(/^I click the edit link of the Coumpound Metric$/) do 25 +When(/^I click the edit link of the Compound Metric$/) do
26 page.find('tr', :text => @compound_metric_configuration.metric.name).click_link('Edit') 26 page.find('tr', :text => @compound_metric_configuration.metric.name).click_link('Edit')
27 end 27 end
28 28
spec/controllers/base_metric_configurations_controller_spec.rb
@@ -1,157 +0,0 @@ @@ -1,157 +0,0 @@
1 -require 'rails_helper'  
2 -  
3 -class CleanInheritsFromBaseMetricConfigurationsController < BaseMetricConfigurationsController  
4 - def metric_configuration; super; end  
5 - def update_metric_configuration (new_metric_configuration); super; end  
6 -end  
7 -  
8 -class InheritsFromBaseMetricConfigurationsController < BaseMetricConfigurationsController  
9 - def new  
10 - render :nothing => true  
11 - super  
12 - end  
13 -  
14 - def create  
15 - render :nothing => true  
16 - super  
17 - end  
18 -  
19 - def show  
20 - update_metric_configuration(@metric_configuration)  
21 - super  
22 - render :nothing => true  
23 - end  
24 -  
25 - def metric_configuration  
26 - @metric_configuration  
27 - end  
28 -  
29 - def update_metric_configuration (new_metric_configuration)  
30 - @metric_configuration = new_metric_configuration  
31 - end  
32 -  
33 - def kalibro_ranges  
34 - @kalibro_ranges  
35 - end  
36 -  
37 - def reading_group  
38 - @reading_group  
39 - end  
40 -end  
41 -  
42 -  
43 -describe InheritsFromBaseMetricConfigurationsController, :type => :controller do  
44 - let(:kalibro_configuration) { FactoryGirl.build(:kalibro_configuration, :with_id) }  
45 -  
46 - before do  
47 - Rails.application.routes.draw do  
48 - resources :kalibro_configurations do  
49 - match '/metric_configurations/choose_metric' => 'metric_configurations#choose_metric', as: :choose_metric, :via => [:get]  
50 - resources :inherits_from_base_metric_configurations do  
51 - match '/metric_configurations/new' => 'metric_configurations#new', as: :new_metric_configuration, :via => [:post]  
52 - match '/metric_configurations/:id' => 'metric_configurations#update', as: :metric_configuration_update, :via => [:put]  
53 - end  
54 - end  
55 - end  
56 - end  
57 -  
58 - after do  
59 - Rails.application.reload_routes!  
60 - end  
61 -  
62 - describe 'new' do  
63 - before :each do  
64 - sign_in FactoryGirl.create(:user)  
65 - end  
66 -  
67 - context 'when the current user owns the kalibro configuration' do  
68 - let!(:metric_configuration) { FactoryGirl.build(:metric_configuration_with_id) }  
69 - before :each do  
70 - subject.expects(:kalibro_configuration_owner?).returns true  
71 - get :new, kalibro_configuration_id: kalibro_configuration.id  
72 - end  
73 -  
74 - it { expect(metric_configuration).not_to be_nil }  
75 - it { is_expected.to respond_with(:success) }  
76 - end  
77 -  
78 - context "when the current user doesn't own the kalibro configuration" do  
79 - before :each do  
80 - get :new, kalibro_configuration_id: kalibro_configuration.id  
81 - end  
82 -  
83 - it { is_expected.to redirect_to(kalibro_configurations_url(id: kalibro_configuration.id)) }  
84 - it { is_expected.to respond_with(:redirect) }  
85 - end  
86 - end  
87 -  
88 - describe 'create' do  
89 - let!(:metric_configuration_params) { FactoryGirl.build(:metric_configuration, metric: FactoryGirl.build(:metric)).to_hash }  
90 - let(:metric_collector) { FactoryGirl.build(:metric_collector) }  
91 -  
92 - before :each do  
93 - sign_in FactoryGirl.create(:user)  
94 - end  
95 -  
96 - context 'when the current user owns the kalibro configuration' do  
97 - before :each do  
98 - subject.expects(:kalibro_configuration_owner?).returns true  
99 - end  
100 -  
101 - context 'with valid fields' do  
102 - before :each do  
103 - post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params, metric_collector_name: metric_collector.name  
104 - end  
105 -  
106 - it { expect(subject.metric_configuration).not_to be_nil }  
107 - it { is_expected.to respond_with(:success) }  
108 - end  
109 - end  
110 - end  
111 -  
112 - describe 'show' do  
113 - let(:metric_configuration) { FactoryGirl.build(:metric_configuration_with_id) }  
114 - let(:reading_group) { FactoryGirl.build(:reading_group, :with_id) }  
115 - let(:kalibro_range) { FactoryGirl.build(:kalibro_range) }  
116 -  
117 - context 'with a valid metric_configuration' do  
118 - before :each do  
119 - ReadingGroup.expects(:find).with(metric_configuration.reading_group_id).returns(reading_group)  
120 - MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration)  
121 - metric_configuration.expects(:kalibro_ranges).returns([kalibro_range])  
122 -  
123 - get :show, kalibro_configuration_id: metric_configuration.kalibro_configuration_id.to_s, id: metric_configuration.id  
124 - end  
125 -  
126 - it { expect(subject.kalibro_ranges).not_to be_nil}  
127 - it { expect(subject.reading_group).not_to be_nil }  
128 - end  
129 -  
130 - context 'with a invalid metric_configuration' do  
131 - before :each do  
132 - subject.expects(:metric_configuration).returns(false)  
133 - end  
134 -  
135 - it 'should raise a NotImplementedError' do  
136 - expect { subject.show }.to raise_error(NotImplementedError)  
137 - end  
138 - end  
139 - end  
140 -  
141 -  
142 - context 'with a inheritance without overrides methods' do  
143 - subject { CleanInheritsFromBaseMetricConfigurationsController.new }  
144 -  
145 - describe 'metric_configuration' do  
146 - it 'should raise a NotImplementedError' do  
147 - expect { subject.metric_configuration }.to raise_error(NotImplementedError)  
148 - end  
149 - end  
150 -  
151 - describe 'update_metric_configuration' do  
152 - it 'should raise a NotImplementedError' do  
153 - expect { subject.update_metric_configuration(nil) }.to raise_error(NotImplementedError)  
154 - end  
155 - end  
156 - end  
157 -end  
spec/controllers/compound_metric_configurations_controller_spec.rb
1 require 'rails_helper' 1 require 'rails_helper'
2 2
3 describe CompoundMetricConfigurationsController, :type => :controller do 3 describe CompoundMetricConfigurationsController, :type => :controller do
  4 + let(:reading_group) { FactoryGirl.build(:reading_group, :with_id) }
4 let(:kalibro_configuration) { FactoryGirl.build(:kalibro_configuration, :with_id) } 5 let(:kalibro_configuration) { FactoryGirl.build(:kalibro_configuration, :with_id) }
5 6
6 describe 'new' do 7 describe 'new' do
@@ -9,10 +10,12 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do @@ -9,10 +10,12 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do
9 end 10 end
10 11
11 context 'when the current user owns the kalibro configuration' do 12 context 'when the current user owns the kalibro configuration' do
12 - let!(:metric_configuration) { FactoryGirl.build(:metric_configuration) } 13 + let!(:metric_configuration) { FactoryGirl.build(:metric_configuration, reading_group_id: reading_group.id) }
13 before :each do 14 before :each do
  15 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
14 subject.expects(:kalibro_configuration_owner?).returns true 16 subject.expects(:kalibro_configuration_owner?).returns true
15 MetricConfiguration.expects(:metric_configurations_of).with(kalibro_configuration.id).returns([metric_configuration]) 17 MetricConfiguration.expects(:metric_configurations_of).with(kalibro_configuration.id).returns([metric_configuration])
  18 +
16 get :new, kalibro_configuration_id: kalibro_configuration.id 19 get :new, kalibro_configuration_id: kalibro_configuration.id
17 end 20 end
18 21
@@ -31,24 +34,25 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do @@ -31,24 +34,25 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do
31 end 34 end
32 35
33 describe 'create' do 36 describe 'create' do
34 - let!(:metric_configuration_params) { FactoryGirl.build(:metric_configuration).to_hash }  
35 - let!(:metric_params) { FactoryGirl.build(:metric).to_hash }  
36 - let(:compound_metric_configuration) { FactoryGirl.build(:compound_metric_configuration) } 37 + let(:compound_metric_configuration) { FactoryGirl.build(:compound_metric_configuration, reading_group_id: reading_group.id) }
  38 + let!(:metric_configuration_params) { compound_metric_configuration.to_hash }
37 39
38 before do 40 before do
39 sign_in FactoryGirl.create(:user) 41 sign_in FactoryGirl.create(:user)
40 - metric_configuration_params["metric"] = metric_params  
41 end 42 end
42 43
43 context 'when the current user owns the reading group' do 44 context 'when the current user owns the reading group' do
44 before :each do 45 before :each do
  46 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
45 subject.expects(:kalibro_configuration_owner?).returns true 47 subject.expects(:kalibro_configuration_owner?).returns true
46 - Rails.cache.expects(:delete).with("#{kalibro_configuration.id}_tree_metric_configurations") 48 + ReadingGroup.expects(:find).with(reading_group.id).returns(reading_group)
47 end 49 end
48 50
49 context 'with valid fields' do 51 context 'with valid fields' do
50 before :each do 52 before :each do
51 MetricConfiguration.any_instance.expects(:save).returns(true) 53 MetricConfiguration.any_instance.expects(:save).returns(true)
  54 + Rails.cache.expects(:delete).with("#{kalibro_configuration.id}_tree_metric_configurations")
  55 + Rails.cache.expects(:delete).with("#{kalibro_configuration.id}_hotspot_metric_configurations")
52 56
53 post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params 57 post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params
54 end 58 end
@@ -59,7 +63,6 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do @@ -59,7 +63,6 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do
59 context 'with invalid fields' do 63 context 'with invalid fields' do
60 before :each do 64 before :each do
61 MetricConfiguration.any_instance.expects(:save).returns(false) 65 MetricConfiguration.any_instance.expects(:save).returns(false)
62 - MetricConfiguration.expects(:metric_configurations_of).with(kalibro_configuration.id).returns([compound_metric_configuration])  
63 post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params 66 post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params
64 end 67 end
65 68
@@ -69,12 +72,12 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do @@ -69,12 +72,12 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do
69 end 72 end
70 73
71 describe 'show' do 74 describe 'show' do
72 - let(:compound_metric_configuration) { FactoryGirl.build(:compound_metric_configuration_with_id) }  
73 - let(:reading_group) { FactoryGirl.build(:reading_group, :with_id) } 75 + let(:compound_metric_configuration) { FactoryGirl.build(:compound_metric_configuration, :with_id, reading_group_id: reading_group.id) }
74 let(:kalibro_range) { FactoryGirl.build(:kalibro_range) } 76 let(:kalibro_range) { FactoryGirl.build(:kalibro_range) }
75 77
76 before :each do 78 before :each do
77 - ReadingGroup.expects(:find).with(compound_metric_configuration.reading_group_id).returns(reading_group) 79 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
  80 + ReadingGroup.expects(:find).with(reading_group.id).returns(reading_group)
78 MetricConfiguration.expects(:find).with(compound_metric_configuration.id).returns(compound_metric_configuration) 81 MetricConfiguration.expects(:find).with(compound_metric_configuration.id).returns(compound_metric_configuration)
79 compound_metric_configuration.expects(:kalibro_ranges).returns([kalibro_range]) 82 compound_metric_configuration.expects(:kalibro_ranges).returns([kalibro_range])
80 83
@@ -85,7 +88,7 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do @@ -85,7 +88,7 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do
85 end 88 end
86 89
87 describe 'edit' do 90 describe 'edit' do
88 - let(:compound_metric_configuration) { FactoryGirl.build(:compound_metric_configuration_with_id) } 91 + let(:compound_metric_configuration) { FactoryGirl.build(:compound_metric_configuration, :with_id, reading_group_id: reading_group.id) }
89 92
90 context 'with a User logged in' do 93 context 'with a User logged in' do
91 before do 94 before do
@@ -94,9 +97,12 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do @@ -94,9 +97,12 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do
94 97
95 context 'when the user owns the compound metric configuration' do 98 context 'when the user owns the compound metric configuration' do
96 before :each do 99 before :each do
  100 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
97 subject.expects(:metric_configuration_owner?).returns(true) 101 subject.expects(:metric_configuration_owner?).returns(true)
  102 + ReadingGroup.expects(:find).with(reading_group.id).returns(reading_group)
98 MetricConfiguration.expects(:find).with(compound_metric_configuration.id).returns(compound_metric_configuration) 103 MetricConfiguration.expects(:find).with(compound_metric_configuration.id).returns(compound_metric_configuration)
99 MetricConfiguration.expects(:metric_configurations_of).with(kalibro_configuration.id).returns([compound_metric_configuration]) 104 MetricConfiguration.expects(:metric_configurations_of).with(kalibro_configuration.id).returns([compound_metric_configuration])
  105 +
100 get :edit, id: compound_metric_configuration.id, kalibro_configuration_id: compound_metric_configuration.kalibro_configuration_id.to_s 106 get :edit, id: compound_metric_configuration.id, kalibro_configuration_id: compound_metric_configuration.kalibro_configuration_id.to_s
101 end 107 end
102 108
@@ -124,8 +130,15 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do @@ -124,8 +130,15 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do
124 end 130 end
125 131
126 describe 'update' do 132 describe 'update' do
127 - let(:compound_metric_configuration) { FactoryGirl.build(:compound_metric_configuration_with_id) }  
128 - let(:metric_configuration_params) { Hash[FactoryGirl.attributes_for(:compound_metric_configuration_with_id).map { |k,v| [k.to_s, v.to_s] }] } #FIXME: Mocha is creating the expectations with strings, but FactoryGirl returns everything with sybols and integers 133 + let(:compound_metric_configuration) { FactoryGirl.build(:compound_metric_configuration, :with_id, reading_group_id: reading_group.id) }
  134 + # Exclude the parameters that come in the URL (as the ones in the body will always be ignored)
  135 + let(:metric_configuration_params) { compound_metric_configuration.to_hash.except('id', 'kalibro_configuration_id', 'type') }
  136 + # Exclude the reading group id since it is set beforehand and not in the update params
  137 + let(:update_params) do
  138 + params = metric_configuration_params.dup
  139 + params['metric'] = params['metric'].except('type')
  140 + params
  141 + end
129 142
130 context 'when the user is logged in' do 143 context 'when the user is logged in' do
131 before do 144 before do
@@ -134,14 +147,17 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do @@ -134,14 +147,17 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do
134 147
135 context 'when user owns the metric configuration' do 148 context 'when user owns the metric configuration' do
136 before :each do 149 before :each do
  150 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
  151 + ReadingGroup.expects(:find).with(reading_group.id).returns(reading_group)
  152 + MetricConfiguration.expects(:find).with(compound_metric_configuration.id).returns(compound_metric_configuration)
137 subject.expects(:metric_configuration_owner?).returns true 153 subject.expects(:metric_configuration_owner?).returns true
138 - Rails.cache.expects(:delete).with("#{kalibro_configuration.id}_tree_metric_configurations")  
139 end 154 end
140 155
141 context 'with valid fields' do 156 context 'with valid fields' do
142 before :each do 157 before :each do
143 - MetricConfiguration.expects(:find).with(compound_metric_configuration.id).returns(compound_metric_configuration)  
144 - MetricConfiguration.any_instance.expects(:update).with(metric_configuration_params).returns(true) 158 + MetricConfiguration.any_instance.expects(:update).with(update_params).returns(true)
  159 + Rails.cache.expects(:delete).with("#{kalibro_configuration.id}_tree_metric_configurations")
  160 + Rails.cache.expects(:delete).with("#{kalibro_configuration.id}_hotspot_metric_configurations")
145 161
146 post :update, kalibro_configuration_id: compound_metric_configuration.kalibro_configuration_id, id: compound_metric_configuration.id, metric_configuration: metric_configuration_params 162 post :update, kalibro_configuration_id: compound_metric_configuration.kalibro_configuration_id, id: compound_metric_configuration.id, metric_configuration: metric_configuration_params
147 end 163 end
@@ -152,9 +168,7 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do @@ -152,9 +168,7 @@ describe CompoundMetricConfigurationsController, :type =&gt; :controller do
152 168
153 context 'with an invalid field' do 169 context 'with an invalid field' do
154 before :each do 170 before :each do
155 - MetricConfiguration.expects(:find).with(compound_metric_configuration.id).returns(compound_metric_configuration)  
156 - MetricConfiguration.expects(:metric_configurations_of).with(kalibro_configuration.id).returns([compound_metric_configuration])  
157 - MetricConfiguration.any_instance.expects(:update).with(metric_configuration_params).returns(false) 171 + MetricConfiguration.any_instance.expects(:update).with(update_params).returns(false)
158 172
159 post :update, kalibro_configuration_id: compound_metric_configuration.kalibro_configuration_id, id: compound_metric_configuration.id, metric_configuration: metric_configuration_params 173 post :update, kalibro_configuration_id: compound_metric_configuration.kalibro_configuration_id, id: compound_metric_configuration.id, metric_configuration: metric_configuration_params
160 end 174 end
spec/controllers/hotspot_metric_configuration_controller_spec.rb 0 → 100644
@@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
  1 +require 'rails_helper'
  2 +
  3 +describe HotspotMetricConfigurationsController, :type => :controller do
  4 + let(:kalibro_configuration) { FactoryGirl.build(:kalibro_configuration, :with_id) }
  5 +
  6 + describe 'create' do
  7 + let!(:metric_configuration) { FactoryGirl.build(:hotspot_metric_configuration) }
  8 + let(:metric_configuration_params) { metric_configuration.to_hash }
  9 + let(:metric_collector) { FactoryGirl.build(:metric_collector) }
  10 +
  11 + before do
  12 + sign_in FactoryGirl.create(:user)
  13 + end
  14 +
  15 + context 'when the current user owns the metric configuration' do
  16 + before :each do
  17 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
  18 + subject.expects(:kalibro_configuration_owner?).returns true
  19 + end
  20 +
  21 + context 'with valid fields' do
  22 + before :each do
  23 + MetricConfiguration.any_instance.expects(:save).returns(true)
  24 + KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:find_by_name).with(metric_collector.name).returns(metric_collector)
  25 + metric_collector.expects(:find_metric_by_code).with(metric_configuration.metric.code).returns(metric_configuration.metric)
  26 +
  27 + post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params, metric_collector_name: metric_collector.name, metric_code: metric_configuration.metric.code
  28 + end
  29 +
  30 + it { is_expected.to respond_with(:redirect) }
  31 + end
  32 +
  33 + context 'with invalid fields' do
  34 + before :each do
  35 + MetricConfiguration.any_instance.expects(:save).returns(false)
  36 + KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:find_by_name).with(metric_collector.name).returns(metric_collector)
  37 + metric_collector.expects(:find_metric_by_code).with(metric_configuration.metric.code).returns(metric_configuration.metric)
  38 +
  39 + post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params, metric_collector_name: metric_collector.name, metric_code: metric_configuration.metric.code
  40 + end
  41 +
  42 + it { is_expected.to respond_with(:redirect) }
  43 + end
  44 + end
  45 + end
  46 +end
spec/controllers/metric_configurations_controller_spec.rb
1 require 'rails_helper' 1 require 'rails_helper'
2 2
3 describe MetricConfigurationsController, :type => :controller do 3 describe MetricConfigurationsController, :type => :controller do
  4 + let(:reading_group) { FactoryGirl.build(:reading_group, :with_id) }
4 let(:kalibro_configuration) { FactoryGirl.build(:kalibro_configuration, :with_id) } 5 let(:kalibro_configuration) { FactoryGirl.build(:kalibro_configuration, :with_id) }
  6 +
5 describe 'choose_metric' do 7 describe 'choose_metric' do
6 let(:metric_collector) { FactoryGirl.build(:metric_collector) } 8 let(:metric_collector) { FactoryGirl.build(:metric_collector) }
7 before :each do 9 before :each do
@@ -10,9 +12,9 @@ describe MetricConfigurationsController, :type =&gt; :controller do @@ -10,9 +12,9 @@ describe MetricConfigurationsController, :type =&gt; :controller do
10 12
11 context 'when adding new metrics' do 13 context 'when adding new metrics' do
12 before :each do 14 before :each do
  15 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
13 subject.expects(:kalibro_configuration_owner?).returns true 16 subject.expects(:kalibro_configuration_owner?).returns true
14 KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:all_names).returns([metric_collector]) 17 KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:all_names).returns([metric_collector])
15 - KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns(kalibro_configuration)  
16 get :choose_metric, kalibro_configuration_id: kalibro_configuration.id 18 get :choose_metric, kalibro_configuration_id: kalibro_configuration.id
17 end 19 end
18 20
@@ -33,11 +35,13 @@ describe MetricConfigurationsController, :type =&gt; :controller do @@ -33,11 +35,13 @@ describe MetricConfigurationsController, :type =&gt; :controller do
33 35
34 context 'when the current user owns the kalibro configuration' do 36 context 'when the current user owns the kalibro configuration' do
35 before :each do 37 before :each do
  38 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
36 ReadingGroup.expects(:public_or_owned_by_user).with(user).returns(reading_groups) 39 ReadingGroup.expects(:public_or_owned_by_user).with(user).returns(reading_groups)
37 subject.expects(:kalibro_configuration_owner?).returns true 40 subject.expects(:kalibro_configuration_owner?).returns true
38 KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:find_by_name).with(metric_collector.name).returns(metric_collector) 41 KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:find_by_name).with(metric_collector.name).returns(metric_collector)
39 - metric_collector.expects(:find_metric_by_code).with(native_metric.code).returns(native_metric)  
40 - post :new, kalibro_configuration_id: kalibro_configuration.id, metric_code: native_metric.code, metric_collector_name: metric_collector.name 42 + metric_collector.expects(:find_metric_by_name).with(native_metric.name).returns(native_metric)
  43 +
  44 + get :new, kalibro_configuration_id: kalibro_configuration.id, metric_name: native_metric.name, metric_collector_name: metric_collector.name
41 end 45 end
42 46
43 it { is_expected.to respond_with(:success) } 47 it { is_expected.to respond_with(:success) }
@@ -55,7 +59,7 @@ describe MetricConfigurationsController, :type =&gt; :controller do @@ -55,7 +59,7 @@ describe MetricConfigurationsController, :type =&gt; :controller do
55 end 59 end
56 60
57 describe 'create' do 61 describe 'create' do
58 - let!(:metric_configuration) { FactoryGirl.build(:metric_configuration) } 62 + let!(:metric_configuration) { FactoryGirl.build(:metric_configuration, reading_group_id: reading_group.id) }
59 let(:metric_configuration_params) { metric_configuration.to_hash } 63 let(:metric_configuration_params) { metric_configuration.to_hash }
60 let(:metric_collector) { FactoryGirl.build(:metric_collector) } 64 let(:metric_collector) { FactoryGirl.build(:metric_collector) }
61 65
@@ -65,26 +69,44 @@ describe MetricConfigurationsController, :type =&gt; :controller do @@ -65,26 +69,44 @@ describe MetricConfigurationsController, :type =&gt; :controller do
65 69
66 context 'when the current user owns the metric configuration' do 70 context 'when the current user owns the metric configuration' do
67 before :each do 71 before :each do
  72 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
68 subject.expects(:kalibro_configuration_owner?).returns true 73 subject.expects(:kalibro_configuration_owner?).returns true
69 end 74 end
70 75
71 - context 'with valid fields' do 76 + context 'with valid metric' do
72 before :each do 77 before :each do
73 - MetricConfiguration.any_instance.expects(:save).returns(true)  
74 KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:find_by_name).with(metric_collector.name).returns(metric_collector) 78 KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:find_by_name).with(metric_collector.name).returns(metric_collector)
75 metric_collector.expects(:find_metric_by_name).with(metric_configuration.metric.name).returns(metric_configuration.metric) 79 metric_collector.expects(:find_metric_by_name).with(metric_configuration.metric.name).returns(metric_configuration.metric)
  80 + ReadingGroup.expects(:find).with(reading_group.id).returns(reading_group)
  81 + end
76 82
77 - post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params, metric_collector_name: metric_collector.name, metric_name: metric_configuration.metric.name 83 + context 'with valid fields' do
  84 + before :each do
  85 + MetricConfiguration.any_instance.expects(:save).returns(true)
  86 +
  87 + post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params, metric_collector_name: metric_collector.name, metric_name: metric_configuration.metric.name
  88 + end
  89 +
  90 + it { is_expected.to respond_with(:redirect) }
78 end 91 end
79 92
80 - it { is_expected.to respond_with(:redirect) } 93 + context 'with invalid fields' do
  94 + before :each do
  95 + MetricConfiguration.any_instance.expects(:save).returns(false)
  96 +
  97 + post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params, metric_collector_name: metric_collector.name, metric_name: metric_configuration.metric.name
  98 + end
  99 +
  100 + it { is_expected.to render_template(:new) }
  101 + end
81 end 102 end
82 103
83 - context 'with invalid fields' do 104 + context 'with invalid metric collector, metric or metric type' do
  105 + let(:invalid_metric) { FactoryGirl.build(:hotspot_metric) }
  106 +
84 before :each do 107 before :each do
85 - MetricConfiguration.any_instance.expects(:save).returns(false)  
86 KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:find_by_name).with(metric_collector.name).returns(metric_collector) 108 KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:find_by_name).with(metric_collector.name).returns(metric_collector)
87 - metric_collector.expects(:find_metric_by_name).with(metric_configuration.metric.name).returns(metric_configuration.metric) 109 + metric_collector.expects(:find_metric_by_name).with(metric_configuration.metric.name).returns(invalid_metric)
88 110
89 post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params, metric_collector_name: metric_collector.name, metric_name: metric_configuration.metric.name 111 post :create, kalibro_configuration_id: kalibro_configuration.id, metric_configuration: metric_configuration_params, metric_collector_name: metric_collector.name, metric_name: metric_configuration.metric.name
90 end 112 end
@@ -95,23 +117,59 @@ describe MetricConfigurationsController, :type =&gt; :controller do @@ -95,23 +117,59 @@ describe MetricConfigurationsController, :type =&gt; :controller do
95 end 117 end
96 118
97 describe 'show' do 119 describe 'show' do
98 - let(:metric_configuration) { FactoryGirl.build(:metric_configuration_with_id) }  
99 - let(:reading_group) { FactoryGirl.build(:reading_group, :with_id) } 120 + let(:metric_configuration) { FactoryGirl.build(:metric_configuration, :with_id, reading_group_id: reading_group.id) }
100 let(:kalibro_range) { FactoryGirl.build(:kalibro_range) } 121 let(:kalibro_range) { FactoryGirl.build(:kalibro_range) }
101 122
102 before :each do 123 before :each do
103 - ReadingGroup.expects(:find).with(metric_configuration.reading_group_id).returns(reading_group)  
104 - MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration)  
105 - metric_configuration.expects(:kalibro_ranges).returns([kalibro_range]) 124 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
  125 + end
  126 +
  127 + context 'with a valid metric configuration instance' do
  128 + before :each do
  129 + MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration)
  130 + end
  131 +
  132 + context 'with valid parameters' do
  133 + before :each do
  134 + ReadingGroup.expects(:find).with(metric_configuration.reading_group_id).returns(reading_group)
  135 + metric_configuration.expects(:kalibro_ranges).returns([kalibro_range])
  136 +
  137 + get :show, kalibro_configuration_id: metric_configuration.kalibro_configuration_id.to_s, id: metric_configuration.id
  138 + end
  139 +
  140 + it { is_expected.to render_template(:show) }
  141 + end
  142 +
  143 + context 'with invalid parameters' do
  144 + before :each do
  145 + ReadingGroup.expects(:find).with(metric_configuration.reading_group_id).raises(KalibroClient::Errors::RecordNotFound)
106 146
107 - get :show, kalibro_configuration_id: metric_configuration.kalibro_configuration_id.to_s, id: metric_configuration.id 147 + get :show, kalibro_configuration_id: metric_configuration.kalibro_configuration_id.to_s, id: metric_configuration.id
  148 + end
  149 +
  150 + it { is_expected.to redirect_to(kalibro_configuration_path(kalibro_configuration.id)) }
  151 + end
108 end 152 end
109 153
110 - it { is_expected.to render_template(:show) } 154 + context 'with an invalid metric configuration instance' do
  155 + let!(:invalid_metric_configuration) { FactoryGirl.build(:metric_configuration, reading_group_id: reading_group.id, kalibro_configuration_id: metric_configuration.kalibro_configuration_id + 1) }
  156 +
  157 + before :each do
  158 + MetricConfiguration.expects(:find).with(metric_configuration.id).returns(invalid_metric_configuration)
  159 + end
  160 +
  161 + context 'with valid parameters' do
  162 + before :each do
  163 + get :show, kalibro_configuration_id: metric_configuration.kalibro_configuration_id.to_s, id: metric_configuration.id
  164 + end
  165 +
  166 + it { is_expected.to respond_with(:not_found) }
  167 + end
  168 + end
111 end 169 end
112 170
113 describe 'edit' do 171 describe 'edit' do
114 - let(:metric_configuration) { FactoryGirl.build(:metric_configuration_with_id) } 172 + let(:metric_configuration) { FactoryGirl.build(:metric_configuration, :with_id, reading_group_id: reading_group.id) }
115 let!(:reading_groups) { [FactoryGirl.build(:reading_group)] } 173 let!(:reading_groups) { [FactoryGirl.build(:reading_group)] }
116 let!(:user) { FactoryGirl.create(:user) } 174 let!(:user) { FactoryGirl.create(:user) }
117 175
@@ -122,9 +180,12 @@ describe MetricConfigurationsController, :type =&gt; :controller do @@ -122,9 +180,12 @@ describe MetricConfigurationsController, :type =&gt; :controller do
122 180
123 context 'when the user owns the metric configuration' do 181 context 'when the user owns the metric configuration' do
124 before :each do 182 before :each do
  183 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
  184 + ReadingGroup.expects(:find).with(reading_group.id).returns(reading_group)
125 ReadingGroup.expects(:public_or_owned_by_user).with(user).returns(reading_groups) 185 ReadingGroup.expects(:public_or_owned_by_user).with(user).returns(reading_groups)
126 subject.expects(:metric_configuration_owner?).returns(true) 186 subject.expects(:metric_configuration_owner?).returns(true)
127 MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration) 187 MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration)
  188 +
128 get :edit, id: metric_configuration.id, kalibro_configuration_id: metric_configuration.kalibro_configuration_id.to_s 189 get :edit, id: metric_configuration.id, kalibro_configuration_id: metric_configuration.kalibro_configuration_id.to_s
129 end 190 end
130 191
@@ -132,12 +193,11 @@ describe MetricConfigurationsController, :type =&gt; :controller do @@ -132,12 +193,11 @@ describe MetricConfigurationsController, :type =&gt; :controller do
132 end 193 end
133 194
134 context 'when the user does not own the metric configuration' do 195 context 'when the user does not own the metric configuration' do
135 - before do 196 + before :each do
136 get :edit, id: metric_configuration.id, kalibro_configuration_id: metric_configuration.kalibro_configuration_id.to_s 197 get :edit, id: metric_configuration.id, kalibro_configuration_id: metric_configuration.kalibro_configuration_id.to_s
137 end 198 end
138 199
139 it { is_expected.to redirect_to(kalibro_configurations_path(id: metric_configuration.kalibro_configuration_id)) } 200 it { is_expected.to redirect_to(kalibro_configurations_path(id: metric_configuration.kalibro_configuration_id)) }
140 - it { is_expected.to respond_with(:redirect) }  
141 it { is_expected.to set_flash[:notice].to("You're not allowed to do this operation") } 201 it { is_expected.to set_flash[:notice].to("You're not allowed to do this operation") }
142 end 202 end
143 end 203 end
@@ -152,40 +212,63 @@ describe MetricConfigurationsController, :type =&gt; :controller do @@ -152,40 +212,63 @@ describe MetricConfigurationsController, :type =&gt; :controller do
152 end 212 end
153 213
154 describe 'update' do 214 describe 'update' do
155 - let(:metric_configuration) { FactoryGirl.build(:metric_configuration_with_id) }  
156 - let(:metric_configuration_params) { metric_configuration.to_hash } 215 + let(:metric_configuration) { FactoryGirl.build(:metric_configuration_with_id, reading_group_id: reading_group.id) }
  216 + let(:metric_configuration_params) { metric_configuration.to_hash.except('id', 'metric') }
  217 + let(:update_params) { metric_configuration_params.except('kalibro_configuration_id') }
157 218
158 context 'when the user is logged in' do 219 context 'when the user is logged in' do
159 before do 220 before do
160 sign_in FactoryGirl.create(:user) 221 sign_in FactoryGirl.create(:user)
161 end 222 end
162 223
163 - context 'when user owns the metric configuration' do 224 + context 'when the given metric exists' do
  225 + let!(:metric_collector) { mock('metric_collector') }
  226 +
164 before :each do 227 before :each do
165 - subject.expects(:metric_configuration_owner?).returns true 228 + metric_collector.expects(:find_metric_by_code).with(metric_configuration.metric.code).returns(metric_configuration.metric)
  229 +
  230 + KalibroClient::Entities::Processor::MetricCollectorDetails.expects(:find_by_name).
  231 + with(metric_configuration.metric.metric_collector_name).
  232 + returns(metric_collector)
166 end 233 end
167 234
168 - context 'with valid fields' do 235 + context 'and the user owns the metric configuration' do
169 before :each do 236 before :each do
170 - MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration)  
171 - MetricConfiguration.any_instance.expects(:update).with(metric_configuration_params).returns(true)  
172 -  
173 - post :update, kalibro_configuration_id: metric_configuration.kalibro_configuration_id, id: metric_configuration.id, metric_configuration: metric_configuration_params 237 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
  238 + subject.expects(:metric_configuration_owner?).returns true
  239 + ReadingGroup.expects(:find).with(reading_group.id).returns(reading_group)
174 end 240 end
175 241
176 - it { is_expected.to redirect_to(kalibro_configuration_path(id: metric_configuration.kalibro_configuration_id)) }  
177 - it { is_expected.to respond_with(:redirect) }  
178 - end 242 + context 'with valid fields' do
  243 + before :each do
  244 + MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration)
  245 + MetricConfiguration.any_instance.expects(:update).with(update_params).returns(true)
179 246
180 - context 'with an invalid field' do  
181 - before :each do  
182 - MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration)  
183 - MetricConfiguration.any_instance.expects(:update).with(metric_configuration_params).returns(false) 247 + post :update,
  248 + kalibro_configuration_id: metric_configuration.kalibro_configuration_id, id: metric_configuration.id,
  249 + metric_configuration: metric_configuration_params,
  250 + metric_collector_name: metric_configuration.metric.metric_collector_name,
  251 + metric_code: metric_configuration.metric.code
  252 + end
184 253
185 - post :update, kalibro_configuration_id: metric_configuration.kalibro_configuration_id, id: metric_configuration.id, metric_configuration: metric_configuration_params 254 + it { is_expected.to redirect_to(kalibro_configuration_path(id: metric_configuration.kalibro_configuration_id)) }
  255 + it { is_expected.to respond_with(:redirect) }
186 end 256 end
187 257
188 - it { is_expected.to render_template(:edit) } 258 + context 'with an invalid field' do
  259 + before :each do
  260 + MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration)
  261 + MetricConfiguration.any_instance.expects(:update).with(update_params).returns(false)
  262 +
  263 + post :update,
  264 + kalibro_configuration_id: metric_configuration.kalibro_configuration_id, id: metric_configuration.id,
  265 + metric_configuration: metric_configuration_params,
  266 + metric_collector_name: metric_configuration.metric.metric_collector_name,
  267 + metric_code: metric_configuration.metric.code
  268 + end
  269 +
  270 + it { is_expected.to render_template(:edit) }
  271 + end
189 end 272 end
190 end 273 end
191 274
@@ -199,7 +282,6 @@ describe MetricConfigurationsController, :type =&gt; :controller do @@ -199,7 +282,6 @@ describe MetricConfigurationsController, :type =&gt; :controller do
199 end 282 end
200 end 283 end
201 284
202 -  
203 describe 'destroy' do 285 describe 'destroy' do
204 let(:metric_configuration) { FactoryGirl.build(:metric_configuration_with_id) } 286 let(:metric_configuration) { FactoryGirl.build(:metric_configuration_with_id) }
205 287
@@ -210,6 +292,7 @@ describe MetricConfigurationsController, :type =&gt; :controller do @@ -210,6 +292,7 @@ describe MetricConfigurationsController, :type =&gt; :controller do
210 292
211 context 'when the user owns the configuration' do 293 context 'when the user owns the configuration' do
212 before :each do 294 before :each do
  295 + KalibroConfiguration.expects(:find).with(kalibro_configuration.id).returns kalibro_configuration
213 subject.expects(:metric_configuration_owner?).returns true 296 subject.expects(:metric_configuration_owner?).returns true
214 metric_configuration.expects(:destroy) 297 metric_configuration.expects(:destroy)
215 MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration) 298 MetricConfiguration.expects(:find).with(metric_configuration.id).returns(metric_configuration)
spec/helpers/metric_configurations_helper_spec.rb
@@ -43,4 +43,40 @@ describe MetricConfigurationsHelper, :type =&gt; :helper do @@ -43,4 +43,40 @@ describe MetricConfigurationsHelper, :type =&gt; :helper do
43 expect(helper.supported_metrics_of(metric_collector_details.name)).to eq(metric_collector_details.supported_metrics) 43 expect(helper.supported_metrics_of(metric_collector_details.name)).to eq(metric_collector_details.supported_metrics)
44 end 44 end
45 end 45 end
  46 +
  47 + describe 'choose_metric_path' do
  48 + let(:kalibro_configuration_id) { 1 }
  49 +
  50 + context 'with a tree metric' do
  51 + let(:metric) { FactoryGirl.build(:loc) }
  52 +
  53 + it 'is expected to generate the path for MetricConfigurationsController' do
  54 + expect(helper.choose_metric_path(metric, kalibro_configuration_id)).to eq(helper.kalibro_configuration_new_metric_configuration_path(kalibro_configuration_id: kalibro_configuration_id))
  55 + end
  56 + end
  57 +
  58 + context 'with a hotspot metric' do
  59 + let(:metric) { FactoryGirl.build(:hotspot_metric) }
  60 +
  61 + it 'is expected to generate the path for HotspotMetricConfigurationsController' do
  62 + expect(helper.choose_metric_path(metric, kalibro_configuration_id)).to eq(helper.kalibro_configuration_hotspot_metric_configurations_path(kalibro_configuration_id: kalibro_configuration_id))
  63 + end
  64 + end
  65 + end
  66 +
  67 + describe 'hotspot_metric_configuration?' do
  68 + let(:metric_configuration) { FactoryGirl.build(:metric_configuration) }
  69 + let(:hotspot_type) { 'HotspotMetricSnapshot' }
  70 + let(:other_type) { 'NativeMetricSnapshot' }
  71 +
  72 + it 'is expected to return true for a HotspotMetricSnapshot' do
  73 + metric_configuration.metric.expects(:type).returns(hotspot_type)
  74 + expect(helper.hotspot_metric_configuration?(metric_configuration)).to eq true
  75 + end
  76 +
  77 + it 'is expected to return false for every other type of metric' do
  78 + metric_configuration.metric.expects(:type).returns(other_type)
  79 + expect(helper.hotspot_metric_configuration?(metric_configuration)).to eq false
  80 + end
  81 + end
46 end 82 end
spec/javascripts/metric_collector_spec.js.coffee 0 → 100644
@@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
  1 +#= require spec_helper
  2 +#= require metric_collector
  3 +
  4 +describe "MetricCollector", ->
  5 + describe 'choose_metric', ->
  6 + before ->
  7 + sinon.stub(window, "$")
  8 +
  9 + @metric_code = 'acc'
  10 + @metric_code_field = sinon.stub()
  11 + @metric_code_field.val = sinon.stub().withArgs(@metric_code)
  12 +
  13 + @metric_collector_name = 'Analizo'
  14 + @metric_collector_name_field = sinon.stub()
  15 + @metric_collector_name_field.val = sinon.stub().withArgs(@metric_collector_name)
  16 +
  17 + @form = sinon.stub()
  18 + @form.submit = sinon.stub()
  19 + @action_path = '/en/kalibro_configurations/1/metric_configurations/new'
  20 + @form.attr = sinon.stub().withArgs('action', @action_path)
  21 +
  22 + $.withArgs("#metric_code").returns(@metric_code_field)
  23 + $.withArgs("#metric_collector_name").returns(@metric_collector_name_field)
  24 + $.withArgs("form").returns(@form)
  25 +
  26 + it 'is expected to fill in the form and submit', ->
  27 + MetricCollector.choose_metric(@metric_code, @metric_collector_name, @action_path)
  28 +
  29 + sinon.assert.calledOnce(@metric_code_field.val, @metric_code)
  30 + sinon.assert.calledOnce(@metric_collector_name_field.val, @metric_collector_name)
  31 + sinon.assert.calledOnce(@form.submit)
  32 + sinon.assert.calledOnce(@form.attr, 'action', @action_path)
  33 +
spec/routing/hotspot_metric_configurations_routing_spec.rb 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +require "rails_helper"
  2 +
  3 +describe HotspotMetricConfigurationsController, :type => :routing do
  4 + describe "routing" do
  5 + it { is_expected.to route(:post, '/kalibro_configurations/1/hotspot_metric_configurations').
  6 + to(controller: :hotspot_metric_configurations, action: :create, kalibro_configuration_id: "1") }
  7 + end
  8 +end
0 \ No newline at end of file 9 \ No newline at end of file