spec/features/rule_spec.rb in marty-2.5.2 vs spec/features/rule_spec.rb in marty-2.5.4

- old
+ new

@@ -8,80 +8,86 @@ save_clean_db(@save_file) Marty::Script.load_scripts dt = DateTime.parse('2017-1-1') p = File.expand_path('../../fixtures/csv/rule', __FILE__) [Marty::DataGrid, Gemini::XyzRule, Gemini::MyRule].each do |klass| - f = "%s/%s.csv" % [p, klass.to_s.sub(/(Gemini|Marty)::/,'')] - Marty::DataImporter.do_import(klass, File.read(f), dt, nil, nil, ",") + f = '%s/%s.csv' % [p, klass.to_s.sub(/(Gemini|Marty)::/, '')] + Marty::DataImporter.do_import(klass, File.read(f), dt, nil, nil, ',') end end after(:all) do restore_clean_db(@save_file) end def go_to_my_rules - press("Pricing Config.") - press("My Rules") + press('Pricing Config.') + press('My Rules') expect(page).to have_content 'My Rules' end + def go_to_xyz_rules - press("Pricing Config.") - press("Xyz Rules") + press('Pricing Config.') + press('Xyz Rules') expect(page).to have_content 'Xyz Rules' end + def col_id(v, col) run_js <<-JS #{ext_var(v.grid, 'grid')} return #{ext_find(ext_arg('gridcolumn', text: col), 'grid')}.id JS end + # click_checkbox in marty_rspec not working here for some reason def click_checkbox(name) q = %Q(checkbox[fieldLabel="#{name}"]) page.execute_script <<-JS var checkbox = Ext.ComponentQuery.query('#{q}')[0]; checkbox.setValue(!checkbox.value); JS end # click_col in marty_rspec is not reliable - def click_column(rv,name) + def click_column(rv, name) cid = col_id(rv, name) - c = find('#'+cid) + c = find('#' + cid) c.select_option # .click does not work reliably c.send_keys(' ') # wait_for_ajax and wait_for_ready do not work here, # or in the next two methods sleep 1.0 end - def column_filter(rv,name,value) + def column_filter(rv, name, value) cid = col_id(rv, name) - c = find('#'+cid) + c = find('#' + cid) c.send_keys([:down, :down, :down, :down, :right, value, :return]) sleep 1.0 end - def column_filter_toggle(rv,name) + + def column_filter_toggle(rv, name) cid = col_id(rv, name) - c = find('#'+cid) + c = find('#' + cid) c.send_keys([:down, :down, :down, :down, ' ', :escape]) sleep 1.0 end + # idx 0 is the start dt, 1 is the end dt def date_fill_in(idx, value) dt = all(:xpath, "//input[contains(@name, 'datefield')]")[idx] dt.native.clear() dt.native.send_keys(value) end - def time_fill_in(idx,value) + + def time_fill_in(idx, value) tm = all(:xpath, "//input[contains(@name, 'timefield')]")[idx] tm.native.clear() tm.native.send_keys(value) end - it "rule workflow" do + it 'rule workflow' do log_in_as('marty') go_to_my_rules - mrv = netzke_find("my_rule_view") + mrv = netzke_find('my_rule_view') # test required field press('Add') wait_for_ajax fill_in('name', with: 'abc') press('OK') @@ -92,161 +98,161 @@ fill_in('rule_type', with: 'SimpleRule') date_fill_in(0, '2013-01-01') time_fill_in(0, '11:03:01') date_fill_in(1, '2030-01-01') time_fill_in(1, '08:03:01') - press("OK") + press('OK') wait_for_ajax expect(mrv.row_count()).to eq(9) - expect(mrv.get_row_vals(1)).to include({"name"=>"abc", - "rule_type"=>"SimpleRule", - "start_dt"=>"2013-01-01T11:03:01", - "end_dt"=>"2030-01-01T08:03:01", - "other_flag"=>false, - "g_array"=>"", - "g_single"=>"", - "g_string"=>"", - "g_bool"=>nil, - "g_nullbool"=>"", - "g_bool_def"=>nil, - "g_nbool_def"=>"False", - "g_range"=>nil, - "g_integer"=>nil, - "g_has_default"=>"string default", - "computed_guards"=>"", - "grids"=>"", - "results"=>"", - }) + expect(mrv.get_row_vals(1)).to include('name' => 'abc', + 'rule_type' => 'SimpleRule', + 'start_dt' => '2013-01-01T11:03:01', + 'end_dt' => '2030-01-01T08:03:01', + 'other_flag' => false, + 'g_array' => '', + 'g_single' => '', + 'g_string' => '', + 'g_bool' => nil, + 'g_nullbool' => '', + 'g_bool_def' => nil, + 'g_nbool_def' => 'False', + 'g_range' => nil, + 'g_integer' => nil, + 'g_has_default' => 'string default', + 'computed_guards' => '', + 'grids' => '', + 'results' => '', + ) r = Gemini::MyRule.find_by(obsoleted_dt: 'infinity', name: 'abc') - expect(r.attributes).to include({"user_id"=>1, - "o_user_id"=>nil, - "name"=>"abc", - "engine"=>"Gemini::MyRuleScriptSet", - "rule_type"=>"SimpleRule", - "simple_guards"=>{"g_bool"=>false, - "g_bool_def"=>false, - "g_nbool_def"=>false, - "g_has_default"=> - "string default"}, - "computed_guards"=>{}, - "grids"=>{}, - "results"=>{}, - }) + expect(r.attributes).to include('user_id' => 1, + 'o_user_id' => nil, + 'name' => 'abc', + 'engine' => 'Gemini::MyRuleScriptSet', + 'rule_type' => 'SimpleRule', + 'simple_guards' => { 'g_bool' => false, + 'g_bool_def' => false, + 'g_nbool_def' => false, + 'g_has_default' => + 'string default' }, + 'computed_guards' => {}, + 'grids' => {}, + 'results' => {}, + ) # type validation (string with values list) mrv.select_row(1) - press("Edit") + press('Edit') # type validation (range) - netzke_find("String list Guard", 'combobox').select_values("Hi Mom") - click_checkbox("Bool Guard") - click_checkbox("Other") - netzke_find("NullBool Guard", 'combobox').select_values("False") - netzke_find('Array Guard', 'combobox').select_values("G1V1,G1V3") - netzke_find('Single Guard', 'combobox').select_values("G2V2") + netzke_find('String list Guard', 'combobox').select_values('Hi Mom') + click_checkbox('Bool Guard') + click_checkbox('Other') + netzke_find('NullBool Guard', 'combobox').select_values('False') + netzke_find('Array Guard', 'combobox').select_values('G1V1,G1V3') + netzke_find('Single Guard', 'combobox').select_values('G2V2') fill_in(:g_integer, with: 123) - fill_in(:g_range, with: "asfd") - press("OK") + fill_in(:g_range, with: 'asfd') + press('OK') wait_for_ajax expect(page).to have_content("Wrong type for 'g_range'") # validate rule - fill_in(:g_range, with: "<=100") - netzke_find('Grid1', 'combobox').select_values("DataGrid1") - netzke_find('Grid2', 'combobox').select_values("DataGrid2") - fill_in("Defaulted String", with: "12345") - press("OK") + fill_in(:g_range, with: '<=100') + netzke_find('Grid1', 'combobox').select_values('DataGrid1') + netzke_find('Grid2', 'combobox').select_values('DataGrid2') + fill_in('Defaulted String', with: '12345') + press('OK') wait_for_ajax - exp = {"name"=>"abc", - "rule_type"=>"SimpleRule", - "start_dt"=>"2013-01-01T11:03:01", - "end_dt"=>"2030-01-01T08:03:01", - "other_flag"=>true, - "g_array"=>"G1V1,G1V3", - "g_single"=>"G2V2", - "g_string"=>"Hi Mom", - "g_bool"=>true, - "g_nullbool"=>"False", - "g_range"=>"<=100", - "g_integer"=>123, - "g_has_default"=>"12345", - "computed_guards"=>"", - "grids"=>"{\"grid1\":\"DataGrid1\",\"grid2\":\"DataGrid2\"}", - "results"=>"", + exp = { 'name' => 'abc', + 'rule_type' => 'SimpleRule', + 'start_dt' => '2013-01-01T11:03:01', + 'end_dt' => '2030-01-01T08:03:01', + 'other_flag' => true, + 'g_array' => 'G1V1,G1V3', + 'g_single' => 'G2V2', + 'g_string' => 'Hi Mom', + 'g_bool' => true, + 'g_nullbool' => 'False', + 'g_range' => '<=100', + 'g_integer' => 123, + 'g_has_default' => '12345', + 'computed_guards' => '', + 'grids' => '{"grid1":"DataGrid1","grid2":"DataGrid2"}', + 'results' => '', } - r = Gemini::MyRule.lookup('infinity','abc') - expect(r["simple_guards"]["g_nullbool"]).to eq(false) + r = Gemini::MyRule.lookup('infinity', 'abc') + expect(r['simple_guards']['g_nullbool']).to eq(false) expect(mrv.get_row_vals(1)).to include(exp) # grid edits - press("Edit") - netzke_find('Grid2', 'combobox').select_values("---") - press("OK") + press('Edit') + netzke_find('Grid2', 'combobox').select_values('---') + press('OK') wait_for_ajax - expect(mrv.get_row_vals(1)).to include(exp+{"grids"=> - "{\"grid1\":\"DataGrid1\"}"}) - press("Edit") - netzke_find("NullBool Guard", 'combobox').select_values("---") - press("OK") + expect(mrv.get_row_vals(1)).to include(exp + { 'grids' => + '{"grid1":"DataGrid1"}' }) + press('Edit') + netzke_find('NullBool Guard', 'combobox').select_values('---') + press('OK') wait_for_ajax - expect(mrv.get_row_vals(1)).to include(exp+{"g_nullbool"=>"", - "grids"=> - "{\"grid1\":\"DataGrid1\"}"}) - r = Gemini::MyRule.lookup('infinity','abc') - expect(r["simple_guards"]).not_to include('g_nullbool') + expect(mrv.get_row_vals(1)).to include(exp + { 'g_nullbool' => '', + 'grids' => + '{"grid1":"DataGrid1"}' }) + r = Gemini::MyRule.lookup('infinity', 'abc') + expect(r['simple_guards']).not_to include('g_nullbool') # computed fields - press("Edit") + press('Edit') # bad form - BaseRuleView#simple_to_hash will raise fill_in(:computed_guards, with: 'sadf asdf ljsf') - press("OK") + press('OK') wait_for_ajax exp = "Computed - Error in rule 'abc' field 'computed_guards': Syntax error on line 1" expect(page).to have_content(exp) sleep 2 # sleep needed for message to clear, otherwise failing tests could # pass due to prior messages # lhs is not identifier - BaseRuleView#simple_to_has will raise fill_in(:computed_guards, with: '0sadf = 123j') - press("OK") + press('OK') wait_for_ajax exp = "Computed - Error in rule 'abc' field 'computed_guards': Syntax error on line 1" expect(page).to have_content(exp) sleep 2 # bad rhs - delorean compile will raise fill_in(:computed_guards, with: 'var = 123j') - press("OK") + press('OK') wait_for_ajax exp = "Computed - Error in rule 'abc' field 'computed_guards': Syntax error" expect(page).to have_content(exp) sleep 2 fill_in(:computed_guards, with: %Q(var1 = "good"\nvar2 = 123\nvar3 = 123j)) - press("OK") + press('OK') wait_for_ajax exp = "Computed - Error in rule 'abc' field 'computed_guards': Syntax error" expect(page).to have_content(exp) sleep 2 fill_in(:computed_guards, with: '') fill_in(:results, with: %Q(var1 = "good"\nvar2 = 123\nvar3 = 123j)) - press("OK") + press('OK') wait_for_ajax exp = "Computed - Error in rule 'abc' field 'results': Syntax error" expect(page).to have_content(exp) sleep 2 fill_in(:results, with: %Q(abc = "def"\ndef = 5\nxyz=def+10\nsadf asdf lsf)) - press("OK") + press('OK') wait_for_ajax exp = "Computed - Error in rule 'abc' field 'results': Syntax error" expect(page).to have_content(exp) sleep 2 fill_in(:results, with: %Q(abc = "def"\ndef = "abc"\nklm = "3"\nabc = "xyz")) exp = "Computed - Error in rule 'abc' field 'results': Keyword 'abc' specified more"\ - " than once (line 4)" - press("OK") + ' than once (line 4)' + press('OK') wait_for_ajax expect(page).to have_content(exp) sleep 2 multi_line = <<-EOL @@ -263,166 +269,165 @@ 4 + if true then 5 else 0 EOL fill_in(:results, with: multi_line) - press("OK") + press('OK') wait_for_ajax # re-edit twice to make sure re-indentation and stripping are correct - press("Edit") + press('Edit') wait_for_ajax expect(find_field(:results).value).to eq(multi_line_fixed.chomp) - press("OK") + press('OK') wait_for_ajax - press("Edit") + press('Edit') wait_for_ajax expect(find_field(:results).value).to eq(multi_line_fixed.chomp) - press("OK") + press('OK') wait_for_ajax # when stored in rule, all lines of a multi line value s/b stripped r = Gemini::MyRule.where(name: 'abc', obsoleted_dt: 'infinity').first expect(r.results['klm']).to eq("3 +\n4 +\nif true then 5 else 0") # make sure change of key/value order is recognized as a change - press("Edit") + press('Edit') wait_for_ajax val = find_field(:results).value.lines val[-1] += "\n" newval = (val[1..-1] + val[0..0]).join fill_in(:results, with: newval) - press("OK") + press('OK') wait_for_ajax - press("Edit") + press('Edit') wait_for_ajax - val = find_field(:results).value+"\n" + val = find_field(:results).value + "\n" expect(val).to eq(newval) - press("OK") + press('OK') wait_for_ajax - exp =<<EOL + exp = <<EOL simple_result = "c value" computed_value = if paramb then param1 / (grid1_grid_result||1) else (grid2_grid_result||1) / param1 EOL names = mrv.get_col_vals(:name, 9, 0) - idx = names.index{|n|n=='Rule3'}+1 + idx = names.index { |n| n == 'Rule3' } + 1 mrv.select_row(idx) - press("Edit") + press('Edit') expect(find_field(:results).value).to eq(exp.chomp) - press("OK") + press('OK') wait_for_ajax - press("Dup in form") - netzke_find('Single Guard', 'combobox').select_values("G2V3") - press("OK") + press('Dup in form') + netzke_find('Single Guard', 'combobox').select_values('G2V3') + press('OK') wait_for_ajax expect(page).to have_content(/record must be unique/) - press("Cancel") + press('Cancel') # column sorting, etc go_to_xyz_rules - xrv = netzke_find("xyz_rule_view") - expect(page).to have_content("Rule type") - expect(xrv.get_col_vals(:name, 5, 0)).to eq(["ZRule1", "ZRule2", - "ZRule3", "ZRule4", - "ZRule5"]) + xrv = netzke_find('xyz_rule_view') + expect(page).to have_content('Rule type') + expect(xrv.get_col_vals(:name, 5, 0)).to eq(['ZRule1', 'ZRule2', + 'ZRule3', 'ZRule4', + 'ZRule5']) xrv.select_row(1) - press("Edit") - fill_in("Range Guard 1", with: "[100,200)") - fill_in("Range Guard 2", with: "[30,40)") - press("OK") + press('Edit') + fill_in('Range Guard 1', with: '[100,200)') + fill_in('Range Guard 2', with: '[30,40)') + press('OK') wait_for_ajax - r = Gemini::XyzRule.get_matches('infinity', {}, {"g_range1"=> 150, - "g_range2"=> 35}) + r = Gemini::XyzRule.get_matches('infinity', {}, 'g_range1' => 150, + 'g_range2' => 35) expect(r.to_a.count).to eq(1) - exp = {"user_id"=>1, - "o_user_id"=>nil, - "name"=>"ZRule1", - "engine"=>"Gemini::XyzRuleScriptSet", - "rule_type"=>"ZRule", - "start_dt"=>DateTime.parse("2017-1-1 08:01:00"), - "simple_guards"=>{"g_bool"=>false, - "g_date"=>"2017-1-1", - "g_range1"=>"[100,200)", - "g_range2"=>"[30,40)", - "g_string"=>"aaa", - "g_integer"=>"5", - "g_datetime"=>"2017-1-1 12:00:01"}, - "computed_guards"=>{}, - "grids"=>{"grid1"=>"DataGrid1"}, - "results"=> - {"bvlen"=>"base_value.length", - "bv"=>"base_value"}} + exp = { 'user_id' => 1, + 'o_user_id' => nil, + 'name' => 'ZRule1', + 'engine' => 'Gemini::XyzRuleScriptSet', + 'rule_type' => 'ZRule', + 'start_dt' => DateTime.parse('2017-1-1 08:01:00'), + 'simple_guards' => { 'g_bool' => false, + 'g_date' => '2017-1-1', + 'g_range1' => '[100,200)', + 'g_range2' => '[30,40)', + 'g_string' => 'aaa', + 'g_integer' => '5', + 'g_datetime' => '2017-1-1 12:00:01' }, + 'computed_guards' => {}, + 'grids' => { 'grid1' => 'DataGrid1' }, + 'results' => + { 'bvlen' => 'base_value.length', + 'bv' => 'base_value' } } expect(r.first.as_json).to include(exp) - expect(xrv.get_col_vals(:g_string, 8, 0)).to eq(["aaa", "bbb", "ccc", "ddd", - "eee", "eee", "eee", "eee"]) - click_column(xrv, "String list Guard") - expect(xrv.get_col_vals(:g_string, 8, 0)).to eq(["eee", "eee", "eee", "eee", - "ddd", "ccc", "bbb", "aaa"]) - column_filter(xrv, "String list Guard", "eee") + expect(xrv.get_col_vals(:g_string, 8, 0)).to eq(['aaa', 'bbb', 'ccc', 'ddd', + 'eee', 'eee', 'eee', 'eee']) + click_column(xrv, 'String list Guard') + expect(xrv.get_col_vals(:g_string, 8, 0)).to eq(['eee', 'eee', 'eee', 'eee', + 'ddd', 'ccc', 'bbb', 'aaa']) + column_filter(xrv, 'String list Guard', 'eee') rc = xrv.row_count - expect(xrv.get_col_vals(:g_string,rc,0)).to eq(["eee", "eee", "eee", "eee"]) - column_filter_toggle(xrv, "String list Guard") + expect(xrv.get_col_vals(:g_string, rc, 0)).to eq(['eee', 'eee', 'eee', 'eee']) + column_filter_toggle(xrv, 'String list Guard') rc = xrv.row_count - expect(xrv.get_col_vals(:g_string,rc,0)).to eq(["eee", "eee", "eee", "eee", - "ddd", "ccc", "bbb", "aaa"]) - column_filter(xrv, "Grids", "Grid1") + expect(xrv.get_col_vals(:g_string, rc, 0)).to eq(['eee', 'eee', 'eee', 'eee', + 'ddd', 'ccc', 'bbb', 'aaa']) + column_filter(xrv, 'Grids', 'Grid1') rc = xrv.row_count # netzke reports jsonb as string - expect(xrv.get_col_vals(:grids,rc,0)).to eq([%Q({"grid1":"DataGrid1"}), - %Q({"grid1":"DataGrid1"})]) - column_filter_toggle(xrv, "Grids") + expect(xrv.get_col_vals(:grids, rc, 0)).to eq([%Q({"grid1":"DataGrid1"}), + %Q({"grid1":"DataGrid1"})]) + column_filter_toggle(xrv, 'Grids') rc = xrv.row_count - expect(xrv.get_col_vals(:grids,rc,0)).to eq([%Q({"grid1":"DataGrid3"}), - %Q({"grid1":"DataGrid3"}), - %Q({"grid1":"DataGrid3"}), - %Q({"grid1":"DataGrid3"}), - %Q({"grid1":"DataGrid3"}), - %Q({"grid1":"DataGrid2"}), - %Q({"grid1":"DataGrid1"}), - %Q({"grid1":"DataGrid1"})]) - press("Applications") - press("Data Grids") - dgv = netzke_find("data_grid_view") + expect(xrv.get_col_vals(:grids, rc, 0)).to eq([%Q({"grid1":"DataGrid3"}), + %Q({"grid1":"DataGrid3"}), + %Q({"grid1":"DataGrid3"}), + %Q({"grid1":"DataGrid3"}), + %Q({"grid1":"DataGrid3"}), + %Q({"grid1":"DataGrid2"}), + %Q({"grid1":"DataGrid1"}), + %Q({"grid1":"DataGrid1"})]) + press('Applications') + press('Data Grids') + dgv = netzke_find('data_grid_view') cvs = dgv.get_col_vals(:name, 4, 0) - ind1 = cvs.index("DataGrid1")+1 - ind4 = cvs.index("DataGrid4")+1 + ind1 = cvs.index('DataGrid1') + 1 + ind4 = cvs.index('DataGrid4') + 1 dgv.select_row(ind1) - press("Edit") - fill_in("Name", with: "DataGrid1 new") - press("OK") + press('Edit') + fill_in('Name', with: 'DataGrid1 new') + press('OK') wait_for_ajax dgv.select_row(ind4) - press("Edit") - fill_in("Name", with: "DataGrid4 new") - press("OK") + press('Edit') + fill_in('Name', with: 'DataGrid4 new') + press('OK') wait_for_ajax go_to_xyz_rules wait_for_ajax names = xrv.get_col_vals(:name, 5, 0) gvs = xrv.get_col_vals(:grids, 5, 0) - g1h = {"grid1"=>"DataGrid1 new"} - expect(JSON.parse(gvs[names.index("ZRule1")])).to eq(g1h) - expect(JSON.parse(gvs[names.index("ZRule2")])).to eq(g1h) + g1h = { 'grid1' => 'DataGrid1 new' } + expect(JSON.parse(gvs[names.index('ZRule1')])).to eq(g1h) + expect(JSON.parse(gvs[names.index('ZRule2')])).to eq(g1h) go_to_my_rules wait_for_ajax names = mrv.get_col_vals(:name, 9, 0) gvs = mrv.get_col_vals(:grids, 9, 0) rvs = mrv.get_col_vals(:results, 9, 0) expect(JSON.parse(gvs[names.index('abc')])).to eq(g1h) expect(JSON.parse(gvs[names.index('Rule2b')])).to eq(g1h + - {"grid2"=>"DataGrid2"}) - expect(JSON.parse(rvs[names.index('Rule5')])["other_grid"]).to eq( - '"DataGrid4 new"') - + { 'grid2' => 'DataGrid2' }) + expect(JSON.parse(rvs[names.index('Rule5')])['other_grid']).to eq( + '"DataGrid4 new"') end end