Permalink
Browse files

Contexto asignación de valores en rescurso desde fit table

  • Loading branch information...
1 parent 4aa6ee7 commit 708250e4cab0678eb4ad115a04592cd05daa1e81 Paco Guzman committed with May 14, 2010
@@ -0,0 +1,69 @@
+# language: es
+Característica: asignación de valores en un recurso concreto desde fit table
+
+ Escenario: Asignación de valores en un campo (atributo, belongs_to o has_one) de un recurso concreto desde fit table
+ ########################################################################
+ # Patrón:
+ # Dado que el _modelo_ "_nombre_" tiene:
+ # o:
+ # Dado que dicho/a _modelo_ tiene:
+ # seguido de:
+ # | campo1 | campo2 | ... | campoN |
+ # | v1-1 | v1-2 | ... | v1-N |
+ #
+ # Ejemplo refiriéndonos a un recurso explícitamente:
+ #
+ # Dado que el huerto "H-01" tiene:
+ # | longitud | latitud | area |
+ # | 12 | 10 | 15 |
+ #
+ #
+ # Ejemplo haciendo referencia a un recurso mencionado:
+ #
+ # Dado que dicho huerto tiene:
+ # | longitud | latitud | area |
+ # | 12 | 10 | 15 |
+ #
+ # Descripción:
+ # Asigna un _valor_ a un _campo_ del recurso cuya clase sea _modelo_
+ # y cuyo nombre sea _nombre_
+ #
+ # Dicha asignación se llevará a cabo de acuerdo con lo siguiente:
+ #
+ # - Si _campo_ está mapeado con un modelo el valor será el registro de
+ # dicho modelo cuyo nombre sea _valor_, creándolo si no existe aún.
+ #
+ # - En caso contrario se asignará directamente _valor_ a _campo_
+ #
+ ########################################################################
+ Dado que tenemos dos huertos llamados "A y B"
+ Y que el huerto "A" tiene:
+ | longitud | latitud | area | bancal |
+ | 12 | 10 | 15 | patatas |
+ Y que la huerta "B" tiene:
+ | longitud | latitud | area | bancal |
+ | 6 | 5 | 8 | tomates |
+ Y que tenemos un huerto llamado "C"
+ Y que dicho huerto tiene:
+ | longitud | latitud | area | bancal |
+ | 18 | 15 | 23 | berzas |
+ Y que tenemos un huerto llamado "D"
+ Y que tiene:
+ | longitud | latitud | area | bancal |
+ | 24 | 20 | 27 | puerros |
+ Entonces el huerto "A" tiene en bbdd como área "15"
+ Y tiene en bbdd como longitud "12"
+ Y tiene en bbdd como latitud "10"
+ Y tiene en bbdd un bancal "patatas"
+ Y el huerto "B" tiene en bbdd como área "8"
+ Y tiene en bbdd como longitud "6"
+ Y tiene en bbdd como latitud "5"
+ Y tiene en bbdd un bancal "tomates"
+ Y el huerto "C" tiene en bbdd como área "23"
+ Y tiene en bbdd como longitud "18"
+ Y tiene en bbdd como latitud "15"
+ Y tiene en bbdd un bancal "berzas"
+ Y el huerto "D" tiene en bbdd como área "27"
+ Y tiene en bbdd como longitud "24"
+ Y tiene en bbdd como latitud "20"
+ Y tiene en bbdd un bancal "puerros"
@@ -25,12 +25,20 @@
:value => valor
end
+Dado /^que (?:el|la) (.+) ['"](.+)["'] tiene:$/ do |modelo, nombre, tabla|
+ given_resource_have_the_following_values_from_step_table :model => modelo, :name => nombre, :table => tabla
+end
+
Dado /^que dich[oa]s? (.+) tienen? como (.+) ['"](.+)["'](?:.+)?$/i do |modelo, campo, valor|
given_those_resources_have_value_in_field :model => modelo,
:field => campo,
:value => valor
end
+Dado /^que(?: dich[oa]s? (.+))? tiene:$/i do |modelo, tabla|
+ given_resource_have_the_following_values_from_step_table :model => modelo, :table => tabla
+end
+
Dado /^que (?:el|la) (.+) ['"](.+)["'] tiene (#{_numero_}) (.+?)(?: (?:llamad[oa]s? )?['"](.+)["'])?$/i do |modelo_padre, nombre_del_padre, numero, campo_hijos, nombres|
given_resource_has_many_children(
:model => modelo_padre,
@@ -27,14 +27,37 @@ def given_we_have_the_following_instances_from_step_table(params)
# :name (optional)
def given_those_resources_have_value_in_field(params)
if res = params[:name] ? [last_mentioned_of(params[:model], params[:name])] : last_mentioned_of(params[:model])
- resources, field, values = resources_array_field_and_values(res, params[:field], params[:value])
- if field
- resources.each_with_index do |r, i|
- r.update_attribute field, real_value_for(values[i])
- end
- pile_up res
+
+ if resource_not_respond_to_field?(res, params[:field]) && !resource_respond_to_relation_field?(res, params[:field])
+ params.merge!(:children_field => params[:field], :children_names => params[:value])
+ given_resource_has_many_children(params)
else
- raise MundoPepino::FieldNotMapped.new(params[:field])
+ resources, field, values = resources_array_field_and_values(res, params[:field], params[:value])
+ if field
+ resources.each_with_index do |r, i|
+ r.update_attribute field, real_value_for(values[i])
+ end
+ pile_up res
+ else
+ raise MundoPepino::FieldNotMapped.new(params[:field])
+ end
+ end
+ end
+ end
+
+ # Params:
+ # :model (raw) (optional)
+ # :table
+ # :name (optional)
+ def given_resource_have_the_following_values_from_step_table(params)
+ params[:model] = last_mentioned.class.name.downcase if params[:model].nil?
+
+ params[:table].hashes.each do |hash|
+ hash.each_pair do |campo, valor|
+ given_those_resources_have_value_in_field :model => params[:model],
+ :name => params[:name],
+ :field => campo,
+ :value => valor
end
end
end
@@ -43,7 +66,7 @@ def given_resource_has_many_children(params)
children_model = convert_to_model(params[:children_field])
last_mentioned_resources(params[:model], params[:name]) do |resource|
attribs = names_for_simple_creation(children_model,
- params[:number_of_children].to_number, params[:children_names],
+ (params[:number_of_children] || '1').to_number, params[:children_names],
parent_options(resource, children_model, params[:children_field]))
add_resource children_model, attribs, :force_creation => params[:children_names].nil?
end
@@ -121,5 +144,16 @@ def then_resource_called_name_should_have_child(params)
def then_that_resource_should_have_child(params)
last_mentioned_should_have_child(params[:children_field], params[:child_name])
end
+
+ private
+ def resource_not_respond_to_field?(res, field)
+ res = res.is_a?(Array) ? res.first : res
+ field.to_model && !res.respond_to?(field.to_model.name.downcase)
+ end
+
+ def resource_respond_to_relation_field?(res, field)
+ res = res.is_a?(Array) ? res.first : res
+ field_for(res.class, field) && res.respond_to?(field_for(res.class, field))
+ end
end
end

0 comments on commit 708250e

Please sign in to comment.