fat_free_crm 0.11.4 → 0.12.0

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.

Potentially problematic release.


This version of fat_free_crm might be problematic. Click here for more details.

Files changed (451) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +2 -1
  3. data/.travis.yml +10 -17
  4. data/CHANGELOG +57 -4
  5. data/CONTRIBUTORS +6 -4
  6. data/Gemfile +24 -21
  7. data/Gemfile.lock +142 -111
  8. data/Guardfile +11 -31
  9. data/MIT-LICENSE +21 -0
  10. data/README.md +30 -39
  11. data/app/assets/javascripts/admin/fields.js.coffee +5 -18
  12. data/app/assets/javascripts/application.js.erb +3 -14
  13. data/app/assets/javascripts/crm.js +3 -15
  14. data/app/assets/javascripts/crm_chosen.js.coffee +21 -4
  15. data/app/assets/javascripts/crm_classes.js +3 -15
  16. data/app/assets/javascripts/crm_fields.js +3 -15
  17. data/app/assets/javascripts/crm_loginout.js +3 -15
  18. data/app/assets/javascripts/crm_textarea_autocomplete.js +3 -15
  19. data/app/assets/javascripts/datepicker.js.coffee +5 -0
  20. data/app/assets/javascripts/format_buttons.js.coffee +5 -0
  21. data/app/assets/javascripts/groups.js.coffee +5 -0
  22. data/app/assets/javascripts/jquery-noconflict.js +3 -15
  23. data/app/assets/javascripts/lists.js.coffee +6 -0
  24. data/app/assets/javascripts/search.js.coffee +5 -0
  25. data/app/assets/stylesheets/admin/fields.css.scss +10 -0
  26. data/app/assets/stylesheets/advanced_search.css.scss +5 -0
  27. data/app/assets/stylesheets/application.css.erb +3 -14
  28. data/app/assets/stylesheets/base.scss +3 -15
  29. data/app/assets/stylesheets/common.scss +3 -15
  30. data/app/assets/stylesheets/ffcrm_chosen.scss +5 -0
  31. data/app/assets/stylesheets/fields.scss +5 -0
  32. data/app/assets/stylesheets/format_buttons.css.scss +5 -0
  33. data/app/assets/stylesheets/groups.css.scss +5 -0
  34. data/app/assets/stylesheets/header.scss +3 -15
  35. data/app/assets/stylesheets/index_headers.css.scss +5 -0
  36. data/app/assets/stylesheets/lists.css.scss +5 -0
  37. data/app/assets/stylesheets/print.css.scss +3 -15
  38. data/app/assets/stylesheets/rails.scss +4 -16
  39. data/app/assets/stylesheets/safari.scss +3 -15
  40. data/app/assets/stylesheets/textarea_autocomplete.scss +5 -0
  41. data/app/controllers/admin/application_controller.rb +3 -15
  42. data/app/controllers/admin/field_groups_controller.rb +3 -15
  43. data/app/controllers/admin/fields_controller.rb +3 -15
  44. data/app/controllers/admin/groups_controller.rb +3 -15
  45. data/app/controllers/admin/plugins_controller.rb +3 -15
  46. data/app/controllers/admin/settings_controller.rb +3 -15
  47. data/app/controllers/admin/tags_controller.rb +3 -15
  48. data/app/controllers/admin/users_controller.rb +3 -15
  49. data/app/controllers/application_controller.rb +3 -15
  50. data/app/controllers/authentications_controller.rb +3 -15
  51. data/app/controllers/comments_controller.rb +6 -16
  52. data/app/controllers/emails_controller.rb +3 -15
  53. data/app/controllers/entities/accounts_controller.rb +4 -15
  54. data/app/controllers/entities/campaigns_controller.rb +4 -15
  55. data/app/controllers/entities/contacts_controller.rb +4 -15
  56. data/app/controllers/entities/leads_controller.rb +4 -15
  57. data/app/controllers/entities/opportunities_controller.rb +6 -16
  58. data/app/controllers/entities_controller.rb +3 -15
  59. data/app/controllers/home_controller.rb +3 -15
  60. data/app/controllers/lists_controller.rb +3 -15
  61. data/app/controllers/passwords_controller.rb +3 -15
  62. data/app/controllers/tasks_controller.rb +5 -16
  63. data/app/controllers/users_controller.rb +3 -15
  64. data/app/helpers/accounts_helper.rb +7 -17
  65. data/app/helpers/addresses_helper.rb +3 -15
  66. data/app/helpers/admin/application_helper.rb +3 -15
  67. data/app/helpers/admin/field_groups_helper.rb +3 -15
  68. data/app/helpers/admin/fields_helper.rb +3 -15
  69. data/app/helpers/admin/plugins_helper.rb +3 -15
  70. data/app/helpers/admin/settings_helper.rb +3 -15
  71. data/app/helpers/admin/tags_helper.rb +3 -15
  72. data/app/helpers/admin/users_helper.rb +3 -15
  73. data/app/helpers/application_helper.rb +12 -18
  74. data/app/helpers/authentications_helper.rb +3 -15
  75. data/app/helpers/campaigns_helper.rb +3 -15
  76. data/app/helpers/comments_helper.rb +3 -15
  77. data/app/helpers/contacts_helper.rb +3 -15
  78. data/app/helpers/emails_helper.rb +3 -15
  79. data/app/helpers/fields_helper.rb +3 -15
  80. data/app/helpers/groups_helper.rb +5 -0
  81. data/app/helpers/home_helper.rb +3 -15
  82. data/app/helpers/leads_helper.rb +3 -15
  83. data/app/helpers/lists_helper.rb +3 -15
  84. data/app/helpers/opportunities_helper.rb +3 -15
  85. data/app/helpers/passwords_helper.rb +3 -15
  86. data/app/helpers/tags_helper.rb +3 -15
  87. data/app/helpers/tasks_helper.rb +3 -15
  88. data/app/helpers/users_helper.rb +3 -15
  89. data/app/helpers/versions_helper.rb +3 -15
  90. data/app/inputs/{datepair_input.rb → date_pair_input.rb} +10 -21
  91. data/app/inputs/date_time_input.rb +13 -15
  92. data/app/inputs/datetime_pair_input.rb +26 -0
  93. data/app/inputs/text_input.rb +5 -15
  94. data/app/mailers/dropbox_mailer.rb +3 -15
  95. data/app/mailers/subscription_mailer.rb +9 -16
  96. data/app/mailers/user_mailer.rb +3 -15
  97. data/app/models/entities/account.rb +7 -17
  98. data/app/models/entities/account_contact.rb +6 -17
  99. data/app/models/entities/account_opportunity.rb +5 -15
  100. data/app/models/entities/campaign.rb +5 -15
  101. data/app/models/entities/contact.rb +15 -25
  102. data/app/models/entities/contact_opportunity.rb +5 -15
  103. data/app/models/entities/lead.rb +6 -16
  104. data/app/models/entities/opportunity.rb +6 -16
  105. data/app/models/fields/core_field.rb +5 -16
  106. data/app/models/fields/custom_field.rb +6 -16
  107. data/app/models/fields/custom_field_date_pair.rb +6 -21
  108. data/app/models/fields/custom_field_datetime_pair.rb +5 -19
  109. data/app/models/fields/custom_field_pair.rb +6 -16
  110. data/app/models/fields/field.rb +6 -17
  111. data/app/models/fields/field_group.rb +7 -17
  112. data/app/models/list.rb +4 -15
  113. data/app/models/observers/entity_observer.rb +5 -0
  114. data/app/models/observers/lead_observer.rb +3 -15
  115. data/app/models/observers/opportunity_observer.rb +3 -15
  116. data/app/models/observers/task_observer.rb +3 -15
  117. data/app/models/polymorphic/address.rb +5 -16
  118. data/app/models/polymorphic/avatar.rb +5 -16
  119. data/app/models/polymorphic/comment.rb +5 -15
  120. data/app/models/polymorphic/email.rb +5 -15
  121. data/app/models/polymorphic/tag.rb +6 -16
  122. data/app/models/polymorphic/tagging.rb +4 -15
  123. data/app/models/polymorphic/task.rb +6 -16
  124. data/app/models/setting.rb +5 -23
  125. data/app/models/users/ability.rb +9 -2
  126. data/app/models/users/authentication.rb +5 -16
  127. data/app/models/users/group.rb +7 -0
  128. data/app/models/users/permission.rb +5 -16
  129. data/app/models/users/preference.rb +4 -15
  130. data/app/models/users/user.rb +10 -19
  131. data/app/views/admin/fields/index.html.haml +2 -0
  132. data/app/views/comments/_edit.html.haml +0 -1
  133. data/app/views/comments/_new.html.haml +0 -1
  134. data/app/views/contacts/_contacts.html.haml +1 -1
  135. data/app/views/contacts/_sidebar_show.html.haml +19 -0
  136. data/app/views/contacts/_top_section.html.haml +3 -2
  137. data/app/views/entities/_search.html.haml +4 -3
  138. data/app/views/entities/contacts.js.rjs +1 -1
  139. data/app/views/entities/leads.js.rjs +1 -1
  140. data/app/views/entities/opportunities.js.rjs +1 -1
  141. data/app/views/fields/_edit_custom_field_group.html.haml +1 -1
  142. data/app/views/home/_task.html.haml +3 -1
  143. data/app/views/layouts/_footer.html.haml +1 -1
  144. data/app/views/leads/_leads.html.haml +1 -1
  145. data/app/views/leads/_sidebar_show.html.haml +7 -0
  146. data/app/views/leads/_top_section.html.haml +3 -2
  147. data/app/views/lists/_sidebar.html.haml +5 -5
  148. data/app/views/opportunities/_opportunities.html.haml +1 -1
  149. data/app/views/versions/_versions.html.haml +1 -1
  150. data/config/application.rb +11 -3
  151. data/config/boot.rb +5 -1
  152. data/config/deploy.example.rb +5 -0
  153. data/config/environment.rb +5 -0
  154. data/config/environments/development.rb +5 -0
  155. data/config/environments/production.rb +5 -0
  156. data/config/environments/staging.rb +5 -0
  157. data/config/environments/test.rb +6 -1
  158. data/config/initializers/action_mailer.rb +5 -0
  159. data/config/initializers/authlogic.rb +5 -0
  160. data/config/initializers/constants.rb +5 -0
  161. data/config/initializers/gravatar.rb +5 -0
  162. data/config/initializers/locale.rb +3 -15
  163. data/config/initializers/mime_types.rb +5 -0
  164. data/config/initializers/paginate_arrays.rb +5 -0
  165. data/config/initializers/paper_trail.rb +5 -0
  166. data/config/initializers/ransack.rb +6 -1
  167. data/config/initializers/relative_url_root.rb +3 -15
  168. data/config/initializers/sass.rb +5 -0
  169. data/config/initializers/secret_token.rb +6 -1
  170. data/config/initializers/simple_form.rb +5 -0
  171. data/config/initializers/views.rb +5 -0
  172. data/config/locales/de_fat_free_crm.yml +125 -7
  173. data/config/locales/en-US_fat_free_crm.yml +7 -2
  174. data/config/locales/th.rb +5 -0
  175. data/config/routes.rb +5 -0
  176. data/config/settings.default.yml +10 -18
  177. data/config/unicorn.rb +5 -0
  178. data/fat_free_crm.gemspec +6 -4
  179. data/lib/development_tasks/gem.rake +3 -15
  180. data/lib/development_tasks/license.rake +12 -32
  181. data/lib/development_tasks/rdoc.rake +3 -15
  182. data/lib/development_tasks/rspec.rake +3 -15
  183. data/lib/fat_free_crm.rb +6 -16
  184. data/lib/fat_free_crm/callback.rb +3 -15
  185. data/lib/fat_free_crm/comment_extensions.rb +5 -0
  186. data/lib/fat_free_crm/core_ext.rb +3 -15
  187. data/lib/fat_free_crm/core_ext/nil.rb +3 -15
  188. data/lib/fat_free_crm/core_ext/string.rb +3 -15
  189. data/lib/fat_free_crm/custom_fields.rb +12 -0
  190. data/lib/fat_free_crm/engine.rb +3 -15
  191. data/lib/fat_free_crm/errors.rb +3 -15
  192. data/lib/fat_free_crm/exceptions.rb +3 -15
  193. data/lib/fat_free_crm/export_csv.rb +35 -0
  194. data/lib/fat_free_crm/exportable.rb +3 -15
  195. data/lib/fat_free_crm/fields.rb +5 -17
  196. data/lib/fat_free_crm/gem_dependencies.rb +3 -15
  197. data/lib/fat_free_crm/gem_ext.rb +3 -15
  198. data/lib/fat_free_crm/gem_ext/action_controller/base.rb +3 -15
  199. data/lib/fat_free_crm/gem_ext/active_model/serializers/xml/serializer/attribute.rb +3 -15
  200. data/lib/fat_free_crm/gem_ext/active_record/schema_dumper.rb +3 -15
  201. data/lib/fat_free_crm/gem_ext/active_support/buffered_logger.rb +3 -15
  202. data/lib/fat_free_crm/gem_ext/authlogic/session/cookies.rb +3 -15
  203. data/lib/fat_free_crm/gem_ext/rails/engine.rb +3 -15
  204. data/lib/fat_free_crm/gem_ext/rails/text_helper.rb +3 -15
  205. data/lib/fat_free_crm/gem_ext/rake/task.rb +3 -15
  206. data/lib/fat_free_crm/gem_ext/simple_form/action_view_extensions/form_helper.rb +3 -15
  207. data/lib/fat_free_crm/i18n.rb +3 -15
  208. data/lib/fat_free_crm/load_settings.rb +20 -0
  209. data/lib/fat_free_crm/mail_processor/base.rb +20 -18
  210. data/lib/fat_free_crm/mail_processor/comment_replies.rb +3 -15
  211. data/lib/fat_free_crm/mail_processor/dropbox.rb +4 -16
  212. data/lib/fat_free_crm/permissions.rb +3 -15
  213. data/lib/fat_free_crm/plugin.rb +3 -15
  214. data/lib/fat_free_crm/plugin_dependencies.rb +3 -15
  215. data/lib/fat_free_crm/renderers.rb +6 -25
  216. data/lib/fat_free_crm/sortable.rb +3 -15
  217. data/lib/fat_free_crm/tabs.rb +3 -15
  218. data/lib/fat_free_crm/version.rb +5 -17
  219. data/lib/fat_free_crm/view_factory.rb +3 -15
  220. data/lib/missing_translation_detector.rb +50 -0
  221. data/lib/tasks/db/migrate.rake +3 -15
  222. data/lib/tasks/db/schema.rake +3 -15
  223. data/lib/tasks/ffcrm/comment_replies.rake +3 -15
  224. data/lib/tasks/ffcrm/config.rake +28 -16
  225. data/lib/tasks/ffcrm/demo.rake +3 -15
  226. data/lib/tasks/ffcrm/dropbox.rake +3 -15
  227. data/lib/tasks/ffcrm/missing_translations.rake +33 -0
  228. data/lib/tasks/ffcrm/settings.rake +3 -15
  229. data/lib/tasks/ffcrm/setup.rake +15 -24
  230. data/lib/tasks/ffcrm/update_data.rake +3 -15
  231. data/spec/controllers/admin/groups_controller_spec.rb +5 -0
  232. data/spec/controllers/admin/users_controller_spec.rb +5 -0
  233. data/spec/controllers/applications_controller_spec.rb +5 -0
  234. data/spec/controllers/authentications_controller_spec.rb +5 -0
  235. data/spec/controllers/comments_controller_spec.rb +5 -0
  236. data/spec/controllers/emails_controller_spec.rb +5 -0
  237. data/spec/controllers/entities/accounts_controller_spec.rb +5 -0
  238. data/spec/controllers/entities/campaigns_controller_spec.rb +5 -0
  239. data/spec/controllers/entities/contacts_controller_spec.rb +5 -0
  240. data/spec/controllers/entities/leads_controller_spec.rb +5 -0
  241. data/spec/controllers/entities/opportunities_controller_spec.rb +5 -0
  242. data/spec/controllers/entities_controller_spec.rb +5 -0
  243. data/spec/controllers/home_controller_spec.rb +5 -0
  244. data/spec/controllers/lists_controller_spec.rb +5 -0
  245. data/spec/controllers/passwords_controller_spec.rb +5 -0
  246. data/spec/controllers/tasks_controller_spec.rb +7 -6
  247. data/spec/controllers/users_controller_spec.rb +5 -0
  248. data/spec/factories/account_factories.rb +5 -0
  249. data/spec/factories/campaign_factories.rb +6 -1
  250. data/spec/factories/contact_factories.rb +6 -1
  251. data/spec/factories/field_factories.rb +6 -1
  252. data/spec/factories/lead_factories.rb +6 -1
  253. data/spec/factories/list_factories.rb +6 -1
  254. data/spec/factories/opportunity_factories.rb +16 -5
  255. data/spec/factories/sequences.rb +7 -1
  256. data/spec/factories/setting_factories.rb +6 -1
  257. data/spec/factories/shared_factories.rb +5 -0
  258. data/spec/factories/subscription_factories.rb +5 -0
  259. data/spec/factories/tag_factories.rb +6 -1
  260. data/spec/factories/task_factories.rb +6 -1
  261. data/spec/factories/user_factories.rb +5 -0
  262. data/spec/features/acceptance_helper.rb +9 -0
  263. data/spec/{acceptance → features}/accounts_spec.rb +14 -9
  264. data/spec/{acceptance → features}/admin/groups_spec.rb +5 -0
  265. data/spec/{acceptance → features}/admin/users_spec.rb +9 -4
  266. data/spec/{acceptance → features}/campaigns_spec.rb +14 -16
  267. data/spec/{acceptance → features}/contacts_spec.rb +13 -16
  268. data/spec/{acceptance → features}/dashboard_spec.rb +5 -0
  269. data/spec/{acceptance → features}/leads_spec.rb +11 -12
  270. data/spec/{acceptance → features}/opportunities_overview_spec.rb +5 -0
  271. data/spec/{acceptance → features}/opportunities_spec.rb +14 -16
  272. data/spec/features/support/browser.rb +18 -0
  273. data/spec/{acceptance → features}/support/headless.rb +5 -3
  274. data/spec/{acceptance → features}/support/helpers.rb +6 -1
  275. data/spec/features/support/maintain_sessions.rb +10 -0
  276. data/spec/{acceptance → features}/support/paths.rb +9 -4
  277. data/spec/{acceptance → features}/support/selector_helpers.rb +6 -1
  278. data/spec/{acceptance → features}/tasks_spec.rb +7 -5
  279. data/spec/helpers/accounts_helper_spec.rb +5 -0
  280. data/spec/helpers/admin/field_groups_helper_spec.rb +5 -0
  281. data/spec/helpers/admin/plugins_helper_spec.rb +5 -0
  282. data/spec/helpers/admin/settings_helper_spec.rb +5 -0
  283. data/spec/helpers/admin/users_helper_spec.rb +5 -0
  284. data/spec/helpers/application_helper_spec.rb +5 -0
  285. data/spec/helpers/authentications_helper_spec.rb +5 -0
  286. data/spec/helpers/campaigns_helper_spec.rb +5 -0
  287. data/spec/helpers/comments_helper_spec.rb +5 -0
  288. data/spec/helpers/contacts_helper_spec.rb +5 -0
  289. data/spec/helpers/emails_helper_spec.rb +5 -0
  290. data/spec/helpers/fields_helper_spec.rb +5 -0
  291. data/spec/helpers/groups_helper_spec.rb +6 -1
  292. data/spec/helpers/home_helper_spec.rb +5 -0
  293. data/spec/helpers/leads_helper_spec.rb +5 -0
  294. data/spec/helpers/lists_helper_spec.rb +6 -1
  295. data/spec/helpers/opportunities_helper_spec.rb +5 -0
  296. data/spec/helpers/passwords_helper_spec.rb +5 -0
  297. data/spec/helpers/tasks_helper_spec.rb +5 -0
  298. data/spec/helpers/users_helper_spec.rb +5 -0
  299. data/spec/lib/comment_extensions_spec.rb +5 -0
  300. data/spec/lib/core_ext/string_spec.rb +5 -0
  301. data/spec/lib/errors_spec.rb +5 -0
  302. data/spec/lib/fields_spec.rb +5 -0
  303. data/spec/lib/mail_processor/base_spec.rb +5 -0
  304. data/spec/lib/mail_processor/comment_replies_spec.rb +5 -0
  305. data/spec/lib/mail_processor/dropbox_spec.rb +5 -0
  306. data/spec/lib/mail_processor/sample_emails/dropbox.rb +5 -0
  307. data/spec/lib/permissions_spec.rb +5 -0
  308. data/spec/lib/view_factory_spec.rb +5 -0
  309. data/spec/mailers/subscription_mailer_spec.rb +19 -1
  310. data/spec/mailers/user_mailer_spec.rb +6 -1
  311. data/spec/models/entities/account_contact_spec.rb +5 -0
  312. data/spec/models/entities/account_opportunity_spec.rb +5 -0
  313. data/spec/models/entities/account_spec.rb +6 -1
  314. data/spec/models/entities/campaign_spec.rb +5 -0
  315. data/spec/models/entities/contact_opportunity_spec.rb +5 -0
  316. data/spec/models/entities/contact_spec.rb +5 -0
  317. data/spec/models/entities/lead_spec.rb +5 -0
  318. data/spec/models/entities/opportunity_spec.rb +15 -2
  319. data/spec/models/fields/custom_field_date_pair_spec.rb +3 -15
  320. data/spec/models/fields/custom_field_pair_spec.rb +3 -15
  321. data/spec/models/fields/custom_field_spec.rb +5 -0
  322. data/spec/models/fields/field_group_spec.rb +5 -0
  323. data/spec/models/fields/field_spec.rb +5 -0
  324. data/spec/models/list_spec.rb +5 -0
  325. data/spec/models/observers/entity_observer_spec.rb +5 -0
  326. data/spec/models/polymorphic/address_spec.rb +5 -0
  327. data/spec/models/polymorphic/avatar_spec.rb +5 -0
  328. data/spec/models/polymorphic/comment_spec.rb +5 -0
  329. data/spec/models/polymorphic/email_spec.rb +5 -0
  330. data/spec/models/polymorphic/task_spec.rb +5 -0
  331. data/spec/models/polymorphic/version_spec.rb +26 -22
  332. data/spec/models/setting_spec.rb +5 -0
  333. data/spec/models/users/authentication_spec.rb +5 -0
  334. data/spec/models/users/group_spec.rb +6 -1
  335. data/spec/models/users/permission_spec.rb +5 -0
  336. data/spec/models/users/preference_spec.rb +5 -0
  337. data/spec/models/users/user_spec.rb +6 -1
  338. data/spec/routing/accounts_routing_spec.rb +5 -0
  339. data/spec/routing/admin/users_routing_spec.rb +5 -0
  340. data/spec/routing/campaigns_routing_spec.rb +5 -0
  341. data/spec/routing/comments_routing_spec.rb +5 -0
  342. data/spec/routing/contacts_routing_spec.rb +5 -0
  343. data/spec/routing/emails_routing_spec.rb +5 -0
  344. data/spec/routing/leads_routing_spec.rb +5 -0
  345. data/spec/routing/opportunities_routing_spec.rb +5 -0
  346. data/spec/routing/tasks_routing_spec.rb +5 -0
  347. data/spec/routing/users_routing_spec.rb +5 -0
  348. data/spec/shared/controllers.rb +8 -3
  349. data/spec/shared/models.rb +110 -105
  350. data/spec/spec_helper.rb +40 -22
  351. data/spec/support/assert_select.rb +5 -0
  352. data/spec/support/auth_macros.rb +5 -0
  353. data/spec/support/macros.rb +5 -0
  354. data/spec/support/mail_processor_mocks.rb +5 -0
  355. data/spec/support/rjs_support.rb +6 -1
  356. data/spec/support/uploaded_file.rb +5 -0
  357. data/spec/views/accounts/_edit.haml_spec.rb +5 -0
  358. data/spec/views/accounts/_new.haml_spec.rb +5 -0
  359. data/spec/views/accounts/create.rjs_spec.rb +5 -0
  360. data/spec/views/accounts/destroy.rjs_spec.rb +5 -0
  361. data/spec/views/accounts/edit.rjs_spec.rb +5 -0
  362. data/spec/views/accounts/index.haml_spec.rb +5 -0
  363. data/spec/views/accounts/index.rjs_spec.rb +5 -0
  364. data/spec/views/accounts/new.rjs_spec.rb +5 -0
  365. data/spec/views/accounts/show.haml_spec.rb +5 -0
  366. data/spec/views/accounts/update.rjs_spec.rb +5 -0
  367. data/spec/views/admin/users/_create.haml_spec.rb +5 -0
  368. data/spec/views/admin/users/create.rjs_spec.rb +5 -0
  369. data/spec/views/admin/users/destroy.rjs_spec.rb +5 -0
  370. data/spec/views/admin/users/edit.rjs_spec.rb +5 -0
  371. data/spec/views/admin/users/index.haml_spec.rb +5 -0
  372. data/spec/views/admin/users/index.rjs_spec.rb +5 -0
  373. data/spec/views/admin/users/new.rjs_spec.rb +5 -0
  374. data/spec/views/admin/users/reactivate.rjs_spec.rb +5 -0
  375. data/spec/views/admin/users/show.haml_spec.rb +5 -0
  376. data/spec/views/admin/users/suspend.rjs_spec.rb +5 -0
  377. data/spec/views/admin/users/update.rjs_spec.rb +5 -0
  378. data/spec/views/application/auto_complete.haml_spec.rb +5 -0
  379. data/spec/views/authentications/new.haml_spec.rb +5 -0
  380. data/spec/views/campaigns/_edit.haml_spec.rb +8 -2
  381. data/spec/views/campaigns/_new.haml_spec.rb +5 -0
  382. data/spec/views/campaigns/create.rjs_spec.rb +5 -0
  383. data/spec/views/campaigns/destroy.rjs_spec.rb +5 -0
  384. data/spec/views/campaigns/edit.rjs_spec.rb +5 -0
  385. data/spec/views/campaigns/index.haml_spec.rb +5 -0
  386. data/spec/views/campaigns/index.rjs_spec.rb +5 -0
  387. data/spec/views/campaigns/new.rjs_spec.rb +5 -0
  388. data/spec/views/campaigns/show.haml_spec.rb +5 -0
  389. data/spec/views/campaigns/update.rjs_spec.rb +5 -0
  390. data/spec/views/comments/new.rjs_spec.rb +5 -0
  391. data/spec/views/contacts/_edit.haml_spec.rb +5 -0
  392. data/spec/views/contacts/_new.haml_spec.rb +5 -0
  393. data/spec/views/contacts/create.rjs_spec.rb +5 -0
  394. data/spec/views/contacts/destroy.rjs_spec.rb +5 -0
  395. data/spec/views/contacts/edit.rjs_spec.rb +5 -0
  396. data/spec/views/contacts/index.haml_spec.rb +5 -0
  397. data/spec/views/contacts/index.rjs_spec.rb +5 -0
  398. data/spec/views/contacts/new.rjs_spec.rb +5 -0
  399. data/spec/views/contacts/show.haml_spec.rb +5 -0
  400. data/spec/views/contacts/update.rjs_spec.rb +5 -0
  401. data/spec/views/home/index.haml_spec.rb +5 -0
  402. data/spec/views/home/index.rjs_spec.rb +5 -0
  403. data/spec/views/home/options.rjs_spec.rb +5 -0
  404. data/spec/views/leads/_convert.haml_spec.rb +5 -0
  405. data/spec/views/leads/_edit.haml_spec.rb +5 -0
  406. data/spec/views/leads/_new.haml_spec.rb +5 -0
  407. data/spec/views/leads/_sidebar_show.haml_spec.rb +5 -0
  408. data/spec/views/leads/convert.rjs_spec.rb +5 -0
  409. data/spec/views/leads/create.rjs_spec.rb +5 -0
  410. data/spec/views/leads/destroy.rjs_spec.rb +5 -0
  411. data/spec/views/leads/edit.rjs_spec.rb +5 -0
  412. data/spec/views/leads/index.haml_spec.rb +5 -0
  413. data/spec/views/leads/index.rjs_spec.rb +5 -0
  414. data/spec/views/leads/new.rjs_spec.rb +5 -0
  415. data/spec/views/leads/promote.rjs_spec.rb +5 -0
  416. data/spec/views/leads/reject.rjs_spec.rb +5 -0
  417. data/spec/views/leads/show.haml_spec.rb +5 -0
  418. data/spec/views/leads/update.rjs_spec.rb +5 -0
  419. data/spec/views/opportunities/_edit.haml_spec.rb +5 -0
  420. data/spec/views/opportunities/_new.haml_spec.rb +5 -0
  421. data/spec/views/opportunities/create.rjs_spec.rb +5 -0
  422. data/spec/views/opportunities/destroy.rjs_spec.rb +5 -0
  423. data/spec/views/opportunities/edit.rjs_spec.rb +5 -0
  424. data/spec/views/opportunities/index.haml_spec.rb +5 -0
  425. data/spec/views/opportunities/index.rjs_spec.rb +5 -0
  426. data/spec/views/opportunities/new.rjs_spec.rb +5 -0
  427. data/spec/views/opportunities/show.haml_spec.rb +5 -0
  428. data/spec/views/opportunities/update.rjs_spec.rb +5 -0
  429. data/spec/views/tasks/_edit.haml_spec.rb +5 -0
  430. data/spec/views/tasks/complete.rjs_spec.rb +5 -0
  431. data/spec/views/tasks/create.rjs_spec.rb +5 -0
  432. data/spec/views/tasks/destroy.rjs_spec.rb +5 -0
  433. data/spec/views/tasks/edit.rjs_spec.rb +5 -0
  434. data/spec/views/tasks/index.haml_spec.rb +5 -0
  435. data/spec/views/tasks/new.rjs_spec.rb +5 -0
  436. data/spec/views/tasks/update.rjs_spec.rb +5 -0
  437. data/spec/views/users/avatar.rjs_spec.rb +5 -0
  438. data/spec/views/users/change_password.rjs_spec.rb +5 -0
  439. data/spec/views/users/edit.rjs_spec.rb +5 -0
  440. data/spec/views/users/password.rjs_spec.rb +5 -0
  441. data/spec/views/users/update.rjs_spec.rb +5 -0
  442. data/spec/views/users/upload_avatar.rjs_spec.rb +5 -0
  443. metadata +45 -101
  444. data/LICENSE +0 -620
  445. data/app/inputs/datetimepair_input.rb +0 -37
  446. data/config/initializers/custom_fields.rb +0 -21
  447. data/lib/fat_free_crm/core_ext/array.rb +0 -75
  448. data/lib/fat_free_crm/syck_yaml.rb +0 -21
  449. data/spec/acceptance/acceptance_helper.rb +0 -8
  450. data/spec/acceptance/support/browser.rb +0 -13
  451. data/spec/acceptance/support/maintain_sessions.rb +0 -5
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  # encoding: utf-8
2
7
  # == Schema Information
3
8
  #
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  # == Schema Information
2
7
  #
3
8
  # Table name: versions
@@ -15,7 +20,7 @@
15
20
 
16
21
  require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
17
22
 
18
- describe Version do
23
+ describe Version, :versioning => true do
19
24
 
20
25
  before do
21
26
  login
@@ -36,36 +41,37 @@ describe Version do
36
41
  end
37
42
  end
38
43
 
39
- it "should select all versions except one" do
44
+ it "should not include view events" do
40
45
  @versions = Version.for(current_user).exclude_events(:view)
41
- @versions.map(&:event).sort.should == %w(create destroy update)
46
+ @versions.map(&:event).sort.should_not include('view')
42
47
  end
43
48
 
44
- it "should select all versions except many" do
49
+ it "should exclude create, update and destroy events" do
45
50
  @versions = Version.for(current_user).exclude_events(:create, :update, :destroy)
46
- @versions.map(&:event).should == %w(view)
51
+ @versions.map(&:event).should_not include('create')
52
+ @versions.map(&:event).should_not include('update')
53
+ @versions.map(&:event).should_not include('destroy')
47
54
  end
48
55
 
49
- it "should select one requested version" do
56
+ it "should include only destroy events" do
50
57
  @versions = Version.for(current_user).include_events(:destroy)
51
- @versions.map(&:event).should == %w(destroy)
58
+ @versions.map(&:event).uniq.should == %w(destroy)
52
59
  end
53
60
 
54
- it "should select many requested versions" do
61
+ it "should include create and update events" do
55
62
  @versions = Version.for(current_user).include_events(:create, :update)
56
- @versions.map(&:event).sort.should == %w(create update)
63
+ @versions.map(&:event).uniq.sort.should == %w(create update)
57
64
  end
58
65
 
59
- it "should select versions for given user" do
66
+ it "should select all versions for a given user" do
60
67
  @versions = Version.for(current_user)
61
- @versions.map(&:event).sort.should == %w(create destroy update view)
68
+ @versions.map(&:whodunnit).uniq.should == [current_user.id.to_s]
62
69
  end
63
70
  end
64
71
 
65
72
  %w(account campaign contact lead opportunity task).each do |item|
66
73
  describe "Create, update, and delete (#{item})" do
67
74
  before :each do
68
- PaperTrail.enabled = true
69
75
  @item = FactoryGirl.create(item.to_sym, :user => current_user)
70
76
  @conditions = {:item_id => @item.id, :item_type => @item.class.name, :whodunnit => PaperTrail.whodunnit}
71
77
  end
@@ -104,7 +110,6 @@ describe Version do
104
110
 
105
111
  describe "Recently viewed items (task)" do
106
112
  before do
107
- PaperTrail.enabled = true
108
113
  @task = FactoryGirl.create(:task)
109
114
  @conditions = {:item_id => @task.id, :item_type => @task.class.name}
110
115
  end
@@ -112,7 +117,7 @@ describe Version do
112
117
  it "creating a new task should not add it to recently viewed items list" do
113
118
  @versions = Version.where(@conditions)
114
119
 
115
- @versions.map(&:event).should == %w(create) # but not view
120
+ @versions.map(&:event).should include('create') # but not view
116
121
  end
117
122
 
118
123
  it "updating a new task should not add it to recently viewed items list" do
@@ -133,21 +138,21 @@ describe Version do
133
138
  @task.update_attribute(:completed_at, 1.second.ago)
134
139
  @versions = Version.where(@conditions)
135
140
 
136
- @versions.map(&:event).sort.should == %w(complete)
141
+ @versions.map(&:event).should include('complete')
137
142
  end
138
143
 
139
144
  it "should create 'reassigned' task event" do
140
145
  @task.update_attribute(:assigned_to, current_user.id + 1)
141
146
  @versions = Version.where(@conditions)
142
147
 
143
- @versions.map(&:event).sort.should == %w(reassign)
148
+ @versions.map(&:event).should include('reassign')
144
149
  end
145
150
 
146
151
  it "should create 'rescheduled' task event" do
147
152
  @task.update_attribute(:bucket, "due_tomorrow") # FactoryGirl creates :due_asap task
148
153
  @versions = Version.where(@conditions)
149
154
 
150
- @versions.map(&:event).sort.should == %w(reschedule)
155
+ @versions.map(&:event).should include('reschedule')
151
156
  end
152
157
  end
153
158
 
@@ -161,7 +166,7 @@ describe Version do
161
166
  @lead.update_attribute(:status, "rejected")
162
167
  @versions = Version.where(@conditions)
163
168
 
164
- @versions.map(&:event).sort.should == %w(reject)
169
+ @versions.map(&:event).should include('reject')
165
170
  end
166
171
  end
167
172
 
@@ -169,7 +174,6 @@ describe Version do
169
174
  before do
170
175
  @user = FactoryGirl.create(:user)
171
176
  Version.delete_all
172
- PaperTrail.enabled = true
173
177
  end
174
178
 
175
179
  it "should not show the create/update versions if the item is private" do
@@ -237,11 +241,11 @@ describe Version do
237
241
 
238
242
  describe "Exportable" do
239
243
  before do
240
- FactoryGirl.create(:version, :whodunnit => FactoryGirl.create(:user).id, :item => FactoryGirl.create(:account))
241
- FactoryGirl.create(:version, :whodunnit => FactoryGirl.create(:user, :first_name => nil, :last_name => nil).id, :item => FactoryGirl.create(:account))
242
244
  end
243
245
  it_should_behave_like("exportable") do
244
- let(:exported) { Version.all }
246
+ v1 = FactoryGirl.create(:version, :whodunnit => FactoryGirl.create(:user).id, :item => FactoryGirl.create(:account))
247
+ v2 = FactoryGirl.create(:version, :whodunnit => FactoryGirl.create(:user, :first_name => nil, :last_name => nil).id, :item => FactoryGirl.create(:account))
248
+ let(:exported) { [v1,v2] }
245
249
  end
246
250
  end
247
251
  end
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  # == Schema Information
2
7
  #
3
8
  # Table name: settings
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
7
 
3
8
  describe Authentication do
@@ -1,5 +1,10 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require 'spec_helper'
2
7
 
3
8
  describe Group do
4
- pending "add some examples to (or delete) #{__FILE__}"
9
+
5
10
  end
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  # == Schema Information
2
7
  #
3
8
  # Table name: permissions
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  # == Schema Information
2
7
  #
3
8
  # Table name: preferences
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  # == Schema Information
2
7
  #
3
8
  # Table name: users
@@ -122,7 +127,7 @@ describe User do
122
127
  describe "have_assigned_opportunities" do
123
128
  before :each do
124
129
  @user1 = FactoryGirl.create(:user)
125
- FactoryGirl.create(:open_opportunity, :assignee => @user1)
130
+ FactoryGirl.create(:opportunity, :assignee => @user1, :stage => 'analysis')
126
131
 
127
132
  @user2 = FactoryGirl.create(:user)
128
133
 
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
7
 
3
8
  describe AccountsController do
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
7
 
3
8
  describe Admin::UsersController do
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
7
 
3
8
  describe CampaignsController do
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
7
 
3
8
  describe CommentsController do
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
7
 
3
8
  describe ContactsController do
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
7
 
3
8
  describe EmailsController do
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
7
 
3
8
  describe LeadsController do
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
7
 
3
8
  describe OpportunitiesController do
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
7
 
3
8
  describe TasksController do
@@ -1,3 +1,8 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
7
 
3
8
  describe UsersController do
@@ -1,6 +1,11 @@
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
1
6
  module SharedControllerSpecs
2
7
 
3
- shared_examples_for "auto complete" do
8
+ shared_examples "auto complete" do
4
9
  before(:each) do
5
10
  @query = "Hello"
6
11
  end
@@ -27,7 +32,7 @@ module SharedControllerSpecs
27
32
  end
28
33
  end
29
34
 
30
- shared_examples_for "attach" do
35
+ shared_examples "attach" do
31
36
  it "should attach existing asset to the parent asset of different type" do
32
37
  xhr :put, :attach, :id => @model.id, :assets => @attachment.class.name.tableize, :asset_id => @attachment.id
33
38
  @model.send(@attachment.class.name.tableize).should include(@attachment)
@@ -70,7 +75,7 @@ module SharedControllerSpecs
70
75
  end
71
76
  end
72
77
 
73
- shared_examples_for "discard" do
78
+ shared_examples "discard" do
74
79
  it "should discard the attachment without deleting it" do
75
80
  xhr :post, :discard, :id => @model.id, :attachment => @attachment.class.name, :attachment_id => @attachment.id
76
81
  assigns[:attachment].should == @attachment.reload # The attachment should still exist.
@@ -1,137 +1,142 @@
1
- module SharedModelSpecs
2
- shared_examples_for "exportable" do
3
- it "Model#export returns all records with extra attributes added" do
4
- pending
5
- # User/assignee for the second record has no first/last name.
6
- exported.size.should == 2
1
+ # Copyright (c) 2008-2013 Michael Dvorkin and contributors.
2
+ #
3
+ # Fat Free CRM is freely distributable under the terms of MIT license.
4
+ # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
+ #------------------------------------------------------------------------------
6
+ require "cancan/matchers"
7
+
8
+ shared_examples "exportable" do
9
+ it "Model#export returns all records with extra attributes added" do
10
+
11
+ # User/assignee for the second record has no first/last name.
12
+ exported.size.should == 2
13
+ if exported[0].respond_to?(:user_id)
7
14
  exported[0].user_id_full_name.should == "#{exported[0].user.first_name} #{exported[0].user.last_name}"
8
15
  exported[1].user_id_full_name.should == "#{exported[1].user.email}"
16
+ end
9
17
 
10
- if exported[0].respond_to?(:assigned_to)
11
- if exported[0].assigned_to?
12
- exported[0].assigned_to_full_name.should == "#{exported[0].assignee.first_name} #{exported[0].assignee.last_name}"
13
- else
14
- exported[0].assigned_to_full_name.should == ''
15
- end
16
- if exported[1].assigned_to?
17
- exported[1].assigned_to_full_name.should == "#{exported[1].assignee.email}"
18
- else
19
- exported[1].assigned_to_full_name.should == ''
20
- end
18
+ if exported[0].respond_to?(:assigned_to)
19
+ if exported[0].assigned_to?
20
+ exported[0].assigned_to_full_name.should == "#{exported[0].assignee.first_name} #{exported[0].assignee.last_name}"
21
+ else
22
+ exported[0].assigned_to_full_name.should == ''
23
+ end
24
+ if exported[1].assigned_to?
25
+ exported[1].assigned_to_full_name.should == "#{exported[1].assignee.email}"
26
+ else
27
+ exported[1].assigned_to_full_name.should == ''
21
28
  end
29
+ end
22
30
 
23
- if exported[0].respond_to?(:completed_by)
24
- if exported[0].completed_by?
25
- exported[0].completed_by_full_name.should == "#{exported[0].completor.first_name} #{exported[0].completor.last_name}"
26
- else
27
- exported[0].completed_by_full_name.should == ''
28
- end
29
- if exported[1].completed_by?
30
- exported[1].completed_by_full_name.should == "#{exported[1].completor.email}"
31
- else
32
- exported[1].completed_by_full_name.should == ''
33
- end
31
+ if exported[0].respond_to?(:completed_by)
32
+ if exported[0].completed_by?
33
+ exported[0].completed_by_full_name.should == "#{exported[0].completor.first_name} #{exported[0].completor.last_name}"
34
+ else
35
+ exported[0].completed_by_full_name.should == ''
36
+ end
37
+ if exported[1].completed_by?
38
+ exported[1].completed_by_full_name.should == "#{exported[1].completor.email}"
39
+ else
40
+ exported[1].completed_by_full_name.should == ''
34
41
  end
35
42
  end
36
43
  end
44
+ end
37
45
 
38
- require "cancan/matchers"
46
+ shared_examples Ability do |klass|
39
47
 
40
- shared_examples_for Ability do |klass|
48
+ subject { ability }
49
+ let(:ability){ Ability.new(user) }
50
+ let(:user){ FactoryGirl.create(:user) }
51
+ let(:factory){ klass.model_name.underscore }
41
52
 
42
- subject { ability }
43
- let(:ability){ Ability.new(user) }
44
- let(:user){ FactoryGirl.create(:user) }
45
- let(:factory){ klass.model_name.underscore }
53
+ context "create" do
54
+ it{ should be_able_to(:create, klass) }
55
+ end
46
56
 
47
- context "create" do
48
- it{ should be_able_to(:create, klass) }
49
- end
57
+ context "when public access" do
58
+ let(:asset){ FactoryGirl.create(factory, :access => 'Public') }
50
59
 
51
- context "when public access" do
52
- let(:asset){ FactoryGirl.create(factory, :access => 'Public') }
60
+ it{ should be_able_to(:manage, asset) }
61
+ end
53
62
 
54
- it{ should be_able_to(:manage, asset) }
55
- end
63
+ context "when private access owner" do
64
+ let(:asset){ FactoryGirl.create(factory, :access => 'Private', :user_id => user.id) }
56
65
 
57
- context "when private access owner" do
58
- let(:asset){ FactoryGirl.create(factory, :access => 'Private', :user_id => user.id) }
66
+ it{ should be_able_to(:manage, asset) }
67
+ end
59
68
 
60
- it{ should be_able_to(:manage, asset) }
61
- end
62
-
63
- context "when private access administrator" do
64
- let(:asset){ FactoryGirl.create(factory, :access => 'Private') }
65
- let(:user) { FactoryGirl.create(:user, :admin => true) }
69
+ context "when private access administrator" do
70
+ let(:asset){ FactoryGirl.create(factory, :access => 'Private') }
71
+ let(:user) { FactoryGirl.create(:user, :admin => true) }
66
72
 
67
- it{ should be_able_to(:manage, asset) }
68
- end
73
+ it{ should be_able_to(:manage, asset) }
74
+ end
69
75
 
70
- context "when private access not owner" do
71
- let(:asset){ FactoryGirl.create(factory, :access => 'Private') }
76
+ context "when private access not owner" do
77
+ let(:asset){ FactoryGirl.create(factory, :access => 'Private') }
72
78
 
73
- it{ should_not be_able_to(:manage, asset) }
74
- end
75
-
76
- context "when private access not owner but is assigned" do
77
- let(:asset){ FactoryGirl.create(factory, :access => 'Private', :assigned_to => user.id) }
79
+ it{ should_not be_able_to(:manage, asset) }
80
+ end
78
81
 
79
- it{ should be_able_to(:manage, asset) }
80
- end
82
+ context "when private access not owner but is assigned" do
83
+ let(:asset){ FactoryGirl.create(factory, :access => 'Private', :assigned_to => user.id) }
81
84
 
82
- context "when shared access with permission" do
83
- let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission]) }
84
- let(:permission){ Permission.new(:user => user) }
85
+ it{ should be_able_to(:manage, asset) }
86
+ end
85
87
 
86
- it{ should be_able_to(:manage, asset) }
87
- end
88
+ context "when shared access with permission" do
89
+ let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission]) }
90
+ let(:permission){ Permission.new(:user => user) }
88
91
 
89
- context "when shared access with no permission" do
90
- let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission]) }
91
- let(:permission){ Permission.new(:user => FactoryGirl.create(:user)) }
92
+ it{ should be_able_to(:manage, asset) }
93
+ end
92
94
 
93
- it{ should_not be_able_to(:manage, asset) }
94
- end
95
-
96
- context "when shared access with no permission but administrator" do
97
- let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission]) }
98
- let(:permission){ Permission.new(:user => FactoryGirl.create(:user)) }
99
- let(:user) { FactoryGirl.create(:user, :admin => true) }
95
+ context "when shared access with no permission" do
96
+ let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission]) }
97
+ let(:permission){ Permission.new(:user => FactoryGirl.create(:user)) }
100
98
 
101
- it{ should be_able_to(:manage, asset) }
102
- end
103
-
104
- context "when shared access with no permission but assigned" do
105
- let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission], :assigned_to => user.id) }
106
- let(:permission){ Permission.new(:user => FactoryGirl.create(:user)) }
99
+ it{ should_not be_able_to(:manage, asset) }
100
+ end
107
101
 
108
- it{ should be_able_to(:manage, asset) }
109
- end
102
+ context "when shared access with no permission but administrator" do
103
+ let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission]) }
104
+ let(:permission){ Permission.new(:user => FactoryGirl.create(:user)) }
105
+ let(:user) { FactoryGirl.create(:user, :admin => true) }
110
106
 
111
- context "when shared access with group permission" do
112
- let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission]) }
113
- let(:permission){ Permission.new(:group => group) }
114
- let(:group){ FactoryGirl.create(:group, :users => [user]) }
107
+ it{ should be_able_to(:manage, asset) }
108
+ end
115
109
 
116
- it{ should be_able_to(:manage, asset) }
117
- end
118
-
119
- context "when shared access with several group permissions" do
120
- let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => permissions) }
121
- let(:permissions){ [Permission.new(:group => group1), Permission.new(:group => group2)] }
122
- let(:group1){ FactoryGirl.create(:group, :users => [user]) }
123
- let(:group2){ FactoryGirl.create(:group, :users => [user]) }
124
-
125
- it{ should be_able_to(:manage, asset) }
126
- end
110
+ context "when shared access with no permission but assigned" do
111
+ let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission], :assigned_to => user.id) }
112
+ let(:permission){ Permission.new(:user => FactoryGirl.create(:user)) }
113
+
114
+ it{ should be_able_to(:manage, asset) }
115
+ end
127
116
 
128
- context "when shared access with no group permission" do
129
- let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission]) }
130
- let(:permission){ Permission.new(:group => group) }
131
- let(:group){ FactoryGirl.create(:group) }
117
+ context "when shared access with group permission" do
118
+ let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission]) }
119
+ let(:permission){ Permission.new(:group => group) }
120
+ let(:group){ FactoryGirl.create(:group, :users => [user]) }
132
121
 
133
- it{ should_not be_able_to(:manage, asset) }
134
- end
135
-
122
+ it{ should be_able_to(:manage, asset) }
123
+ end
124
+
125
+ context "when shared access with several group permissions" do
126
+ let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => permissions) }
127
+ let(:permissions){ [Permission.new(:group => group1), Permission.new(:group => group2)] }
128
+ let(:group1){ FactoryGirl.create(:group, :users => [user]) }
129
+ let(:group2){ FactoryGirl.create(:group, :users => [user]) }
130
+
131
+ it{ should be_able_to(:manage, asset) }
136
132
  end
133
+
134
+ context "when shared access with no group permission" do
135
+ let(:asset){ FactoryGirl.create(factory, :access => 'Shared', :permissions => [permission]) }
136
+ let(:permission){ Permission.new(:group => group) }
137
+ let(:group){ FactoryGirl.create(:group) }
138
+
139
+ it{ should_not be_able_to(:manage, asset) }
140
+ end
141
+
137
142
  end