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