rules_engine 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/VERSION +1 -0
- data/init.rb +1 -0
- data/lib/rules_engine/cache.rb +26 -0
- data/lib/rules_engine/discovery.rb +51 -0
- data/lib/rules_engine/job_runner.rb +115 -0
- data/lib/rules_engine/rule.rb +60 -0
- data/lib/rules_engine/rule_outcome.rb +13 -0
- data/lib/rules_engine.rb +6 -0
- data/rails_generators/USAGE +68 -0
- data/rails_generators/blacklist_word.yml +6 -0
- data/rails_generators/blacklist_word_manifest.rb +26 -0
- data/rails_generators/generator.yml +58 -0
- data/rails_generators/generator_manifest.rb +282 -0
- data/rails_generators/rules_engine_generator.rb +35 -0
- data/rails_generators/simple.yml +6 -0
- data/rails_generators/simple_manifest.rb +21 -0
- data/rails_generators/template_manifest.rb +13 -0
- data/rails_generators/templates/app/controllers/re_jobs_controller.rb +18 -0
- data/rails_generators/templates/app/controllers/re_pipeline_jobs_controller.rb +17 -0
- data/rails_generators/templates/app/controllers/re_pipelines_controller.rb +143 -0
- data/rails_generators/templates/app/controllers/re_rules_controller.rb +140 -0
- data/rails_generators/templates/app/helpers/re_pipeline_helper.rb +29 -0
- data/rails_generators/templates/app/models/re_job.rb +123 -0
- data/rails_generators/templates/app/models/re_job_audit.rb +21 -0
- data/rails_generators/templates/app/models/re_pipeline.rb +69 -0
- data/rails_generators/templates/app/models/re_pipeline_activated.rb +26 -0
- data/rails_generators/templates/app/models/re_pipeline_activated_observer.rb +11 -0
- data/rails_generators/templates/app/models/re_pipeline_base.rb +68 -0
- data/rails_generators/templates/app/models/re_rule.rb +78 -0
- data/rails_generators/templates/app/models/re_rule_outcome.rb +40 -0
- data/rails_generators/templates/app/rules/blacklist_word.rb +89 -0
- data/rails_generators/templates/app/rules/simple.rb +44 -0
- data/rails_generators/templates/app/rules/template.rb +51 -0
- data/rails_generators/templates/app/views/layouts/_blockUI.html.erb +3 -0
- data/rails_generators/templates/app/views/re_jobs/_empty.html.erb +11 -0
- data/rails_generators/templates/app/views/re_jobs/_index.html.erb +66 -0
- data/rails_generators/templates/app/views/re_jobs/_show.html.erb +43 -0
- data/rails_generators/templates/app/views/re_jobs/index.html.erb +21 -0
- data/rails_generators/templates/app/views/re_jobs/index.js.erb +9 -0
- data/rails_generators/templates/app/views/re_jobs/show.html.erb +12 -0
- data/rails_generators/templates/app/views/re_jobs/show.js.erb +1 -0
- data/rails_generators/templates/app/views/re_pipeline_jobs/_empty.html.erb +11 -0
- data/rails_generators/templates/app/views/re_pipeline_jobs/_index.html.erb +41 -0
- data/rails_generators/templates/app/views/re_pipeline_jobs/index.html.erb +21 -0
- data/rails_generators/templates/app/views/re_pipeline_jobs/index.js.erb +10 -0
- data/rails_generators/templates/app/views/re_pipelines/_change.html.erb +46 -0
- data/rails_generators/templates/app/views/re_pipelines/_change_actions.html.erb +34 -0
- data/rails_generators/templates/app/views/re_pipelines/_confirm.html.erb +40 -0
- data/rails_generators/templates/app/views/re_pipelines/_edit.html.erb +21 -0
- data/rails_generators/templates/app/views/re_pipelines/_empty.html.erb +13 -0
- data/rails_generators/templates/app/views/re_pipelines/_index.html.erb +58 -0
- data/rails_generators/templates/app/views/re_pipelines/_new.html.erb +18 -0
- data/rails_generators/templates/app/views/re_pipelines/_show.html.erb +32 -0
- data/rails_generators/templates/app/views/re_pipelines/_show_actions.html.erb +3 -0
- data/rails_generators/templates/app/views/re_pipelines/change.html.erb +37 -0
- data/rails_generators/templates/app/views/re_pipelines/create.js.erb +8 -0
- data/rails_generators/templates/app/views/re_pipelines/edit.html.erb +11 -0
- data/rails_generators/templates/app/views/re_pipelines/edit.js.erb +5 -0
- data/rails_generators/templates/app/views/re_pipelines/index.html.erb +14 -0
- data/rails_generators/templates/app/views/re_pipelines/new.html.erb +9 -0
- data/rails_generators/templates/app/views/re_pipelines/new.js.erb +5 -0
- data/rails_generators/templates/app/views/re_pipelines/show.html.erb +41 -0
- data/rails_generators/templates/app/views/re_pipelines/update.js.erb +13 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_edit.html.erb +7 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_help.html.erb +2 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_new.html.erb +7 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_pipeline.html.erb +18 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_script.html.erb +26 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_title.html.erb +6 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_word.html.erb +12 -0
- data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_words.html.erb +16 -0
- data/rails_generators/templates/app/views/re_rule_definitions/simple/_edit.html.erb +6 -0
- data/rails_generators/templates/app/views/re_rule_definitions/simple/_help.html.erb +2 -0
- data/rails_generators/templates/app/views/re_rule_definitions/simple/_new.html.erb +6 -0
- data/rails_generators/templates/app/views/re_rule_definitions/template/_edit.html.erb +6 -0
- data/rails_generators/templates/app/views/re_rule_definitions/template/_help.html.erb +2 -0
- data/rails_generators/templates/app/views/re_rule_definitions/template/_new.html.erb +6 -0
- data/rails_generators/templates/app/views/re_rules/_change.html.erb +57 -0
- data/rails_generators/templates/app/views/re_rules/_edit.html.erb +25 -0
- data/rails_generators/templates/app/views/re_rules/_empty.html.erb +12 -0
- data/rails_generators/templates/app/views/re_rules/_empty.js.erb +7 -0
- data/rails_generators/templates/app/views/re_rules/_error.html.erb +3 -0
- data/rails_generators/templates/app/views/re_rules/_help.html.erb +13 -0
- data/rails_generators/templates/app/views/re_rules/_index.html.erb +38 -0
- data/rails_generators/templates/app/views/re_rules/_menu.html.erb +41 -0
- data/rails_generators/templates/app/views/re_rules/_new.html.erb +26 -0
- data/rails_generators/templates/app/views/re_rules/_show.html.erb +43 -0
- data/rails_generators/templates/app/views/re_rules/destroy.js.erb +13 -0
- data/rails_generators/templates/app/views/re_rules/edit.html.erb +11 -0
- data/rails_generators/templates/app/views/re_rules/edit.js.erb +5 -0
- data/rails_generators/templates/app/views/re_rules/error.html.erb +11 -0
- data/rails_generators/templates/app/views/re_rules/error.js.erb +3 -0
- data/rails_generators/templates/app/views/re_rules/help.html.erb +11 -0
- data/rails_generators/templates/app/views/re_rules/help.js.erb +2 -0
- data/rails_generators/templates/app/views/re_rules/new.html.erb +11 -0
- data/rails_generators/templates/app/views/re_rules/new.js.erb +5 -0
- data/rails_generators/templates/app/views/re_rules/update.js.erb +20 -0
- data/rails_generators/templates/db/migrate/20100308225008_create_re_pipelines.rb +74 -0
- data/rails_generators/templates/lib/tasks/re_runner.rake +12 -0
- data/rails_generators/templates/public/images/re_job/error-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/error-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/error-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/error-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/goto-16.png +0 -0
- data/rails_generators/templates/public/images/re_job/info-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/info-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/info-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/info-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/list-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/list-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/list-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/list-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/loadingAnimation.gif +0 -0
- data/rails_generators/templates/public/images/re_job/next-disabled-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-disabled-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-disabled-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-disabled-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-enabled-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-enabled-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-enabled-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/next-enabled-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-disabled-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-disabled-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-disabled-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-disabled-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-enabled-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-enabled-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-enabled-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/prev-enabled-48.png +0 -0
- data/rails_generators/templates/public/images/re_job/success-14.png +0 -0
- data/rails_generators/templates/public/images/re_job/success-18.png +0 -0
- data/rails_generators/templates/public/images/re_job/success-25.png +0 -0
- data/rails_generators/templates/public/images/re_job/success-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/__destroy-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/__destroy-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/__destroy-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/__destroy-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/activate-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/activate-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/activate-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/activate-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/alert-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/alert-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/alert-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/alert-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/change-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/change-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/change-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/change-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/changed-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/changed-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/changed-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/changed-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/current-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/current-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/current-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/current-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/deactivate-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/deactivate-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/deactivate-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/deactivate-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/destroy-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/destroy-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/destroy-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/destroy-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/draft-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/draft-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/draft-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/draft-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/edit-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/edit-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/edit-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/edit-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-down.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/list-right.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/new-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/new-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/new-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/new-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/revert-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/revert-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/revert-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/revert-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/show-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/show-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/show-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/show-48.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/verify-14.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/verify-18.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/verify-25.png +0 -0
- data/rails_generators/templates/public/images/re_pipeline/verify-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/__destroy-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/__destroy-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/__destroy-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/__destroy-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/destroy-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/destroy-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/destroy-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/destroy-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/edit-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/edit-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/edit-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/edit-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/goto-pipeline-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/goto-pipeline-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-off-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-off-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-off-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-down-off-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-off-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-off-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-off-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/move-up-off-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-change-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-change-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-change-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-change-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-show-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-show-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-show-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/next-show-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-failure-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-failure-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-failure-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-failure-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-success-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-success-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-success-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/stop-success-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/valid-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/valid-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/valid-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/valid-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule/verify-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule/verify-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule/verify-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule/verify-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/add-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/add-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/add-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/add-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/help-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/help-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/help-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/help-48.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/list-down.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/list-right.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/new-14.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/new-18.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/new-25.png +0 -0
- data/rails_generators/templates/public/images/re_rule_class/new-48.png +0 -0
- data/rails_generators/templates/public/javascripts/re_jobs.js +59 -0
- data/rails_generators/templates/public/javascripts/re_pipeline.js +54 -0
- data/rails_generators/templates/public/javascripts/re_pipeline_change.js +205 -0
- data/rails_generators/templates/public/javascripts/re_pipeline_index.js +24 -0
- data/rails_generators/templates/public/javascripts/re_pipeline_jobs.js +61 -0
- data/rails_generators/templates/public/javascripts/re_pipeline_new.js +34 -0
- data/rails_generators/templates/public/stylesheets/re_pipeline/accept.png +0 -0
- data/rails_generators/templates/public/stylesheets/re_pipeline/exclamation.png +0 -0
- data/rails_generators/templates/public/stylesheets/re_pipeline.css +509 -0
- data/rails_generators/templates/spec/controllers/re_pipelines_controller_spec.rb +111 -0
- data/rails_generators/templates/spec/models/re_job_audit_spec.rb +24 -0
- data/rails_generators/templates/spec/models/re_job_spec.rb +18 -0
- data/rails_generators/templates/spec/models/re_pipeline_activated_spec.rb +6 -0
- data/rails_generators/templates/spec/models/re_pipeline_base_spec.rb +157 -0
- data/rails_generators/templates/spec/models/re_pipeline_spec.rb +166 -0
- data/rails_generators/templates/spec/models/re_rule_outcome_spec.rb +97 -0
- data/rails_generators/templates/spec/models/re_rule_spec.rb +171 -0
- data/rails_generators/templates/spec/support/blueprint_re_pipelines.rb +11 -0
- data/spec/rules_engine_spec.rb +7 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- data/tasks/rspec.rake +18 -0
- metadata +363 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
|
+
|
|
3
|
+
describe RePipelineBase do
|
|
4
|
+
def valid_attributes
|
|
5
|
+
{
|
|
6
|
+
:code => "AA-MOCK",
|
|
7
|
+
:title => "Mock Title"
|
|
8
|
+
}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should be valid with valid attributes" do
|
|
12
|
+
RePipelineBase.new(valid_attributes).should be_valid
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
should_validate_presence_of :code
|
|
16
|
+
should_validate_presence_of :title
|
|
17
|
+
|
|
18
|
+
describe "unique attributes" do
|
|
19
|
+
before(:each) do
|
|
20
|
+
RePipelineBase.create!(valid_attributes)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should_validate_uniqueness_of :code, :scope => :parent_re_pipeline_id, :case_sensitive => false, :message=>"alread taken."
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should change the code to lower case when creating" do
|
|
27
|
+
src = RePipelineBase.new(valid_attributes.merge(:code => "My code"))
|
|
28
|
+
src.save!
|
|
29
|
+
src.code.should == "my code"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe "code cannot be changed after creation" do
|
|
33
|
+
it "should save the code with a new record" do
|
|
34
|
+
src = RePipelineBase.new(valid_attributes.merge(:code => "my code"))
|
|
35
|
+
src.save!
|
|
36
|
+
src.code.should == "my code"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "should ignore the code attribute for an existing record" do
|
|
40
|
+
src = RePipelineBase.new(valid_attributes.merge(:code => "my code"))
|
|
41
|
+
src.save!
|
|
42
|
+
src.code = "new code"
|
|
43
|
+
src.save!
|
|
44
|
+
src.code.should == "my code"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe "copying the pipeline" do
|
|
49
|
+
|
|
50
|
+
%W(code title description).each do |key|
|
|
51
|
+
it "should copy the attribute #{key}" do
|
|
52
|
+
src = RePipelineBase.new(valid_attributes.merge(key.to_sym => "mock source value"))
|
|
53
|
+
dest = RePipelineBase.new(valid_attributes.merge(key.to_sym => "mock dest value"))
|
|
54
|
+
dest.copy!(src)
|
|
55
|
+
dest.read_attribute(key).should == "mock source value"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should copy the rules" do
|
|
59
|
+
src = RePipelineBase.new(valid_attributes)
|
|
60
|
+
dest = RePipelineBase.new(valid_attributes)
|
|
61
|
+
|
|
62
|
+
src_rule = mock_model(ReRule)
|
|
63
|
+
dest_rule = mock_model(ReRule)
|
|
64
|
+
|
|
65
|
+
ReRule.should_receive(:new).and_return(dest_rule)
|
|
66
|
+
dest_rule.should_receive(:copy!).with(src_rule).and_return(dest_rule)
|
|
67
|
+
|
|
68
|
+
src.should_receive(:re_rules).and_return([src_rule])
|
|
69
|
+
dest.should_receive(:re_rules=).with([dest_rule])
|
|
70
|
+
|
|
71
|
+
dest.copy!(src)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe "comparing pipeline" do
|
|
77
|
+
it "should be equal if the attributes are equal" do
|
|
78
|
+
src = RePipelineBase.new(valid_attributes)
|
|
79
|
+
dest =RePipelineBase.new(valid_attributes)
|
|
80
|
+
dest.equals?(src).should be_true
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
%W(code title description).each do |key|
|
|
84
|
+
it "should not be equal if the attribute #{key} are different" do
|
|
85
|
+
src = RePipelineBase.new(valid_attributes.merge(key.to_sym => "mock source value"))
|
|
86
|
+
dest = RePipelineBase.new(valid_attributes.merge(key.to_sym => "mock dest value"))
|
|
87
|
+
dest.equals?(src).should be_false
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe "equals rule" do
|
|
92
|
+
before(:each) do
|
|
93
|
+
@rule_1 = mock_model(ReRule)
|
|
94
|
+
@rule_2 = mock_model(ReRule)
|
|
95
|
+
@re_pipeline_1 = RePipeline.new(valid_attributes)
|
|
96
|
+
@re_pipeline_2 = RePipeline.new(valid_attributes)
|
|
97
|
+
@re_pipeline_1.stub!(:re_rules).and_return([@rule_1, @rule_2])
|
|
98
|
+
@re_pipeline_2.stub!(:re_rules).and_return([@rule_1, @rule_2])
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
it "should not compare the rules if the the number is different" do
|
|
102
|
+
@re_pipeline_2.stub!(:re_rules).and_return([@rule_1])
|
|
103
|
+
|
|
104
|
+
@rule_1.should_not_receive(:equals?)
|
|
105
|
+
@rule_2.should_not_receive(:equals?)
|
|
106
|
+
|
|
107
|
+
@re_pipeline_1.equals?(@re_pipeline_2)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "should check the equals status of each rule outcome" do
|
|
111
|
+
@rule_1.should_receive(:equals?).with(@rule_1).and_return(true)
|
|
112
|
+
@rule_2.should_receive(:equals?).with(@rule_2).and_return(true)
|
|
113
|
+
|
|
114
|
+
@re_pipeline_1.equals?(@re_pipeline_2).should be_true
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "should stop on the rule outcome equals error" do
|
|
118
|
+
@rule_1.should_receive(:equals?).with(@rule_1).and_return(false)
|
|
119
|
+
@rule_2.should_not_receive(:equals?)
|
|
120
|
+
|
|
121
|
+
@re_pipeline_1.equals?(@re_pipeline_2).should be_false
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
describe "verify the pipeline" do
|
|
127
|
+
it "should return a failed message if there are no rules" do
|
|
128
|
+
src = RePipelineBase.new(valid_attributes.merge(:code => "my code"))
|
|
129
|
+
src.verify.should_not be_blank
|
|
130
|
+
src.verify.should =~ /rules required/
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it "should verify each rule" do
|
|
134
|
+
rule1 = mock_model(ReRule)
|
|
135
|
+
rule2 = mock_model(ReRule)
|
|
136
|
+
re_pipeline = RePipelineBase.new
|
|
137
|
+
re_pipeline.stub!(:re_rules).and_return([rule1, rule2])
|
|
138
|
+
|
|
139
|
+
rule1.should_receive(:verify).at_least(:once).and_return(nil)
|
|
140
|
+
rule2.should_receive(:verify).at_least(:once).and_return(nil)
|
|
141
|
+
|
|
142
|
+
re_pipeline.verify.should be_nil
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "should stop on the first verify error" do
|
|
146
|
+
rule1 = mock_model(ReRule)
|
|
147
|
+
rule2 = mock_model(ReRule)
|
|
148
|
+
re_pipeline = RePipelineBase.new
|
|
149
|
+
re_pipeline.stub!(:re_rules).and_return([rule1, rule2])
|
|
150
|
+
|
|
151
|
+
rule1.should_receive(:verify).at_least(:once).and_return('failed rule 1')
|
|
152
|
+
rule2.should_not_receive(:verify)
|
|
153
|
+
|
|
154
|
+
re_pipeline.verify.should == 'failed rule 1'
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
|
+
# require File.expand_path(File.dirname(__FILE__) + '/re_pipeline_base_spec')
|
|
3
|
+
|
|
4
|
+
describe RePipeline do
|
|
5
|
+
def valid_attributes
|
|
6
|
+
{
|
|
7
|
+
:code => "AA-MOCK",
|
|
8
|
+
:title => "Mock Title"
|
|
9
|
+
}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
should_have_one :activated_re_pipeline
|
|
13
|
+
should_have_many :re_job_audits
|
|
14
|
+
|
|
15
|
+
describe "setting the activated status" do
|
|
16
|
+
before(:each) do
|
|
17
|
+
@re_pipeline = RePipeline.new(valid_attributes)
|
|
18
|
+
@re_pipeline_activated = RePipeline.new(valid_attributes)
|
|
19
|
+
@re_pipeline.stub!(:activated_re_pipeline).and_return(@re_pipeline_activated)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should be set to draft when there is no activated re_pipeline" do
|
|
23
|
+
@re_pipeline.stub!(:activated_re_pipeline).and_return(nil)
|
|
24
|
+
@re_pipeline.stub!(:validate).and_return(true)
|
|
25
|
+
@re_pipeline.save
|
|
26
|
+
@re_pipeline.activated_status.should == RePipelineBase::ACTIVATED_STATUS_DRAFT
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should be active if there is an activated re_pipeline" do
|
|
30
|
+
@re_pipeline.stub!(:validate).and_return(true)
|
|
31
|
+
@re_pipeline.save
|
|
32
|
+
@re_pipeline.activated_status.should == RePipelineBase::ACTIVATED_STATUS_ACTIVE
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "setting the changed status" do
|
|
37
|
+
before(:each) do
|
|
38
|
+
@re_pipeline = RePipeline.new(valid_attributes)
|
|
39
|
+
@re_pipeline_activated = RePipeline.new(valid_attributes)
|
|
40
|
+
@re_pipeline.stub!(:activated_re_pipeline).and_return(@re_pipeline_activated)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should be set to draft when there is no activated re_pipeline" do
|
|
44
|
+
@re_pipeline.stub!(:activated_re_pipeline).and_return(nil)
|
|
45
|
+
@re_pipeline.stub!(:validate).and_return(true)
|
|
46
|
+
@re_pipeline.save
|
|
47
|
+
@re_pipeline.changed_status.should == RePipelineBase::CHANGED_STATUS_DRAFT
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should be set to changed if the activated re_pipeline is not equal" do
|
|
51
|
+
@re_pipeline.should_receive(:equals?).with(@re_pipeline_activated).and_return(false)
|
|
52
|
+
@re_pipeline.save
|
|
53
|
+
@re_pipeline.changed_status.should == RePipelineBase::CHANGED_STATUS_CHANGED
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
describe "activating a re_pipeline" do
|
|
59
|
+
before(:each) do
|
|
60
|
+
@re_pipeline = RePipeline.new(valid_attributes)
|
|
61
|
+
@re_pipeline_activated = RePipelineActivated.new
|
|
62
|
+
RePipelineActivated.stub!(:new).and_return(@re_pipeline_activated)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should create an associated activated re_pipeline if it does not exist" do
|
|
66
|
+
RePipelineActivated.should_receive(:new).and_return(@re_pipeline_activated)
|
|
67
|
+
@re_pipeline.activate!
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should update the activated_status to RePipelineBase::ACTIVATED_STATUS_ACTIVE" do
|
|
71
|
+
@re_pipeline.activate!
|
|
72
|
+
@re_pipeline.activated_status.should == RePipelineBase::ACTIVATED_STATUS_ACTIVE
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "should update the changed_status to RePipelineBase::CHANGED_STATUS_CURRENT" do
|
|
76
|
+
@re_pipeline.activate!
|
|
77
|
+
@re_pipeline.changed_status.should == RePipelineBase::CHANGED_STATUS_CURRENT
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should copy itself to the activated re_pipeline" do
|
|
81
|
+
@re_pipeline_activated.should_receive(:copy!).with(@re_pipeline)
|
|
82
|
+
@re_pipeline.activate!
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "should save the re_pipeline" do
|
|
86
|
+
@re_pipeline.should_receive(:save)
|
|
87
|
+
@re_pipeline.activate!
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "should do the saving in a transaction" do
|
|
91
|
+
RePipeline.should_receive(:transaction)
|
|
92
|
+
@re_pipeline.should_not_receive(:save)
|
|
93
|
+
@re_pipeline.activate!
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "should save the activated re_pipeline if it is not a new record" do
|
|
97
|
+
@re_pipeline.should_receive(:new_record?).at_least(:once).and_return(false)
|
|
98
|
+
@re_pipeline_activated.should_receive(:save!)
|
|
99
|
+
@re_pipeline.activate!
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "should not save the activated re_pipeline if it is a new record" do
|
|
103
|
+
@re_pipeline.should_receive(:new_record?).at_least(:once).and_return(true)
|
|
104
|
+
@re_pipeline_activated.should_not_receive(:save!)
|
|
105
|
+
@re_pipeline.activate!
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
describe "reverting a re_pipeline to it's previous state" do
|
|
110
|
+
before(:each) do
|
|
111
|
+
@re_pipeline = RePipeline.create(valid_attributes)
|
|
112
|
+
@re_pipeline.activate!
|
|
113
|
+
@re_pipeline_activated = @re_pipeline.activated_re_pipeline
|
|
114
|
+
|
|
115
|
+
@re_pipeline.update_attributes(:title => "new title")
|
|
116
|
+
@re_pipeline.changed_status.should == RePipelineBase::CHANGED_STATUS_CHANGED
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "should copy the content from the activated re_pipeline" do
|
|
120
|
+
@re_pipeline.should_receive(:copy!).with(@re_pipeline_activated)
|
|
121
|
+
@re_pipeline.revert!
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "should not try and copy content id there is no activated re_pipeline" do
|
|
125
|
+
@re_pipeline.stub!(:activated_re_pipeline).and_return(nil)
|
|
126
|
+
@re_pipeline.should_not_receive(:copy!)
|
|
127
|
+
@re_pipeline.revert!
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
it "should save the re_pipeline" do
|
|
131
|
+
@re_pipeline.should_receive(:save)
|
|
132
|
+
@re_pipeline.revert!
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "should update the activated_status to RePipelineBase::ACTIVATED_STATUS_ACTIVE" do
|
|
136
|
+
@re_pipeline.revert!
|
|
137
|
+
@re_pipeline.activated_status.should == RePipelineBase::ACTIVATED_STATUS_ACTIVE
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "should update the changed_status to RePipelineBase::CHANGED_STATUS_CURRENT" do
|
|
141
|
+
@re_pipeline.revert!
|
|
142
|
+
@re_pipeline.changed_status.should == RePipelineBase::CHANGED_STATUS_CURRENT
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
describe "changing a re_pipeline" do
|
|
147
|
+
before(:each) do
|
|
148
|
+
@re_pipeline = RePipeline.create(valid_attributes)
|
|
149
|
+
@re_pipeline.activate!
|
|
150
|
+
@re_pipeline_activated = @re_pipeline.activated_re_pipeline
|
|
151
|
+
@re_pipeline.changed_status.should == RePipelineBase::CHANGED_STATUS_CURRENT
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it "should update the activated_status to RePipelineBase::ACTIVATED_STATUS_ACTIVE" do
|
|
155
|
+
@re_pipeline.update_attributes(:title => "new title")
|
|
156
|
+
@re_pipeline.activated_status.should == RePipelineBase::ACTIVATED_STATUS_ACTIVE
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "should update the changed_status to RePipelineBase::CHANGED_STATUS_CHANGED" do
|
|
160
|
+
@re_pipeline.update_attributes(:title => "new title")
|
|
161
|
+
@re_pipeline.changed_status.should == RePipelineBase::CHANGED_STATUS_CHANGED
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
|
+
|
|
3
|
+
describe ReRuleOutcome do
|
|
4
|
+
def valid_attributes
|
|
5
|
+
{
|
|
6
|
+
:outcome => RulesEngine::RuleOutcome::OUTCOME_NEXT
|
|
7
|
+
}
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "should be valid with valid attributes" do
|
|
11
|
+
ReRuleOutcome.new(valid_attributes).should be_valid
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should_validate_presence_of :outcome
|
|
15
|
+
|
|
16
|
+
describe "START PIPELINE" do
|
|
17
|
+
it "should be invalid when the outcome pipeline code is blank" do
|
|
18
|
+
re_rule_outcome = ReRuleOutcome.new(:outcome => RulesEngine::RuleOutcome::OUTCOME_START_PIPELINE)
|
|
19
|
+
re_rule_outcome.should_not be_valid
|
|
20
|
+
re_rule_outcome.errors.on(:pipeline_code).should_not be_blank
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should be valid when outcome pipeline code is present" do
|
|
24
|
+
re_rule_outcome = ReRuleOutcome.new(:outcome => RulesEngine::RuleOutcome::OUTCOME_START_PIPELINE, :pipeline_code => "mock code")
|
|
25
|
+
re_rule_outcome.should be_valid
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "copying the details from another rule outcome" do
|
|
30
|
+
|
|
31
|
+
%W(pipeline_code).each do |key|
|
|
32
|
+
it "should copy the attribute #{key}" do
|
|
33
|
+
src = ReRuleOutcome.new(valid_attributes.merge(key.to_sym => "mock source value"))
|
|
34
|
+
dest = ReRuleOutcome.new(valid_attributes.merge(key.to_sym => "mock dest value"))
|
|
35
|
+
dest.copy!(src)
|
|
36
|
+
dest.read_attribute(key).should == "mock source value"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
%W(outcome).each do |key|
|
|
41
|
+
it "should copy the attribute #{key}" do
|
|
42
|
+
src = ReRuleOutcome.new(valid_attributes.merge(key.to_sym => 101))
|
|
43
|
+
dest = ReRuleOutcome.new(valid_attributes.merge(key.to_sym => 202))
|
|
44
|
+
dest.copy!(src)
|
|
45
|
+
dest.read_attribute(key).should == 101
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe "comparing rule outcomes" do
|
|
51
|
+
it "should be equal if the attributes are equal" do
|
|
52
|
+
src = ReRuleOutcome.new(valid_attributes)
|
|
53
|
+
dest = ReRuleOutcome.new(valid_attributes)
|
|
54
|
+
dest.equals?(src).should be_true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
%W(outcome).each do |key|
|
|
58
|
+
it "should not be equal if the attribute #{key} are different" do
|
|
59
|
+
src = ReRuleOutcome.new(valid_attributes.merge(key.to_sym => 101))
|
|
60
|
+
dest = ReRuleOutcome.new(valid_attributes.merge(key.to_sym => 202))
|
|
61
|
+
dest.equals?(src).should be_false
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should not be equal if the outcome is OUTCOME_START_PIPELINE and pipeline_code are different" do
|
|
66
|
+
src = ReRuleOutcome.new(:outcome => RulesEngine::RuleOutcome::OUTCOME_START_PIPELINE, :pipeline_code => "value 1")
|
|
67
|
+
dest = ReRuleOutcome.new(:outcome => RulesEngine::RuleOutcome::OUTCOME_START_PIPELINE, :pipeline_code => "value 2")
|
|
68
|
+
dest.equals?(src).should be_false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe "verify the rule outcome" do
|
|
74
|
+
it "should be nil if the outcome is OUTCOME_NEXT" do
|
|
75
|
+
ReRuleOutcome.new(valid_attributes.merge(:outcome => RulesEngine::RuleOutcome::OUTCOME_NEXT)).verify.should be_nil
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should be nil if the outcome is OUTCOME_STOP_SUCCESS" do
|
|
79
|
+
ReRuleOutcome.new(valid_attributes.merge(:outcome => RulesEngine::RuleOutcome::OUTCOME_NEXT)).verify.should be_nil
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "should be nil if the outcome is OUTCOME_STOP_FAILURE" do
|
|
83
|
+
ReRuleOutcome.new(valid_attributes.merge(:outcome => RulesEngine::RuleOutcome::OUTCOME_STOP_FAILURE)).verify.should be_nil
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "should be valid if the outcome is OUTCOME_START_PIPELINE and the pipleine exists" do
|
|
87
|
+
RePipeline.should_receive(:find).with(:first, {:conditions=>["code = ?", "value 2"]}).and_return(true)
|
|
88
|
+
ReRuleOutcome.new(valid_attributes.merge(:outcome => RulesEngine::RuleOutcome::OUTCOME_START_PIPELINE, :pipeline_code => "value 2")).verify.should be_nil
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "should be invalid if the outcome is OUTCOME_START_PIPELINE and the pipleine does not exist" do
|
|
92
|
+
RePipeline.should_receive(:find).with(:first, {:conditions=>["code = ?", "value 2"]}).and_return(nil)
|
|
93
|
+
ReRuleOutcome.new(valid_attributes.merge(:outcome => RulesEngine::RuleOutcome::OUTCOME_START_PIPELINE, :pipeline_code => "value 2")).verify.should == "outcome pipeline missing"
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
|
+
|
|
3
|
+
describe ReRule do
|
|
4
|
+
def valid_attributes
|
|
5
|
+
{
|
|
6
|
+
:title => "Mock Title",
|
|
7
|
+
:rule_class => "Mock Type",
|
|
8
|
+
:summary => "Mock Summary",
|
|
9
|
+
:data_version => 0,
|
|
10
|
+
:data => "Lots Of Data"
|
|
11
|
+
}
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should be valid with valid attributes" do
|
|
15
|
+
ReRule.new(valid_attributes).should be_valid
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should_have_many :re_rule_outcomes
|
|
19
|
+
should_have_many :re_job_audits
|
|
20
|
+
|
|
21
|
+
should_validate_presence_of :title
|
|
22
|
+
should_validate_presence_of :rule_class
|
|
23
|
+
should_validate_presence_of :summary
|
|
24
|
+
should_validate_presence_of :data_version
|
|
25
|
+
should_validate_presence_of :data
|
|
26
|
+
|
|
27
|
+
describe "copying the rule" do
|
|
28
|
+
|
|
29
|
+
%W(title rule_class summary data error).each do |key|
|
|
30
|
+
it "should copy the attribute #{key}" do
|
|
31
|
+
src = ReRule.new(valid_attributes.merge(key.to_sym => "mock source value"))
|
|
32
|
+
dest = ReRule.new(valid_attributes.merge(key.to_sym => "mock dest value"))
|
|
33
|
+
dest.copy!(src)
|
|
34
|
+
dest.read_attribute(key).should == "mock source value"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
%W(position data_version).each do |key|
|
|
39
|
+
it "should copy the attribute #{key}" do
|
|
40
|
+
src = ReRule.new(valid_attributes.merge(key.to_sym => 101))
|
|
41
|
+
dest = ReRule.new(valid_attributes.merge(key.to_sym => 202))
|
|
42
|
+
dest.copy!(src)
|
|
43
|
+
dest.read_attribute(key).should == 101
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should copy the rule outcomes" do
|
|
48
|
+
src = ReRule.new(valid_attributes)
|
|
49
|
+
dest = ReRule.new(valid_attributes)
|
|
50
|
+
|
|
51
|
+
src_outcome = mock_model(ReRuleOutcome)
|
|
52
|
+
dest_outcome = mock_model(ReRuleOutcome )
|
|
53
|
+
|
|
54
|
+
ReRuleOutcome.should_receive(:new).and_return(dest_outcome)
|
|
55
|
+
dest_outcome.should_receive(:copy!).with(src_outcome).and_return(dest_outcome)
|
|
56
|
+
|
|
57
|
+
src.should_receive(:re_rule_outcomes).and_return([src_outcome])
|
|
58
|
+
dest.should_receive(:re_rule_outcomes=).with([dest_outcome])
|
|
59
|
+
|
|
60
|
+
dest.copy!(src)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe "comparing rules" do
|
|
65
|
+
it "should be equal if the attributes are equal" do
|
|
66
|
+
src = ReRule.new(valid_attributes)
|
|
67
|
+
dest = ReRule.new(valid_attributes)
|
|
68
|
+
dest.equals?(src).should be_true
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
%W(title rule_class summary data).each do |key|
|
|
72
|
+
it "should not be equal if the attribute #{key} are different" do
|
|
73
|
+
src = ReRule.new(valid_attributes.merge(key.to_sym => "mock source value"))
|
|
74
|
+
dest = ReRule.new(valid_attributes.merge(key.to_sym => "mock dest value"))
|
|
75
|
+
dest.equals?(src).should be_false
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
%W(position data_version).each do |key|
|
|
80
|
+
it "should not be equal if the attribute #{key} are different" do
|
|
81
|
+
src = ReRule.new(valid_attributes.merge(key.to_sym => 101))
|
|
82
|
+
dest = ReRule.new(valid_attributes.merge(key.to_sym => 202))
|
|
83
|
+
dest.equals?(src).should be_false
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe "equals rule outcome" do
|
|
88
|
+
before(:each) do
|
|
89
|
+
@re_rule_re_rule_outcome_1 = mock_model(ReRuleOutcome)
|
|
90
|
+
@re_rule_re_rule_outcome_2 = mock_model(ReRuleOutcome)
|
|
91
|
+
@re_rule_1 = ReRule.new(valid_attributes)
|
|
92
|
+
@re_rule_2 = ReRule.new(valid_attributes)
|
|
93
|
+
@re_rule_1.stub!(:re_rule_outcomes).and_return([@re_rule_re_rule_outcome_1, @re_rule_re_rule_outcome_2])
|
|
94
|
+
@re_rule_2.stub!(:re_rule_outcomes).and_return([@re_rule_re_rule_outcome_1, @re_rule_re_rule_outcome_2])
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
it "should not compare the outcomes if the the number is different" do
|
|
98
|
+
@re_rule_2.stub!(:re_rule_outcomes).and_return([@re_rule_re_rule_outcome_1])
|
|
99
|
+
|
|
100
|
+
@re_rule_re_rule_outcome_1.should_not_receive(:equals?)
|
|
101
|
+
@re_rule_re_rule_outcome_2.should_not_receive(:equals?)
|
|
102
|
+
|
|
103
|
+
@re_rule_1.equals?(@re_rule_2)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "should check the equals status of each rule outcome" do
|
|
107
|
+
@re_rule_re_rule_outcome_1.should_receive(:equals?).with(@re_rule_re_rule_outcome_1).and_return(true)
|
|
108
|
+
@re_rule_re_rule_outcome_2.should_receive(:equals?).with(@re_rule_re_rule_outcome_2).and_return(true)
|
|
109
|
+
|
|
110
|
+
@re_rule_1.equals?(@re_rule_2).should be_true
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "should stop on the rule outcome equals error" do
|
|
114
|
+
@re_rule_re_rule_outcome_1.should_receive(:equals?).with(@re_rule_re_rule_outcome_1).and_return(false)
|
|
115
|
+
@re_rule_re_rule_outcome_2.should_not_receive(:equals?)
|
|
116
|
+
|
|
117
|
+
@re_rule_1.equals?(@re_rule_2).should be_false
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
describe "verify the rule" do
|
|
123
|
+
it "should return the rule_error if not blank" do
|
|
124
|
+
src = ReRule.new(valid_attributes.merge(:error => "mock rule error"))
|
|
125
|
+
src.verify.should_not be_blank
|
|
126
|
+
src.verify.should == "mock rule error"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should verify each rule outcome" do
|
|
130
|
+
re_rule_outcome_1 = mock_model(ReRule)
|
|
131
|
+
re_rule_outcome_2 = mock_model(ReRule)
|
|
132
|
+
re_rule = ReRule.new
|
|
133
|
+
re_rule.stub!(:re_rule_outcomes).and_return([re_rule_outcome_1, re_rule_outcome_2])
|
|
134
|
+
|
|
135
|
+
re_rule_outcome_1.should_receive(:verify).at_least(:once).and_return(nil)
|
|
136
|
+
re_rule_outcome_2.should_receive(:verify).at_least(:once).and_return(nil)
|
|
137
|
+
|
|
138
|
+
re_rule.verify.should be_nil
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "should stop on the first verify error" do
|
|
142
|
+
re_rule_outcome_1 = mock_model(ReRule)
|
|
143
|
+
re_rule_outcome_2 = mock_model(ReRule)
|
|
144
|
+
re_rule = ReRule.new
|
|
145
|
+
re_rule.stub!(:re_rule_outcomes).and_return([re_rule_outcome_1, re_rule_outcome_2])
|
|
146
|
+
|
|
147
|
+
re_rule_outcome_1.should_receive(:verify).at_least(:once).and_return("mock fail error")
|
|
148
|
+
re_rule_outcome_2.should_not_receive(:verify)
|
|
149
|
+
|
|
150
|
+
re_rule.verify.should == "mock fail error"
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
describe "moving items up in a list" do
|
|
155
|
+
it "should move a rule down in the list" do
|
|
156
|
+
base = RePipelineBase.create!(:code => "AA-MOCK",:title => "Mock Title")
|
|
157
|
+
re_rule_1 = ReRule.new(valid_attributes)
|
|
158
|
+
re_rule_2 = ReRule.new(valid_attributes)
|
|
159
|
+
base.re_rules << re_rule_1
|
|
160
|
+
base.re_rules << re_rule_2
|
|
161
|
+
|
|
162
|
+
base.reload
|
|
163
|
+
|
|
164
|
+
base.re_rules.should == [re_rule_1, re_rule_2]
|
|
165
|
+
base.re_rules[1].move_higher
|
|
166
|
+
base.reload
|
|
167
|
+
|
|
168
|
+
base.re_rules.should == [re_rule_2, re_rule_1]
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# PIPELINES
|
|
2
|
+
RePipeline.blueprint do
|
|
3
|
+
title { | index | "#{Faker::Lorem.words(2).join(' ')} #{index} #{Faker::Lorem.words(2).join(' ')}" }
|
|
4
|
+
description { Faker::Lorem.sentence }
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
RePipelineActivated.blueprint do
|
|
8
|
+
title { | index | "#{Faker::Lorem.words(2).join(' ')} #{index} #{Faker::Lorem.words(2).join(' ')}" }
|
|
9
|
+
description { Faker::Lorem.sentence }
|
|
10
|
+
end
|
|
11
|
+
|
data/spec/spec.opts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
data/tasks/rspec.rake
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'spec/rake/spectask'
|
|
2
|
+
|
|
3
|
+
desc "Run all specs in spec directory"
|
|
4
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
|
5
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
namespace :spec do
|
|
9
|
+
desc "Run all specs in spec directory with RCov (excluding plugin specs)"
|
|
10
|
+
Spec::Rake::SpecTask.new(:rcov) do |t|
|
|
11
|
+
t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/../spec/spec.opts\""]
|
|
12
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
|
13
|
+
t.rcov = true
|
|
14
|
+
t.rcov_opts = lambda do
|
|
15
|
+
IO.readlines("#{File.dirname(__FILE__)}/../spec/rcov.opts").map {|l| l.chomp.split " "}.flatten
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|