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.
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