fat_free_crm 0.11.3 → 0.11.4

Sign up to get free protection for your applications and to get access to all the features.

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
@@ -156,7 +156,7 @@ describe CommentsController do
156
156
  COMMENTABLE.each do |asset|
157
157
  it "should expose the requested comment as @commment and render [edit] template" do
158
158
  @asset = FactoryGirl.create(asset)
159
- @comment = FactoryGirl.create(:comment, :id => 42, :commentable => @asset, :user => @current_user)
159
+ @comment = FactoryGirl.create(:comment, :id => 42, :commentable => @asset, :user => current_user)
160
160
  Comment.stub!(:new).and_return(@comment)
161
161
 
162
162
  xhr :get, :edit, :id => 42
@@ -176,10 +176,10 @@ describe CommentsController do
176
176
  COMMENTABLE.each do |asset|
177
177
  it "should expose a newly created comment as @comment for the #{asset}" do
178
178
  @asset = FactoryGirl.create(asset)
179
- @comment = FactoryGirl.build(:comment, :commentable => @asset, :user => @current_user)
179
+ @comment = FactoryGirl.build(:comment, :commentable => @asset, :user => current_user)
180
180
  Comment.stub!(:new).and_return(@comment)
181
181
 
182
- xhr :post, :create, :comment => { :commentable_type => asset.to_s.classify, :commentable_id => @asset.id, :user_id => @current_user.id, :comment => "Hello" }
182
+ xhr :post, :create, :comment => { :commentable_type => asset.to_s.classify, :commentable_id => @asset.id, :user_id => current_user.id, :comment => "Hello" }
183
183
  assigns[:comment].should == @comment
184
184
  response.should render_template("comments/create")
185
185
  end
@@ -190,7 +190,7 @@ describe CommentsController do
190
190
  COMMENTABLE.each do |asset|
191
191
  it "should expose a newly created but unsaved comment as @comment for #{asset}" do
192
192
  @asset = FactoryGirl.create(asset)
193
- @comment = FactoryGirl.build(:comment, :commentable => @asset, :user => @current_user)
193
+ @comment = FactoryGirl.build(:comment, :commentable => @asset, :user => current_user)
194
194
  Comment.stub!(:new).and_return(@comment)
195
195
 
196
196
  xhr :post, :create, :comment => {}
@@ -258,7 +258,7 @@ describe CommentsController do
258
258
  COMMENTABLE.each do |asset|
259
259
  it "should destroy the requested comment and render [destroy] template" do
260
260
  @asset = FactoryGirl.create(asset)
261
- @comment = FactoryGirl.create(:comment, :commentable => @asset, :user => @current_user)
261
+ @comment = FactoryGirl.create(:comment, :commentable => @asset, :user => current_user)
262
262
  Comment.stub!(:new).and_return(@comment)
263
263
 
264
264
  xhr :delete, :destroy, :id => @comment.id
@@ -271,4 +271,3 @@ describe CommentsController do
271
271
  end
272
272
 
273
273
  end
274
-
@@ -16,7 +16,7 @@ describe EmailsController, "handling GET /emails" do
16
16
  MEDIATOR.each do |asset|
17
17
  it "should destroy the requested email and render [destroy] template" do
18
18
  @asset = FactoryGirl.create(asset)
19
- @email = FactoryGirl.create(:email, :mediator => @asset, :user => @current_user)
19
+ @email = FactoryGirl.create(:email, :mediator => @asset, :user => current_user)
20
20
  Email.stub!(:new).and_return(@email)
21
21
 
22
22
  xhr :delete, :destroy, :id => @email.id
@@ -29,4 +29,3 @@ describe EmailsController, "handling GET /emails" do
29
29
  end
30
30
 
31
31
  end
32
-
@@ -19,14 +19,14 @@ describe AccountsController do
19
19
  end
20
20
 
21
21
  it "should expose all accounts as @accounts and render [index] template" do
22
- @accounts = [ FactoryGirl.create(:account, :user => @current_user) ]
22
+ @accounts = [ FactoryGirl.create(:account, :user => current_user) ]
23
23
  get :index
24
24
  assigns[:accounts].should == @accounts
25
25
  response.should render_template("accounts/index")
26
26
  end
27
27
 
28
28
  it "should collect the data for the accounts sidebar" do
29
- @accounts = [ FactoryGirl.create(:account, :user => @current_user) ]
29
+ @accounts = [ FactoryGirl.create(:account, :user => current_user) ]
30
30
 
31
31
  get :index
32
32
  (assigns[:account_category_total].keys.map(&:to_sym) - (@category << :all << :other)).should == []
@@ -36,19 +36,19 @@ describe AccountsController do
36
36
  categories = %w(customer vendor)
37
37
  controller.session[:accounts_filter] = categories.join(',')
38
38
  @accounts = [
39
- FactoryGirl.create(:account, :user => @current_user, :category => categories.first),
40
- FactoryGirl.create(:account, :user => @current_user, :category => categories.last)
39
+ FactoryGirl.create(:account, :user => current_user, :category => categories.first),
40
+ FactoryGirl.create(:account, :user => current_user, :category => categories.last)
41
41
  ]
42
42
  # This one should be filtered out.
43
- FactoryGirl.create(:account, :user => @current_user, :category => "competitor")
43
+ FactoryGirl.create(:account, :user => current_user, :category => "competitor")
44
44
 
45
45
  get :index
46
46
  assigns[:accounts].should == @accounts
47
47
  end
48
48
 
49
49
  it "should perform lookup using query string" do
50
- @first = FactoryGirl.create(:account, :user => @current_user, :name => "The first one")
51
- @second = FactoryGirl.create(:account, :user => @current_user, :name => "The second one")
50
+ @first = FactoryGirl.create(:account, :user => current_user, :name => "The first one")
51
+ @second = FactoryGirl.create(:account, :user => current_user, :name => "The second one")
52
52
 
53
53
  get :index, :query => "second"
54
54
  assigns[:accounts].should == [ @second ]
@@ -58,7 +58,7 @@ describe AccountsController do
58
58
 
59
59
  describe "AJAX pagination" do
60
60
  it "should pick up page number from params" do
61
- @accounts = [ FactoryGirl.create(:account, :user => @current_user) ]
61
+ @accounts = [ FactoryGirl.create(:account, :user => current_user) ]
62
62
  xhr :get, :index, :page => 42
63
63
 
64
64
  assigns[:current_page].to_i.should == 42
@@ -69,13 +69,24 @@ describe AccountsController do
69
69
 
70
70
  it "should pick up saved page number from session" do
71
71
  session[:accounts_current_page] = 42
72
- @accounts = [ FactoryGirl.create(:account, :user => @current_user) ]
72
+ @accounts = [ FactoryGirl.create(:account, :user => current_user) ]
73
73
  xhr :get, :index
74
74
 
75
75
  assigns[:current_page].should == 42
76
76
  assigns[:accounts].should == []
77
77
  response.should render_template("accounts/index")
78
78
  end
79
+
80
+ it "should reset current_page when query is altered" do
81
+ session[:accounts_current_page] = 42
82
+ session[:accounts_current_query] = "bill"
83
+ @accounts = [ FactoryGirl.create(:account, :user => current_user) ]
84
+ xhr :get, :index
85
+
86
+ assigns[:current_page].should == 1
87
+ assigns[:accounts].should == @accounts
88
+ response.should render_template("accounts/index")
89
+ end
79
90
  end
80
91
 
81
92
  describe "with mime type of JSON" do
@@ -108,7 +119,7 @@ describe AccountsController do
108
119
 
109
120
  describe "with mime type of HTML" do
110
121
  before do
111
- @account = FactoryGirl.create(:account, :user => @current_user)
122
+ @account = FactoryGirl.create(:account, :user => current_user)
112
123
  @stage = Setting.unroll(:opportunity_stage)
113
124
  @comment = Comment.new
114
125
  end
@@ -129,7 +140,7 @@ describe AccountsController do
129
140
 
130
141
  describe "with mime type of JSON" do
131
142
  it "should render the requested account as json" do
132
- @account = FactoryGirl.create(:account, :user => @current_user)
143
+ @account = FactoryGirl.create(:account, :user => current_user)
133
144
  Account.should_receive(:find).and_return(@account)
134
145
  @account.should_receive(:to_json).and_return("generated JSON")
135
146
 
@@ -141,7 +152,7 @@ describe AccountsController do
141
152
 
142
153
  describe "with mime type of XML" do
143
154
  it "should render the requested account as xml" do
144
- @account = FactoryGirl.create(:account, :user => @current_user)
155
+ @account = FactoryGirl.create(:account, :user => current_user)
145
156
  Account.should_receive(:find).and_return(@account)
146
157
  @account.should_receive(:to_xml).and_return("generated XML")
147
158
 
@@ -153,7 +164,7 @@ describe AccountsController do
153
164
 
154
165
  describe "account got deleted or otherwise unavailable" do
155
166
  it "should redirect to account index if the account got deleted" do
156
- @account = FactoryGirl.create(:account, :user => @current_user)
167
+ @account = FactoryGirl.create(:account, :user => current_user)
157
168
  @account.destroy
158
169
 
159
170
  get :show, :id => @account.id
@@ -170,7 +181,7 @@ describe AccountsController do
170
181
  end
171
182
 
172
183
  it "should return 404 (Not Found) JSON error" do
173
- @account = FactoryGirl.create(:account, :user => @current_user)
184
+ @account = FactoryGirl.create(:account, :user => current_user)
174
185
  @account.destroy
175
186
  request.env["HTTP_ACCEPT"] = "application/json"
176
187
 
@@ -179,7 +190,7 @@ describe AccountsController do
179
190
  end
180
191
 
181
192
  it "should return 404 (Not Found) XML error" do
182
- @account = FactoryGirl.create(:account, :user => @current_user)
193
+ @account = FactoryGirl.create(:account, :user => current_user)
183
194
  @account.destroy
184
195
  request.env["HTTP_ACCEPT"] = "application/xml"
185
196
 
@@ -196,12 +207,10 @@ describe AccountsController do
196
207
  describe "responding to GET new" do
197
208
 
198
209
  it "should expose a new account as @account and render [new] template" do
199
- @account = Account.new(:user => @current_user)
200
- @users = [ FactoryGirl.create(:user) ]
201
-
210
+ @account = Account.new(:user => current_user,
211
+ :access => Setting.default_access)
202
212
  xhr :get, :new
203
213
  assigns[:account].attributes.should == @account.attributes
204
- assigns[:users].should == @users
205
214
  assigns[:contact].should == nil
206
215
  response.should render_template("accounts/new")
207
216
  end
@@ -220,12 +229,10 @@ describe AccountsController do
220
229
  describe "responding to GET edit" do
221
230
 
222
231
  it "should expose the requested account as @account and render [edit] template" do
223
- @account = FactoryGirl.create(:account, :id => 42, :user => @current_user)
224
- @users = [ FactoryGirl.create(:user) ]
232
+ @account = FactoryGirl.create(:account, :id => 42, :user => current_user)
225
233
 
226
234
  xhr :get, :edit, :id => 42
227
235
  assigns[:account].should == @account
228
- assigns[:users].should == @users
229
236
  assigns[:previous].should == nil
230
237
  response.should render_template("accounts/edit")
231
238
  end
@@ -240,7 +247,7 @@ describe AccountsController do
240
247
 
241
248
  describe "(account got deleted or is otherwise unavailable)" do
242
249
  it "should reload current page with the flash message if the account got deleted" do
243
- @account = FactoryGirl.create(:account, :user => @current_user)
250
+ @account = FactoryGirl.create(:account, :user => current_user)
244
251
  @account.destroy
245
252
 
246
253
  xhr :get, :edit, :id => @account.id
@@ -259,7 +266,7 @@ describe AccountsController do
259
266
 
260
267
  describe "(previous account got deleted or is otherwise unavailable)" do
261
268
  before do
262
- @account = FactoryGirl.create(:account, :user => @current_user)
269
+ @account = FactoryGirl.create(:account, :user => current_user)
263
270
  @previous = FactoryGirl.create(:account, :user => FactoryGirl.create(:user))
264
271
  end
265
272
 
@@ -291,44 +298,47 @@ describe AccountsController do
291
298
  describe "with valid params" do
292
299
 
293
300
  it "should expose a newly created account as @account and render [create] template" do
294
- @account = FactoryGirl.build(:account, :name => "Hello world", :user => @current_user)
301
+ @account = FactoryGirl.build(:account, :name => "Hello world", :user => current_user)
295
302
  Account.stub!(:new).and_return(@account)
296
- @users = [ FactoryGirl.create(:user) ]
297
303
 
298
- xhr :post, :create, :account => { :name => "Hello world" }, :users => %w(1 2 3)
304
+ xhr :post, :create, :account => { :name => "Hello world" }
299
305
  assigns(:account).should == @account
300
- assigns(:users).should == @users
301
306
  response.should render_template("accounts/create")
302
307
  end
303
308
 
304
309
  # Note: [Create Account] is shown only on Accounts index page.
305
310
  it "should reload accounts to update pagination" do
306
- @account = FactoryGirl.build(:account, :user => @current_user)
311
+ @account = FactoryGirl.build(:account, :user => current_user)
307
312
  Account.stub!(:new).and_return(@account)
308
313
 
309
- xhr :post, :create, :account => { :name => "Hello" }, :users => %w(1 2 3)
314
+ xhr :post, :create, :account => { :name => "Hello" }
310
315
  assigns[:accounts].should == [ @account ]
311
316
  end
312
317
 
313
318
  it "should get data to update account sidebar" do
314
- @account = FactoryGirl.build(:account, :name => "Hello", :user => @current_user)
319
+ @account = FactoryGirl.build(:account, :name => "Hello", :user => current_user)
315
320
  Campaign.stub!(:new).and_return(@account)
316
- @users = [ FactoryGirl.create(:user) ]
317
321
 
318
- xhr :post, :create, :account => { :name => "Hello" }, :users => %w(1 2 3)
322
+ xhr :post, :create, :account => { :name => "Hello" }
319
323
  assigns[:account_category_total].should be_instance_of(HashWithIndifferentAccess)
320
324
  end
325
+
326
+ it "should add a new comment to the newly created account when specified" do
327
+ @account = FactoryGirl.build(:account, :name => "Hello world", :user => current_user)
328
+ Account.stub!(:new).and_return(@account)
329
+
330
+ xhr :post, :create, :account => { :name => "Hello world" }, :comment_body => "Awesome comment is awesome"
331
+ assigns[:account].comments.map(&:comment).should include("Awesome comment is awesome")
332
+ end
321
333
  end
322
334
 
323
335
  describe "with invalid params" do
324
336
  it "should expose a newly created but unsaved account as @account and still render [create] template" do
325
337
  @account = FactoryGirl.build(:account, :name => nil, :user => nil)
326
338
  Account.stub!(:new).and_return(@account)
327
- @users = [ FactoryGirl.create(:user) ]
328
339
 
329
- xhr :post, :create, :account => {}, :users => []
340
+ xhr :post, :create, :account => {}
330
341
  assigns(:account).should == @account
331
- assigns(:users).should == @users
332
342
  response.should render_template("accounts/create")
333
343
  end
334
344
  end
@@ -353,25 +363,22 @@ describe AccountsController do
353
363
  @account = FactoryGirl.create(:account, :id => 42)
354
364
  request.env["HTTP_REFERER"] = "http://localhost/accounts"
355
365
 
356
- xhr :put, :update, :id => 42, :account => { :name => "Hello" }, :users => []
366
+ xhr :put, :update, :id => 42, :account => { :name => "Hello" }
357
367
  assigns(:account).should == @account
358
368
  assigns[:account_category_total].should be_instance_of(HashWithIndifferentAccess)
359
369
  end
360
370
 
361
371
  it "should update account permissions when sharing with specific users" do
362
372
  @account = FactoryGirl.create(:account, :id => 42, :access => "Public")
363
- he = FactoryGirl.create(:user, :id => 7)
364
- she = FactoryGirl.create(:user, :id => 8)
365
373
 
366
- xhr :put, :update, :id => 42, :account => { :name => "Hello", :access => "Shared" }, :users => %w(7 8)
367
- @account.reload.access.should == "Shared"
368
- @account.permissions.map(&:user_id).sort.should == [ 7, 8 ]
369
- assigns[:account].should == @account
374
+ xhr :put, :update, :id => 42, :account => { :name => "Hello", :access => "Shared", :user_ids => [7, 8] }
375
+ assigns[:account].access.should == "Shared"
376
+ assigns[:account].user_ids.sort.should == [7, 8]
370
377
  end
371
378
 
372
379
  describe "account got deleted or otherwise unavailable" do
373
380
  it "should reload current page is the account got deleted" do
374
- @account = FactoryGirl.create(:account, :user => @current_user)
381
+ @account = FactoryGirl.create(:account, :user => current_user)
375
382
  @account.destroy
376
383
 
377
384
  xhr :put, :update, :id => @account.id
@@ -394,7 +401,7 @@ describe AccountsController do
394
401
  @account = FactoryGirl.create(:account, :id => 42, :name => "Hello people")
395
402
 
396
403
  xhr :put, :update, :id => 42, :account => { :name => nil }
397
- @account.reload.name.should == "Hello people"
404
+ assigns(:account).reload.name.should == "Hello people"
398
405
  assigns(:account).should == @account
399
406
  response.should render_template("accounts/update")
400
407
  end
@@ -407,12 +414,12 @@ describe AccountsController do
407
414
  #----------------------------------------------------------------------------
408
415
  describe "responding to DELETE destroy" do
409
416
  before do
410
- @account = FactoryGirl.create(:account, :user => @current_user)
417
+ @account = FactoryGirl.create(:account, :user => current_user)
411
418
  end
412
419
 
413
420
  describe "AJAX request" do
414
421
  it "should destroy the requested account and render [destroy] template" do
415
- @another_account = FactoryGirl.create(:account, :user => @current_user)
422
+ @another_account = FactoryGirl.create(:account, :user => current_user)
416
423
  xhr :delete, :destroy, :id => @account.id
417
424
 
418
425
  lambda { Account.find(@account) }.should raise_error(ActiveRecord::RecordNotFound)
@@ -444,7 +451,7 @@ describe AccountsController do
444
451
 
445
452
  describe "account got deleted or otherwise unavailable" do
446
453
  it "should reload current page is the account got deleted" do
447
- @account = FactoryGirl.create(:account, :user => @current_user)
454
+ @account = FactoryGirl.create(:account, :user => current_user)
448
455
  @account.destroy
449
456
 
450
457
  xhr :delete, :destroy, :id => @account.id
@@ -471,7 +478,7 @@ describe AccountsController do
471
478
  end
472
479
 
473
480
  it "should redirect to account index with the flash message is the account got deleted" do
474
- @account = FactoryGirl.create(:account, :user => @current_user)
481
+ @account = FactoryGirl.create(:account, :user => current_user)
475
482
  @account.destroy
476
483
 
477
484
  delete :destroy, :id => @account.id
@@ -548,53 +555,31 @@ describe AccountsController do
548
555
  #----------------------------------------------------------------------------
549
556
  describe "responding to POST auto_complete" do
550
557
  before do
551
- @auto_complete_matches = [ FactoryGirl.create(:account, :name => "Hello World", :user => @current_user) ]
558
+ @auto_complete_matches = [ FactoryGirl.create(:account, :name => "Hello World", :user => current_user) ]
552
559
  end
553
560
 
554
561
  it_should_behave_like("auto complete")
555
562
  end
556
563
 
557
- # GET /accounts/options AJAX
558
- #----------------------------------------------------------------------------
559
- describe "responding to GET options" do
560
- it "should set current user preferences when showing options" do
561
- @per_page = FactoryGirl.create(:preference, :user => @current_user, :name => "accounts_per_page", :value => Base64.encode64(Marshal.dump(42)))
562
- @outline = FactoryGirl.create(:preference, :user => @current_user, :name => "accounts_outline", :value => Base64.encode64(Marshal.dump("option_long")))
563
- @sort_by = FactoryGirl.create(:preference, :user => @current_user, :name => "accounts_sort_by", :value => Base64.encode64(Marshal.dump("accounts.name ASC")))
564
-
565
- xhr :get, :options
566
- assigns[:per_page].should == 42
567
- assigns[:outline].should == "option_long"
568
- assigns[:sort_by].should == "accounts.name ASC"
569
- end
570
-
571
- it "should not assign instance variables when hiding options" do
572
- xhr :get, :options, :cancel => "true"
573
- assigns[:per_page].should == nil
574
- assigns[:outline].should == nil
575
- assigns[:sort_by].should == nil
576
- end
577
- end
578
-
579
564
  # POST /accounts/redraw AJAX
580
565
  #----------------------------------------------------------------------------
581
566
  describe "responding to POST redraw" do
582
567
  it "should save user selected account preference" do
583
- xhr :post, :redraw, :per_page => 42, :outline => "brief", :sort_by => "name"
584
- @current_user.preference[:accounts_per_page].should == "42"
585
- @current_user.preference[:accounts_outline].should == "brief"
586
- @current_user.preference[:accounts_sort_by].should == "accounts.name ASC"
568
+ xhr :post, :redraw, :per_page => 42, :view => "brief", :sort_by => "name"
569
+ current_user.preference[:accounts_per_page].should == "42"
570
+ current_user.preference[:accounts_index_view].should == "brief"
571
+ current_user.preference[:accounts_sort_by].should == "accounts.name ASC"
587
572
  end
588
573
 
589
574
  it "should reset current page to 1" do
590
- xhr :post, :redraw, :per_page => 42, :outline => "brief", :sort_by => "name"
575
+ xhr :post, :redraw, :per_page => 42, :view => "brief", :sort_by => "name"
591
576
  session[:accounts_current_page].should == 1
592
577
  end
593
578
 
594
579
  it "should select @accounts and render [index] template" do
595
580
  @accounts = [
596
- FactoryGirl.create(:account, :name => "A", :user => @current_user),
597
- FactoryGirl.create(:account, :name => "B", :user => @current_user)
581
+ FactoryGirl.create(:account, :name => "A", :user => current_user),
582
+ FactoryGirl.create(:account, :name => "B", :user => current_user)
598
583
  ]
599
584
 
600
585
  xhr :post, :redraw, :per_page => 1, :sort_by => "name"
@@ -608,7 +593,7 @@ describe AccountsController do
608
593
  describe "responding to POST filter" do
609
594
  it "should expose filtered accounts as @accounts and render [index] template" do
610
595
  session[:accounts_filter] = "customer,vendor"
611
- @accounts = [ FactoryGirl.create(:account, :category => "partner", :user => @current_user) ]
596
+ @accounts = [ FactoryGirl.create(:account, :category => "partner", :user => current_user) ]
612
597
 
613
598
  xhr :post, :filter, :category => "partner"
614
599
  assigns(:accounts).should == @accounts
@@ -623,4 +608,3 @@ describe AccountsController do
623
608
  end
624
609
  end
625
610
  end
626
-
@@ -21,7 +21,7 @@ describe CampaignsController do
21
21
  end
22
22
 
23
23
  it "should expose all campaigns as @campaigns and render [index] template" do
24
- @campaigns = [ FactoryGirl.create(:campaign, :user => @current_user) ]
24
+ @campaigns = [ FactoryGirl.create(:campaign, :user => current_user) ]
25
25
 
26
26
  get :index
27
27
  assigns[:campaigns].should == @campaigns
@@ -29,7 +29,7 @@ describe CampaignsController do
29
29
  end
30
30
 
31
31
  it "should collect the data for the opportunities sidebar" do
32
- @campaigns = [ FactoryGirl.create(:campaign, :user => @current_user) ]
32
+ @campaigns = [ FactoryGirl.create(:campaign, :user => current_user) ]
33
33
 
34
34
  get :index
35
35
  (assigns[:campaign_status_total].keys.map(&:to_sym) - (@status << :all << :other)).should == []
@@ -38,12 +38,12 @@ describe CampaignsController do
38
38
  it "should filter out campaigns by status" do
39
39
  controller.session[:campaigns_filter] = "planned,started"
40
40
  @campaigns = [
41
- FactoryGirl.create(:campaign, :user => @current_user, :status => "started"),
42
- FactoryGirl.create(:campaign, :user => @current_user, :status => "planned")
41
+ FactoryGirl.create(:campaign, :user => current_user, :status => "started"),
42
+ FactoryGirl.create(:campaign, :user => current_user, :status => "planned")
43
43
  ]
44
44
 
45
45
  # This one should be filtered out.
46
- FactoryGirl.create(:campaign, :user => @current_user, :status => "completed")
46
+ FactoryGirl.create(:campaign, :user => current_user, :status => "completed")
47
47
 
48
48
  get :index
49
49
  # Note: can't compare campaigns directly because of BigDecimal objects.
@@ -52,8 +52,8 @@ describe CampaignsController do
52
52
  end
53
53
 
54
54
  it "should perform lookup using query string" do
55
- @first = FactoryGirl.create(:campaign, :user => @current_user, :name => "Hello, world!")
56
- @second = FactoryGirl.create(:campaign, :user => @current_user, :name => "Hello again")
55
+ @first = FactoryGirl.create(:campaign, :user => current_user, :name => "Hello, world!")
56
+ @second = FactoryGirl.create(:campaign, :user => current_user, :name => "Hello again")
57
57
 
58
58
  get :index, :query => "again"
59
59
  assigns[:campaigns].should == [ @second ]
@@ -63,7 +63,7 @@ describe CampaignsController do
63
63
 
64
64
  describe "AJAX pagination" do
65
65
  it "should pick up page number from params" do
66
- @campaigns = [ FactoryGirl.create(:campaign, :user => @current_user) ]
66
+ @campaigns = [ FactoryGirl.create(:campaign, :user => current_user) ]
67
67
  xhr :get, :index, :page => 42
68
68
 
69
69
  assigns[:current_page].to_i.should == 42
@@ -74,13 +74,24 @@ describe CampaignsController do
74
74
 
75
75
  it "should pick up saved page number from session" do
76
76
  session[:campaigns_current_page] = 42
77
- @campaigns = [ FactoryGirl.create(:campaign, :user => @current_user) ]
77
+ @campaigns = [ FactoryGirl.create(:campaign, :user => current_user) ]
78
78
  xhr :get, :index
79
79
 
80
80
  assigns[:current_page].should == 42
81
81
  assigns[:campaigns].should == []
82
82
  response.should render_template("campaigns/index")
83
83
  end
84
+
85
+ it "should reset current_page when query is altered" do
86
+ session[:campaigns_current_page] = 42
87
+ session[:campaigns_current_query] = "bill"
88
+ @campaigns = [ FactoryGirl.create(:campaign, :user => current_user) ]
89
+ xhr :get, :index
90
+
91
+ assigns[:current_page].should == 1
92
+ assigns[:campaigns].should == @campaigns
93
+ response.should render_template("campaigns/index")
94
+ end
84
95
  end
85
96
 
86
97
  describe "with mime type of JSON" do
@@ -113,7 +124,7 @@ describe CampaignsController do
113
124
 
114
125
  describe "with mime type of HTML" do
115
126
  before(:each) do
116
- @campaign = FactoryGirl.create(:campaign, :id => 42, :user => @current_user)
127
+ @campaign = FactoryGirl.create(:campaign, :id => 42, :user => current_user)
117
128
  @stage = Setting.unroll(:opportunity_stage)
118
129
  @comment = Comment.new
119
130
  end
@@ -134,7 +145,7 @@ describe CampaignsController do
134
145
 
135
146
  describe "with mime type of JSON" do
136
147
  it "should render the requested campaign as JSON" do
137
- @campaign = FactoryGirl.create(:campaign, :id => 42, :user => @current_user)
148
+ @campaign = FactoryGirl.create(:campaign, :id => 42, :user => current_user)
138
149
  Campaign.should_receive(:find).and_return(@campaign)
139
150
  @campaign.should_receive(:to_json).and_return("generated JSON")
140
151
 
@@ -146,7 +157,7 @@ describe CampaignsController do
146
157
 
147
158
  describe "with mime type of XML" do
148
159
  it "should render the requested campaign as XML" do
149
- @campaign = FactoryGirl.create(:campaign, :id => 42, :user => @current_user)
160
+ @campaign = FactoryGirl.create(:campaign, :id => 42, :user => current_user)
150
161
  Campaign.should_receive(:find).and_return(@campaign)
151
162
  @campaign.should_receive(:to_xml).and_return("generated XML")
152
163
 
@@ -158,7 +169,7 @@ describe CampaignsController do
158
169
 
159
170
  describe "campaign got deleted or otherwise unavailable" do
160
171
  it "should redirect to campaign index if the campaign got deleted" do
161
- @campaign = FactoryGirl.create(:campaign, :user => @current_user)
172
+ @campaign = FactoryGirl.create(:campaign, :user => current_user)
162
173
  @campaign.destroy
163
174
 
164
175
  get :show, :id => @campaign.id
@@ -175,7 +186,7 @@ describe CampaignsController do
175
186
  end
176
187
 
177
188
  it "should return 404 (Not Found) JSON error" do
178
- @campaign = FactoryGirl.create(:campaign, :user => @current_user)
189
+ @campaign = FactoryGirl.create(:campaign, :user => current_user)
179
190
  @campaign.destroy
180
191
  request.env["HTTP_ACCEPT"] = "application/json"
181
192
 
@@ -184,7 +195,7 @@ describe CampaignsController do
184
195
  end
185
196
 
186
197
  it "should return 404 (Not Found) XML error" do
187
- @campaign = FactoryGirl.create(:campaign, :user => @current_user)
198
+ @campaign = FactoryGirl.create(:campaign, :user => current_user)
188
199
  @campaign.destroy
189
200
  request.env["HTTP_ACCEPT"] = "application/xml"
190
201
 
@@ -200,12 +211,10 @@ describe CampaignsController do
200
211
  describe "responding to GET new" do
201
212
 
202
213
  it "should expose a new campaign as @campaign" do
203
- @campaign = Campaign.new(:user => @current_user)
204
- @users = [ FactoryGirl.create(:user) ]
205
-
214
+ @campaign = Campaign.new(:user => current_user,
215
+ :access => Setting.default_access)
206
216
  xhr :get, :new
207
217
  assigns[:campaign].attributes.should == @campaign.attributes
208
- assigns[:users].should == @users
209
218
  response.should render_template("campaigns/new")
210
219
  end
211
220
 
@@ -222,12 +231,10 @@ describe CampaignsController do
222
231
  describe "responding to GET edit" do
223
232
 
224
233
  it "should expose the requested campaign as @campaign and render [edit] template" do
225
- @campaign = FactoryGirl.create(:campaign, :id => 42, :user => @current_user)
226
- @users = [ FactoryGirl.create(:user) ]
234
+ @campaign = FactoryGirl.create(:campaign, :id => 42, :user => current_user)
227
235
 
228
236
  xhr :get, :edit, :id => 42
229
237
  assigns[:campaign].should == @campaign
230
- assigns[:users].should == @users
231
238
  response.should render_template("campaigns/edit")
232
239
  end
233
240
 
@@ -242,7 +249,7 @@ describe CampaignsController do
242
249
 
243
250
  describe "(campaign got deleted or is otherwise unavailable)" do
244
251
  it "should reload current page with the flash message if the campaign got deleted" do
245
- @campaign = FactoryGirl.create(:campaign, :user => @current_user)
252
+ @campaign = FactoryGirl.create(:campaign, :user => current_user)
246
253
  @campaign.destroy
247
254
 
248
255
  xhr :get, :edit, :id => @campaign.id
@@ -261,7 +268,7 @@ describe CampaignsController do
261
268
 
262
269
  describe "(previous campaign got deleted or is otherwise unavailable)" do
263
270
  before(:each) do
264
- @campaign = FactoryGirl.create(:campaign, :user => @current_user)
271
+ @campaign = FactoryGirl.create(:campaign, :user => current_user)
265
272
  @previous = FactoryGirl.create(:campaign, :user => FactoryGirl.create(:user))
266
273
  end
267
274
 
@@ -293,44 +300,47 @@ describe CampaignsController do
293
300
  describe "with valid params" do
294
301
 
295
302
  it "should expose a newly created campaign as @campaign and render [create] template" do
296
- @campaign = FactoryGirl.build(:campaign, :name => "Hello", :user => @current_user)
303
+ @campaign = FactoryGirl.build(:campaign, :name => "Hello", :user => current_user)
297
304
  Campaign.stub!(:new).and_return(@campaign)
298
- @users = [ FactoryGirl.create(:user) ]
299
305
 
300
- xhr :post, :create, :campaign => { :name => "Hello" }, :users => %w(1 2 3)
306
+ xhr :post, :create, :campaign => { :name => "Hello" }
301
307
  assigns(:campaign).should == @campaign
302
- assigns(:users).should == @users
303
308
  response.should render_template("campaigns/create")
304
309
  end
305
310
 
306
311
  it "should get data to update campaign sidebar" do
307
- @campaign = FactoryGirl.build(:campaign, :name => "Hello", :user => @current_user)
312
+ @campaign = FactoryGirl.build(:campaign, :name => "Hello", :user => current_user)
308
313
  Campaign.stub!(:new).and_return(@campaign)
309
- @users = [ FactoryGirl.create(:user) ]
310
314
 
311
- xhr :post, :create, :campaign => { :name => "Hello" }, :users => %w(1 2 3)
315
+ xhr :post, :create, :campaign => { :name => "Hello" }
312
316
  assigns[:campaign_status_total].should be_instance_of(HashWithIndifferentAccess)
313
317
  end
314
318
 
315
319
  it "should reload campaigns to update pagination" do
316
- @campaign = FactoryGirl.build(:campaign, :user => @current_user)
320
+ @campaign = FactoryGirl.build(:campaign, :user => current_user)
317
321
  Campaign.stub!(:new).and_return(@campaign)
318
322
 
319
- xhr :post, :create, :campaign => { :name => "Hello" }, :users => %w(1 2 3)
323
+ xhr :post, :create, :campaign => { :name => "Hello" }
320
324
  assigns[:campaigns].should == [ @campaign ]
321
325
  end
326
+
327
+ it "should add a new comment to the newly created campaign when specified" do
328
+ @campaign = FactoryGirl.build(:campaign, :name => "Hello world", :user => current_user)
329
+ Campaign.stub!(:new).and_return(@campaign)
330
+
331
+ xhr :post, :create, :campaign => { :name => "Hello world" }, :comment_body => "Awesome comment is awesome"
332
+ @campaign.reload.comments.map(&:comment).should include("Awesome comment is awesome")
333
+ end
322
334
  end
323
335
 
324
336
  describe "with invalid params" do
325
337
 
326
338
  it "should expose a newly created but unsaved campaign as @campaign and still render [create] template" do
327
- @campaign = FactoryGirl.build(:campaign, :id => nil, :name => nil, :user => @current_user)
339
+ @campaign = FactoryGirl.build(:campaign, :id => nil, :name => nil, :user => current_user)
328
340
  Campaign.stub!(:new).and_return(@campaign)
329
- @users = [ FactoryGirl.create(:user) ]
330
341
 
331
- xhr :post, :create, :campaign => nil, :users => %w(1 2 3)
342
+ xhr :post, :create, :campaign => nil
332
343
  assigns(:campaign).should == @campaign
333
- assigns(:users).should == @users
334
344
  response.should render_template("campaigns/create")
335
345
  end
336
346
  end
@@ -346,7 +356,7 @@ describe CampaignsController do
346
356
  it "should update the requested campaign and render [update] template" do
347
357
  @campaign = FactoryGirl.create(:campaign, :id => 42, :name => "Bye")
348
358
 
349
- xhr :put, :update, :id => 42, :campaign => { :name => "Hello" }, :users => []
359
+ xhr :put, :update, :id => 42, :campaign => { :name => "Hello" }
350
360
  @campaign.reload.name.should == "Hello"
351
361
  assigns(:campaign).should == @campaign
352
362
  response.should render_template("campaigns/update")
@@ -356,7 +366,7 @@ describe CampaignsController do
356
366
  @campaign = FactoryGirl.create(:campaign, :id => 42)
357
367
  request.env["HTTP_REFERER"] = "http://localhost/campaigns"
358
368
 
359
- xhr :put, :update, :id => 42, :campaign => { :name => "Hello" }, :users => []
369
+ xhr :put, :update, :id => 42, :campaign => { :name => "Hello" }
360
370
  assigns(:campaign).should == @campaign
361
371
  assigns[:campaign_status_total].should be_instance_of(HashWithIndifferentAccess)
362
372
  end
@@ -366,18 +376,17 @@ describe CampaignsController do
366
376
  he = FactoryGirl.create(:user, :id => 7)
367
377
  she = FactoryGirl.create(:user, :id => 8)
368
378
 
369
- xhr :put, :update, :id => 42, :campaign => { :name => "Hello", :access => "Shared" }, :users => %w(7 8)
370
- @campaign.reload.access.should == "Shared"
371
- @campaign.permissions.map(&:user_id).sort.should == [ 7, 8 ]
372
- assigns[:campaign].should == @campaign
379
+ xhr :put, :update, :id => 42, :campaign => { :name => "Hello", :access => "Shared", :user_ids => %w(7 8) }
380
+ assigns[:campaign].access.should == "Shared"
381
+ assigns[:campaign].user_ids.sort.should == [ 7, 8 ]
373
382
  end
374
383
 
375
384
  describe "campaign got deleted or otherwise unavailable" do
376
385
  it "should reload current page with the flash message if the campaign got deleted" do
377
- @campaign = FactoryGirl.create(:campaign, :user => @current_user)
386
+ @campaign = FactoryGirl.create(:campaign, :user => current_user)
378
387
  @campaign.destroy
379
388
 
380
- xhr :put, :update, :id => @campaign.id, :users => []
389
+ xhr :put, :update, :id => @campaign.id
381
390
  flash[:warning].should_not == nil
382
391
  response.body.should == "window.location.reload();"
383
392
  end
@@ -385,7 +394,7 @@ describe CampaignsController do
385
394
  it "should reload current page with the flash message if the campaign is protected" do
386
395
  @private = FactoryGirl.create(:campaign, :user => FactoryGirl.create(:user), :access => "Private")
387
396
 
388
- xhr :put, :update, :id => @private.id, :users => []
397
+ xhr :put, :update, :id => @private.id
389
398
  flash[:warning].should_not == nil
390
399
  response.body.should == "window.location.reload();"
391
400
  end
@@ -395,13 +404,11 @@ describe CampaignsController do
395
404
  describe "with invalid params" do
396
405
 
397
406
  it "should not update the requested campaign, but still expose it as @campaign and still render [update] template" do
398
- @campaign = FactoryGirl.create(:campaign, :id => 42, :name => "Hello", :user => @current_user)
399
- @users = [ FactoryGirl.create(:user) ]
407
+ @campaign = FactoryGirl.create(:campaign, :id => 42, :name => "Hello", :user => current_user)
400
408
 
401
409
  xhr :put, :update, :id => 42, :campaign => { :name => nil }
402
410
  @campaign.reload.name.should == "Hello"
403
411
  assigns(:campaign).should == @campaign
404
- assigns(:users).should == @users
405
412
  response.should render_template("campaigns/update")
406
413
  end
407
414
  end
@@ -412,12 +419,12 @@ describe CampaignsController do
412
419
  #----------------------------------------------------------------------------
413
420
  describe "responding to DELETE destroy" do
414
421
  before(:each) do
415
- @campaign = FactoryGirl.create(:campaign, :user => @current_user)
422
+ @campaign = FactoryGirl.create(:campaign, :user => current_user)
416
423
  end
417
424
 
418
425
  describe "AJAX request" do
419
426
  it "should destroy the requested campaign and render [destroy] template" do
420
- @another_campaign = FactoryGirl.create(:campaign, :user => @current_user)
427
+ @another_campaign = FactoryGirl.create(:campaign, :user => current_user)
421
428
  xhr :delete, :destroy, :id => @campaign.id
422
429
 
423
430
  assigns[:campaigns].should == [ @another_campaign ]
@@ -449,7 +456,7 @@ describe CampaignsController do
449
456
 
450
457
  describe "campaign got deleted or otherwise unavailable" do
451
458
  it "should reload current page with the flash message if the campaign got deleted" do
452
- @campaign = FactoryGirl.create(:campaign, :user => @current_user)
459
+ @campaign = FactoryGirl.create(:campaign, :user => current_user)
453
460
  @campaign.destroy
454
461
 
455
462
  xhr :delete, :destroy, :id => @campaign.id
@@ -476,7 +483,7 @@ describe CampaignsController do
476
483
  end
477
484
 
478
485
  it "should redirect to campaign index with the flash message is the campaign got deleted" do
479
- @campaign = FactoryGirl.create(:campaign, :user => @current_user)
486
+ @campaign = FactoryGirl.create(:campaign, :user => current_user)
480
487
  @campaign.destroy
481
488
 
482
489
  delete :destroy, :id => @campaign.id
@@ -587,53 +594,31 @@ describe CampaignsController do
587
594
  #----------------------------------------------------------------------------
588
595
  describe "responding to POST auto_complete" do
589
596
  before(:each) do
590
- @auto_complete_matches = [ FactoryGirl.create(:campaign, :name => "Hello World", :user => @current_user) ]
597
+ @auto_complete_matches = [ FactoryGirl.create(:campaign, :name => "Hello World", :user => current_user) ]
591
598
  end
592
599
 
593
600
  it_should_behave_like("auto complete")
594
601
  end
595
602
 
596
- # GET /campaigns/options AJAX
597
- #----------------------------------------------------------------------------
598
- describe "responding to GET options" do
599
- it "should set current user preferences when showing options" do
600
- @per_page = FactoryGirl.create(:preference, :user => @current_user, :name => "campaigns_per_page", :value => Base64.encode64(Marshal.dump(42)))
601
- @outline = FactoryGirl.create(:preference, :user => @current_user, :name => "campaigns_outline", :value => Base64.encode64(Marshal.dump("option_long")))
602
- @sort_by = FactoryGirl.create(:preference, :user => @current_user, :name => "campaigns_sort_by", :value => Base64.encode64(Marshal.dump("campaigns.name ASC")))
603
-
604
- xhr :get, :options
605
- assigns[:per_page].should == 42
606
- assigns[:outline].should == "option_long"
607
- assigns[:sort_by].should == "campaigns.name ASC"
608
- end
609
-
610
- it "should not assign instance variables when hiding options" do
611
- xhr :get, :options, :cancel => "true"
612
- assigns[:per_page].should == nil
613
- assigns[:outline].should == nil
614
- assigns[:sort_by].should == nil
615
- end
616
- end
617
-
618
603
  # POST /campaigns/redraw AJAX
619
604
  #----------------------------------------------------------------------------
620
605
  describe "responding to POST redraw" do
621
606
  it "should save user selected campaign preference" do
622
- xhr :post, :redraw, :per_page => 42, :outline => "brief", :sort_by => "name"
623
- @current_user.preference[:campaigns_per_page].should == "42"
624
- @current_user.preference[:campaigns_outline].should == "brief"
625
- @current_user.preference[:campaigns_sort_by].should == "campaigns.name ASC"
607
+ xhr :post, :redraw, :per_page => 42, :view => "brief", :sort_by => "name"
608
+ current_user.preference[:campaigns_per_page].should == "42"
609
+ current_user.preference[:campaigns_index_view].should == "brief"
610
+ current_user.preference[:campaigns_sort_by].should == "campaigns.name ASC"
626
611
  end
627
612
 
628
613
  it "should reset current page to 1" do
629
- xhr :post, :redraw, :per_page => 42, :outline => "brief", :sort_by => "name"
614
+ xhr :post, :redraw, :per_page => 42, :view => "brief", :sort_by => "name"
630
615
  session[:campaigns_current_page].should == 1
631
616
  end
632
617
 
633
618
  it "should select @campaigns and render [index] template" do
634
619
  @campaigns = [
635
- FactoryGirl.create(:campaign, :name => "A", :user => @current_user),
636
- FactoryGirl.create(:campaign, :name => "B", :user => @current_user)
620
+ FactoryGirl.create(:campaign, :name => "A", :user => current_user),
621
+ FactoryGirl.create(:campaign, :name => "B", :user => current_user)
637
622
  ]
638
623
 
639
624
  xhr :post, :redraw, :per_page => 1, :sort_by => "name"
@@ -648,7 +633,7 @@ describe CampaignsController do
648
633
 
649
634
  it "should expose filtered campaigns as @campaigns and render [index] template" do
650
635
  session[:campaigns_filter] = "planned,started"
651
- @campaigns = [ FactoryGirl.create(:campaign, :status => "completed", :user => @current_user) ]
636
+ @campaigns = [ FactoryGirl.create(:campaign, :status => "completed", :user => current_user) ]
652
637
 
653
638
  xhr :post, :filter, :status => "completed"
654
639
  assigns(:campaigns).should == @campaigns
@@ -665,4 +650,3 @@ describe CampaignsController do
665
650
  end
666
651
 
667
652
  end
668
-