require File.dirname(__FILE__) + '/../../spec_helper' def valid_<%=rule_name%>_rule_data '["Rule Title", ["word one", "word two"],"1"]' end describe RulesEngine::Rule::<%=rule_class%> do def valid_attributes { :<%=rule_name%>_title => 'Another Title', :<%=rule_name%>_words => { "1" => { "word" => 'first word' }, "2" => { "word" => 'second word' } } } end it "should be discoverable" do RulesEngine::Discovery.rule_class("RulesEngine::Rule::<%=rule_class%>").should == RulesEngine::Rule::<%=rule_class%> end describe "the expected class options" do it "should be in the 'Twitter' group" do RulesEngine::Rule::<%=rule_class%>.options[:group].should == "Twitter" end it "should have the diplay name of 'Twitter Filter'" do RulesEngine::Rule::<%=rule_class%>.options[:display_name].should == "Twitter Filter" end it "should have the help template of '/re_rule_definitions/<%=rule_name%>/help'" do RulesEngine::Rule::<%=rule_class%>.options[:help_partial].should == '/re_rule_definitions/<%=rule_name%>/help' end it "should have the new template of '/re_rule_definitions/<%=rule_name%>/new'" do RulesEngine::Rule::<%=rule_class%>.options[:new_partial].should == '/re_rule_definitions/<%=rule_name%>/new' end it "should have the edit view partial template of '/re_rule_definitions/<%=rule_name%>/edit'" do RulesEngine::Rule::<%=rule_class%>.options[:edit_partial].should == '/re_rule_definitions/<%=rule_name%>/edit' end end describe "setting the rule data" do before(:each) do @filter = RulesEngine::Rule::<%=rule_class%>.new @filter.data = valid_<%=rule_name%>_rule_data end describe "the json data is valid" do it "should be valid" do @filter.should be_valid end it "should set the title" do @filter.title.should == "Rule Title" end it "should set the words" do @filter.words.should == ["word one", "word two"] end it "should set match_type" do @filter.match_type.should == 1 end end describe "the data is nil" do it "should set the title to nil" do @filter.title.should_not be_nil @filter.data = nil @filter.title.should be_nil end it "should set the words to nil" do @filter.words.should_not be_nil @filter.data = nil @filter.words.should be_nil end it "should set match_types to MATCH_ANY" do @filter.match_type.should_not == false @filter.data = nil @filter.match_type.should == RulesEngine::Rule::<%=rule_class%>::TWEET_MATCH_ANY end end end describe "the summary" do it "should be singluar if there is one word" do filter = RulesEngine::Rule::<%=rule_class%>.new filter.stub!(:words).and_return(["one"]) filter.summary.should == "Filter out tweets with the word one" end it "should be plural if there are multiple words" do filter = RulesEngine::Rule::<%=rule_class%>.new filter.stub!(:words).and_return(["one", "two", "three"]) filter.summary.should == "Filter out tweets with the words one, two, three" end end describe "the data" do it "should be converted to a json string" do filter = RulesEngine::Rule::<%=rule_class%>.new filter.should_receive(:title).and_return("mock title") filter.should_receive(:words).and_return(["one", "two"]) filter.should_receive(:match_type).and_return(RulesEngine::Rule::<%=rule_class%>::TWEET_MATCH_WORD) filter.data.should == '["mock title",["one","two"],"2"]' end end describe "the expected_outcomes" do it "should be next and stop success" do filter = RulesEngine::Rule::<%=rule_class%>.new filter.expected_outcomes[0][:outcome].should == RulesEngine::Rule::Outcome::NEXT filter.expected_outcomes[1][:outcome].should == RulesEngine::Rule::Outcome::STOP_SUCCESS end end describe "setting the rule attributes" do before(:each) do @filter = RulesEngine::Rule::<%=rule_class%>.new end it "should be valid with valid attributes" do @filter.attributes = valid_attributes @filter.should be_valid end describe "setting the <%=rule_name%>_title" do it "should set the title" do @filter.attributes = valid_attributes @filter.title.should == 'Another Title' end it "should not be valid if the '<%=rule_name%>_title' attribute is missing" do @filter.attributes = valid_attributes.except(:<%=rule_name%>_title) @filter.should_not be_valid @filter.errors.should include(:<%=rule_name%>_title) end it "should not be valid if the '<%=rule_name%>_title' attribute is blank" do @filter.attributes = valid_attributes.merge(:<%=rule_name%>_title => "") @filter.should_not be_valid @filter.errors.should include(:<%=rule_name%>_title) end end describe "setting the <%=rule_name%>_words" do it "should set the words" do @filter.attributes = valid_attributes @filter.words.should == ['first word', 'second word'] end it "should not be valid if the '<%=rule_name%>_words' attribute is missing" do @filter.attributes = valid_attributes.except(:<%=rule_name%>_words) @filter.should_not be_valid @filter.errors.should include(:<%=rule_name%>_words) end it "should not be valid if the '<%=rule_name%>_words' is not a hash" do @filter.attributes = valid_attributes.merge(:<%=rule_name%>_words => "filter word") @filter.should_not be_valid @filter.errors.should include(:<%=rule_name%>_words) end it "should not be valid if the '<%=rule_name%>_words' is empty" do @filter.attributes = valid_attributes.merge(:<%=rule_name%>_words => {}) @filter.should_not be_valid @filter.errors.should include(:<%=rule_name%>_words) end it "should not include parameters that are marked for deletion" do @filter.attributes = valid_attributes.merge(:<%=rule_name%>_words => { "1" => { "word" => 'first word', "_delete" => '1' }, "2" => { "word" => 'second word' } } ) @filter.should be_valid @filter.words.should == ['second word'] end end end describe "before a rule is created" do # xit "There is nothing to do here" end describe "before a rule is updated" do # xit "There is nothing to do here" end describe "before a rule is destroyed" do # xit "There is nothing to do here" end describe "processing the rule" do before(:each) do @filter = RulesEngine::Rule::<%=rule_class%>.new @filter.stub!(:match_type).and_return(RulesEngine::Rule::<%=rule_class%>::TWEET_MATCH_WORD) @filter.stub!(:words).and_return(["mcgurgle", "sonic", "the whole tweet"]) end it "should do nothing if there is no tweet" do @filter.process(1001, {}).outcome.should == RulesEngine::Rule::Outcome::NEXT end it "should do nothing if there is no match" do @filter.process(@job, {:tweet => "not here"}).outcome.should == RulesEngine::Rule::Outcome::NEXT end describe "a match found" do before(:each) do @matched_data = {:tweet => "here is a mcgurgle"} end it "should audit the match" do RulesEngine::Process.auditor.should_receive(:audit) do |process_id, message, code| process_id.should == 1001 message.should =~ /mcgurgle$/ end @filter.process(1001, @matched_data) end it "should return stop_success" do @filter.process(1001, @matched_data).outcome.should == RulesEngine::Rule::Outcome::STOP_SUCCESS end describe "MATCH_ANY" do it "should STOP on a match" do @filter.stub!(:match_type).and_return(RulesEngine::Rule::<%=rule_class%>::TWEET_MATCH_ANY) @filter.process(1001, {:tweet => "here is XmcgurgleY match"}).outcome.should == RulesEngine::Rule::Outcome::STOP_SUCCESS end end describe "MATCH_TWEET" do it "should STOP on a match" do @filter.stub!(:match_type).and_return(RulesEngine::Rule::<%=rule_class%>::TWEET_MATCH_TWEET) @filter.process(1001, {:tweet => "the whole tweet"}).outcome.should == RulesEngine::Rule::Outcome::STOP_SUCCESS end end describe "MATCH_WORD" do it "should STOP on a match" do @filter.stub!(:match_type).and_return(RulesEngine::Rule::<%=rule_class%>::TWEET_MATCH_WORD) @filter.process(1001, {:tweet => "here mcgurgle is a match"}).outcome.should == RulesEngine::Rule::Outcome::STOP_SUCCESS end end describe "MATCH_BEGIN_WITH" do it "should STOP on a match" do @filter.stub!(:match_type).and_return(RulesEngine::Rule::<%=rule_class%>::TWEET_MATCH_BEGIN_WITH) @filter.process(1001, {:tweet => "mcgurgleX is a match"}).outcome.should == RulesEngine::Rule::Outcome::STOP_SUCCESS end end describe "MATCH_END_WITH" do it "should STOP on a match" do @filter.stub!(:match_type).and_return(RulesEngine::Rule::<%=rule_class%>::TWEET_MATCH_END_WITH) @filter.process(1001, {:tweet => "match Xmcgurgle"}).outcome.should == RulesEngine::Rule::Outcome::STOP_SUCCESS end end end end end describe ReWorkflowRulesController, :type => :controller do integrate_views describe "RulesEngine::Rule::<%=rule_class%>" do before(:each) do controller.instance_eval { flash.stub!(:sweep) } RulesEngine::Discovery.discover! controller.stub!(:rules_engine_reader_access_required).and_return(true) controller.stub!(:rules_engine_editor_access_required).and_return(true) @re_workflow = ReWorkflow.make ReWorkflow.stub!(:find).and_return(@re_workflow) end describe "help" do it "should assign the <%=rule_name%> rule class" do get :help, :rule_class_name => "RulesEngine::Rule::<%=rule_class%>" assigns[:rule_class].should == RulesEngine::Rule::<%=rule_class%> end end describe "new" do it "show the new form" do get :new, :rule_class_name => "RulesEngine::Rule::<%=rule_class%>" response.should have_tag("form#re_rule_new_form") do with_tag("input#<%=rule_name%>_title") with_tag("input#<%=rule_name%>_words_0_word") with_tag("select#<%=rule_name%>_match_type") end end end describe "edit" do it "show the edit form" do re_rule = ReRule.make(:re_workflow_id => @re_workflow.id, :rule_class_name => "RulesEngine::Rule::<%=rule_class%>", :data => valid_<%=rule_name%>_rule_data) ReRule.stub!(:find).and_return(re_rule) get :edit, :re_workflow_id => @re_workflow.id, :re_rule_id => 1001, :rule_class_name => "RulesEngine::Rule::<%=rule_class%>" response.should have_tag("form#re_rule_edit_form") do with_tag("input#<%=rule_name%>_title", :value => 'Rule Title') with_tag("input#<%=rule_name%>_words_0_word", :value => 'word one') with_tag("input#<%=rule_name%>_words_1_word", :value => 'word two') with_tag("select#<%=rule_name%>_match_type", :value => '1') end end end end end