require File.dirname(__FILE__) + '/../../spec_helper' def valid_<%=rule_name%>_rule_data '["Rule Title", "Twitter Message to Find", "Other Plan"]' end describe RulesEngine::Rule::<%=rule_class%> do def valid_attributes { :<%=rule_name%>_title => 'Rule Title', :<%=rule_name%>_message => 'The Message', :<%=rule_name%>_plan => 'Next Plan' } 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 'General' group" do RulesEngine::Rule::<%=rule_class%>.options[:group].should == "Twitter" end it "should have the diplay name of '<%=rule_class%> Rule'" do RulesEngine::Rule::<%=rule_class%>.options[:display_name].should == "Twitter Reader" 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 @<%=rule_name%> = RulesEngine::Rule::<%=rule_class%>.new @<%=rule_name%>.data = valid_<%=rule_name%>_rule_data end describe "the json data is valid" do it "should be valid" do @<%=rule_name%>.should be_valid end it "should set the title" do @<%=rule_name%>.title.should == "Rule Title" end it "should set the message" do @<%=rule_name%>.message.should == "Twitter Message to Find" end it "should set the plan" do @<%=rule_name%>.plan.should == "Other Plan" end end describe "the data is nil" do it "should set the title to nil" do @<%=rule_name%>.title.should_not be_nil @<%=rule_name%>.data = nil @<%=rule_name%>.title.should be_nil end it "should set the message to nil" do @<%=rule_name%>.message.should_not be_nil @<%=rule_name%>.data = nil @<%=rule_name%>.message.should be_nil end it "should set the 'plan' to nil" do @<%=rule_name%>.plan.should_not be_nil @<%=rule_name%>.data = nil @<%=rule_name%>.plan.should be_nil end end end describe "the summary" do it "should show the plan" do <%=rule_name%> = RulesEngine::Rule::<%=rule_class%>.new <%=rule_name%>.stub!(:message).and_return("twitter message") <%=rule_name%>.stub!(:plan).and_return("mock") <%=rule_name%>.summary.should == "Look for \"twitter message\" and send matches to the plan : mock" end end describe "the data" do it "should be converted to a json string" do <%=rule_name%> = RulesEngine::Rule::<%=rule_class%>.new <%=rule_name%>.should_receive(:title).and_return("mock title") <%=rule_name%>.should_receive(:message).and_return("message") <%=rule_name%>.should_receive(:plan).and_return("plan") <%=rule_name%>.data.should == '["mock title","message","plan"]' end end describe "the expected_outcomes" do it "should be next and stop failure" do <%=rule_name%> = RulesEngine::Rule::<%=rule_class%>.new <%=rule_name%>.expected_outcomes.should include(:outcome => RulesEngine::Rule::Outcome::NEXT) <%=rule_name%>.expected_outcomes.should include(:outcome => RulesEngine::Rule::Outcome::STOP_FAILURE) end end describe "setting the rule attributes" do before(:each) do @<%=rule_name%> = RulesEngine::Rule::<%=rule_class%>.new end it "should be valid with valid attributes" do @<%=rule_name%>.attributes = valid_attributes @<%=rule_name%>.should be_valid end describe "setting the <%=rule_name%>_title" do it "should set the title" do @<%=rule_name%>.attributes = valid_attributes @<%=rule_name%>.title.should == 'Rule Title' end it "should not be valid if the '<%=rule_name%>_title' attribute is missing" do @<%=rule_name%>.attributes = valid_attributes.except(:<%=rule_name%>_title) @<%=rule_name%>.should_not be_valid @<%=rule_name%>.errors.should include(:<%=rule_name%>_title) end it "should not be valid if the '<%=rule_name%>_title' attribute is blank" do @<%=rule_name%>.attributes = valid_attributes.merge(:<%=rule_name%>_title => "") @<%=rule_name%>.should_not be_valid @<%=rule_name%>.errors.should include(:<%=rule_name%>_title) end end describe "setting the <%=rule_name%>_message" do it "should set the message" do @<%=rule_name%>.attributes = valid_attributes @<%=rule_name%>.message.should == 'The Message' end it "should not be valid if the '<%=rule_name%>_message' attribute is missing" do @<%=rule_name%>.attributes = valid_attributes.except(:<%=rule_name%>_message) @<%=rule_name%>.should_not be_valid @<%=rule_name%>.errors.should include(:<%=rule_name%>_message) end it "should not be valid if the '<%=rule_name%>_message' attribute is blank" do @<%=rule_name%>.attributes = valid_attributes.merge(:<%=rule_name%>_message => "") @<%=rule_name%>.should_not be_valid @<%=rule_name%>.errors.should include(:<%=rule_name%>_message) end end describe "setting the <%=rule_name%>_plan" do it "should be valid with valid '<%=rule_name%>_plan'" do @<%=rule_name%>.attributes = valid_attributes @<%=rule_name%>.should be_valid @<%=rule_name%>.plan.should == 'Next Plan' end it "should not be valid if the '<%=rule_name%>_plan' attribute is missing" do @<%=rule_name%>.attributes = valid_attributes.except(:<%=rule_name%>_plan) @<%=rule_name%>.should_not be_valid @<%=rule_name%>.errors.should include(:<%=rule_name%>_plan) end it "should not be valid if the '<%=rule_name%>_plan' attribute is blank" do @<%=rule_name%>.attributes = valid_attributes.merge(:<%=rule_name%>_plan => "") @<%=rule_name%>.should_not be_valid @<%=rule_name%>.errors.should include(:<%=rule_name%>_plan) end end end describe "after a rule is created" do # xit "There is nothing to do here" end describe "after a rule is created" do # xit "There is nothing to do here" end describe "processing the rule" do before(:each) do @<%=rule_name%> = RulesEngine::Rule::<%=rule_class%>.new @<%=rule_name%>.stub!(:plan).and_return('sub_plan') @<%=rule_name%>.stub!(:message).and_return("sub message") RulesEngine::Process.runner.stub!(:create).and_return(1003) RulesEngine::Process.runner.stub!(:run) end it "should create a rules process to run" do RulesEngine::Process.runner.should_receive(:create).and_return(1003) RulesEngine::Process.runner.should_receive(:run).with(1003, 'sub_plan', {:origional => "data", :message => "sub message"}) @<%=rule_name%>.process(1003, {:origional => "data"}) end it "should return outcome next if the plan was successful" do RulesEngine::Process.runner.stub!(:run).and_return(true) @<%=rule_name%>.process(1003, {}).outcome.should == RulesEngine::Rule::Outcome::NEXT end it "should return outcome stop failure if the plan failed" do RulesEngine::Process.runner.stub!(:run).and_return(false) @<%=rule_name%>.process(1003, {}).outcome.should == RulesEngine::Rule::Outcome::STOP_FAILURE end end end describe ReWorkflowRulesController, :type => :controller do integrate_views 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 tweet reader_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 class" 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%>_message") with_tag("input#<%=rule_name%>_plan") 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%>_message", :value => 'Twitter Message to Find') with_tag("input#<%=rule_name%>_plan", :value => 'Other Plan') end end end end