fat_free_crm 0.11.3 → 0.11.4

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 (637) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +2 -2
  3. data/CHANGELOG +6 -1
  4. data/CONTRIBUTORS +40 -1
  5. data/Capfile +5 -0
  6. data/Gemfile +25 -6
  7. data/Gemfile.lock +128 -86
  8. data/README.md +23 -16
  9. data/{vendor → app}/assets/images/delete.png +0 -0
  10. data/app/assets/javascripts/admin/fields.js.coffee +62 -0
  11. data/app/assets/javascripts/application.js.erb +8 -1
  12. data/app/assets/javascripts/crm.js +44 -46
  13. data/app/assets/javascripts/crm_chosen.js.coffee +10 -7
  14. data/app/assets/javascripts/datepicker.js.coffee +15 -0
  15. data/app/assets/javascripts/format_buttons.js.coffee +48 -0
  16. data/app/assets/javascripts/{admin/field_groups.js.coffee → groups.js.coffee} +0 -0
  17. data/app/assets/javascripts/lists.js.coffee +1 -1
  18. data/app/assets/javascripts/search.js.coffee +56 -38
  19. data/app/assets/stylesheets/admin/{field_groups.css.scss → fields.css.scss} +4 -0
  20. data/app/assets/stylesheets/advanced_search.css.scss +79 -0
  21. data/app/assets/stylesheets/application.css.erb +4 -0
  22. data/app/assets/stylesheets/base.scss +3 -3
  23. data/app/assets/stylesheets/common.scss +72 -25
  24. data/app/assets/stylesheets/fields.scss +14 -0
  25. data/app/assets/stylesheets/format_buttons.css.scss +30 -0
  26. data/app/assets/stylesheets/groups.css.scss +3 -0
  27. data/app/assets/stylesheets/header.scss +7 -6
  28. data/{vendor/plugins/.gitkeep → app/assets/stylesheets/index_headers.css.scss} +0 -0
  29. data/app/assets/stylesheets/print.css.scss +12 -3
  30. data/app/assets/stylesheets/rails.scss +12 -3
  31. data/app/controllers/admin/application_controller.rb +1 -1
  32. data/app/controllers/admin/field_groups_controller.rb +2 -0
  33. data/app/controllers/admin/fields_controller.rb +41 -17
  34. data/app/controllers/admin/groups_controller.rb +70 -0
  35. data/app/controllers/admin/tags_controller.rb +1 -0
  36. data/app/controllers/admin/users_controller.rb +8 -7
  37. data/app/controllers/application_controller.rb +34 -5
  38. data/app/controllers/comments_controller.rb +2 -3
  39. data/app/controllers/entities/accounts_controller.rb +30 -37
  40. data/app/controllers/entities/campaigns_controller.rb +56 -29
  41. data/app/controllers/entities/contacts_controller.rb +24 -26
  42. data/app/controllers/entities/leads_controller.rb +38 -37
  43. data/app/controllers/entities/opportunities_controller.rb +28 -34
  44. data/app/controllers/entities_controller.rb +71 -43
  45. data/app/controllers/home_controller.rb +29 -27
  46. data/app/controllers/tasks_controller.rb +18 -17
  47. data/app/controllers/users_controller.rb +12 -8
  48. data/app/helpers/accounts_helper.rb +58 -16
  49. data/app/helpers/addresses_helper.rb +4 -1
  50. data/app/helpers/admin/fields_helper.rb +3 -4
  51. data/app/helpers/application_helper.rb +147 -100
  52. data/app/helpers/campaigns_helper.rb +2 -9
  53. data/app/helpers/fields_helper.rb +0 -1
  54. data/app/helpers/groups_helper.rb +2 -0
  55. data/app/helpers/home_helper.rb +11 -0
  56. data/app/helpers/leads_helper.rb +2 -9
  57. data/app/helpers/opportunities_helper.rb +2 -9
  58. data/app/helpers/{crm_tags_helper.rb → tags_helper.rb} +9 -8
  59. data/app/helpers/tasks_helper.rb +5 -21
  60. data/app/helpers/users_helper.rb +14 -7
  61. data/app/helpers/versions_helper.rb +46 -0
  62. data/app/inputs/date_time_input.rb +8 -25
  63. data/app/inputs/datepair_input.rb +77 -0
  64. data/app/inputs/datetimepair_input.rb +37 -0
  65. data/app/mailers/user_mailer.rb +10 -0
  66. data/app/models/entities/account.rb +18 -11
  67. data/app/models/entities/account_contact.rb +4 -3
  68. data/app/models/entities/account_opportunity.rb +0 -1
  69. data/app/models/entities/campaign.rb +6 -7
  70. data/app/models/entities/contact.rb +53 -25
  71. data/app/models/entities/contact_opportunity.rb +0 -1
  72. data/app/models/entities/lead.rb +24 -13
  73. data/app/models/entities/opportunity.rb +34 -16
  74. data/app/models/fields/custom_field.rb +29 -13
  75. data/app/models/fields/custom_field_date_pair.rb +58 -0
  76. data/app/models/fields/custom_field_datetime_pair.rb +28 -0
  77. data/app/models/fields/custom_field_pair.rb +54 -0
  78. data/app/models/fields/field.rb +60 -43
  79. data/app/models/fields/field_group.rb +0 -9
  80. data/app/models/observers/entity_observer.rb +29 -0
  81. data/app/models/observers/opportunity_observer.rb +3 -0
  82. data/app/models/polymorphic/address.rb +14 -0
  83. data/app/models/polymorphic/avatar.rb +13 -1
  84. data/app/models/polymorphic/email.rb +1 -1
  85. data/app/models/polymorphic/task.rb +14 -13
  86. data/app/models/setting.rb +14 -21
  87. data/app/models/users/ability.rb +25 -4
  88. data/app/models/users/group.rb +13 -0
  89. data/app/models/users/permission.rb +3 -1
  90. data/app/models/users/preference.rb +1 -2
  91. data/app/models/users/user.rb +25 -3
  92. data/app/views/accounts/_account.html.haml +5 -39
  93. data/app/views/accounts/_edit.html.haml +3 -2
  94. data/app/views/accounts/_index_brief.html.haml +32 -0
  95. data/app/views/accounts/_index_long.html.haml +42 -0
  96. data/app/views/accounts/_new.html.haml +3 -2
  97. data/app/views/accounts/_sidebar_index.html.haml +3 -4
  98. data/app/views/accounts/_sidebar_show.html.haml +2 -2
  99. data/app/views/accounts/_title_bar.html.haml +11 -0
  100. data/app/views/accounts/_top_section.html.haml +1 -1
  101. data/app/views/accounts/create.js.rjs +1 -2
  102. data/app/views/accounts/destroy.js.rjs +1 -1
  103. data/app/views/accounts/edit.js.rjs +0 -2
  104. data/app/views/accounts/index.html.haml +6 -13
  105. data/app/views/accounts/index.js.rjs +3 -1
  106. data/app/views/accounts/index.xls.builder +82 -0
  107. data/app/views/accounts/new.js.rjs +0 -2
  108. data/app/views/accounts/show.html.haml +17 -15
  109. data/app/views/accounts/show.js.erb +2 -0
  110. data/app/views/admin/custom_fields/_base_field.html.haml +21 -0
  111. data/app/views/admin/custom_fields/_check_boxes_field.html.haml +6 -0
  112. data/app/views/admin/custom_fields/_date_field.html.haml +14 -0
  113. data/app/views/admin/custom_fields/_date_pair_field.html.haml +21 -0
  114. data/app/views/admin/custom_fields/_datetime_field.html.haml +14 -0
  115. data/app/views/admin/custom_fields/_datetime_pair_field.html.haml +21 -0
  116. data/app/views/admin/custom_fields/_radio_field.html.haml +6 -0
  117. data/app/views/admin/custom_fields/_select_field.html.haml +25 -0
  118. data/app/views/admin/custom_fields/_string_field.html.haml +2 -0
  119. data/app/views/admin/field_groups/_field_group.html.haml +7 -5
  120. data/app/views/admin/field_groups/_top_section.html.haml +4 -3
  121. data/app/views/admin/field_groups/create.js.rjs +1 -2
  122. data/app/views/admin/fields/_field.html.haml +5 -3
  123. data/app/views/admin/fields/_form.html.haml +35 -0
  124. data/app/views/admin/fields/_subform.html.haml +6 -0
  125. data/app/views/admin/fields/create.js.erb +19 -0
  126. data/app/views/admin/fields/destroy.js.erb +9 -0
  127. data/app/views/admin/fields/edit.js.erb +1 -0
  128. data/app/views/admin/fields/index.html.haml +11 -8
  129. data/app/views/admin/fields/update.js.erb +13 -0
  130. data/app/views/admin/groups/_edit.html.haml +12 -0
  131. data/app/views/admin/groups/_form.html.haml +13 -0
  132. data/app/views/admin/groups/_group.html.haml +15 -0
  133. data/app/views/admin/groups/_new.html.haml +12 -0
  134. data/app/views/admin/groups/create.js.rjs +11 -0
  135. data/app/views/admin/{fields → groups}/destroy.js.rjs +3 -3
  136. data/app/views/admin/groups/edit.js.rjs +21 -0
  137. data/app/views/admin/groups/index.html.haml +18 -0
  138. data/app/views/admin/groups/index.js.rjs +2 -0
  139. data/app/views/admin/groups/new.js.rjs +9 -0
  140. data/app/views/admin/groups/show.html.haml +11 -0
  141. data/app/views/admin/groups/update.js.rjs +10 -0
  142. data/app/views/admin/users/_profile.html.haml +13 -1
  143. data/app/views/admin/users/_user.html.haml +7 -2
  144. data/app/views/admin/users/index.js.rjs +1 -0
  145. data/app/views/application/index.atom.builder +1 -1
  146. data/app/views/application/index.rss.builder +1 -1
  147. data/app/views/application/show.atom.builder +32 -0
  148. data/app/views/application/show.rss.builder +29 -0
  149. data/app/views/campaigns/_campaign.html.haml +5 -21
  150. data/app/views/campaigns/_edit.html.haml +3 -2
  151. data/app/views/campaigns/_index_brief.html.haml +15 -0
  152. data/app/views/campaigns/_index_long.html.haml +20 -0
  153. data/app/views/campaigns/_new.html.haml +4 -2
  154. data/app/views/campaigns/_sidebar_index.html.haml +3 -3
  155. data/app/views/campaigns/_title_bar.html.haml +11 -0
  156. data/app/views/campaigns/_top_section.html.haml +2 -2
  157. data/app/views/campaigns/create.js.rjs +1 -4
  158. data/app/views/campaigns/destroy.js.rjs +1 -1
  159. data/app/views/campaigns/edit.js.rjs +0 -4
  160. data/app/views/campaigns/index.html.haml +6 -13
  161. data/app/views/campaigns/index.js.rjs +3 -1
  162. data/app/views/campaigns/index.xls.builder +75 -0
  163. data/app/views/campaigns/new.js.rjs +0 -4
  164. data/app/views/campaigns/show.html.haml +17 -15
  165. data/app/views/campaigns/show.js.erb +2 -0
  166. data/app/views/campaigns/update.js.rjs +0 -2
  167. data/app/views/comments/_comment.html.haml +6 -5
  168. data/app/views/comments/_edit.html.haml +5 -5
  169. data/app/views/comments/_new.html.haml +6 -5
  170. data/app/views/comments/create.js.rjs +1 -1
  171. data/app/views/contacts/_contact.html.haml +5 -52
  172. data/app/views/contacts/_contacts.html.haml +1 -0
  173. data/app/views/contacts/_edit.html.haml +3 -2
  174. data/app/views/contacts/_index_brief.html.haml +25 -0
  175. data/app/views/contacts/_index_full.html.haml +57 -0
  176. data/app/views/contacts/_index_long.html.haml +43 -0
  177. data/app/views/contacts/_new.html.haml +4 -2
  178. data/app/views/contacts/_section_extra.html.haml +26 -0
  179. data/app/views/contacts/_section_general.html.haml +22 -0
  180. data/app/views/contacts/_sidebar_index.html.haml +0 -3
  181. data/app/views/contacts/_sidebar_show.html.haml +2 -10
  182. data/app/views/contacts/_title_bar.html.haml +11 -0
  183. data/app/views/contacts/_top_section.html.haml +1 -1
  184. data/app/views/contacts/create.js.rjs +1 -2
  185. data/app/views/contacts/destroy.js.rjs +1 -1
  186. data/app/views/contacts/edit.js.rjs +0 -2
  187. data/app/views/contacts/index.html.haml +6 -14
  188. data/app/views/contacts/index.js.rjs +3 -1
  189. data/app/views/contacts/index.xls.builder +102 -0
  190. data/app/views/contacts/new.js.rjs +0 -2
  191. data/app/views/contacts/show.html.haml +15 -15
  192. data/app/views/contacts/show.js.erb +2 -0
  193. data/app/views/entities/_basic_search.html.haml +22 -0
  194. data/app/views/entities/_permissions.html.haml +41 -0
  195. data/app/views/entities/_search.html.haml +15 -0
  196. data/app/views/entities/_section_custom_fields.html.haml +11 -0
  197. data/app/views/entities/_title_bar.html.haml +12 -0
  198. data/app/views/entities/attach.js.rjs +1 -1
  199. data/app/views/entities/opportunities.js.rjs +1 -1
  200. data/app/views/entities/versions.js.erb +3 -0
  201. data/app/views/fields/_edit_custom_field_group.html.haml +8 -0
  202. data/app/views/fields/_group.html.haml +11 -20
  203. data/app/views/fields/_group_table.html.haml +13 -0
  204. data/app/views/fields/_group_view.html.haml +7 -0
  205. data/app/views/fields/_groups.html.haml +1 -4
  206. data/app/views/fields/_sidebar_show.html.haml +5 -4
  207. data/app/views/home/_account.html.haml +29 -0
  208. data/app/views/home/_activity.html.haml +16 -6
  209. data/app/views/home/_opportunity.html.haml +41 -0
  210. data/app/views/home/_options.html.haml +1 -1
  211. data/app/views/home/_task.html.haml +46 -0
  212. data/app/views/home/index.html.haml +32 -1
  213. data/app/views/home/index.js.rjs +1 -0
  214. data/app/views/layouts/_header.html.haml +3 -3
  215. data/app/views/layouts/_sidebar.html.haml +1 -3
  216. data/app/views/layouts/_tabbed.html.haml +2 -3
  217. data/app/views/layouts/_tabless.html.haml +1 -1
  218. data/app/views/layouts/admin/_header.html.haml +1 -1
  219. data/app/views/layouts/application.html.haml +7 -8
  220. data/app/views/layouts/header.xls.builder +8 -0
  221. data/app/views/leads/_contact.html.haml +1 -2
  222. data/app/views/leads/_convert.html.haml +1 -2
  223. data/app/views/leads/_convert_permissions.html.haml +21 -11
  224. data/app/views/leads/_edit.html.haml +3 -2
  225. data/app/views/leads/_index_brief.html.haml +41 -0
  226. data/app/views/leads/_index_long.html.haml +62 -0
  227. data/app/views/leads/_lead.html.haml +5 -62
  228. data/app/views/leads/_new.html.haml +4 -2
  229. data/app/views/leads/_opportunity.html.haml +1 -1
  230. data/app/views/leads/_sidebar_index.html.haml +3 -3
  231. data/app/views/leads/_sidebar_show.html.haml +3 -3
  232. data/app/views/leads/_status.html.haml +1 -1
  233. data/app/views/leads/_title_bar.html.haml +16 -0
  234. data/app/views/leads/convert.js.rjs +0 -1
  235. data/app/views/leads/create.js.rjs +1 -2
  236. data/app/views/leads/destroy.js.rjs +1 -1
  237. data/app/views/leads/edit.js.rjs +0 -2
  238. data/app/views/leads/index.html.haml +6 -13
  239. data/app/views/leads/index.js.rjs +3 -1
  240. data/app/views/leads/index.xls.builder +100 -0
  241. data/app/views/leads/new.js.rjs +0 -2
  242. data/app/views/leads/promote.js.rjs +0 -1
  243. data/app/views/leads/show.html.haml +13 -18
  244. data/app/views/leads/show.js.erb +2 -0
  245. data/app/views/{shared/_lists.html.haml → lists/_sidebar.html.haml} +0 -0
  246. data/app/views/lists/create.js.rjs +1 -1
  247. data/app/views/opportunities/_edit.html.haml +3 -2
  248. data/app/views/opportunities/_index_brief.html.haml +29 -0
  249. data/app/views/opportunities/_index_long.html.haml +59 -0
  250. data/app/views/opportunities/_new.html.haml +4 -2
  251. data/app/views/opportunities/_opportunity.html.haml +5 -57
  252. data/app/views/opportunities/_sidebar_index.html.haml +3 -3
  253. data/app/views/opportunities/_sidebar_show.html.haml +2 -2
  254. data/app/views/opportunities/_title_bar.html.haml +11 -0
  255. data/app/views/opportunities/_top_section.html.haml +2 -2
  256. data/app/views/opportunities/create.js.rjs +4 -6
  257. data/app/views/opportunities/destroy.js.rjs +1 -1
  258. data/app/views/opportunities/edit.js.rjs +0 -3
  259. data/app/views/opportunities/index.html.haml +6 -14
  260. data/app/views/opportunities/index.js.rjs +3 -1
  261. data/app/views/opportunities/index.xls.builder +69 -0
  262. data/app/views/opportunities/new.js.rjs +1 -5
  263. data/app/views/opportunities/show.html.haml +14 -14
  264. data/app/views/opportunities/show.js.erb +2 -0
  265. data/app/views/opportunities/update.js.rjs +0 -1
  266. data/app/views/passwords/new.html.haml +1 -1
  267. data/app/views/shared/_add_comment.html.haml +8 -0
  268. data/app/views/shared/_address.html.haml +1 -1
  269. data/app/views/shared/_address_show.html.haml +1 -1
  270. data/app/views/shared/_edit_comment.html.haml +2 -2
  271. data/app/views/shared/_export.html.haml +2 -1
  272. data/app/views/shared/_paginate_with_per_page.html.haml +14 -0
  273. data/app/views/shared/_recently.html.haml +1 -1
  274. data/app/views/shared/_search.html.haml +1 -1
  275. data/app/views/shared/_tags.html.haml +1 -2
  276. data/app/views/shared/_tasks.html.haml +2 -2
  277. data/app/views/tasks/_completed.html.haml +3 -3
  278. data/app/views/tasks/_new.html.haml +1 -1
  279. data/app/views/tasks/_pending.html.haml +2 -3
  280. data/app/views/tasks/_sidebar_index.html.haml +2 -2
  281. data/app/views/tasks/_top_section.html.haml +5 -3
  282. data/app/views/tasks/create.js.rjs +3 -4
  283. data/app/views/tasks/edit.js.rjs +2 -4
  284. data/app/views/tasks/index.html.haml +1 -1
  285. data/app/views/tasks/index.xls.builder +47 -0
  286. data/app/views/tasks/new.js.rjs +0 -2
  287. data/app/views/tasks/update.js.rjs +0 -1
  288. data/app/views/user_mailer/assigned_entity_notification.html.haml +3 -0
  289. data/app/views/users/_user.html.haml +2 -2
  290. data/app/views/users/_user_report.html.haml +6 -0
  291. data/app/views/users/opportunities_overview.html.haml +16 -0
  292. data/app/views/users/show.html.haml +2 -3
  293. data/app/views/users/update.js.rjs +1 -1
  294. data/app/views/versions/_version.html.haml +4 -19
  295. data/app/views/versions/_version_item.html.haml +8 -0
  296. data/app/views/versions/_versions.html.haml +9 -9
  297. data/config/application.rb +10 -2
  298. data/config/deploy.example.rb +47 -0
  299. data/config/environments/development.rb +1 -0
  300. data/config/environments/production.rb +1 -3
  301. data/config/environments/staging.rb +1 -1
  302. data/config/initializers/action_mailer.rb +10 -8
  303. data/config/initializers/custom_fields.rb +21 -0
  304. data/config/initializers/gravatar.rb +7 -0
  305. data/config/initializers/paper_trail.rb +1 -0
  306. data/config/initializers/ransack.rb +15 -0
  307. data/config/initializers/simple_form.rb +1 -2
  308. data/config/initializers/views.rb +42 -0
  309. data/config/locales/cz_fat_free_crm.yml +0 -10
  310. data/config/locales/de_fat_free_crm.yml +23 -21
  311. data/config/locales/en-GB_fat_free_crm.yml +241 -25
  312. data/config/locales/en-US_fat_free_crm.yml +139 -57
  313. data/config/locales/en-US_ransack.yml +92 -0
  314. data/config/locales/es_fat_free_crm.yml +0 -6
  315. data/config/locales/fr-CA_fat_free_crm.yml +0 -6
  316. data/config/locales/fr_fat_free_crm.yml +3 -14
  317. data/config/locales/it_fat_free_crm.yml +0 -11
  318. data/config/locales/ja_fat_free_crm.yml +0 -10
  319. data/config/locales/pl_fat_free_crm.yml +0 -6
  320. data/config/locales/pt-BR_fat_free_crm.yml +0 -6
  321. data/config/locales/ru_fat_free_crm.yml +0 -9
  322. data/config/locales/sv-SE_fat_free_crm.yml +0 -10
  323. data/config/locales/th_fat_free_crm.yml +0 -6
  324. data/config/locales/zh-CN.yml +4 -0
  325. data/config/locales/zh-CN_fat_free_crm.yml +78 -47
  326. data/config/routes.rb +13 -0
  327. data/config/settings.default.yml +20 -20
  328. data/db/demo/addresses.yml +2 -2
  329. data/db/migrate/20100928030598_create_sessions.rb +5 -0
  330. data/db/migrate/20100928030627_acts_as_taggable_on_migration.rb +6 -6
  331. data/db/migrate/20111201030535_add_field_groups_klass_name.rb +2 -1
  332. data/db/migrate/20120406082136_create_groups.rb +19 -0
  333. data/db/migrate/20120510025219_add_not_null_constraints_for_timestamp_columns.rb +21 -0
  334. data/db/migrate/20120528102124_increase_length_of_version_events.rb +9 -0
  335. data/db/migrate/20120801032706_add_pair_id_to_fields.rb +5 -0
  336. data/db/migrate/20121003063155_add_settings_to_custom_fields.rb +5 -0
  337. data/db/migrate/20121221033947_fix_country_mapping.rb +32 -0
  338. data/db/schema.rb +25 -6
  339. data/fat_free_crm.gemspec +16 -13
  340. data/lib/fat_free_crm.rb +2 -0
  341. data/lib/fat_free_crm/comment_extensions.rb +23 -0
  342. data/lib/fat_free_crm/core_ext/array.rb +8 -2
  343. data/lib/fat_free_crm/fields.rb +24 -2
  344. data/lib/fat_free_crm/gem_dependencies.rb +7 -1
  345. data/lib/fat_free_crm/permissions.rb +47 -26
  346. data/lib/fat_free_crm/version.rb +1 -1
  347. data/lib/fat_free_crm/view_factory.rb +95 -0
  348. data/lib/plugins/country_select/lib/country_select.rb +393 -374
  349. data/lib/tasks/{plugins.rake → db/migrate.rake} +1 -1
  350. data/lib/tasks/{schema_upgrade.rake → db/schema.rake} +2 -1
  351. data/lib/tasks/{mail_processing.rake → ffcrm/comment_replies.rake} +2 -21
  352. data/lib/tasks/ffcrm/config.rake +33 -0
  353. data/lib/tasks/{demo.rake → ffcrm/demo.rake} +3 -2
  354. data/lib/tasks/ffcrm/dropbox.rake +42 -0
  355. data/lib/tasks/ffcrm/settings.rake +46 -0
  356. data/lib/tasks/{fat_free_crm.rake → ffcrm/setup.rake} +1 -39
  357. data/lib/tasks/ffcrm/update_data.rake +256 -0
  358. data/{acceptance → spec/acceptance}/acceptance_helper.rb +5 -4
  359. data/{acceptance → spec/acceptance}/accounts_spec.rb +36 -10
  360. data/spec/acceptance/admin/groups_spec.rb +26 -0
  361. data/spec/acceptance/admin/users_spec.rb +34 -0
  362. data/spec/acceptance/campaigns_spec.rb +101 -0
  363. data/spec/acceptance/contacts_spec.rb +101 -0
  364. data/spec/acceptance/dashboard_spec.rb +62 -0
  365. data/spec/acceptance/leads_spec.rb +109 -0
  366. data/spec/acceptance/opportunities_overview_spec.rb +82 -0
  367. data/spec/acceptance/opportunities_spec.rb +103 -0
  368. data/{acceptance → spec/acceptance}/support/browser.rb +0 -0
  369. data/{acceptance → spec/acceptance}/support/headless.rb +0 -0
  370. data/{acceptance → spec/acceptance}/support/helpers.rb +8 -1
  371. data/{acceptance → spec/acceptance}/support/maintain_sessions.rb +0 -0
  372. data/spec/acceptance/support/paths.rb +42 -0
  373. data/spec/acceptance/support/selector_helpers.rb +31 -0
  374. data/spec/acceptance/tasks_spec.rb +85 -0
  375. data/spec/controllers/admin/groups_controller_spec.rb +5 -0
  376. data/spec/controllers/admin/users_controller_spec.rb +2 -3
  377. data/spec/controllers/applications_controller_spec.rb +40 -0
  378. data/spec/controllers/comments_controller_spec.rb +5 -6
  379. data/spec/controllers/emails_controller_spec.rb +1 -2
  380. data/spec/controllers/entities/accounts_controller_spec.rb +65 -81
  381. data/spec/controllers/entities/campaigns_controller_spec.rb +69 -85
  382. data/spec/controllers/entities/contacts_controller_spec.rb +78 -95
  383. data/spec/controllers/entities/leads_controller_spec.rb +105 -127
  384. data/spec/controllers/entities/opportunities_controller_spec.rb +88 -103
  385. data/spec/controllers/entities_controller_spec.rb +39 -0
  386. data/spec/controllers/home_controller_spec.rb +101 -11
  387. data/spec/controllers/tasks_controller_spec.rb +27 -32
  388. data/spec/controllers/users_controller_spec.rb +95 -28
  389. data/spec/factories/account_factories.rb +2 -2
  390. data/spec/factories/opportunity_factories.rb +12 -4
  391. data/spec/factories/task_factories.rb +4 -0
  392. data/spec/factories/user_factories.rb +9 -2
  393. data/spec/helpers/application_helper_spec.rb +15 -1
  394. data/spec/helpers/groups_helper_spec.rb +15 -0
  395. data/spec/helpers/users_helper_spec.rb +26 -4
  396. data/spec/lib/comment_extensions_spec.rb +29 -0
  397. data/spec/lib/core_ext/{string.rb → string_spec.rb} +0 -1
  398. data/spec/lib/fields_spec.rb +104 -0
  399. data/spec/lib/permissions_spec.rb +144 -0
  400. data/spec/lib/view_factory_spec.rb +68 -0
  401. data/spec/mailers/subscription_mailer_spec.rb +18 -4
  402. data/spec/mailers/user_mailer_spec.rb +134 -0
  403. data/spec/models/entities/account_spec.rb +44 -4
  404. data/spec/models/entities/campaign_spec.rb +3 -4
  405. data/spec/models/entities/contact_spec.rb +45 -5
  406. data/spec/models/entities/lead_spec.rb +3 -4
  407. data/spec/models/entities/opportunity_spec.rb +105 -9
  408. data/spec/models/fields/custom_field_date_pair_spec.rb +106 -0
  409. data/spec/models/fields/custom_field_pair_spec.rb +94 -0
  410. data/spec/models/fields/custom_field_spec.rb +43 -23
  411. data/spec/models/fields/field_spec.rb +3 -5
  412. data/spec/models/observers/entity_observer_spec.rb +65 -0
  413. data/spec/models/polymorphic/task_spec.rb +74 -118
  414. data/spec/models/polymorphic/version_spec.rb +18 -18
  415. data/spec/models/users/group_spec.rb +5 -0
  416. data/spec/models/users/permission_spec.rb +18 -1
  417. data/spec/models/users/preference_spec.rb +5 -1
  418. data/spec/models/users/user_spec.rb +55 -8
  419. data/spec/shared/models.rb +54 -0
  420. data/spec/spec_helper.rb +82 -87
  421. data/spec/support/auth_macros.rb +2 -3
  422. data/spec/views/accounts/_edit.haml_spec.rb +1 -2
  423. data/spec/views/accounts/_new.haml_spec.rb +1 -2
  424. data/spec/views/accounts/create.rjs_spec.rb +1 -3
  425. data/spec/views/accounts/edit.rjs_spec.rb +3 -4
  426. data/spec/views/accounts/index.haml_spec.rb +9 -6
  427. data/spec/views/accounts/new.rjs_spec.rb +2 -9
  428. data/spec/views/accounts/show.haml_spec.rb +1 -2
  429. data/spec/views/accounts/update.rjs_spec.rb +2 -3
  430. data/spec/views/admin/users/_create.haml_spec.rb +1 -2
  431. data/spec/views/admin/users/create.rjs_spec.rb +1 -2
  432. data/spec/views/campaigns/_edit.haml_spec.rb +2 -3
  433. data/spec/views/campaigns/_new.haml_spec.rb +2 -3
  434. data/spec/views/campaigns/create.rjs_spec.rb +0 -3
  435. data/spec/views/campaigns/destroy.rjs_spec.rb +1 -2
  436. data/spec/views/campaigns/edit.rjs_spec.rb +3 -6
  437. data/spec/views/campaigns/index.haml_spec.rb +6 -3
  438. data/spec/views/campaigns/new.rjs_spec.rb +2 -13
  439. data/spec/views/campaigns/show.haml_spec.rb +4 -6
  440. data/spec/views/campaigns/update.rjs_spec.rb +2 -7
  441. data/spec/views/contacts/_edit.haml_spec.rb +6 -7
  442. data/spec/views/contacts/_new.haml_spec.rb +2 -3
  443. data/spec/views/contacts/create.rjs_spec.rb +1 -3
  444. data/spec/views/contacts/edit.rjs_spec.rb +3 -4
  445. data/spec/views/contacts/index.haml_spec.rb +6 -3
  446. data/spec/views/contacts/new.rjs_spec.rb +2 -11
  447. data/spec/views/contacts/show.haml_spec.rb +1 -2
  448. data/spec/views/contacts/update.rjs_spec.rb +2 -3
  449. data/spec/views/home/index.haml_spec.rb +6 -2
  450. data/spec/views/home/index.rjs_spec.rb +1 -2
  451. data/spec/views/home/options.rjs_spec.rb +1 -2
  452. data/spec/views/leads/_convert.haml_spec.rb +1 -2
  453. data/spec/views/leads/_edit.haml_spec.rb +2 -3
  454. data/spec/views/leads/_new.haml_spec.rb +2 -3
  455. data/spec/views/leads/_sidebar_show.haml_spec.rb +1 -2
  456. data/spec/views/leads/convert.rjs_spec.rb +3 -5
  457. data/spec/views/leads/edit.rjs_spec.rb +4 -5
  458. data/spec/views/leads/index.haml_spec.rb +6 -3
  459. data/spec/views/leads/new.rjs_spec.rb +2 -11
  460. data/spec/views/leads/promote.rjs_spec.rb +3 -5
  461. data/spec/views/leads/show.haml_spec.rb +1 -2
  462. data/spec/views/leads/update.rjs_spec.rb +2 -3
  463. data/spec/views/opportunities/_edit.haml_spec.rb +5 -6
  464. data/spec/views/opportunities/_new.haml_spec.rb +2 -4
  465. data/spec/views/opportunities/create.rjs_spec.rb +0 -2
  466. data/spec/views/opportunities/edit.rjs_spec.rb +3 -4
  467. data/spec/views/opportunities/index.haml_spec.rb +7 -4
  468. data/spec/views/opportunities/new.rjs_spec.rb +2 -12
  469. data/spec/views/opportunities/show.haml_spec.rb +1 -2
  470. data/spec/views/opportunities/update.rjs_spec.rb +2 -3
  471. data/spec/views/tasks/_edit.haml_spec.rb +1 -3
  472. data/spec/views/tasks/complete.rjs_spec.rb +2 -3
  473. data/spec/views/tasks/create.rjs_spec.rb +2 -2
  474. data/spec/views/tasks/edit.rjs_spec.rb +1 -2
  475. data/spec/views/tasks/new.rjs_spec.rb +1 -18
  476. data/spec/views/users/avatar.rjs_spec.rb +1 -2
  477. data/spec/views/users/change_password.rjs_spec.rb +1 -2
  478. data/spec/views/users/edit.rjs_spec.rb +1 -2
  479. data/spec/views/users/password.rjs_spec.rb +1 -1
  480. data/spec/views/users/update.rjs_spec.rb +1 -2
  481. data/spec/views/users/upload_avatar.rjs_spec.rb +6 -7
  482. data/vendor/assets/images/brief.png +0 -0
  483. data/vendor/assets/images/chosen-sprite.png +0 -0
  484. data/vendor/assets/images/full.png +0 -0
  485. data/vendor/assets/images/jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  486. data/vendor/assets/images/jquery-ui/ui-bg_flat_0_eeeeee_40x100.png +0 -0
  487. data/vendor/assets/images/jquery-ui/ui-bg_flat_100_ffffff_40x100.png +0 -0
  488. data/vendor/assets/images/jquery-ui/ui-bg_flat_25_3875d7_40x100.png +0 -0
  489. data/vendor/assets/images/jquery-ui/ui-bg_flat_55_ffffff_40x100.png +0 -0
  490. data/vendor/assets/images/jquery-ui/ui-bg_flat_65_3875d7_40x100.png +0 -0
  491. data/vendor/assets/images/jquery-ui/ui-bg_flat_75_ffffff_40x100.png +0 -0
  492. data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
  493. data/vendor/assets/images/jquery-ui/{ui-icons_ef8c08_256x240.png → ui-icons_0073ea_256x240.png} +0 -0
  494. data/vendor/assets/images/jquery-ui/ui-icons_466bb1_256x240.png +0 -0
  495. data/vendor/assets/images/jquery-ui/{ui-icons_ffd27a_256x240.png → ui-icons_ff0084_256x240.png} +0 -0
  496. data/vendor/assets/images/long.png +0 -0
  497. data/vendor/assets/javascripts/chosen-jquery.js +3 -0
  498. data/vendor/assets/javascripts/chosen-prototype.js +3 -0
  499. data/vendor/assets/javascripts/chosen.jquery.coffee +574 -0
  500. data/vendor/assets/javascripts/chosen.proto.coffee +580 -0
  501. data/vendor/assets/javascripts/jquery.disable.js +23 -0
  502. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-addon.js +1882 -0
  503. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-af.js +20 -0
  504. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ca.js +20 -0
  505. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-cz.js +20 -0
  506. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-de.js +20 -0
  507. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-el.js +20 -0
  508. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-es.js +20 -0
  509. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-et.js +20 -0
  510. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-fi.js +20 -0
  511. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-fr-CA.js +20 -0
  512. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-fr.js +20 -0
  513. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-gl.js +20 -0
  514. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-he.js +20 -0
  515. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-hu.js +20 -0
  516. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-id.js +20 -0
  517. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-it.js +20 -0
  518. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ja.js +20 -0
  519. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ko.js +20 -0
  520. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-lt.js +20 -0
  521. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-nl.js +20 -0
  522. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-no.js +20 -0
  523. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-pl.js +20 -0
  524. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-pt.js +20 -0
  525. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ro.js +20 -0
  526. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-ru.js +20 -0
  527. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-sk.js +20 -0
  528. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-sv.js +20 -0
  529. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-tr.js +20 -0
  530. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-vi.js +20 -0
  531. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-zh-CN.js +20 -0
  532. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery-ui-timepicker-zh-TW.js +20 -0
  533. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-cz.js +23 -0
  534. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-de.js +23 -0
  535. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-en-GB.js +23 -0
  536. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-es.js +23 -0
  537. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-fr.js +23 -0
  538. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-it.js +23 -0
  539. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-ja.js +23 -0
  540. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-pl.js +23 -0
  541. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-pt-BR.js +23 -0
  542. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-ru.js +23 -0
  543. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-sv-SE.js +23 -0
  544. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-th.js +23 -0
  545. data/vendor/assets/javascripts/jquery_ui_datepicker/jquery.ui.datepicker-zh-CN.js +23 -0
  546. data/vendor/assets/javascripts/lib/abstract-chosen.coffee +110 -0
  547. data/vendor/assets/javascripts/lib/select-parser.coffee +51 -0
  548. data/vendor/assets/stylesheets/chosen.css.sass +361 -0
  549. data/vendor/assets/stylesheets/{jquery-ui.custom.css.erb → jquery-ui.custom.css} +70 -70
  550. data/zeus.json +21 -0
  551. metadata +304 -140
  552. data/acceptance/support/database_cleaner.rb +0 -16
  553. data/acceptance/support/paths.rb +0 -9
  554. data/app/views/accounts/_options.html.haml +0 -20
  555. data/app/views/accounts/_permissions.html.haml +0 -24
  556. data/app/views/accounts/options.js.rjs +0 -10
  557. data/app/views/admin/fields/_edit.html.haml +0 -9
  558. data/app/views/admin/fields/_new.html.haml +0 -10
  559. data/app/views/admin/fields/_options.html.haml +0 -12
  560. data/app/views/admin/fields/_top_section.html.haml +0 -54
  561. data/app/views/admin/fields/create.js.rjs +0 -16
  562. data/app/views/admin/fields/edit.js.rjs +0 -35
  563. data/app/views/admin/fields/index.js.rjs +0 -6
  564. data/app/views/admin/fields/new.js.rjs +0 -8
  565. data/app/views/admin/fields/options.js.rjs +0 -10
  566. data/app/views/admin/fields/update.js.rjs +0 -17
  567. data/app/views/campaigns/_options.html.haml +0 -20
  568. data/app/views/campaigns/_permissions.html.haml +0 -24
  569. data/app/views/campaigns/options.js.rjs +0 -10
  570. data/app/views/contacts/_options.html.haml +0 -21
  571. data/app/views/contacts/_permissions.html.haml +0 -24
  572. data/app/views/contacts/options.js.rjs +0 -10
  573. data/app/views/entities/_advanced_search.html.haml +0 -12
  574. data/app/views/entities/_condition_fields.html.haml +0 -14
  575. data/app/views/entities/_grouping_fields.html.haml +0 -12
  576. data/app/views/entities/advanced_search.js.rjs +0 -9
  577. data/app/views/entities/versions.js.rjs +0 -3
  578. data/app/views/leads/_options.html.haml +0 -21
  579. data/app/views/leads/_permissions.html.haml +0 -28
  580. data/app/views/leads/options.js.rjs +0 -10
  581. data/app/views/opportunities/_options.html.haml +0 -20
  582. data/app/views/opportunities/_permissions.html.haml +0 -24
  583. data/app/views/opportunities/options.js.rjs +0 -10
  584. data/app/views/shared/_outline.html.haml +0 -9
  585. data/app/views/shared/_per_page.html.haml +0 -10
  586. data/app/views/shared/_sort_by.html.haml +0 -10
  587. data/config/initializers/cancan.rb +0 -151
  588. data/config/initializers/squeel.rb +0 -5
  589. data/public/blank_iframe.html +0 -2
  590. data/spec/views/accounts/options.rjs_spec.rb +0 -59
  591. data/spec/views/campaigns/options.rjs_spec.rb +0 -60
  592. data/spec/views/contacts/options.rjs_spec.rb +0 -61
  593. data/spec/views/leads/options.rjs_spec.rb +0 -61
  594. data/spec/views/opportunities/options.rjs_spec.rb +0 -60
  595. data/vendor/assets/images/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  596. data/vendor/assets/images/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  597. data/vendor/assets/images/jquery-ui/ui-bg_flat_10_000000_40x100.png +0 -0
  598. data/vendor/assets/images/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  599. data/vendor/assets/images/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  600. data/vendor/assets/images/jquery-ui/ui-bg_glass_65_ffffff_1x400.png +0 -0
  601. data/vendor/assets/images/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  602. data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  603. data/vendor/assets/images/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  604. data/vendor/assets/images/jquery-ui/ui-icons_222222_256x240.png +0 -0
  605. data/vendor/assets/images/jquery-ui/ui-icons_228ef1_256x240.png +0 -0
  606. data/vendor/assets/javascripts/calendar_date_select/calendar_date_select.js +0 -446
  607. data/vendor/assets/javascripts/calendar_date_select/format_american.js +0 -35
  608. data/vendor/assets/javascripts/calendar_date_select/format_danish.js +0 -31
  609. data/vendor/assets/javascripts/calendar_date_select/format_db.js +0 -27
  610. data/vendor/assets/javascripts/calendar_date_select/format_euro_24hr.js +0 -7
  611. data/vendor/assets/javascripts/calendar_date_select/format_euro_24hr_ymd.js +0 -7
  612. data/vendor/assets/javascripts/calendar_date_select/format_finnish.js +0 -32
  613. data/vendor/assets/javascripts/calendar_date_select/format_french.js +0 -24
  614. data/vendor/assets/javascripts/calendar_date_select/format_hyphen_ampm.js +0 -37
  615. data/vendor/assets/javascripts/calendar_date_select/format_iso_date.js +0 -29
  616. data/vendor/assets/javascripts/calendar_date_select/format_italian.js +0 -24
  617. data/vendor/assets/javascripts/calendar_date_select/locale/ar.js +0 -10
  618. data/vendor/assets/javascripts/calendar_date_select/locale/da.js +0 -11
  619. data/vendor/assets/javascripts/calendar_date_select/locale/de.js +0 -11
  620. data/vendor/assets/javascripts/calendar_date_select/locale/es.js +0 -11
  621. data/vendor/assets/javascripts/calendar_date_select/locale/fi.js +0 -10
  622. data/vendor/assets/javascripts/calendar_date_select/locale/fr.js +0 -11
  623. data/vendor/assets/javascripts/calendar_date_select/locale/it.js +0 -9
  624. data/vendor/assets/javascripts/calendar_date_select/locale/ja.js +0 -11
  625. data/vendor/assets/javascripts/calendar_date_select/locale/nl.js +0 -11
  626. data/vendor/assets/javascripts/calendar_date_select/locale/pl.js +0 -11
  627. data/vendor/assets/javascripts/calendar_date_select/locale/pt.js +0 -11
  628. data/vendor/assets/javascripts/calendar_date_select/locale/ru.js +0 -10
  629. data/vendor/assets/javascripts/calendar_date_select/locale/sl.js +0 -11
  630. data/vendor/assets/javascripts/calendar_date_select/locale/sv.js +0 -9
  631. data/vendor/assets/stylesheets/calendar_date_select/blue.css +0 -130
  632. data/vendor/assets/stylesheets/calendar_date_select/default.css +0 -135
  633. data/vendor/assets/stylesheets/calendar_date_select/green.css +0 -142
  634. data/vendor/assets/stylesheets/calendar_date_select/plain.css +0 -128
  635. data/vendor/assets/stylesheets/calendar_date_select/red.css +0 -135
  636. data/vendor/assets/stylesheets/calendar_date_select/silver.css +0 -133
  637. data/vendor/plugins/.gitkeep~master +0 -0
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe EntitiesController do
4
+
5
+ describe "parse_query_and_tags" do
6
+
7
+ it "should parse empty string" do
8
+ str = ""
9
+ controller.send(:parse_query_and_tags, str).should == ['', '']
10
+ end
11
+
12
+ it "should parse #tags" do
13
+ str = "#test"
14
+ controller.send(:parse_query_and_tags, str).should == ['', 'test']
15
+ end
16
+
17
+ it "should parse no tags" do
18
+ str = "test query"
19
+ controller.send(:parse_query_and_tags, str).should == ['test query', '']
20
+ end
21
+
22
+ it "should parse tags and query" do
23
+ str = "#real Billy Bones #pirate"
24
+ controller.send(:parse_query_and_tags, str).should == [ "Billy Bones", "real, pirate" ]
25
+ end
26
+
27
+ it "should parse strange characters" do
28
+ str = "#this is #a test !@$%^~ #parseme"
29
+ controller.send(:parse_query_and_tags, str).should == ['is test !@$%^~', 'this, a, parseme']
30
+ end
31
+
32
+ it "should strip whitespace" do
33
+ str = " test me "
34
+ controller.send(:parse_query_and_tags, str).should == ['test me', '']
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -10,11 +10,65 @@ describe HomeController do
10
10
  end
11
11
 
12
12
  it "should get a list of activities" do
13
- @activity = FactoryGirl.create(:version, :item => FactoryGirl.create(:account, :user => @current_user))
14
- controller.should_receive(:get_activities).once.and_return([ @activity ])
13
+ activity = FactoryGirl.create(:version, :item => FactoryGirl.create(:account, :user => current_user))
14
+ controller.should_receive(:get_activities).once.and_return([ activity ])
15
+ get :index
16
+ assigns[:activities].should == [ activity ]
17
+ end
18
+
19
+ it "should not include views in the list of activities" do
20
+ activity = FactoryGirl.create(:version, :item => FactoryGirl.create(:account, :user => @current_user), :event => "view")
21
+ controller.should_receive(:get_activities).once.and_return([])
15
22
 
16
23
  get :index
17
- assigns[:activities].should == [ @activity ]
24
+ assigns[:activities].should == []
25
+ end
26
+
27
+ it "should get a list of my tasks ordered by due_at" do
28
+ task_1 = FactoryGirl.create(:task, :name => "Your first task", :bucket => "due_asap", :assigned_to => current_user.id)
29
+ task_2 = FactoryGirl.create(:task, :name => "Another task for you", :bucket => "specific_time", :calendar => 5.days.from_now.to_s, :assigned_to => current_user.id)
30
+ task_3 = FactoryGirl.create(:task, :name => "Third Task", :bucket => "due_next_week", :assigned_to => current_user.id)
31
+ task_4 = FactoryGirl.create(:task, :name => "i've assigned it to myself", :user => current_user, :calendar => 20.days.from_now.to_s, :assigned_to => nil, :bucket => "specific_time")
32
+
33
+ FactoryGirl.create(:task, :name => "Someone else's Task", :user_id => current_user.id, :bucket => "due_asap", :assigned_to => FactoryGirl.create(:user).id)
34
+ FactoryGirl.create(:task, :name => "Not my task", :bucket => "due_asap", :assigned_to => FactoryGirl.create(:user).id)
35
+
36
+ get :index
37
+ assigns[:my_tasks].should == [task_1, task_2, task_3, task_4]
38
+ end
39
+
40
+ it "should not display completed tasks" do
41
+ task_1 = FactoryGirl.create(:task, :user_id => current_user.id, :name => "Your first task", :bucket => "due_asap", :assigned_to => current_user.id)
42
+ task_2 = FactoryGirl.create(:task, :user_id => current_user.id, :name => "Completed task", :bucket => "due_asap", :completed_at => 1.days.ago, :completed_by => current_user.id, :assigned_to => current_user.id)
43
+
44
+ get :index
45
+ assigns[:my_tasks].should == [task_1]
46
+ end
47
+
48
+ it "should get a list of my opportunities ordered by closes_on" do
49
+ opportunity_1 = FactoryGirl.create(:opportunity, :name => "Your first opportunity", :closes_on => 15.days.from_now, :assigned_to => current_user.id, :stage => 'proposal')
50
+ opportunity_2 = FactoryGirl.create(:opportunity, :name => "Another opportunity for you", :closes_on => 10.days.from_now, :assigned_to => current_user.id, :stage => 'proposal')
51
+ opportunity_3 = FactoryGirl.create(:opportunity, :name => "Third Opportunity", :closes_on => 5.days.from_now, :assigned_to => current_user.id, :stage => 'proposal')
52
+ opportunity_4 = FactoryGirl.create(:opportunity, :name => "Fourth Opportunity", :closes_on => 50.days.from_now, :assigned_to => nil, :user_id => current_user.id, :stage => 'proposal')
53
+
54
+ FactoryGirl.create(:opportunity_in_pipeline, :name => "Someone else's Opportunity", :assigned_to => FactoryGirl.create(:user).id, :stage => 'proposal')
55
+ FactoryGirl.create(:opportunity_in_pipeline, :name => "Not my opportunity", :assigned_to => FactoryGirl.create(:user).id, :stage => 'proposal')
56
+
57
+ get :index
58
+ assigns[:my_opportunities].should == [opportunity_3, opportunity_2, opportunity_1, opportunity_4]
59
+ end
60
+
61
+ it "should get a list of my accounts ordered by name" do
62
+ account_1 = FactoryGirl.create(:account, :name => "Anderson", :assigned_to => current_user.id)
63
+ account_2 = FactoryGirl.create(:account, :name => "Wilson", :assigned_to => current_user.id)
64
+ account_3 = FactoryGirl.create(:account, :name => "Triple", :assigned_to => current_user.id)
65
+ account_4 = FactoryGirl.create(:account, :name => "Double", :assigned_to => nil, :user_id => current_user.id)
66
+
67
+ FactoryGirl.create(:account, :name => "Someone else's Account", :assigned_to => FactoryGirl.create(:user).id)
68
+ FactoryGirl.create(:account, :name => "Not my account", :assigned_to => FactoryGirl.create(:user).id)
69
+
70
+ get :index
71
+ assigns[:my_accounts].should == [account_1, account_4, account_3, account_2]
18
72
  end
19
73
 
20
74
  it "should assign @hello and call hook" do
@@ -34,9 +88,9 @@ describe HomeController do
34
88
  end
35
89
 
36
90
  it "should assign instance variables for user preferences" do
37
- @asset = FactoryGirl.create(:preference, :user => @current_user, :name => "activity_asset", :value => Base64.encode64(Marshal.dump("tasks")))
38
- @user = FactoryGirl.create(:preference, :user => @current_user, :name => "activity_user", :value => Base64.encode64(Marshal.dump("Billy Bones")))
39
- @duration = FactoryGirl.create(:preference, :user => @current_user, :name => "activity_duration", :value => Base64.encode64(Marshal.dump("two days")))
91
+ @asset = FactoryGirl.create(:preference, :user => current_user, :name => "activity_asset", :value => Base64.encode64(Marshal.dump("tasks")))
92
+ @user = FactoryGirl.create(:preference, :user => current_user, :name => "activity_user", :value => Base64.encode64(Marshal.dump("Billy Bones")))
93
+ @duration = FactoryGirl.create(:preference, :user => current_user, :name => "activity_duration", :value => Base64.encode64(Marshal.dump("two days")))
40
94
 
41
95
  xhr :get, :options
42
96
  assigns[:asset].should == "tasks"
@@ -63,13 +117,13 @@ describe HomeController do
63
117
 
64
118
  it "should save user selected options" do
65
119
  xhr :post, :redraw, :asset => "tasks", :user => "Billy Bones", :duration => "two days"
66
- @current_user.pref[:activity_asset].should == "tasks"
67
- @current_user.pref[:activity_user].should == "Billy Bones"
68
- @current_user.pref[:activity_duration].should == "two days"
120
+ current_user.pref[:activity_asset].should == "tasks"
121
+ current_user.pref[:activity_user].should == "Billy Bones"
122
+ current_user.pref[:activity_duration].should == "two days"
69
123
  end
70
124
 
71
125
  it "should get a list of activities" do
72
- @activity = FactoryGirl.create(:version, :item => FactoryGirl.create(:account, :user => @current_user))
126
+ @activity = FactoryGirl.create(:version, :item => FactoryGirl.create(:account, :user => current_user))
73
127
  controller.should_receive(:get_activities).once.and_return([ @activity ])
74
128
 
75
129
  get :index
@@ -94,6 +148,42 @@ describe HomeController do
94
148
  session[:hello].should == true
95
149
  end
96
150
  end
151
+
152
+ describe "activity_user" do
153
+
154
+ before(:each) do
155
+ @user = mock(User, :id => 1, :is_a? => true)
156
+ @cur_user = mock(User)
157
+ end
158
+
159
+ it "should find a user by email" do
160
+ @cur_user.stub!(:pref).and_return(:activity_user => 'billy@example.com')
161
+ controller.instance_variable_set(:@current_user, @cur_user)
162
+ User.should_receive(:where).with(:email => 'billy@example.com').and_return([@user])
163
+ controller.send(:activity_user).should == 1
164
+ end
165
+
166
+ it "should find a user by first name or last name" do
167
+ @cur_user.stub!(:pref).and_return(:activity_user => 'Billy')
168
+ controller.instance_variable_set(:@current_user, @cur_user)
169
+ User.should_receive(:where).with("upper(first_name) LIKE upper('%Billy%') OR upper(last_name) LIKE upper('%Billy%')").and_return([@user])
170
+ controller.send(:activity_user).should == 1
171
+ end
172
+
173
+ it "should find a user by first name and last name" do
174
+ @cur_user.stub!(:pref).and_return(:activity_user => 'Billy Elliot')
175
+ controller.instance_variable_set(:@current_user, @cur_user)
176
+ User.should_receive(:where).with("(upper(first_name) LIKE upper('%Billy%') AND upper(last_name) LIKE upper('%Elliot%')) OR (upper(first_name) LIKE upper('%Elliot%') AND upper(last_name) LIKE upper('%Billy%'))").and_return([@user])
177
+ controller.send(:activity_user).should == 1
178
+ end
179
+
180
+ it "should return nil when 'all_users' is specified" do
181
+ @cur_user.stub!(:pref).and_return(:activity_user => 'all_users')
182
+ controller.instance_variable_set(:@current_user, @cur_user)
183
+ User.should_not_receive(:where)
184
+ controller.send(:activity_user).should == nil
185
+ end
186
+
187
+ end
97
188
 
98
189
  end
99
-
@@ -62,7 +62,7 @@ describe TasksController do
62
62
  TASK_STATUSES.each do |view|
63
63
 
64
64
  it "should expose all tasks as @tasks and render [index] template for #{view} view" do
65
- @tasks = produce_tasks(@current_user, view)
65
+ @tasks = produce_tasks(current_user, view)
66
66
 
67
67
  get :index, :view => view
68
68
 
@@ -73,7 +73,7 @@ describe TasksController do
73
73
  end
74
74
 
75
75
  it "should render all tasks as JSON for #{view} view" do
76
- @tasks = produce_tasks(@current_user, view)
76
+ @tasks = produce_tasks(current_user, view)
77
77
 
78
78
  request.env["HTTP_ACCEPT"] = "application/json"
79
79
  get :index, :view => view
@@ -92,7 +92,7 @@ describe TasksController do
92
92
  end
93
93
 
94
94
  it "should render all tasks as xml for #{view} view" do
95
- @tasks = produce_tasks(@current_user, view)
95
+ @tasks = produce_tasks(current_user, view)
96
96
 
97
97
  request.env["HTTP_ACCEPT"] = "application/xml"
98
98
  get :index, :view => view
@@ -144,16 +144,14 @@ describe TasksController do
144
144
  describe "responding to GET new" do
145
145
 
146
146
  it "should expose a new task as @task and render [new] template" do
147
- account = FactoryGirl.create(:account, :user => @current_user)
148
- @task = FactoryGirl.build(:task, :user => @current_user, :asset => account)
147
+ account = FactoryGirl.create(:account, :user => current_user)
148
+ @task = FactoryGirl.build(:task, :user => current_user, :asset => account)
149
149
  Task.stub!(:new).and_return(@task)
150
- @users = [ FactoryGirl.create(:user) ]
151
150
  @bucket = Setting.unroll(:task_bucket)[1..-1] << [ "On Specific Date...", :specific_time ]
152
151
  @category = Setting.unroll(:task_category)
153
152
 
154
153
  xhr :get, :new
155
154
  assigns[:task].should == @task
156
- assigns[:users].should == @users
157
155
  assigns[:bucket].should == @bucket
158
156
  assigns[:category].should == @category
159
157
  response.should render_template("tasks/new")
@@ -192,15 +190,13 @@ describe TasksController do
192
190
  describe "responding to GET edit" do
193
191
 
194
192
  it "should expose the requested task as @task and render [edit] template" do
195
- @asset = FactoryGirl.create(:account, :user => @current_user)
196
- @task = FactoryGirl.create(:task, :user => @current_user, :asset => @asset)
197
- @users = [ FactoryGirl.create(:user) ]
193
+ @asset = FactoryGirl.create(:account, :user => current_user)
194
+ @task = FactoryGirl.create(:task, :user => current_user, :asset => @asset)
198
195
  @bucket = Setting.unroll(:task_bucket)[1..-1] << [ "On Specific Date...", :specific_time ]
199
196
  @category = Setting.unroll(:task_category)
200
197
 
201
198
  xhr :get, :edit, :id => @task.id
202
199
  assigns[:task].should == @task
203
- assigns[:users].should == @users
204
200
  assigns[:bucket].should == @bucket
205
201
  assigns[:category].should == @category
206
202
  assigns[:asset].should == @asset
@@ -208,8 +204,8 @@ describe TasksController do
208
204
  end
209
205
 
210
206
  it "should find previously open task when necessary" do
211
- @task = FactoryGirl.create(:task, :user => @current_user)
212
- @previous = FactoryGirl.create(:task, :id => 999, :user => @current_user)
207
+ @task = FactoryGirl.create(:task, :user => current_user)
208
+ @previous = FactoryGirl.create(:task, :id => 999, :user => current_user)
213
209
 
214
210
  xhr :get, :edit, :id => @task.id, :previous => 999
215
211
  assigns[:task].should == @task
@@ -219,7 +215,7 @@ describe TasksController do
219
215
 
220
216
  describe "(task got deleted or reassigned)" do
221
217
  it "should reload current page with the flash message if the task got deleted" do
222
- @task = FactoryGirl.create(:task, :user => FactoryGirl.create(:user), :assignee => @current_user)
218
+ @task = FactoryGirl.create(:task, :user => FactoryGirl.create(:user), :assignee => current_user)
223
219
  @task.destroy
224
220
 
225
221
  xhr :get, :edit, :id => @task.id
@@ -238,8 +234,8 @@ describe TasksController do
238
234
 
239
235
  describe "(previous task got deleted or reassigned)" do
240
236
  before(:each) do
241
- @task = FactoryGirl.create(:task, :user => @current_user)
242
- @previous = FactoryGirl.create(:task, :user => FactoryGirl.create(:user), :assignee => @current_user)
237
+ @task = FactoryGirl.create(:task, :user => current_user)
238
+ @previous = FactoryGirl.create(:task, :user => FactoryGirl.create(:user), :assignee => current_user)
243
239
  end
244
240
 
245
241
  it "should notify the view if previous task got deleted" do
@@ -270,7 +266,7 @@ describe TasksController do
270
266
  describe "with valid params" do
271
267
 
272
268
  it "should expose a newly created task as @task and render [create] template" do
273
- @task = FactoryGirl.build(:task, :user => @current_user)
269
+ @task = FactoryGirl.build(:task, :user => current_user)
274
270
  Task.stub!(:new).and_return(@task)
275
271
 
276
272
  xhr :post, :create, :task => { :name => "Hello world" }
@@ -282,7 +278,7 @@ describe TasksController do
282
278
 
283
279
  [ "", "?view=pending", "?view=assigned", "?view=completed" ].each do |view|
284
280
  it "should update tasks sidebar when [create] is being called from [/tasks#{view}] page" do
285
- @task = FactoryGirl.build(:task, :user => @current_user)
281
+ @task = FactoryGirl.build(:task, :user => current_user)
286
282
  Task.stub!(:new).and_return(@task)
287
283
 
288
284
  request.env["HTTP_REFERER"] = "http://localhost/tasks#{view}"
@@ -295,7 +291,7 @@ describe TasksController do
295
291
  describe "with invalid params" do
296
292
 
297
293
  it "should expose a newly created but unsaved task as @lead and still render [create] template" do
298
- @task = FactoryGirl.build(:task, :name => nil, :user => @current_user)
294
+ @task = FactoryGirl.build(:task, :name => nil, :user => current_user)
299
295
  Task.stub!(:new).and_return(@task)
300
296
 
301
297
  xhr :post, :create, :task => {}
@@ -314,7 +310,7 @@ describe TasksController do
314
310
 
315
311
  describe "with valid params" do
316
312
  it "should update the requested task, expose it as @task, and render [update] template" do
317
- @task = FactoryGirl.create(:task, :name => "Hi", :user => @current_user)
313
+ @task = FactoryGirl.create(:task, :name => "Hi", :user => current_user)
318
314
 
319
315
  xhr :put, :update, :id => @task.id, :task => { :name => "Hello" }
320
316
  @task.reload.name.should == "Hello"
@@ -326,7 +322,7 @@ describe TasksController do
326
322
 
327
323
  [ "", "?view=pending", "?view=assigned", "?view=completed" ].each do |view|
328
324
  it "should update tasks sidebar when [update] is being called from [/tasks#{view}] page" do
329
- @task = FactoryGirl.create(:task, :name => "Hi", :user => @current_user)
325
+ @task = FactoryGirl.create(:task, :name => "Hi", :user => current_user)
330
326
 
331
327
  request.env["HTTP_REFERER"] = "http://localhost/tasks#{view}"
332
328
  xhr :put, :update, :id => @task.id, :task => { :name => "Hello" }
@@ -337,7 +333,7 @@ describe TasksController do
337
333
 
338
334
  describe "with invalid params" do
339
335
  it "should not update the task, but still expose it as @task and render [update] template" do
340
- @task = FactoryGirl.create(:task, :name => "Hi", :user => @current_user)
336
+ @task = FactoryGirl.create(:task, :name => "Hi", :user => current_user)
341
337
 
342
338
  xhr :put, :update, :id => @task.id, :task => { :name => nil }
343
339
  @task.reload.name.should == "Hi"
@@ -350,7 +346,7 @@ describe TasksController do
350
346
 
351
347
  describe "task got deleted or reassigned" do
352
348
  it "should reload current page with the flash message if the task got deleted" do
353
- @task = FactoryGirl.create(:task, :user => FactoryGirl.create(:user), :assignee => @current_user)
349
+ @task = FactoryGirl.create(:task, :user => FactoryGirl.create(:user), :assignee => current_user)
354
350
  @task.destroy
355
351
 
356
352
  xhr :put, :update, :id => @task.id, :task => { :name => "Hello" }
@@ -374,7 +370,7 @@ describe TasksController do
374
370
  describe "responding to DELETE destroy" do
375
371
 
376
372
  it "should destroy the requested task and render [destroy] template" do
377
- @task = FactoryGirl.create(:task, :user => @current_user)
373
+ @task = FactoryGirl.create(:task, :user => current_user)
378
374
 
379
375
  xhr :delete, :destroy, :id => @task.id, :bucket => "due_asap"
380
376
  assigns(:task).should == @task
@@ -385,7 +381,7 @@ describe TasksController do
385
381
 
386
382
  [ "", "?view=pending", "?view=assigned", "?view=completed" ].each do |view|
387
383
  it "should update sidebar when [destroy] is being called from [/tasks#{view}]" do
388
- @task = FactoryGirl.create(:task, :user => @current_user)
384
+ @task = FactoryGirl.create(:task, :user => current_user)
389
385
 
390
386
  request.env["HTTP_REFERER"] = "http://localhost/tasks#{view}"
391
387
  xhr :delete, :destroy, :id => @task.id, :bucket => "due_asap"
@@ -394,7 +390,7 @@ describe TasksController do
394
390
  end
395
391
 
396
392
  it "should not update sidebar when [destroy] is being called from asset page" do
397
- @task = FactoryGirl.create(:task, :user => @current_user)
393
+ @task = FactoryGirl.create(:task, :user => current_user)
398
394
 
399
395
  xhr :delete, :destroy, :id => @task.id
400
396
  assigns[:task_total].should == nil
@@ -402,7 +398,7 @@ describe TasksController do
402
398
 
403
399
  describe "task got deleted or reassigned" do
404
400
  it "should reload current page with the flash message if the task got deleted" do
405
- @task = FactoryGirl.create(:task, :user => FactoryGirl.create(:user), :assignee => @current_user)
401
+ @task = FactoryGirl.create(:task, :user => FactoryGirl.create(:user), :assignee => current_user)
406
402
  @task.destroy
407
403
 
408
404
  xhr :delete, :destroy, :id => @task.id
@@ -426,7 +422,7 @@ describe TasksController do
426
422
  describe "responding to PUT complete" do
427
423
 
428
424
  it "should change task status, expose task as @task, and render [complete] template" do
429
- @task = FactoryGirl.create(:task, :completed_at => nil, :user => @current_user)
425
+ @task = FactoryGirl.create(:task, :completed_at => nil, :user => current_user)
430
426
 
431
427
  xhr :put, :complete, :id => @task.id
432
428
  @task.reload.completed_at.should_not == nil
@@ -436,7 +432,7 @@ describe TasksController do
436
432
  end
437
433
 
438
434
  it "should change task status, expose task as @task, and render [complete] template where task.bucket = 'specific_time'" do
439
- @task = FactoryGirl.create(:task, :completed_at => nil, :user => @current_user, :bucket => "specific_time", :calendar => "01/01/2010 1:00 AM")
435
+ @task = FactoryGirl.create(:task, :completed_at => nil, :user => current_user, :bucket => "specific_time", :calendar => "01/01/2010 1:00 AM")
440
436
 
441
437
  xhr :put, :complete, :id => @task.id
442
438
  @task.reload.completed_at.should_not == nil
@@ -446,7 +442,7 @@ describe TasksController do
446
442
  end
447
443
 
448
444
  it "should change update tasks sidebar if bucket is not empty" do
449
- @task = FactoryGirl.create(:task, :completed_at => nil, :user => @current_user)
445
+ @task = FactoryGirl.create(:task, :completed_at => nil, :user => current_user)
450
446
 
451
447
  xhr :put, :complete, :id => @task.id, :bucket => "due_asap"
452
448
  assigns[:task_total].should be_an_instance_of(HashWithIndifferentAccess)
@@ -454,7 +450,7 @@ describe TasksController do
454
450
 
455
451
  describe "task got deleted or reassigned" do
456
452
  it "should reload current page with the flash message if the task got deleted" do
457
- @task = FactoryGirl.create(:task, :user => FactoryGirl.create(:user), :assignee => @current_user)
453
+ @task = FactoryGirl.create(:task, :user => FactoryGirl.create(:user), :assignee => current_user)
458
454
  @task.destroy
459
455
 
460
456
  xhr :put, :complete, :id => @task.id
@@ -501,4 +497,3 @@ describe TasksController do
501
497
  end
502
498
  end
503
499
  end
504
-
@@ -20,7 +20,7 @@ describe UsersController do
20
20
 
21
21
  it "should expose current user as @user if no specific user was requested" do
22
22
  get :show
23
- assigns[:user].should == @current_user
23
+ assigns[:user].should == current_user
24
24
  response.should render_template("users/show")
25
25
  end
26
26
 
@@ -38,7 +38,7 @@ describe UsersController do
38
38
  end
39
39
 
40
40
  it "should render current user as JSON if no specific user was requested" do
41
- @current_user.should_receive(:to_json).and_return("generated JSON")
41
+ current_user.should_receive(:to_json).and_return("generated JSON")
42
42
 
43
43
  get :show
44
44
  response.body.should == "generated JSON"
@@ -59,7 +59,7 @@ describe UsersController do
59
59
  end
60
60
 
61
61
  it "should render current user as XML if no specific user was requested" do
62
- @current_user.should_receive(:to_xml).and_return("generated XML")
62
+ current_user.should_receive(:to_xml).and_return("generated XML")
63
63
 
64
64
  get :show
65
65
  response.body.should == "generated XML"
@@ -99,12 +99,12 @@ describe UsersController do
99
99
  describe "responding to GET edit" do
100
100
  before(:each) do
101
101
  require_user
102
- @user = @current_user
102
+ @user = current_user
103
103
  end
104
104
 
105
105
  it "should expose current user as @user and render [edit] template" do
106
106
  xhr :get, :edit, :id => @user.id
107
- assigns[:user].should == @current_user
107
+ assigns[:user].should == current_user
108
108
  response.should render_template("users/edit")
109
109
  end
110
110
 
@@ -159,7 +159,7 @@ describe UsersController do
159
159
  describe "responding to PUT update" do
160
160
  before(:each) do
161
161
  require_user
162
- @user = @current_user
162
+ @user = current_user
163
163
  end
164
164
 
165
165
  describe "with valid params" do
@@ -178,7 +178,7 @@ describe UsersController do
178
178
 
179
179
  it "should not update the user information and redraw [update] template" do
180
180
  xhr :put, :update, :id => @user.id, :user => { :first_name => nil }
181
- @user.reload.first_name.should == @current_user.first_name
181
+ @user.reload.first_name.should == current_user.first_name
182
182
  assigns[:user].should == @user
183
183
  response.should render_template("users/update")
184
184
  end
@@ -207,12 +207,12 @@ describe UsersController do
207
207
  describe "responding to GET avatar" do
208
208
  before(:each) do
209
209
  require_user
210
- @user = @current_user
210
+ @user = current_user
211
211
  end
212
212
 
213
213
  it "should expose current user as @user and render [avatar] template" do
214
214
  xhr :get, :avatar, :id => @user.id
215
- assigns[:user].should == @current_user
215
+ assigns[:user].should == current_user
216
216
  response.should render_template("users/avatar")
217
217
  end
218
218
  end
@@ -223,7 +223,7 @@ describe UsersController do
223
223
  describe "responding to PUT update_avatar" do
224
224
  before(:each) do
225
225
  require_user
226
- @user = @current_user
226
+ @user = current_user
227
227
  end
228
228
 
229
229
  it "should delete avatar if user chooses to use Gravatar" do
@@ -271,12 +271,12 @@ describe UsersController do
271
271
  describe "responding to GET avatar" do
272
272
  before(:each) do
273
273
  require_user
274
- @user = @current_user
274
+ @user = current_user
275
275
  end
276
276
 
277
277
  it "should expose current user as @user and render [pssword] template" do
278
278
  xhr :get, :password, :id => @user.id
279
- assigns[:user].should == @current_user
279
+ assigns[:user].should == current_user
280
280
  response.should render_template("users/password")
281
281
  end
282
282
  end
@@ -287,17 +287,17 @@ describe UsersController do
287
287
  describe "responding to PUT change_password" do
288
288
  before(:each) do
289
289
  require_user
290
- @current_user_session.stub!(:unauthorized_record=).and_return(@current_user)
291
- @current_user_session.stub!(:save).and_return(@current_user)
292
- @user = @current_user
290
+ @current_user_session.stub!(:unauthorized_record=).and_return(current_user)
291
+ @current_user_session.stub!(:save).and_return(current_user)
292
+ @user = current_user
293
293
  @new_password = "secret?!"
294
294
  end
295
295
 
296
296
  it "should set new user password" do
297
297
  xhr :put, :change_password, :id => @user.id, :current_password => @user.password, :user => { :password => @new_password, :password_confirmation => @new_password }
298
- assigns[:user].should == @current_user
299
- @current_user.password.should == @new_password
300
- @current_user.errors.should be_empty
298
+ assigns[:user].should == current_user
299
+ current_user.password.should == @new_password
300
+ current_user.errors.should be_empty
301
301
  flash[:notice].should_not == nil
302
302
  response.should render_template("users/change_password")
303
303
  end
@@ -305,36 +305,103 @@ describe UsersController do
305
305
  it "should allow to change password if current password is blank" do
306
306
  @user.password_hash = nil
307
307
  xhr :put, :change_password, :id => @user.id, :current_password => "", :user => { :password => @new_password, :password_confirmation => @new_password }
308
- @current_user.password.should == @new_password
309
- @current_user.errors.should be_empty
308
+ current_user.password.should == @new_password
309
+ current_user.errors.should be_empty
310
310
  flash[:notice].should_not == nil
311
311
  response.should render_template("users/change_password")
312
312
  end
313
313
 
314
314
  it "should not change user password if password field is blank" do
315
315
  xhr :put, :change_password, :id => @user.id, :current_password => @user.password, :user => { :password => "", :password_confirmation => "" }
316
- assigns[:user].should == @current_user
317
- @current_user.password.should == @user.password # password stays the same
318
- @current_user.errors.should be_empty # no errors
316
+ assigns[:user].should == current_user
317
+ current_user.password.should == @user.password # password stays the same
318
+ current_user.errors.should be_empty # no errors
319
319
  flash[:notice].should_not == nil
320
320
  response.should render_template("users/change_password")
321
321
  end
322
322
 
323
323
  it "should require valid current password" do
324
324
  xhr :put, :change_password, :id => @user.id, :current_password => "what?!", :user => { :password => @new_password, :password_confirmation => @new_password }
325
- @current_user.password.should == @user.password # password stays the same
326
- @current_user.should have(1).error # .error_on(:current_password)
325
+ current_user.password.should == @user.password # password stays the same
326
+ current_user.should have(1).error # .error_on(:current_password)
327
327
  response.should render_template("users/change_password")
328
328
  end
329
329
 
330
330
  it "should require new password and password confirmation to match" do
331
331
  xhr :put, :change_password, :id => @user.id, :current_password => @user.password, :user => { :password => @new_password, :password_confirmation => "none" }
332
- @current_user.password.should == @user.password # password stays the same
333
- @current_user.should have(1).error # .error_on(:current_password)
332
+ current_user.password.should == @user.password # password stays the same
333
+ current_user.should have(1).error # .error_on(:current_password)
334
334
  response.should render_template("users/change_password")
335
335
  end
336
336
 
337
337
  end
338
338
 
339
- end
339
+ # GET /users/opportunities
340
+ # GET /users/opportunities.xml HTML
341
+ #----------------------------------------------------------------------------
342
+ describe "responding to GET opportunities_overview" do
343
+ before(:each) do
344
+ require_user
345
+ @user = @current_user
346
+ @user.update_attributes(:first_name => "Apple", :last_name => "Boy")
347
+ end
348
+
349
+ it "should assign @users_with_opportunities" do
350
+ FactoryGirl.create(:opportunity, :stage => "prospecting", :assignee => @user)
351
+ xhr :get, :opportunities_overview
352
+ assigns[:users_with_opportunities].should == [@current_user]
353
+ end
354
+
355
+ it "@users_with_opportunities should be ordered by name" do
356
+ FactoryGirl.create(:opportunity, :stage => "prospecting", :assignee => @user)
357
+
358
+ user1 = FactoryGirl.create(:user, :first_name => "Zebra", :last_name => "Stripes")
359
+ FactoryGirl.create(:opportunity, :stage => "prospecting", :assignee => user1)
360
+
361
+ user2 = FactoryGirl.create(:user, :first_name => "Bilbo", :last_name => "Magic")
362
+ FactoryGirl.create(:opportunity, :stage => "prospecting", :assignee => user2)
363
+
364
+ xhr :get, :opportunities_overview
340
365
 
366
+ assigns[:users_with_opportunities].should == [@user, user2, user1]
367
+ end
368
+
369
+ it "should assign @unassigned_opportunities with only open unassigned opportunities" do
370
+ @o1 = FactoryGirl.create(:opportunity, :stage => "prospecting", :assignee => nil)
371
+ @o2 = FactoryGirl.create(:opportunity, :stage => "won", :assignee => nil)
372
+ @o3 = FactoryGirl.create(:opportunity, :stage => "prospecting", :assignee => nil)
373
+
374
+ xhr :get, :opportunities_overview
375
+
376
+ assigns[:unassigned_opportunities].should include(@o1, @o3)
377
+ assigns[:unassigned_opportunities].should_not include(@o2)
378
+ end
379
+
380
+ it "@unassigned_opportunities should be ordered by stage" do
381
+ @o1 = FactoryGirl.create(:opportunity, :stage => "proposal", :assignee => nil)
382
+ @o2 = FactoryGirl.create(:opportunity, :stage => "prospecting", :assignee => nil)
383
+ @o3 = FactoryGirl.create(:opportunity, :stage => "negotiation", :assignee => nil)
384
+
385
+ xhr :get, :opportunities_overview
386
+
387
+ assigns[:unassigned_opportunities].should == [@o3, @o1, @o2]
388
+ end
389
+
390
+ it "should not include users who have no assigned opportunities" do
391
+ xhr :get, :opportunities_overview
392
+ assigns[:users_with_opportunities].should == []
393
+ end
394
+
395
+ it "should not include users who have no open assigned opportunities" do
396
+ FactoryGirl.create(:opportunity, :stage => "won", :assignee => @user)
397
+
398
+ xhr :get, :opportunities_overview
399
+ assigns[:users_with_opportunities].should == []
400
+ end
401
+
402
+ it "should render opportunities overview" do
403
+ xhr :get, :opportunities_overview
404
+ response.should render_template("users/opportunities_overview")
405
+ end
406
+ end
407
+ end