rules_engine 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (288) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +17 -0
  3. data/VERSION +1 -0
  4. data/init.rb +1 -0
  5. data/lib/rules_engine/cache.rb +26 -0
  6. data/lib/rules_engine/discovery.rb +51 -0
  7. data/lib/rules_engine/job_runner.rb +115 -0
  8. data/lib/rules_engine/rule.rb +60 -0
  9. data/lib/rules_engine/rule_outcome.rb +13 -0
  10. data/lib/rules_engine.rb +6 -0
  11. data/rails_generators/USAGE +68 -0
  12. data/rails_generators/blacklist_word.yml +6 -0
  13. data/rails_generators/blacklist_word_manifest.rb +26 -0
  14. data/rails_generators/generator.yml +58 -0
  15. data/rails_generators/generator_manifest.rb +282 -0
  16. data/rails_generators/rules_engine_generator.rb +35 -0
  17. data/rails_generators/simple.yml +6 -0
  18. data/rails_generators/simple_manifest.rb +21 -0
  19. data/rails_generators/template_manifest.rb +13 -0
  20. data/rails_generators/templates/app/controllers/re_jobs_controller.rb +18 -0
  21. data/rails_generators/templates/app/controllers/re_pipeline_jobs_controller.rb +17 -0
  22. data/rails_generators/templates/app/controllers/re_pipelines_controller.rb +143 -0
  23. data/rails_generators/templates/app/controllers/re_rules_controller.rb +140 -0
  24. data/rails_generators/templates/app/helpers/re_pipeline_helper.rb +29 -0
  25. data/rails_generators/templates/app/models/re_job.rb +123 -0
  26. data/rails_generators/templates/app/models/re_job_audit.rb +21 -0
  27. data/rails_generators/templates/app/models/re_pipeline.rb +69 -0
  28. data/rails_generators/templates/app/models/re_pipeline_activated.rb +26 -0
  29. data/rails_generators/templates/app/models/re_pipeline_activated_observer.rb +11 -0
  30. data/rails_generators/templates/app/models/re_pipeline_base.rb +68 -0
  31. data/rails_generators/templates/app/models/re_rule.rb +78 -0
  32. data/rails_generators/templates/app/models/re_rule_outcome.rb +40 -0
  33. data/rails_generators/templates/app/rules/blacklist_word.rb +89 -0
  34. data/rails_generators/templates/app/rules/simple.rb +44 -0
  35. data/rails_generators/templates/app/rules/template.rb +51 -0
  36. data/rails_generators/templates/app/views/layouts/_blockUI.html.erb +3 -0
  37. data/rails_generators/templates/app/views/re_jobs/_empty.html.erb +11 -0
  38. data/rails_generators/templates/app/views/re_jobs/_index.html.erb +66 -0
  39. data/rails_generators/templates/app/views/re_jobs/_show.html.erb +43 -0
  40. data/rails_generators/templates/app/views/re_jobs/index.html.erb +21 -0
  41. data/rails_generators/templates/app/views/re_jobs/index.js.erb +9 -0
  42. data/rails_generators/templates/app/views/re_jobs/show.html.erb +12 -0
  43. data/rails_generators/templates/app/views/re_jobs/show.js.erb +1 -0
  44. data/rails_generators/templates/app/views/re_pipeline_jobs/_empty.html.erb +11 -0
  45. data/rails_generators/templates/app/views/re_pipeline_jobs/_index.html.erb +41 -0
  46. data/rails_generators/templates/app/views/re_pipeline_jobs/index.html.erb +21 -0
  47. data/rails_generators/templates/app/views/re_pipeline_jobs/index.js.erb +10 -0
  48. data/rails_generators/templates/app/views/re_pipelines/_change.html.erb +46 -0
  49. data/rails_generators/templates/app/views/re_pipelines/_change_actions.html.erb +34 -0
  50. data/rails_generators/templates/app/views/re_pipelines/_confirm.html.erb +40 -0
  51. data/rails_generators/templates/app/views/re_pipelines/_edit.html.erb +21 -0
  52. data/rails_generators/templates/app/views/re_pipelines/_empty.html.erb +13 -0
  53. data/rails_generators/templates/app/views/re_pipelines/_index.html.erb +58 -0
  54. data/rails_generators/templates/app/views/re_pipelines/_new.html.erb +18 -0
  55. data/rails_generators/templates/app/views/re_pipelines/_show.html.erb +32 -0
  56. data/rails_generators/templates/app/views/re_pipelines/_show_actions.html.erb +3 -0
  57. data/rails_generators/templates/app/views/re_pipelines/change.html.erb +37 -0
  58. data/rails_generators/templates/app/views/re_pipelines/create.js.erb +8 -0
  59. data/rails_generators/templates/app/views/re_pipelines/edit.html.erb +11 -0
  60. data/rails_generators/templates/app/views/re_pipelines/edit.js.erb +5 -0
  61. data/rails_generators/templates/app/views/re_pipelines/index.html.erb +14 -0
  62. data/rails_generators/templates/app/views/re_pipelines/new.html.erb +9 -0
  63. data/rails_generators/templates/app/views/re_pipelines/new.js.erb +5 -0
  64. data/rails_generators/templates/app/views/re_pipelines/show.html.erb +41 -0
  65. data/rails_generators/templates/app/views/re_pipelines/update.js.erb +13 -0
  66. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_edit.html.erb +7 -0
  67. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_help.html.erb +2 -0
  68. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_new.html.erb +7 -0
  69. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_pipeline.html.erb +18 -0
  70. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_script.html.erb +26 -0
  71. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_title.html.erb +6 -0
  72. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_word.html.erb +12 -0
  73. data/rails_generators/templates/app/views/re_rule_definitions/blacklist_word/_words.html.erb +16 -0
  74. data/rails_generators/templates/app/views/re_rule_definitions/simple/_edit.html.erb +6 -0
  75. data/rails_generators/templates/app/views/re_rule_definitions/simple/_help.html.erb +2 -0
  76. data/rails_generators/templates/app/views/re_rule_definitions/simple/_new.html.erb +6 -0
  77. data/rails_generators/templates/app/views/re_rule_definitions/template/_edit.html.erb +6 -0
  78. data/rails_generators/templates/app/views/re_rule_definitions/template/_help.html.erb +2 -0
  79. data/rails_generators/templates/app/views/re_rule_definitions/template/_new.html.erb +6 -0
  80. data/rails_generators/templates/app/views/re_rules/_change.html.erb +57 -0
  81. data/rails_generators/templates/app/views/re_rules/_edit.html.erb +25 -0
  82. data/rails_generators/templates/app/views/re_rules/_empty.html.erb +12 -0
  83. data/rails_generators/templates/app/views/re_rules/_empty.js.erb +7 -0
  84. data/rails_generators/templates/app/views/re_rules/_error.html.erb +3 -0
  85. data/rails_generators/templates/app/views/re_rules/_help.html.erb +13 -0
  86. data/rails_generators/templates/app/views/re_rules/_index.html.erb +38 -0
  87. data/rails_generators/templates/app/views/re_rules/_menu.html.erb +41 -0
  88. data/rails_generators/templates/app/views/re_rules/_new.html.erb +26 -0
  89. data/rails_generators/templates/app/views/re_rules/_show.html.erb +43 -0
  90. data/rails_generators/templates/app/views/re_rules/destroy.js.erb +13 -0
  91. data/rails_generators/templates/app/views/re_rules/edit.html.erb +11 -0
  92. data/rails_generators/templates/app/views/re_rules/edit.js.erb +5 -0
  93. data/rails_generators/templates/app/views/re_rules/error.html.erb +11 -0
  94. data/rails_generators/templates/app/views/re_rules/error.js.erb +3 -0
  95. data/rails_generators/templates/app/views/re_rules/help.html.erb +11 -0
  96. data/rails_generators/templates/app/views/re_rules/help.js.erb +2 -0
  97. data/rails_generators/templates/app/views/re_rules/new.html.erb +11 -0
  98. data/rails_generators/templates/app/views/re_rules/new.js.erb +5 -0
  99. data/rails_generators/templates/app/views/re_rules/update.js.erb +20 -0
  100. data/rails_generators/templates/db/migrate/20100308225008_create_re_pipelines.rb +74 -0
  101. data/rails_generators/templates/lib/tasks/re_runner.rake +12 -0
  102. data/rails_generators/templates/public/images/re_job/error-14.png +0 -0
  103. data/rails_generators/templates/public/images/re_job/error-18.png +0 -0
  104. data/rails_generators/templates/public/images/re_job/error-25.png +0 -0
  105. data/rails_generators/templates/public/images/re_job/error-48.png +0 -0
  106. data/rails_generators/templates/public/images/re_job/goto-16.png +0 -0
  107. data/rails_generators/templates/public/images/re_job/info-14.png +0 -0
  108. data/rails_generators/templates/public/images/re_job/info-18.png +0 -0
  109. data/rails_generators/templates/public/images/re_job/info-25.png +0 -0
  110. data/rails_generators/templates/public/images/re_job/info-48.png +0 -0
  111. data/rails_generators/templates/public/images/re_job/list-14.png +0 -0
  112. data/rails_generators/templates/public/images/re_job/list-18.png +0 -0
  113. data/rails_generators/templates/public/images/re_job/list-25.png +0 -0
  114. data/rails_generators/templates/public/images/re_job/list-48.png +0 -0
  115. data/rails_generators/templates/public/images/re_job/loadingAnimation.gif +0 -0
  116. data/rails_generators/templates/public/images/re_job/next-disabled-14.png +0 -0
  117. data/rails_generators/templates/public/images/re_job/next-disabled-18.png +0 -0
  118. data/rails_generators/templates/public/images/re_job/next-disabled-25.png +0 -0
  119. data/rails_generators/templates/public/images/re_job/next-disabled-48.png +0 -0
  120. data/rails_generators/templates/public/images/re_job/next-enabled-14.png +0 -0
  121. data/rails_generators/templates/public/images/re_job/next-enabled-18.png +0 -0
  122. data/rails_generators/templates/public/images/re_job/next-enabled-25.png +0 -0
  123. data/rails_generators/templates/public/images/re_job/next-enabled-48.png +0 -0
  124. data/rails_generators/templates/public/images/re_job/prev-disabled-14.png +0 -0
  125. data/rails_generators/templates/public/images/re_job/prev-disabled-18.png +0 -0
  126. data/rails_generators/templates/public/images/re_job/prev-disabled-25.png +0 -0
  127. data/rails_generators/templates/public/images/re_job/prev-disabled-48.png +0 -0
  128. data/rails_generators/templates/public/images/re_job/prev-enabled-14.png +0 -0
  129. data/rails_generators/templates/public/images/re_job/prev-enabled-18.png +0 -0
  130. data/rails_generators/templates/public/images/re_job/prev-enabled-25.png +0 -0
  131. data/rails_generators/templates/public/images/re_job/prev-enabled-48.png +0 -0
  132. data/rails_generators/templates/public/images/re_job/success-14.png +0 -0
  133. data/rails_generators/templates/public/images/re_job/success-18.png +0 -0
  134. data/rails_generators/templates/public/images/re_job/success-25.png +0 -0
  135. data/rails_generators/templates/public/images/re_job/success-48.png +0 -0
  136. data/rails_generators/templates/public/images/re_pipeline/__destroy-14.png +0 -0
  137. data/rails_generators/templates/public/images/re_pipeline/__destroy-18.png +0 -0
  138. data/rails_generators/templates/public/images/re_pipeline/__destroy-25.png +0 -0
  139. data/rails_generators/templates/public/images/re_pipeline/__destroy-48.png +0 -0
  140. data/rails_generators/templates/public/images/re_pipeline/activate-14.png +0 -0
  141. data/rails_generators/templates/public/images/re_pipeline/activate-18.png +0 -0
  142. data/rails_generators/templates/public/images/re_pipeline/activate-25.png +0 -0
  143. data/rails_generators/templates/public/images/re_pipeline/activate-48.png +0 -0
  144. data/rails_generators/templates/public/images/re_pipeline/alert-14.png +0 -0
  145. data/rails_generators/templates/public/images/re_pipeline/alert-18.png +0 -0
  146. data/rails_generators/templates/public/images/re_pipeline/alert-25.png +0 -0
  147. data/rails_generators/templates/public/images/re_pipeline/alert-48.png +0 -0
  148. data/rails_generators/templates/public/images/re_pipeline/change-14.png +0 -0
  149. data/rails_generators/templates/public/images/re_pipeline/change-18.png +0 -0
  150. data/rails_generators/templates/public/images/re_pipeline/change-25.png +0 -0
  151. data/rails_generators/templates/public/images/re_pipeline/change-48.png +0 -0
  152. data/rails_generators/templates/public/images/re_pipeline/changed-14.png +0 -0
  153. data/rails_generators/templates/public/images/re_pipeline/changed-18.png +0 -0
  154. data/rails_generators/templates/public/images/re_pipeline/changed-25.png +0 -0
  155. data/rails_generators/templates/public/images/re_pipeline/changed-48.png +0 -0
  156. data/rails_generators/templates/public/images/re_pipeline/current-14.png +0 -0
  157. data/rails_generators/templates/public/images/re_pipeline/current-18.png +0 -0
  158. data/rails_generators/templates/public/images/re_pipeline/current-25.png +0 -0
  159. data/rails_generators/templates/public/images/re_pipeline/current-48.png +0 -0
  160. data/rails_generators/templates/public/images/re_pipeline/deactivate-14.png +0 -0
  161. data/rails_generators/templates/public/images/re_pipeline/deactivate-18.png +0 -0
  162. data/rails_generators/templates/public/images/re_pipeline/deactivate-25.png +0 -0
  163. data/rails_generators/templates/public/images/re_pipeline/deactivate-48.png +0 -0
  164. data/rails_generators/templates/public/images/re_pipeline/destroy-14.png +0 -0
  165. data/rails_generators/templates/public/images/re_pipeline/destroy-18.png +0 -0
  166. data/rails_generators/templates/public/images/re_pipeline/destroy-25.png +0 -0
  167. data/rails_generators/templates/public/images/re_pipeline/destroy-48.png +0 -0
  168. data/rails_generators/templates/public/images/re_pipeline/draft-14.png +0 -0
  169. data/rails_generators/templates/public/images/re_pipeline/draft-18.png +0 -0
  170. data/rails_generators/templates/public/images/re_pipeline/draft-25.png +0 -0
  171. data/rails_generators/templates/public/images/re_pipeline/draft-48.png +0 -0
  172. data/rails_generators/templates/public/images/re_pipeline/edit-14.png +0 -0
  173. data/rails_generators/templates/public/images/re_pipeline/edit-18.png +0 -0
  174. data/rails_generators/templates/public/images/re_pipeline/edit-25.png +0 -0
  175. data/rails_generators/templates/public/images/re_pipeline/edit-48.png +0 -0
  176. data/rails_generators/templates/public/images/re_pipeline/list-14.png +0 -0
  177. data/rails_generators/templates/public/images/re_pipeline/list-18.png +0 -0
  178. data/rails_generators/templates/public/images/re_pipeline/list-25.png +0 -0
  179. data/rails_generators/templates/public/images/re_pipeline/list-48.png +0 -0
  180. data/rails_generators/templates/public/images/re_pipeline/list-down.png +0 -0
  181. data/rails_generators/templates/public/images/re_pipeline/list-right.png +0 -0
  182. data/rails_generators/templates/public/images/re_pipeline/new-14.png +0 -0
  183. data/rails_generators/templates/public/images/re_pipeline/new-18.png +0 -0
  184. data/rails_generators/templates/public/images/re_pipeline/new-25.png +0 -0
  185. data/rails_generators/templates/public/images/re_pipeline/new-48.png +0 -0
  186. data/rails_generators/templates/public/images/re_pipeline/revert-14.png +0 -0
  187. data/rails_generators/templates/public/images/re_pipeline/revert-18.png +0 -0
  188. data/rails_generators/templates/public/images/re_pipeline/revert-25.png +0 -0
  189. data/rails_generators/templates/public/images/re_pipeline/revert-48.png +0 -0
  190. data/rails_generators/templates/public/images/re_pipeline/show-14.png +0 -0
  191. data/rails_generators/templates/public/images/re_pipeline/show-18.png +0 -0
  192. data/rails_generators/templates/public/images/re_pipeline/show-25.png +0 -0
  193. data/rails_generators/templates/public/images/re_pipeline/show-48.png +0 -0
  194. data/rails_generators/templates/public/images/re_pipeline/verify-14.png +0 -0
  195. data/rails_generators/templates/public/images/re_pipeline/verify-18.png +0 -0
  196. data/rails_generators/templates/public/images/re_pipeline/verify-25.png +0 -0
  197. data/rails_generators/templates/public/images/re_pipeline/verify-48.png +0 -0
  198. data/rails_generators/templates/public/images/re_rule/__destroy-14.png +0 -0
  199. data/rails_generators/templates/public/images/re_rule/__destroy-18.png +0 -0
  200. data/rails_generators/templates/public/images/re_rule/__destroy-25.png +0 -0
  201. data/rails_generators/templates/public/images/re_rule/__destroy-48.png +0 -0
  202. data/rails_generators/templates/public/images/re_rule/destroy-14.png +0 -0
  203. data/rails_generators/templates/public/images/re_rule/destroy-18.png +0 -0
  204. data/rails_generators/templates/public/images/re_rule/destroy-25.png +0 -0
  205. data/rails_generators/templates/public/images/re_rule/destroy-48.png +0 -0
  206. data/rails_generators/templates/public/images/re_rule/edit-14.png +0 -0
  207. data/rails_generators/templates/public/images/re_rule/edit-18.png +0 -0
  208. data/rails_generators/templates/public/images/re_rule/edit-25.png +0 -0
  209. data/rails_generators/templates/public/images/re_rule/edit-48.png +0 -0
  210. data/rails_generators/templates/public/images/re_rule/goto-pipeline-14.png +0 -0
  211. data/rails_generators/templates/public/images/re_rule/goto-pipeline-18.png +0 -0
  212. data/rails_generators/templates/public/images/re_rule/move-down-14.png +0 -0
  213. data/rails_generators/templates/public/images/re_rule/move-down-18.png +0 -0
  214. data/rails_generators/templates/public/images/re_rule/move-down-25.png +0 -0
  215. data/rails_generators/templates/public/images/re_rule/move-down-48.png +0 -0
  216. data/rails_generators/templates/public/images/re_rule/move-down-off-14.png +0 -0
  217. data/rails_generators/templates/public/images/re_rule/move-down-off-18.png +0 -0
  218. data/rails_generators/templates/public/images/re_rule/move-down-off-25.png +0 -0
  219. data/rails_generators/templates/public/images/re_rule/move-down-off-48.png +0 -0
  220. data/rails_generators/templates/public/images/re_rule/move-up-14.png +0 -0
  221. data/rails_generators/templates/public/images/re_rule/move-up-18.png +0 -0
  222. data/rails_generators/templates/public/images/re_rule/move-up-25.png +0 -0
  223. data/rails_generators/templates/public/images/re_rule/move-up-48.png +0 -0
  224. data/rails_generators/templates/public/images/re_rule/move-up-off-14.png +0 -0
  225. data/rails_generators/templates/public/images/re_rule/move-up-off-18.png +0 -0
  226. data/rails_generators/templates/public/images/re_rule/move-up-off-25.png +0 -0
  227. data/rails_generators/templates/public/images/re_rule/move-up-off-48.png +0 -0
  228. data/rails_generators/templates/public/images/re_rule/next-change-14.png +0 -0
  229. data/rails_generators/templates/public/images/re_rule/next-change-18.png +0 -0
  230. data/rails_generators/templates/public/images/re_rule/next-change-25.png +0 -0
  231. data/rails_generators/templates/public/images/re_rule/next-change-48.png +0 -0
  232. data/rails_generators/templates/public/images/re_rule/next-show-14.png +0 -0
  233. data/rails_generators/templates/public/images/re_rule/next-show-18.png +0 -0
  234. data/rails_generators/templates/public/images/re_rule/next-show-25.png +0 -0
  235. data/rails_generators/templates/public/images/re_rule/next-show-48.png +0 -0
  236. data/rails_generators/templates/public/images/re_rule/stop-failure-14.png +0 -0
  237. data/rails_generators/templates/public/images/re_rule/stop-failure-18.png +0 -0
  238. data/rails_generators/templates/public/images/re_rule/stop-failure-25.png +0 -0
  239. data/rails_generators/templates/public/images/re_rule/stop-failure-48.png +0 -0
  240. data/rails_generators/templates/public/images/re_rule/stop-success-14.png +0 -0
  241. data/rails_generators/templates/public/images/re_rule/stop-success-18.png +0 -0
  242. data/rails_generators/templates/public/images/re_rule/stop-success-25.png +0 -0
  243. data/rails_generators/templates/public/images/re_rule/stop-success-48.png +0 -0
  244. data/rails_generators/templates/public/images/re_rule/valid-14.png +0 -0
  245. data/rails_generators/templates/public/images/re_rule/valid-18.png +0 -0
  246. data/rails_generators/templates/public/images/re_rule/valid-25.png +0 -0
  247. data/rails_generators/templates/public/images/re_rule/valid-48.png +0 -0
  248. data/rails_generators/templates/public/images/re_rule/verify-14.png +0 -0
  249. data/rails_generators/templates/public/images/re_rule/verify-18.png +0 -0
  250. data/rails_generators/templates/public/images/re_rule/verify-25.png +0 -0
  251. data/rails_generators/templates/public/images/re_rule/verify-48.png +0 -0
  252. data/rails_generators/templates/public/images/re_rule_class/add-14.png +0 -0
  253. data/rails_generators/templates/public/images/re_rule_class/add-18.png +0 -0
  254. data/rails_generators/templates/public/images/re_rule_class/add-25.png +0 -0
  255. data/rails_generators/templates/public/images/re_rule_class/add-48.png +0 -0
  256. data/rails_generators/templates/public/images/re_rule_class/help-14.png +0 -0
  257. data/rails_generators/templates/public/images/re_rule_class/help-18.png +0 -0
  258. data/rails_generators/templates/public/images/re_rule_class/help-25.png +0 -0
  259. data/rails_generators/templates/public/images/re_rule_class/help-48.png +0 -0
  260. data/rails_generators/templates/public/images/re_rule_class/list-down.png +0 -0
  261. data/rails_generators/templates/public/images/re_rule_class/list-right.png +0 -0
  262. data/rails_generators/templates/public/images/re_rule_class/new-14.png +0 -0
  263. data/rails_generators/templates/public/images/re_rule_class/new-18.png +0 -0
  264. data/rails_generators/templates/public/images/re_rule_class/new-25.png +0 -0
  265. data/rails_generators/templates/public/images/re_rule_class/new-48.png +0 -0
  266. data/rails_generators/templates/public/javascripts/re_jobs.js +59 -0
  267. data/rails_generators/templates/public/javascripts/re_pipeline.js +54 -0
  268. data/rails_generators/templates/public/javascripts/re_pipeline_change.js +205 -0
  269. data/rails_generators/templates/public/javascripts/re_pipeline_index.js +24 -0
  270. data/rails_generators/templates/public/javascripts/re_pipeline_jobs.js +61 -0
  271. data/rails_generators/templates/public/javascripts/re_pipeline_new.js +34 -0
  272. data/rails_generators/templates/public/stylesheets/re_pipeline/accept.png +0 -0
  273. data/rails_generators/templates/public/stylesheets/re_pipeline/exclamation.png +0 -0
  274. data/rails_generators/templates/public/stylesheets/re_pipeline.css +509 -0
  275. data/rails_generators/templates/spec/controllers/re_pipelines_controller_spec.rb +111 -0
  276. data/rails_generators/templates/spec/models/re_job_audit_spec.rb +24 -0
  277. data/rails_generators/templates/spec/models/re_job_spec.rb +18 -0
  278. data/rails_generators/templates/spec/models/re_pipeline_activated_spec.rb +6 -0
  279. data/rails_generators/templates/spec/models/re_pipeline_base_spec.rb +157 -0
  280. data/rails_generators/templates/spec/models/re_pipeline_spec.rb +166 -0
  281. data/rails_generators/templates/spec/models/re_rule_outcome_spec.rb +97 -0
  282. data/rails_generators/templates/spec/models/re_rule_spec.rb +171 -0
  283. data/rails_generators/templates/spec/support/blueprint_re_pipelines.rb +11 -0
  284. data/spec/rules_engine_spec.rb +7 -0
  285. data/spec/spec.opts +1 -0
  286. data/spec/spec_helper.rb +9 -0
  287. data/tasks/rspec.rake +18 -0
  288. 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
+
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "RulesEngine" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'dougo_rules_engine'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
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