Skip to content

Commit

Permalink
Refactor init_from_dialog method to prevent duplicate loops
Browse files Browse the repository at this point in the history
  • Loading branch information
eclarizio committed Jul 22, 2015
1 parent 4f1406f commit 25b8bc3
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 31 deletions.
59 changes: 28 additions & 31 deletions app/models/miq_request_workflow.rb
Expand Up @@ -118,41 +118,38 @@ def update_request(request, values, requester_id, target_class, event_name, even
request
end

def init_from_dialog(values, _userid)
options = values
values_new = options

get_all_dialogs.keys.each do |d| # Go thru all dialogs
get_all_fields(d).keys.each do |f| # Go thru all field
if !options[f].nil?
values_new[f] = options[f] # Set the existing option value
else
field = get_field(f, d)
if field[:display] != :ignore
if !field[:default].nil?
val = field[:default] # Set to default value
elsif field[:values] && field[:values].length == 1 # if default is not set to anything and there is only one value in hash, use set element to be displayed default
field[:values].each do |v|
val = v[0]
end
end
if field[:values] # If this field has values
if field[:values].kind_of?(Hash)
values_new[f] = [val, field[:values][val]] # Save [value, description], skip for timezones array
else
field[:values].each do |tz|
if tz[1].to_i_with_method == val.to_i_with_method
values_new[f] = [val, tz[0]] # Save [value, description] for timezones array
end
end
def init_from_dialog(init_values, _userid)
@dialogs[:dialogs].keys.each do |dialog_name|
get_all_fields(dialog_name).each_pair do |field_name, field_values|
next if field_values[:display] == :ignore

if !field_values[:default].nil?
val = field_values[:default]

# if default is not set to anything and there is only one value in hash,
# use set element to be displayed default
elsif field_values[:values] && field_values[:values].length == 1
val = field_values[:values].first[0]
end

if field_values[:values]
if field_values[:values].kind_of?(Hash)
# Save [value, description], skip for timezones array
init_values[field_name] = [val, field_values[:values][val]]
else
field_values[:values].each do |tz|
if tz[1].to_i_with_method == val.to_i_with_method
# Save [value, description] for timezones array
init_values[field_name] = [val, tz[0]]
end
else
values_new[f] = val # Set to default value
end
end
else
# Set to default value
init_values[field_name] = val
end
end # get_all_fields
end # get_all_dialogs
end
end
end

def validate(values)
Expand Down
80 changes: 80 additions & 0 deletions spec/models/miq_request_workflow_spec.rb
Expand Up @@ -47,4 +47,84 @@
end
end
end

describe "#init_from_dialog" do
let(:dialogs) { workflow.instance_variable_get(:@dialogs) }
let(:workflow) { FactoryGirl.build(:miq_provision_workflow) }
let(:init_values) { {} }

context "when the dialog fields ignore display" do
before do
dialogs[:dialogs].keys.each do |dialog_name|
workflow.get_all_fields(dialog_name).each_pair do |_, field_values|
field_values[:display] = :ignore
end
end
end

it "does not modify the initial values" do
workflow.init_from_dialog(init_values, 123)

expect(init_values).to eq({})
end
end

context "when the dialog field values default is not nil" do
before do
dialogs[:dialogs].keys.each do |dialog_name|
workflow.get_all_fields(dialog_name).each_pair do |_, field_values|
field_values[:default] = "not nil"
end
end
end

it "modifies the initial values with the default value" do
workflow.init_from_dialog(init_values, 123)

expect(init_values).to eq(:root_password => "not nil")
end
end

context "when the dialog field values default is nil" do
before do
dialogs[:dialogs].keys.each do |dialog_name|
workflow.get_all_fields(dialog_name).each_pair do |_, field_values|
field_values[:default] = nil
end
end
end

context "when the field values are a hash" do
before do
dialogs[:dialogs].keys.each do |dialog_name|
workflow.get_all_fields(dialog_name).each_pair do |_, field_values|
field_values[:values] = {:something => "test"}
end
end
end

it "uses the first field value" do
workflow.init_from_dialog(init_values, 123)

expect(init_values).to eq(:root_password => [:something, "test"])
end
end

context "when the field values are not a hash" do
before do
dialogs[:dialogs].keys.each do |dialog_name|
workflow.get_all_fields(dialog_name).each_pair do |_, field_values|
field_values[:values] = [["test", "100"], ["test2", "0"]]
end
end
end

it "uses values as [value, description] for timezones aray" do
workflow.init_from_dialog(init_values, 123)

expect(init_values).to eq(:root_password => [nil, "test2"])
end
end
end
end
end

0 comments on commit 25b8bc3

Please sign in to comment.