fat_free_crm 0.12.3 → 0.13.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 (521) hide show
  1. checksums.yaml +5 -13
  2. data/.travis.yml +1 -11
  3. data/Gemfile +7 -19
  4. data/Gemfile.lock +166 -166
  5. data/Procfile +1 -1
  6. data/README.md +20 -20
  7. data/app/assets/javascripts/admin/fields.js.coffee +3 -3
  8. data/app/assets/javascripts/application.js.erb +3 -0
  9. data/app/assets/javascripts/crm.js +1 -0
  10. data/app/assets/javascripts/crm_comments.js.coffee +66 -0
  11. data/app/assets/javascripts/lists.js.coffee +45 -2
  12. data/app/assets/javascripts/search.js.coffee +2 -0
  13. data/app/assets/javascripts/timeago.js +17 -0
  14. data/app/assets/stylesheets/advanced_search.css.scss +49 -25
  15. data/app/assets/stylesheets/application.css.erb +3 -0
  16. data/app/assets/stylesheets/common.scss +13 -0
  17. data/app/assets/stylesheets/format_buttons.css.scss +15 -10
  18. data/app/assets/stylesheets/header.scss +3 -0
  19. data/app/assets/stylesheets/lists.css.scss +4 -0
  20. data/app/controllers/admin/fields_controller.rb +5 -5
  21. data/app/controllers/admin/users_controller.rb +1 -3
  22. data/app/controllers/application_controller.rb +23 -23
  23. data/app/controllers/comments_controller.rb +3 -31
  24. data/app/controllers/entities/accounts_controller.rb +3 -3
  25. data/app/controllers/entities/campaigns_controller.rb +4 -4
  26. data/app/controllers/entities/contacts_controller.rb +2 -2
  27. data/app/controllers/entities/leads_controller.rb +3 -3
  28. data/app/controllers/entities/opportunities_controller.rb +4 -3
  29. data/app/controllers/entities_controller.rb +6 -6
  30. data/app/controllers/home_controller.rb +1 -1
  31. data/app/controllers/lists_controller.rb +8 -1
  32. data/app/controllers/tasks_controller.rb +1 -1
  33. data/app/controllers/users_controller.rb +46 -23
  34. data/app/helpers/admin/application_helper.rb +1 -3
  35. data/app/helpers/admin/field_groups_helper.rb +2 -1
  36. data/app/helpers/application_helper.rb +37 -16
  37. data/app/helpers/home_helper.rb +1 -2
  38. data/app/helpers/leads_helper.rb +5 -6
  39. data/app/helpers/tasks_helper.rb +36 -50
  40. data/app/models/entities/account.rb +10 -7
  41. data/app/models/entities/campaign.rb +4 -4
  42. data/app/models/entities/contact.rb +8 -5
  43. data/app/models/entities/lead.rb +8 -8
  44. data/app/models/entities/opportunity.rb +13 -18
  45. data/app/models/fields/custom_field.rb +10 -0
  46. data/app/models/fields/field.rb +3 -3
  47. data/app/models/fields/field_group.rb +1 -1
  48. data/app/models/list.rb +1 -0
  49. data/app/models/polymorphic/address.rb +3 -3
  50. data/app/models/polymorphic/comment.rb +2 -4
  51. data/app/models/polymorphic/task.rb +32 -27
  52. data/app/models/setting.rb +3 -9
  53. data/app/models/users/ability.rb +2 -13
  54. data/app/models/users/user.rb +12 -15
  55. data/app/views/accounts/_edit.html.haml +1 -1
  56. data/app/views/accounts/_index_brief.html.haml +3 -3
  57. data/app/views/accounts/_index_long.html.haml +3 -3
  58. data/app/views/accounts/_new.html.haml +1 -1
  59. data/app/views/accounts/create.js.haml +17 -0
  60. data/app/views/accounts/destroy.js.haml +6 -0
  61. data/app/views/accounts/edit.js.haml +32 -0
  62. data/app/views/accounts/index.js.haml +11 -0
  63. data/app/views/accounts/index.xls.builder +9 -7
  64. data/app/views/accounts/new.js.haml +11 -0
  65. data/app/views/accounts/show.js.haml +5 -0
  66. data/app/views/accounts/update.js.haml +17 -0
  67. data/app/views/admin/field_groups/_edit.html.haml +1 -1
  68. data/app/views/admin/field_groups/_new.html.haml +1 -1
  69. data/app/views/admin/field_groups/confirm.js.haml +7 -0
  70. data/app/views/admin/field_groups/create.js.haml +20 -0
  71. data/app/views/admin/field_groups/destroy.js.haml +9 -0
  72. data/app/views/admin/field_groups/edit.js.haml +12 -0
  73. data/app/views/admin/field_groups/new.js.haml +8 -0
  74. data/app/views/admin/field_groups/update.js.haml +8 -0
  75. data/app/views/admin/fields/_field.html.haml +2 -2
  76. data/app/views/admin/fields/_form.html.haml +2 -2
  77. data/app/views/admin/fields/create.js.haml +17 -0
  78. data/app/views/admin/fields/destroy.js.haml +8 -0
  79. data/app/views/admin/fields/edit.js.haml +3 -0
  80. data/app/views/admin/fields/update.js.haml +13 -0
  81. data/app/views/admin/groups/_edit.html.haml +1 -1
  82. data/app/views/admin/groups/_new.html.haml +1 -1
  83. data/app/views/admin/groups/create.js.haml +10 -0
  84. data/app/views/admin/groups/destroy.js.haml +9 -0
  85. data/app/views/admin/groups/edit.js.haml +14 -0
  86. data/app/views/admin/groups/index.html.haml +1 -1
  87. data/app/views/admin/groups/index.js.haml +2 -0
  88. data/app/views/admin/groups/new.js.haml +9 -0
  89. data/app/views/admin/groups/update.js.haml +9 -0
  90. data/app/views/admin/tags/_edit.html.haml +1 -1
  91. data/app/views/admin/tags/_new.html.haml +1 -1
  92. data/app/views/admin/tags/confirm.js.haml +7 -0
  93. data/app/views/admin/tags/create.js.haml +11 -0
  94. data/app/views/admin/tags/destroy.js.haml +10 -0
  95. data/app/views/admin/tags/edit.js.haml +20 -0
  96. data/app/views/admin/tags/new.js.haml +7 -0
  97. data/app/views/admin/tags/update.js.haml +9 -0
  98. data/app/views/admin/users/_edit.html.haml +1 -1
  99. data/app/views/admin/users/_new.html.haml +1 -1
  100. data/app/views/admin/users/_user.html.haml +1 -1
  101. data/app/views/admin/users/confirm.js.haml +7 -0
  102. data/app/views/admin/users/create.js.haml +10 -0
  103. data/app/views/admin/users/destroy.js.haml +10 -0
  104. data/app/views/admin/users/edit.js.haml +20 -0
  105. data/app/views/admin/users/index.js.haml +2 -0
  106. data/app/views/admin/users/new.js.haml +9 -0
  107. data/app/views/admin/users/reactivate.js.haml +3 -0
  108. data/app/views/admin/users/suspend.js.haml +3 -0
  109. data/app/views/admin/users/update.js.haml +9 -0
  110. data/app/views/authentications/new.html.haml +1 -1
  111. data/app/views/campaigns/_edit.html.haml +1 -1
  112. data/app/views/campaigns/_new.html.haml +1 -1
  113. data/app/views/campaigns/create.js.haml +20 -0
  114. data/app/views/campaigns/destroy.js.haml +6 -0
  115. data/app/views/campaigns/edit.js.haml +33 -0
  116. data/app/views/campaigns/index.js.haml +11 -0
  117. data/app/views/campaigns/index.xls.builder +9 -7
  118. data/app/views/campaigns/new.js.haml +11 -0
  119. data/app/views/campaigns/show.js.haml +5 -0
  120. data/app/views/campaigns/update.js.haml +20 -0
  121. data/app/views/comments/_comment.html.haml +1 -1
  122. data/app/views/comments/_edit.html.haml +1 -1
  123. data/app/views/comments/_new.html.haml +3 -2
  124. data/app/views/comments/create.js.haml +14 -0
  125. data/app/views/comments/destroy.js.haml +5 -0
  126. data/app/views/comments/edit.js.haml +11 -0
  127. data/app/views/comments/update.js.haml +9 -0
  128. data/app/views/contacts/_edit.html.haml +1 -1
  129. data/app/views/contacts/_index_full.html.haml +1 -1
  130. data/app/views/contacts/_index_long.html.haml +2 -1
  131. data/app/views/contacts/_new.html.haml +1 -1
  132. data/app/views/contacts/_section_general.html.haml +3 -3
  133. data/app/views/contacts/create.js.haml +23 -0
  134. data/app/views/contacts/destroy.js.haml +9 -0
  135. data/app/views/contacts/edit.js.haml +35 -0
  136. data/app/views/contacts/index.js.haml +11 -0
  137. data/app/views/contacts/index.xls.builder +9 -7
  138. data/app/views/contacts/new.js.haml +13 -0
  139. data/app/views/contacts/show.js.haml +5 -0
  140. data/app/views/contacts/update.js.haml +22 -0
  141. data/app/views/emails/destroy.js.haml +5 -0
  142. data/app/views/entities/_permissions.html.haml +1 -1
  143. data/app/views/entities/attach.js.haml +21 -0
  144. data/app/views/entities/contacts.js.haml +3 -0
  145. data/app/views/entities/discard.js.haml +6 -0
  146. data/app/views/entities/leads.js.haml +3 -0
  147. data/app/views/entities/opportunities.js.haml +3 -0
  148. data/app/views/entities/subscription_update.js.haml +4 -0
  149. data/app/views/entities/versions.js.haml +3 -0
  150. data/app/views/fields/group.js.erb +3 -0
  151. data/app/views/home/_account.html.haml +3 -3
  152. data/app/views/home/_opportunity.html.haml +3 -3
  153. data/app/views/home/index.atom.builder +3 -3
  154. data/app/views/home/index.js.haml +7 -0
  155. data/app/views/home/index.rss.builder +2 -2
  156. data/app/views/home/options.js.haml +7 -0
  157. data/app/views/layouts/_footer.html.haml +0 -4
  158. data/app/views/layouts/_sidebar.html.haml +1 -0
  159. data/app/views/layouts/_tabbed.html.haml +1 -4
  160. data/app/views/layouts/admin/application.html.haml +0 -1
  161. data/app/views/layouts/application.html.haml +5 -7
  162. data/app/views/leads/_convert.html.haml +1 -1
  163. data/app/views/leads/_edit.html.haml +1 -1
  164. data/app/views/leads/_index_long.html.haml +2 -2
  165. data/app/views/leads/_new.html.haml +1 -1
  166. data/app/views/leads/convert.js.haml +35 -0
  167. data/app/views/leads/create.js.haml +21 -0
  168. data/app/views/leads/destroy.js.haml +9 -0
  169. data/app/views/leads/edit.js.haml +35 -0
  170. data/app/views/leads/index.js.haml +11 -0
  171. data/app/views/leads/index.xls.builder +9 -7
  172. data/app/views/leads/new.js.haml +11 -0
  173. data/app/views/leads/promote.js.haml +26 -0
  174. data/app/views/leads/reject.js.haml +12 -0
  175. data/app/views/leads/show.js.haml +5 -0
  176. data/app/views/leads/update.js.haml +26 -0
  177. data/app/views/lists/_personal_sidebar.html.haml +28 -0
  178. data/app/views/lists/_sidebar.html.haml +10 -7
  179. data/app/views/lists/create.js.haml +10 -0
  180. data/app/views/lists/destroy.js.haml +1 -0
  181. data/app/views/opportunities/_edit.html.haml +1 -1
  182. data/app/views/opportunities/_index_brief.html.haml +3 -3
  183. data/app/views/opportunities/_index_long.html.haml +3 -3
  184. data/app/views/opportunities/_new.html.haml +1 -2
  185. data/app/views/opportunities/_top_section.html.haml +4 -0
  186. data/app/views/opportunities/contacts.js.haml +3 -0
  187. data/app/views/opportunities/create.js.haml +29 -0
  188. data/app/views/opportunities/destroy.js.haml +13 -0
  189. data/app/views/opportunities/edit.js.haml +35 -0
  190. data/app/views/opportunities/index.js.haml +11 -0
  191. data/app/views/opportunities/index.xls.builder +9 -7
  192. data/app/views/opportunities/new.js.haml +13 -0
  193. data/app/views/opportunities/show.js.haml +5 -0
  194. data/app/views/opportunities/update.js.haml +25 -0
  195. data/app/views/passwords/edit.html.haml +1 -1
  196. data/app/views/passwords/new.html.haml +1 -1
  197. data/app/views/shared/_comment.html.haml +1 -1
  198. data/app/views/shared/_inline_styles.html.haml +1 -1
  199. data/app/views/tasks/_edit.html.haml +1 -1
  200. data/app/views/tasks/_new.html.haml +1 -1
  201. data/app/views/tasks/complete.js.haml +14 -0
  202. data/app/views/tasks/create.js.haml +39 -0
  203. data/app/views/tasks/destroy.js.haml +7 -0
  204. data/app/views/tasks/discard.js.haml +1 -0
  205. data/app/views/tasks/edit.js.haml +26 -0
  206. data/app/views/tasks/filter.js.haml +4 -0
  207. data/app/views/tasks/index.xls.builder +7 -5
  208. data/app/views/tasks/new.js.haml +8 -0
  209. data/app/views/tasks/update.js.haml +19 -0
  210. data/app/views/users/_password.html.haml +1 -1
  211. data/app/views/users/_profile.html.haml +1 -1
  212. data/app/views/users/avatar.js.haml +9 -0
  213. data/app/views/users/change_password.js.haml +13 -0
  214. data/app/views/users/edit.js.haml +9 -0
  215. data/app/views/users/new.html.haml +1 -1
  216. data/app/views/users/password.js.haml +10 -0
  217. data/app/views/users/update.js.haml +9 -0
  218. data/app/views/users/upload_avatar.js.haml +7 -0
  219. data/app/views/versions/_version.html.haml +1 -1
  220. data/config/application.rb +1 -4
  221. data/config/environments/production.rb +3 -2
  222. data/config/initializers/custom_field_ransack_translations.rb +15 -0
  223. data/config/initializers/locale.rb +9 -1
  224. data/config/initializers/secret_token.rb +1 -25
  225. data/config/initializers/views.rb +20 -20
  226. data/config/locales/cz.yml +245 -211
  227. data/config/locales/cz_fat_free_crm.yml +105 -181
  228. data/config/locales/de.yml +162 -118
  229. data/config/locales/de_fat_free_crm.yml +760 -731
  230. data/config/locales/de_ransack.yml +91 -0
  231. data/config/locales/en-GB.yml +158 -119
  232. data/config/locales/en-GB_fat_free_crm.yml +161 -279
  233. data/config/locales/en-US.yml +158 -121
  234. data/config/locales/en-US_fat_free_crm.yml +185 -179
  235. data/config/locales/en-US_ransack.yml +81 -82
  236. data/config/locales/es.yml +164 -123
  237. data/config/locales/es_fat_free_crm.yml +151 -209
  238. data/config/locales/fr-CA.yml +167 -130
  239. data/config/locales/fr-CA_fat_free_crm.yml +142 -202
  240. data/config/locales/fr.yml +170 -125
  241. data/config/locales/fr_fat_free_crm.yml +199 -302
  242. data/config/locales/it.yml +158 -122
  243. data/config/locales/it_fat_free_crm.yml +105 -168
  244. data/config/locales/ja.yml +162 -131
  245. data/config/locales/ja_fat_free_crm.yml +118 -188
  246. data/config/locales/pl.yml +168 -132
  247. data/config/locales/pl_fat_free_crm.yml +115 -186
  248. data/config/locales/pt-BR.yml +160 -127
  249. data/config/locales/pt-BR_fat_free_crm.yml +125 -182
  250. data/config/locales/ru.yml +256 -233
  251. data/config/locales/ru_fat_free_crm.yml +136 -193
  252. data/config/locales/sv-SE.yml +164 -181
  253. data/config/locales/sv-SE_fat_free_crm.yml +129 -193
  254. data/config/locales/th_fat_free_crm.yml +114 -194
  255. data/config/locales/zh-CN.yml +176 -149
  256. data/config/locales/zh-CN_fat_free_crm.yml +78 -167
  257. data/config/routes.rb +1 -1
  258. data/config/settings.default.yml +74 -23
  259. data/custom_plan.rb +11 -0
  260. data/db/migrate/20131207033244_add_user_id_to_lists.rb +6 -0
  261. data/db/schema.rb +4 -1
  262. data/fat_free_crm.gemspec +3 -3
  263. data/lib/fat_free_crm.rb +1 -11
  264. data/lib/fat_free_crm/export_csv.rb +3 -3
  265. data/lib/fat_free_crm/fields.rb +10 -0
  266. data/lib/fat_free_crm/gem_dependencies.rb +1 -2
  267. data/lib/fat_free_crm/i18n.rb +9 -5
  268. data/lib/fat_free_crm/version.rb +2 -2
  269. data/lib/fat_free_crm/view_factory.rb +8 -5
  270. data/lib/tasks/ffcrm/config.rake +9 -12
  271. data/lib/tasks/ffcrm/missing_translations.rake +2 -1
  272. data/spec/controllers/admin/users_controller_spec.rb +6 -4
  273. data/spec/controllers/applications_controller_spec.rb +4 -4
  274. data/spec/controllers/authentications_controller_spec.rb +15 -15
  275. data/spec/controllers/comments_controller_spec.rb +9 -87
  276. data/spec/controllers/emails_controller_spec.rb +1 -1
  277. data/spec/controllers/entities/accounts_controller_spec.rb +7 -7
  278. data/spec/controllers/entities/campaigns_controller_spec.rb +5 -5
  279. data/spec/controllers/entities/contacts_controller_spec.rb +7 -7
  280. data/spec/controllers/entities/leads_controller_spec.rb +14 -14
  281. data/spec/controllers/entities/opportunities_controller_spec.rb +8 -8
  282. data/spec/controllers/home_controller_spec.rb +6 -6
  283. data/spec/controllers/tasks_controller_spec.rb +7 -7
  284. data/spec/controllers/users_controller_spec.rb +22 -50
  285. data/spec/features/support/selector_helpers.rb +1 -6
  286. data/spec/features/tasks_spec.rb +2 -2
  287. data/spec/helpers/application_helper_spec.rb +15 -15
  288. data/spec/lib/fields_spec.rb +29 -29
  289. data/spec/lib/mail_processor/base_spec.rb +7 -7
  290. data/spec/lib/mail_processor/dropbox_spec.rb +3 -3
  291. data/spec/lib/view_factory_spec.rb +14 -14
  292. data/spec/models/entities/opportunity_spec.rb +1 -1
  293. data/spec/models/fields/custom_field_date_pair_spec.rb +14 -14
  294. data/spec/models/fields/custom_field_pair_spec.rb +13 -13
  295. data/spec/models/fields/custom_field_spec.rb +5 -5
  296. data/spec/models/fields/field_spec.rb +2 -2
  297. data/spec/models/observers/entity_observer_spec.rb +2 -2
  298. data/spec/models/users/user_spec.rb +7 -7
  299. data/spec/routing/comments_routing_spec.rb +0 -9
  300. data/spec/shared/controllers.rb +75 -77
  301. data/spec/shared/models.rb +1 -1
  302. data/spec/spec_helper.rb +1 -2
  303. data/spec/support/auth_macros.rb +3 -3
  304. data/spec/support/mail_processor_mocks.rb +13 -13
  305. data/spec/views/accounts/_edit.haml_spec.rb +1 -1
  306. data/spec/views/accounts/{create.rjs_spec.rb → create.js.haml_spec.rb} +9 -14
  307. data/spec/views/accounts/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +6 -8
  308. data/spec/views/accounts/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +10 -18
  309. data/spec/views/accounts/{index.rjs_spec.rb → index.js.haml_spec.rb} +7 -11
  310. data/spec/views/accounts/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -8
  311. data/spec/views/accounts/show.haml_spec.rb +1 -1
  312. data/spec/views/accounts/{update.rjs_spec.rb → update.js.haml_spec.rb} +16 -25
  313. data/spec/views/admin/field_groups/create.js.haml_spec.rb +31 -0
  314. data/spec/views/admin/field_groups/destroy.js.haml_spec.rb +31 -0
  315. data/spec/views/admin/field_groups/edit.js.haml_spec.rb +24 -0
  316. data/spec/views/admin/field_groups/new.js.haml_spec.rb +25 -0
  317. data/spec/views/admin/field_groups/update.js.haml_spec.rb +30 -0
  318. data/spec/views/admin/users/_create.haml_spec.rb +1 -1
  319. data/spec/views/admin/users/{create.rjs_spec.rb → create.js.haml_spec.rb} +6 -9
  320. data/spec/views/admin/users/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +6 -7
  321. data/spec/views/admin/users/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +6 -12
  322. data/spec/views/admin/users/index.haml_spec.rb +0 -0
  323. data/spec/views/admin/users/{index.rjs_spec.rb → index.js.haml_spec.rb} +3 -5
  324. data/spec/views/admin/users/{new.rjs_spec.rb → new.js.haml_spec.rb} +4 -6
  325. data/spec/views/admin/users/{reactivate.rjs_spec.rb → reactivate.js.haml_spec.rb} +2 -4
  326. data/spec/views/admin/users/show.haml_spec.rb +0 -0
  327. data/spec/views/admin/users/{suspend.rjs_spec.rb → suspend.js.haml_spec.rb} +2 -4
  328. data/spec/views/admin/users/{update.rjs_spec.rb → update.js.haml_spec.rb} +6 -10
  329. data/spec/views/campaigns/{create.rjs_spec.rb → create.js.haml_spec.rb} +9 -14
  330. data/spec/views/campaigns/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +6 -7
  331. data/spec/views/campaigns/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +11 -19
  332. data/spec/views/campaigns/{index.rjs_spec.rb → index.js.haml_spec.rb} +5 -9
  333. data/spec/views/campaigns/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -8
  334. data/spec/views/campaigns/{update.rjs_spec.rb → update.js.haml_spec.rb} +14 -21
  335. data/spec/views/comments/{new.rjs_spec.rb → edit.js.haml_spec.rb} +12 -9
  336. data/spec/views/contacts/{create.rjs_spec.rb → create.js.haml_spec.rb} +9 -16
  337. data/spec/views/contacts/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +6 -8
  338. data/spec/views/contacts/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +12 -19
  339. data/spec/views/contacts/index.haml_spec.rb +1 -1
  340. data/spec/views/contacts/{index.rjs_spec.rb → index.js.html_spec.rb} +7 -11
  341. data/spec/views/contacts/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -7
  342. data/spec/views/contacts/{update.rjs_spec.rb → update.js.haml_spec.rb} +20 -35
  343. data/spec/views/home/{index.rjs_spec.rb → index.js.haml_spec.rb} +2 -4
  344. data/spec/views/home/{options.rjs_spec.rb → options.js.haml_spec.rb} +7 -12
  345. data/spec/views/leads/{convert.rjs_spec.rb → convert.js.haml_spec.rb} +12 -20
  346. data/spec/views/leads/{create.rjs_spec.rb → create.js.haml_spec.rb} +13 -19
  347. data/spec/views/leads/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +9 -12
  348. data/spec/views/leads/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +12 -20
  349. data/spec/views/leads/{index.rjs_spec.rb → index.js.haml_spec.rb} +5 -9
  350. data/spec/views/leads/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -8
  351. data/spec/views/leads/{promote.rjs_spec.rb → promote.js.haml_spec.rb} +28 -43
  352. data/spec/views/leads/{reject.rjs_spec.rb → reject.js.haml_spec.rb} +10 -17
  353. data/spec/views/leads/{update.rjs_spec.rb → update.js.haml_spec.rb} +25 -38
  354. data/spec/views/opportunities/{create.rjs_spec.rb → create.js.haml_spec.rb} +16 -26
  355. data/spec/views/opportunities/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +13 -16
  356. data/spec/views/opportunities/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +10 -18
  357. data/spec/views/opportunities/{index.rjs_spec.rb → index.js.haml_spec.rb} +7 -12
  358. data/spec/views/opportunities/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -8
  359. data/spec/views/opportunities/{update.rjs_spec.rb → update.js.haml_spec.rb} +29 -46
  360. data/spec/views/tasks/_edit.haml_spec.rb +1 -1
  361. data/spec/views/tasks/{complete.rjs_spec.rb → complete.js.haml_spec.rb} +9 -14
  362. data/spec/views/tasks/{create.rjs_spec.rb → create.js.haml_spec.rb} +25 -33
  363. data/spec/views/tasks/{destroy.rjs_spec.rb → destroy.js.haml_spec.rb} +9 -11
  364. data/spec/views/tasks/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +9 -14
  365. data/spec/views/tasks/index.haml_spec.rb +1 -2
  366. data/spec/views/tasks/{new.rjs_spec.rb → new.js.haml_spec.rb} +6 -8
  367. data/spec/views/tasks/{update.rjs_spec.rb → update.js.haml_spec.rb} +28 -41
  368. data/spec/views/users/{avatar.rjs_spec.rb → avatar.js.haml_spec.rb} +7 -9
  369. data/spec/views/users/{change_password.rjs_spec.rb → change_password.js.haml_spec.rb} +10 -12
  370. data/spec/views/users/{edit.rjs_spec.rb → edit.js.haml_spec.rb} +8 -10
  371. data/spec/views/users/{password.rjs_spec.rb → password.js.haml_spec.rb} +9 -11
  372. data/spec/views/users/{update.rjs_spec.rb → update.js.haml_spec.rb} +7 -15
  373. data/spec/views/users/{upload_avatar.rjs_spec.rb → upload_avatar.js.haml_spec.rb} +8 -10
  374. data/vendor/assets/javascripts/ajax-chosen-jquery.js +2 -0
  375. data/vendor/assets/javascripts/ajax-chosen-prototype.js +2 -0
  376. data/vendor/assets/javascripts/ajax-chosen.jquery.coffee +81 -0
  377. data/vendor/assets/javascripts/ajax-chosen.proto.coffee +98 -0
  378. data/vendor/assets/javascripts/jquery_timeago/index.js +17 -0
  379. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.cz.js +18 -0
  380. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.de.js +18 -0
  381. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-GB.js +20 -0
  382. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.en-US.js +20 -0
  383. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.es.js +18 -0
  384. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr-CA.js +17 -0
  385. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.fr.js +17 -0
  386. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.it.js +16 -0
  387. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ja.js +19 -0
  388. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.js +194 -0
  389. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pl.js +31 -0
  390. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.pt-BR.js +18 -0
  391. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.ru.js +34 -0
  392. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.sv-SE.js +18 -0
  393. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.th.js +20 -0
  394. data/vendor/assets/javascripts/jquery_timeago/jquery.timeago.zh-CN.js +20 -0
  395. data/zeus.json +2 -1
  396. metadata +240 -245
  397. data/app/assets/images/delete.png +0 -0
  398. data/app/assets/images/iconset_attribution.png +0 -0
  399. data/app/views/accounts/create.js.rjs +0 -14
  400. data/app/views/accounts/destroy.js.rjs +0 -3
  401. data/app/views/accounts/edit.js.rjs +0 -33
  402. data/app/views/accounts/index.js.rjs +0 -8
  403. data/app/views/accounts/new.js.rjs +0 -9
  404. data/app/views/accounts/show.js.erb +0 -2
  405. data/app/views/accounts/update.js.rjs +0 -17
  406. data/app/views/admin/field_groups/confirm.js.rjs +0 -6
  407. data/app/views/admin/field_groups/create.js.rjs +0 -20
  408. data/app/views/admin/field_groups/destroy.js.rjs +0 -11
  409. data/app/views/admin/field_groups/edit.js.rjs +0 -14
  410. data/app/views/admin/field_groups/new.js.rjs +0 -9
  411. data/app/views/admin/field_groups/update.js.rjs +0 -9
  412. data/app/views/admin/fields/create.js.erb +0 -19
  413. data/app/views/admin/fields/destroy.js.erb +0 -9
  414. data/app/views/admin/fields/edit.js.erb +0 -1
  415. data/app/views/admin/fields/update.js.erb +0 -13
  416. data/app/views/admin/groups/create.js.rjs +0 -11
  417. data/app/views/admin/groups/destroy.js.rjs +0 -11
  418. data/app/views/admin/groups/edit.js.rjs +0 -21
  419. data/app/views/admin/groups/index.js.rjs +0 -2
  420. data/app/views/admin/groups/new.js.rjs +0 -9
  421. data/app/views/admin/groups/update.js.rjs +0 -10
  422. data/app/views/admin/tags/confirm.js.rjs +0 -6
  423. data/app/views/admin/tags/create.js.rjs +0 -12
  424. data/app/views/admin/tags/destroy.js.rjs +0 -11
  425. data/app/views/admin/tags/edit.js.rjs +0 -21
  426. data/app/views/admin/tags/new.js.rjs +0 -8
  427. data/app/views/admin/tags/update.js.rjs +0 -10
  428. data/app/views/admin/users/confirm.js.rjs +0 -6
  429. data/app/views/admin/users/create.js.rjs +0 -11
  430. data/app/views/admin/users/destroy.js.rjs +0 -11
  431. data/app/views/admin/users/edit.js.rjs +0 -21
  432. data/app/views/admin/users/index.js.rjs +0 -3
  433. data/app/views/admin/users/new.js.rjs +0 -8
  434. data/app/views/admin/users/reactivate.js.rjs +0 -3
  435. data/app/views/admin/users/suspend.js.rjs +0 -3
  436. data/app/views/admin/users/update.js.rjs +0 -10
  437. data/app/views/campaigns/create.js.rjs +0 -18
  438. data/app/views/campaigns/destroy.js.rjs +0 -3
  439. data/app/views/campaigns/edit.js.rjs +0 -34
  440. data/app/views/campaigns/index.js.rjs +0 -8
  441. data/app/views/campaigns/new.js.rjs +0 -9
  442. data/app/views/campaigns/show.js.erb +0 -2
  443. data/app/views/campaigns/update.js.rjs +0 -21
  444. data/app/views/comments/create.js.rjs +0 -11
  445. data/app/views/comments/destroy.js.rjs +0 -6
  446. data/app/views/comments/edit.js.rjs +0 -11
  447. data/app/views/comments/new.js.rjs +0 -14
  448. data/app/views/comments/update.js.rjs +0 -11
  449. data/app/views/contacts/create.js.rjs +0 -19
  450. data/app/views/contacts/destroy.js.rjs +0 -7
  451. data/app/views/contacts/edit.js.rjs +0 -36
  452. data/app/views/contacts/index.js.rjs +0 -8
  453. data/app/views/contacts/new.js.rjs +0 -11
  454. data/app/views/contacts/show.js.erb +0 -2
  455. data/app/views/contacts/update.js.rjs +0 -22
  456. data/app/views/emails/destroy.js.rjs +0 -6
  457. data/app/views/entities/attach.js.rjs +0 -24
  458. data/app/views/entities/contacts.js.rjs +0 -3
  459. data/app/views/entities/discard.js.rjs +0 -7
  460. data/app/views/entities/leads.js.rjs +0 -3
  461. data/app/views/entities/opportunities.js.rjs +0 -3
  462. data/app/views/entities/subscription_update.js.rjs +0 -4
  463. data/app/views/entities/versions.js.erb +0 -3
  464. data/app/views/fields/group.js.rjs +0 -7
  465. data/app/views/home/index.js.rjs +0 -7
  466. data/app/views/home/options.js.rjs +0 -8
  467. data/app/views/leads/convert.js.rjs +0 -37
  468. data/app/views/leads/create.js.rjs +0 -19
  469. data/app/views/leads/destroy.js.rjs +0 -7
  470. data/app/views/leads/edit.js.rjs +0 -36
  471. data/app/views/leads/index.js.rjs +0 -8
  472. data/app/views/leads/new.js.rjs +0 -9
  473. data/app/views/leads/promote.js.rjs +0 -27
  474. data/app/views/leads/reject.js.rjs +0 -10
  475. data/app/views/leads/show.js.erb +0 -2
  476. data/app/views/leads/update.js.rjs +0 -27
  477. data/app/views/lists/create.js.rjs +0 -9
  478. data/app/views/lists/destroy.js.rjs +0 -1
  479. data/app/views/opportunities/contacts.js.rjs +0 -3
  480. data/app/views/opportunities/create.js.rjs +0 -29
  481. data/app/views/opportunities/destroy.js.rjs +0 -11
  482. data/app/views/opportunities/edit.js.rjs +0 -36
  483. data/app/views/opportunities/index.js.rjs +0 -8
  484. data/app/views/opportunities/new.js.rjs +0 -12
  485. data/app/views/opportunities/show.js.erb +0 -2
  486. data/app/views/opportunities/update.js.rjs +0 -26
  487. data/app/views/tasks/complete.js.rjs +0 -17
  488. data/app/views/tasks/create.js.rjs +0 -41
  489. data/app/views/tasks/destroy.js.rjs +0 -7
  490. data/app/views/tasks/discard.rjs +0 -1
  491. data/app/views/tasks/edit.js.rjs +0 -23
  492. data/app/views/tasks/filter.js.rjs +0 -1
  493. data/app/views/tasks/new.js.rjs +0 -9
  494. data/app/views/tasks/update.js.rjs +0 -21
  495. data/app/views/users/avatar.js.rjs +0 -10
  496. data/app/views/users/change_password.js.rjs +0 -15
  497. data/app/views/users/edit.js.rjs +0 -10
  498. data/app/views/users/password.js.rjs +0 -11
  499. data/app/views/users/update.js.rjs +0 -10
  500. data/app/views/users/upload_avatar.js.rjs +0 -8
  501. data/lib/fat_free_crm/secret_token_generator.rb +0 -65
  502. data/spec/lib/secret_token_generator_spec.rb +0 -79
  503. data/spec/models/users/abilities/user_ability_spec.rb +0 -58
  504. data/spec/support/rjs_support.rb +0 -14
  505. data/vendor/assets/images/brief.png +0 -0
  506. data/vendor/assets/images/full.png +0 -0
  507. data/vendor/assets/images/long.png +0 -0
  508. data/vendor/assets/images/tab_icons/accounts.png +0 -0
  509. data/vendor/assets/images/tab_icons/accounts_active.png +0 -0
  510. data/vendor/assets/images/tab_icons/campaigns.png +0 -0
  511. data/vendor/assets/images/tab_icons/campaigns_active.png +0 -0
  512. data/vendor/assets/images/tab_icons/contacts.png +0 -0
  513. data/vendor/assets/images/tab_icons/contacts_active.png +0 -0
  514. data/vendor/assets/images/tab_icons/dashboard.png +0 -0
  515. data/vendor/assets/images/tab_icons/dashboard_active.png +0 -0
  516. data/vendor/assets/images/tab_icons/leads.png +0 -0
  517. data/vendor/assets/images/tab_icons/leads_active.png +0 -0
  518. data/vendor/assets/images/tab_icons/opportunities.png +0 -0
  519. data/vendor/assets/images/tab_icons/opportunities_active.png +0 -0
  520. data/vendor/assets/images/tab_icons/tasks.png +0 -0
  521. data/vendor/assets/images/tab_icons/tasks_active.png +0 -0
@@ -99,7 +99,7 @@ describe OpportunitiesController do
99
99
 
100
100
  describe "with mime type of JSON" do
101
101
  it "should render all opportunities as JSON" do
102
- @controller.should_receive(:get_opportunities).and_return(opportunities = mock("Array of Opportunities"))
102
+ @controller.should_receive(:get_opportunities).and_return(opportunities = double("Array of Opportunities"))
103
103
  opportunities.should_receive(:to_json).and_return("generated JSON")
104
104
 
105
105
  request.env["HTTP_ACCEPT"] = "application/json"
@@ -110,7 +110,7 @@ describe OpportunitiesController do
110
110
 
111
111
  describe "with mime type of JSON" do
112
112
  it "should render all opportunities as JSON" do
113
- @controller.should_receive(:get_opportunities).and_return(opportunities = mock("Array of Opportunities"))
113
+ @controller.should_receive(:get_opportunities).and_return(opportunities = double("Array of Opportunities"))
114
114
  opportunities.should_receive(:to_json).and_return("generated JSON")
115
115
 
116
116
  request.env["HTTP_ACCEPT"] = "application/json"
@@ -121,7 +121,7 @@ describe OpportunitiesController do
121
121
 
122
122
  describe "with mime type of XML" do
123
123
  it "should render all opportunities as xml" do
124
- @controller.should_receive(:get_opportunities).and_return(opportunities = mock("Array of Opportunities"))
124
+ @controller.should_receive(:get_opportunities).and_return(opportunities = double("Array of Opportunities"))
125
125
  opportunities.should_receive(:to_xml).and_return("generated XML")
126
126
 
127
127
  request.env["HTTP_ACCEPT"] = "application/xml"
@@ -348,7 +348,7 @@ describe OpportunitiesController do
348
348
 
349
349
  before do
350
350
  @opportunity = FactoryGirl.build(:opportunity, :user => current_user)
351
- Opportunity.stub!(:new).and_return(@opportunity)
351
+ Opportunity.stub(:new).and_return(@opportunity)
352
352
  @stage = Setting.unroll(:opportunity_stage)
353
353
  end
354
354
 
@@ -426,7 +426,7 @@ describe OpportunitiesController do
426
426
  it "should update related campaign revenue if won" do
427
427
  @campaign = FactoryGirl.create(:campaign, :revenue => 0)
428
428
  @opportunity = FactoryGirl.build(:opportunity, :user => current_user, :stage => "won", :amount => 1100, :discount => 100)
429
- Opportunity.stub!(:new).and_return(@opportunity)
429
+ Opportunity.stub(:new).and_return(@opportunity)
430
430
 
431
431
  xhr :post, :create, :opportunity => { :name => "Hello world" }, :campaign => @campaign.id, :account => { :name => "Test Account" }
432
432
  assigns(:opportunity).should == @opportunity
@@ -436,7 +436,7 @@ describe OpportunitiesController do
436
436
 
437
437
  it "should add a new comment to the newly created opportunity when specified" do
438
438
  @opportunity = FactoryGirl.build(:opportunity, :user => current_user)
439
- Opportunity.stub!(:new).and_return(@opportunity)
439
+ Opportunity.stub(:new).and_return(@opportunity)
440
440
 
441
441
  xhr :post, :create, :opportunity => { :name => "Opportunity Knocks" }, :account => { :name => "My Account" }, :comment_body => "Awesome comment is awesome"
442
442
  @opportunity.reload.comments.map(&:comment).should include("Awesome comment is awesome")
@@ -449,7 +449,7 @@ describe OpportunitiesController do
449
449
  @account = Account.new(:user => current_user)
450
450
  @opportunity = FactoryGirl.build(:opportunity, :name => nil, :campaign => nil, :user => current_user,
451
451
  :account => @account)
452
- Opportunity.stub!(:new).and_return(@opportunity)
452
+ Opportunity.stub(:new).and_return(@opportunity)
453
453
  @stage = Setting.unroll(:opportunity_stage)
454
454
  @accounts = [ FactoryGirl.create(:account, :user => current_user) ]
455
455
 
@@ -465,7 +465,7 @@ describe OpportunitiesController do
465
465
  @account = FactoryGirl.create(:account, :id => 42, :user => current_user)
466
466
  @opportunity = FactoryGirl.build(:opportunity, :name => nil, :campaign => nil, :user => current_user,
467
467
  :account => @account)
468
- Opportunity.stub!(:new).and_return(@opportunity)
468
+ Opportunity.stub(:new).and_return(@opportunity)
469
469
  @stage = Setting.unroll(:opportunity_stage)
470
470
 
471
471
  # Expect to redraw [create] form with selected account.
@@ -157,19 +157,19 @@ describe HomeController do
157
157
  describe "activity_user" do
158
158
 
159
159
  before(:each) do
160
- @user = mock(User, :id => 1, :is_a? => true)
161
- @cur_user = mock(User)
160
+ @user = double(User, :id => 1, :is_a? => true)
161
+ @cur_user = double(User)
162
162
  end
163
163
 
164
164
  it "should find a user by email" do
165
- @cur_user.stub!(:pref).and_return(:activity_user => 'billy@example.com')
165
+ @cur_user.stub(:pref).and_return(:activity_user => 'billy@example.com')
166
166
  controller.instance_variable_set(:@current_user, @cur_user)
167
167
  User.should_receive(:where).with(:email => 'billy@example.com').and_return([@user])
168
168
  controller.send(:activity_user).should == 1
169
169
  end
170
170
 
171
171
  it "should find a user by first name or last name" do
172
- @cur_user.stub!(:pref).and_return(:activity_user => 'Billy')
172
+ @cur_user.stub(:pref).and_return(:activity_user => 'Billy')
173
173
  controller.instance_variable_set(:@current_user, @cur_user)
174
174
  User.should_receive(:where).with(:first_name => 'Billy').and_return([@user])
175
175
  User.should_receive(:where).with(:last_name => 'Billy').and_return([@user])
@@ -177,7 +177,7 @@ describe HomeController do
177
177
  end
178
178
 
179
179
  it "should find a user by first name and last name" do
180
- @cur_user.stub!(:pref).and_return(:activity_user => 'Billy Elliot')
180
+ @cur_user.stub(:pref).and_return(:activity_user => 'Billy Elliot')
181
181
  controller.instance_variable_set(:@current_user, @cur_user)
182
182
  User.should_receive(:where).with(:first_name => 'Billy', :last_name => "Elliot").and_return([@user])
183
183
  User.should_receive(:where).with(:first_name => 'Elliot', :last_name => "Billy").and_return([@user])
@@ -185,7 +185,7 @@ describe HomeController do
185
185
  end
186
186
 
187
187
  it "should return nil when 'all_users' is specified" do
188
- @cur_user.stub!(:pref).and_return(:activity_user => 'all_users')
188
+ @cur_user.stub(:pref).and_return(:activity_user => 'all_users')
189
189
  controller.instance_variable_set(:@current_user, @cur_user)
190
190
  User.should_not_receive(:where)
191
191
  controller.send(:activity_user).should == nil
@@ -9,7 +9,7 @@ describe TasksController do
9
9
 
10
10
  def update_sidebar
11
11
  @task_total = { :key => :value, :pairs => :etc }
12
- Task.stub!(:totals).and_return(@task_total)
12
+ Task.stub(:totals).and_return(@task_total)
13
13
  end
14
14
 
15
15
  def produce_tasks(user, view)
@@ -120,7 +120,7 @@ describe TasksController do
120
120
  TASK_STATUSES.each do |view|
121
121
 
122
122
  it "should render the requested task as JSON for #{view} view" do
123
- Task.stub_chain(:tracked_by, :find).and_return(task = mock("Task"))
123
+ Task.stub_chain(:tracked_by, :find).and_return(task = double("Task"))
124
124
  task.should_receive(:to_json).and_return("generated JSON")
125
125
 
126
126
  request.env["HTTP_ACCEPT"] = "application/json"
@@ -129,7 +129,7 @@ describe TasksController do
129
129
  end
130
130
 
131
131
  it "should render the requested task as xml for #{view} view" do
132
- Task.stub_chain(:tracked_by, :find).and_return(task = mock("Task"))
132
+ Task.stub_chain(:tracked_by, :find).and_return(task = double("Task"))
133
133
  task.should_receive(:to_xml).and_return("generated XML")
134
134
 
135
135
  request.env["HTTP_ACCEPT"] = "application/xml"
@@ -147,7 +147,7 @@ describe TasksController do
147
147
  it "should expose a new task as @task and render [new] template" do
148
148
  account = FactoryGirl.create(:account, :user => current_user)
149
149
  @task = FactoryGirl.build(:task, :user => current_user, :asset => account)
150
- Task.stub!(:new).and_return(@task)
150
+ Task.stub(:new).and_return(@task)
151
151
  @bucket = Setting.unroll(:task_bucket)[1..-1] << [ "On Specific Date...", :specific_time ]
152
152
  @category = Setting.unroll(:task_category)
153
153
 
@@ -268,7 +268,7 @@ describe TasksController do
268
268
 
269
269
  it "should expose a newly created task as @task and render [create] template" do
270
270
  @task = FactoryGirl.build(:task, :user => current_user)
271
- Task.stub!(:new).and_return(@task)
271
+ Task.stub(:new).and_return(@task)
272
272
 
273
273
  xhr :post, :create, :task => { :name => "Hello world" }
274
274
  assigns(:task).should == @task
@@ -280,7 +280,7 @@ describe TasksController do
280
280
  [ "", "?view=pending", "?view=assigned", "?view=completed" ].each do |view|
281
281
  it "should update tasks sidebar when [create] is being called from [/tasks#{view}] page" do
282
282
  @task = FactoryGirl.build(:task, :user => current_user)
283
- Task.stub!(:new).and_return(@task)
283
+ Task.stub(:new).and_return(@task)
284
284
 
285
285
  request.env["HTTP_REFERER"] = "http://localhost/tasks#{view}"
286
286
  xhr :post, :create, :task => { :name => "Hello world" }
@@ -293,7 +293,7 @@ describe TasksController do
293
293
 
294
294
  it "should expose a newly created but unsaved task as @lead and still render [create] template" do
295
295
  @task = FactoryGirl.build(:task, :name => nil, :user => current_user)
296
- Task.stub!(:new).and_return(@task)
296
+ Task.stub(:new).and_return(@task)
297
297
 
298
298
  xhr :post, :create, :task => {}
299
299
  assigns(:task).should == @task
@@ -3,7 +3,7 @@
3
3
  # Fat Free CRM is freely distributable under the terms of MIT license.
4
4
  # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
5
5
  #------------------------------------------------------------------------------
6
- require 'spec_helper'
6
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
7
7
 
8
8
  describe UsersController do
9
9
 
@@ -15,9 +15,11 @@ describe UsersController do
15
15
  require_user
16
16
  end
17
17
 
18
- it "should render [show] template" do
19
- get :show, :id => current_user.id
20
- assigns[:user].should == current_user
18
+ it "should expose the requested user as @user and render [show] template" do
19
+ @user = FactoryGirl.create(:user)
20
+
21
+ get :show, :id => @user.id
22
+ assigns[:user].should == @user
21
23
  response.should render_template("users/show")
22
24
  end
23
25
 
@@ -27,30 +29,16 @@ describe UsersController do
27
29
  response.should render_template("users/show")
28
30
  end
29
31
 
30
- it "should show user if admin user" do
31
- @user = create(:user)
32
- require_user(admin: true)
33
- get :show, id: @user.id
34
- assigns[:user].should == @user
35
- response.should render_template("users/show")
36
- end
37
-
38
- it "should not show user if not admin user" do
39
- @user = create(:user)
40
- get :show, id: @user.id
41
- response.should redirect_to(root_url)
42
- end
43
-
44
32
  describe "with mime type of JSON" do
45
33
  before(:each) do
46
34
  request.env["HTTP_ACCEPT"] = "application/json"
47
35
  end
48
36
 
49
37
  it "should render the requested user as JSON" do
50
- User.should_receive(:find).and_return(current_user)
51
- current_user.should_receive(:to_json).and_return("generated JSON")
38
+ User.should_receive(:find).and_return(user = double("User"))
39
+ user.should_receive(:to_json).and_return("generated JSON")
52
40
 
53
- get :show, :id => current_user.id
41
+ get :show, :id => 42
54
42
  response.body.should == "generated JSON"
55
43
  end
56
44
 
@@ -68,10 +56,10 @@ describe UsersController do
68
56
  end
69
57
 
70
58
  it "should render the requested user as XML" do
71
- User.should_receive(:find).and_return(current_user)
72
- current_user.should_receive(:to_xml).and_return("generated XML")
59
+ User.should_receive(:find).and_return(user = double("User"))
60
+ user.should_receive(:to_xml).and_return("generated XML")
73
61
 
74
- get :show, :id => current_user.id
62
+ get :show, :id => 42
75
63
  response.body.should == "generated XML"
76
64
  end
77
65
 
@@ -91,9 +79,9 @@ describe UsersController do
91
79
 
92
80
  describe "if user is allowed to sign up" do
93
81
  it "should expose a new user as @user and render [new] template" do
94
- User.should_receive(:can_signup?).and_return(true)
82
+ @controller.should_receive(:can_signup?).and_return(true)
95
83
  @user = FactoryGirl.build(:user)
96
- User.stub!(:new).and_return(@user)
84
+ User.stub(:new).and_return(@user)
97
85
 
98
86
  get :new
99
87
  assigns[:user].should == @user
@@ -103,7 +91,7 @@ describe UsersController do
103
91
 
104
92
  describe "if user is not allowed to sign up" do
105
93
  it "should redirect to login_path" do
106
- User.should_receive(:can_signup?).and_return(false)
94
+ @controller.should_receive(:can_signup?).and_return(false)
107
95
 
108
96
  get :new
109
97
  response.should redirect_to(login_path)
@@ -114,27 +102,14 @@ describe UsersController do
114
102
  # GET /users/1/edit AJAX
115
103
  #----------------------------------------------------------------------------
116
104
  describe "responding to GET edit" do
117
-
118
- it "should expose current user as @user and render [edit] template" do
105
+ before(:each) do
119
106
  require_user
120
107
  @user = current_user
121
- xhr :get, :edit, :id => @user.id
122
- assigns[:user].should == current_user
123
- response.should render_template("users/edit")
124
- end
125
-
126
- it "should not allow current user to edit another user" do
127
- @user = create(:user)
128
- require_user
129
- xhr :get, :edit, :id => @user.id
130
- expect(response.body).to eql("window.location.reload();")
131
108
  end
132
109
 
133
- it "should allow admin to edit another user" do
134
- require_user(admin: true)
135
- @user = create(:user)
110
+ it "should expose current user as @user and render [edit] template" do
136
111
  xhr :get, :edit, :id => @user.id
137
- assigns[:user].should == @user
112
+ assigns[:user].should == current_user
138
113
  response.should render_template("users/edit")
139
114
  end
140
115
 
@@ -151,11 +126,10 @@ describe UsersController do
151
126
  @email = @username + "@example.com"
152
127
  @password = "secret"
153
128
  @user = FactoryGirl.build(:user, :username => @username, :email => @email)
154
- User.stub!(:new).and_return(@user)
129
+ User.stub(:new).and_return(@user)
155
130
  end
156
131
 
157
132
  it "exposes a newly created user as @user and redirect to profile page" do
158
- require_user(admin: true)
159
133
  post :create, :user => { :username => @username, :email => @email, :password => @password, :password_confirmation => @password }
160
134
  assigns[:user].should == @user
161
135
  flash[:notice].should =~ /welcome/
@@ -163,7 +137,7 @@ describe UsersController do
163
137
  end
164
138
 
165
139
  it "should redirect to login page if user signup needs approval" do
166
- Setting.stub!(:user_signup).and_return(:needs_approval)
140
+ Setting.stub(:user_signup).and_return(:needs_approval)
167
141
 
168
142
  post :create, :user => { :username => @username, :email => @email, :password => @password, :password_confirmation => @password }
169
143
  assigns[:user].should == @user
@@ -174,9 +148,8 @@ describe UsersController do
174
148
 
175
149
  describe "with invalid params" do
176
150
  it "assigns a newly created but unsaved user as @user and renders [new] template" do
177
- require_user(admin: true)
178
151
  @user = FactoryGirl.build(:user, :username => "", :email => "")
179
- User.stub!(:new).and_return(@user)
152
+ User.stub(:new).and_return(@user)
180
153
 
181
154
  post :create, :user => {}
182
155
  assigns[:user].should == @user
@@ -288,7 +261,7 @@ describe UsersController do
288
261
  # -------------------------- Fix later --------------------------------
289
262
  # it "should return errors if the avatar failed to get uploaded and resized" do
290
263
  # @image = fixture_file_upload("spec/fixtures/rails.png", "image/png")
291
- # @user.stub!(:save).and_return(false) # make it fail
264
+ # @user.stub(:save).and_return(false) # make it fail
292
265
 
293
266
  # xhr :put, :upload_avatar, :id => @user.id, :avatar => { :image => @image }
294
267
  # @user.avatar.errors.should_not be_empty
@@ -319,7 +292,6 @@ describe UsersController do
319
292
  describe "responding to PUT change_password" do
320
293
  before(:each) do
321
294
  require_user
322
- User.stub(:find).and_return(current_user)
323
295
  @current_user_session.stub(:unauthorized_record=).and_return(current_user)
324
296
  @current_user_session.stub(:save).and_return(current_user)
325
297
  @user = current_user
@@ -5,16 +5,11 @@
5
5
  #------------------------------------------------------------------------------
6
6
  module SelectorHelpers
7
7
  def chosen_select(item_text, options)
8
- field_id = find_field(options[:from])[:id]
8
+ field_id = find_field(options[:from], :visible => false)[:id]
9
9
  option_value = page.evaluate_script("jQuery(\"##{field_id} option:contains('#{item_text}')\").val()")#page.evaluate_script("$(\"##{field_id} option:contains('#{item_text}')\").val()")
10
10
  page.execute_script("jQuery('##{field_id}').val('#{option_value}')")
11
11
  end
12
12
 
13
- def check_filter(filter_name)
14
- filter_checkbox = find(:xpath, "//input[@type='checkbox'][@value='due_#{filter_name}']")
15
- filter_checkbox.click
16
- end
17
-
18
13
  def click_filter_tab(filter_name)
19
14
  tab = find(:xpath, "//div[@class='filters']//td[contains(text(), '#{filter_name}')]")
20
15
  tab.click
@@ -54,11 +54,11 @@ feature 'Tasks', %q{
54
54
  page.should have_content('The task has been created and assigned to Another User')
55
55
 
56
56
  click_link 'Tasks'
57
- check_filter 'tomorrow'
57
+ page.uncheck('filters_due_tomorrow')
58
58
  page.should_not have_content('Task For Someone Else')
59
59
 
60
60
  click_filter_tab('Assigned')
61
- check_filter 'tomorrow'
61
+ page.check('filters_due_tomorrow')
62
62
  find('#main').should have_content('Task For Someone Else')
63
63
  find('#main').should have_content('Another User')
64
64
 
@@ -14,29 +14,29 @@ describe ApplicationHelper do
14
14
 
15
15
  describe "link_to_emails" do
16
16
  it "should add Bcc: if dropbox address is set" do
17
- Setting.stub!(:email_dropbox).and_return({ :address => "drop@example.com" })
17
+ Setting.stub(:email_dropbox).and_return({ :address => "drop@example.com" })
18
18
  helper.link_to_email("hello@example.com").should == '<a href="mailto:hello@example.com?bcc=drop@example.com" title="hello@example.com">hello@example.com</a>'
19
19
  end
20
20
 
21
21
  it "should not add Bcc: if dropbox address is not set" do
22
- Setting.stub!(:email_dropbox).and_return({ :address => nil })
22
+ Setting.stub(:email_dropbox).and_return({ :address => nil })
23
23
  helper.link_to_email("hello@example.com").should == '<a href="mailto:hello@example.com" title="hello@example.com">hello@example.com</a>'
24
24
  end
25
25
 
26
26
  it "should truncate long emails" do
27
- Setting.stub!(:email_dropbox).and_return({ :address => nil })
27
+ Setting.stub(:email_dropbox).and_return({ :address => nil })
28
28
  helper.link_to_email("hello@example.com", 5).should == '<a href="mailto:hello@example.com" title="hello@example.com">he...</a>'
29
29
  end
30
30
 
31
31
  it "should escape HTML entities" do
32
- Setting.stub!(:email_dropbox).and_return({ :address => 'dr&op@example.com' })
32
+ Setting.stub(:email_dropbox).and_return({ :address => 'dr&op@example.com' })
33
33
  helper.link_to_email("hell&o@example.com").should == '<a href="mailto:hell&amp;o@example.com?bcc=dr&amp;op@example.com" title="hell&amp;o@example.com">hell&amp;o@example.com</a>'
34
34
  end
35
35
  end
36
36
 
37
37
  it "link_to_discard" do
38
38
  lead = FactoryGirl.create(:lead)
39
- controller.request.stub!(:fullpath).and_return("http://www.example.com/leads/#{lead.id}")
39
+ controller.request.stub(:fullpath).and_return("http://www.example.com/leads/#{lead.id}")
40
40
 
41
41
  link = helper.link_to_discard(lead)
42
42
  link.should =~ %r|leads/#{lead.id}/discard|
@@ -45,26 +45,26 @@ describe ApplicationHelper do
45
45
 
46
46
  describe "shown_on_landing_page?" do
47
47
  it "should return true for Ajax request made from the asset landing page" do
48
- controller.request.stub!(:xhr?).and_return(true)
49
- controller.request.stub!(:referer).and_return("http://www.example.com/leads/123")
48
+ controller.request.stub(:xhr?).and_return(true)
49
+ controller.request.stub(:referer).and_return("http://www.example.com/leads/123")
50
50
  helper.shown_on_landing_page?.should == true
51
51
  end
52
52
 
53
53
  it "should return true for regular request to display asset landing page" do
54
- controller.request.stub!(:xhr?).and_return(false)
55
- controller.request.stub!(:fullpath).and_return("http://www.example.com/leads/123")
54
+ controller.request.stub(:xhr?).and_return(false)
55
+ controller.request.stub(:fullpath).and_return("http://www.example.com/leads/123")
56
56
  helper.shown_on_landing_page?.should == true
57
57
  end
58
58
 
59
59
  it "should return false for Ajax request made from page other than the asset landing page" do
60
- controller.request.stub!(:xhr?).and_return(true)
61
- controller.request.stub!(:referer).and_return("http://www.example.com/leads")
60
+ controller.request.stub(:xhr?).and_return(true)
61
+ controller.request.stub(:referer).and_return("http://www.example.com/leads")
62
62
  helper.shown_on_landing_page?.should == false
63
63
  end
64
64
 
65
65
  it "should return false for regular request to display page other than asset landing page" do
66
- controller.request.stub!(:xhr?).and_return(false)
67
- controller.request.stub!(:fullpath).and_return("http://www.example.com/leads")
66
+ controller.request.stub(:xhr?).and_return(false)
67
+ controller.request.stub(:fullpath).and_return("http://www.example.com/leads")
68
68
  helper.shown_on_landing_page?.should == false
69
69
  end
70
70
  end
@@ -73,8 +73,8 @@ describe ApplicationHelper do
73
73
 
74
74
  before(:each) do
75
75
  @user = mock_model(User)
76
- helper.stub!(:current_user).and_return(@user)
77
- controller.stub!(:params).and_return({'action' => 'show', 'controller' => 'contacts'})
76
+ helper.stub(:current_user).and_return(@user)
77
+ controller.stub(:params).and_return({'action' => 'show', 'controller' => 'contacts'})
78
78
  end
79
79
 
80
80
  it "should return the contact 'show' outline stored in the user preferences" do