your_platform 0.0.1 → 0.0.2
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.
- checksums.yaml +7 -0
- data/README.md +39 -11
- data/Rakefile +15 -1
- data/app/assets/images/file.png +0 -0
- data/app/assets/images/img/excel2013_file_128.png +0 -0
- data/app/assets/images/img/excel2013_file_bw_107.png +0 -0
- data/app/assets/images/img/excel2013_file_bw_semitransparent_107.png +0 -0
- data/app/assets/images/img/glyphicons-halflings-white.png +0 -0
- data/app/assets/images/img/glyphicons-halflings.png +0 -0
- data/app/assets/images/img/gmaps_yellow_marker.png +0 -0
- data/app/assets/images/img/gmaps_yellow_marker_38.png +0 -0
- data/app/assets/images/markdown_help.png +0 -0
- data/app/assets/images/your_platform/breadcrumb-sep.png +0 -0
- data/app/assets/javascripts/app-ng.js.coffee +5 -0
- data/app/assets/javascripts/attachments.js +2 -0
- data/app/assets/javascripts/controllers-ng/bookmark_list_controller.js.coffee +30 -0
- data/app/assets/javascripts/controllers-ng/box_controller.js.coffee +37 -0
- data/app/assets/javascripts/controllers-ng/profile_angular.js.coffee +151 -0
- data/app/assets/javascripts/directives-ng/box_directive.js.coffee +91 -0
- data/app/assets/javascripts/directives-ng/star_tool_directive.js.coffee +111 -0
- data/app/assets/javascripts/filters-ng/some_filter.js.coffee +0 -0
- data/app/assets/javascripts/jquery.appear-1.1.1.js +138 -0
- data/app/assets/javascripts/make-js-more-like-ruby.js.coffee +32 -0
- data/app/assets/javascripts/mercury.js +456 -0
- data/app/assets/javascripts/models-ng/bookmark.js.coffee +28 -0
- data/app/assets/javascripts/services-ng/current_user_bookmarks.js.coffee +39 -0
- data/app/assets/javascripts/your_platform.js +27 -0
- data/app/assets/javascripts/your_platform/address_labels.js.coffee +40 -0
- data/app/assets/javascripts/your_platform/attachments.js.coffee +61 -0
- data/app/assets/javascripts/your_platform/auto-completion.js.coffee +90 -0
- data/app/assets/javascripts/your_platform/best_in_place.js.coffee +8 -0
- data/app/assets/javascripts/your_platform/best_in_place_hyperlinks.js.coffee +25 -0
- data/app/assets/javascripts/your_platform/best_in_place_tab_key.js.coffee +28 -0
- data/app/assets/javascripts/your_platform/boxes.js.coffee +11 -0
- data/app/assets/javascripts/your_platform/change_password.js.coffee +22 -0
- data/app/assets/javascripts/your_platform/close_dropdowns.js.coffee +18 -0
- data/app/assets/javascripts/your_platform/copy_to_clipboard.js.coffee +6 -0
- data/app/assets/javascripts/your_platform/datatables.coffee +112 -0
- data/app/assets/javascripts/your_platform/datepicker_settings.js.coffee +16 -0
- data/app/assets/javascripts/your_platform/edit_tools.js.coffee +19 -0
- data/app/assets/javascripts/your_platform/editable_dbl_click.js.coffee +42 -0
- data/app/assets/javascripts/your_platform/events.js.coffee +126 -0
- data/app/assets/javascripts/your_platform/fix_textarea.js.coffee +11 -0
- data/app/assets/javascripts/your_platform/galleria.js.coffee +112 -0
- data/app/assets/javascripts/your_platform/groups.js.coffee +36 -0
- data/app/assets/javascripts/your_platform/hidden.js.coffee +5 -0
- data/app/assets/javascripts/your_platform/links_to_external_sites.js.coffee +12 -0
- data/app/assets/javascripts/your_platform/maps.js.coffee +13 -0
- data/app/assets/javascripts/your_platform/may_need_review.js.coffee +10 -0
- data/app/assets/javascripts/your_platform/navable_title_rename.js.coffee +17 -0
- data/app/assets/javascripts/your_platform/officers.js.coffee +35 -0
- data/app/assets/javascripts/your_platform/popovers.js.coffee +38 -0
- data/app/assets/javascripts/your_platform/posts.js.coffee +58 -0
- data/app/assets/javascripts/your_platform/profile_fields.js.coffee +61 -0
- data/app/assets/javascripts/your_platform/search.js.coffee +26 -0
- data/app/assets/javascripts/your_platform/tooltips.js.coffee +10 -0
- data/app/assets/javascripts/your_platform/turbolinks_loading_spinner.js.coffee +83 -0
- data/app/assets/javascripts/your_platform/user_avatars.js.coffee +33 -0
- data/app/assets/javascripts/your_platform/user_group_memberships.js.coffee +11 -0
- data/app/assets/javascripts/your_platform/user_settings.js.coffee +18 -0
- data/app/assets/javascripts/your_platform/users_new.js.coffee +54 -0
- data/app/assets/stylesheets/bootstrap_layout.css.sass +3 -0
- data/app/assets/stylesheets/bootstrap_layout/attachments.css.sass +3 -0
- data/app/assets/stylesheets/bootstrap_layout/boxes.css.sass +11 -0
- data/app/assets/stylesheets/bootstrap_layout/breadcrumb.css.sass +25 -0
- data/app/assets/stylesheets/bootstrap_layout/category_indicator.css.sass +5 -0
- data/app/assets/stylesheets/bootstrap_layout/footer.css.sass +14 -0
- data/app/assets/stylesheets/bootstrap_layout/galleria.css.sass +8 -0
- data/app/assets/stylesheets/bootstrap_layout/header_bar.css.sass +11 -0
- data/app/assets/stylesheets/bootstrap_layout/headings.css.sass +10 -0
- data/app/assets/stylesheets/bootstrap_layout/logged_in_bar.css.sass +40 -0
- data/app/assets/stylesheets/bootstrap_layout/logo.css.sass +2 -0
- data/app/assets/stylesheets/bootstrap_layout/modal_fix.css.sass +8 -0
- data/app/assets/stylesheets/bootstrap_layout/profiles.css.sass +10 -0
- data/app/assets/stylesheets/bootstrap_layout/session_bar.css.sass +60 -0
- data/app/assets/stylesheets/bootstrap_layout/stars.css.sass +4 -0
- data/app/assets/stylesheets/bootstrap_layout/turbolinks_progress_bar.css.sass +3 -0
- data/app/assets/stylesheets/bootstrap_layout/vertical_menu.css.sass +15 -0
- data/app/assets/stylesheets/bootstrap_setup.css.sass +4 -0
- data/app/assets/stylesheets/your_platform.css.sass +11 -0
- data/app/assets/stylesheets/your_platform/address_labels_modal.css.sass +8 -0
- data/app/assets/stylesheets/your_platform/attachments.css.sass +75 -0
- data/app/assets/stylesheets/your_platform/authorization_info.css.sass +16 -0
- data/app/assets/stylesheets/your_platform/auto-completion.css.sass +3 -0
- data/app/assets/stylesheets/your_platform/center.css.sass +14 -0
- data/app/assets/stylesheets/your_platform/change_password.css.sass +13 -0
- data/app/assets/stylesheets/your_platform/corporate_vita.css.sass +2 -0
- data/app/assets/stylesheets/your_platform/datatables.css.sass +23 -0
- data/app/assets/stylesheets/your_platform/datepicker.css.sass +2 -0
- data/app/assets/stylesheets/your_platform/dropdowns.css.sass +8 -0
- data/app/assets/stylesheets/your_platform/events.css.sass +68 -0
- data/app/assets/stylesheets/your_platform/forms.css.sass +25 -0
- data/app/assets/stylesheets/your_platform/galleria.css.sass +12 -0
- data/app/assets/stylesheets/your_platform/groups.css.sass +8 -0
- data/app/assets/stylesheets/your_platform/groups_table.css.sass +8 -0
- data/app/assets/stylesheets/your_platform/hidden.css.sass +3 -0
- data/app/assets/stylesheets/your_platform/images.css.sass +50 -0
- data/app/assets/stylesheets/your_platform/last_activities.css.sass +17 -0
- data/app/assets/stylesheets/your_platform/latest_members.css.sass +7 -0
- data/app/assets/stylesheets/your_platform/login.css.sass +4 -0
- data/app/assets/stylesheets/your_platform/maps.css.sass +22 -0
- data/app/assets/stylesheets/your_platform/markdown_help.css.sass +5 -0
- data/app/assets/stylesheets/your_platform/may_need_review.css.sass +3 -0
- data/app/assets/stylesheets/your_platform/pages.css.sass +12 -0
- data/app/assets/stylesheets/your_platform/password_strength.css.sass +73 -0
- data/app/assets/stylesheets/your_platform/picture_attachments.css.sass +7 -0
- data/app/assets/stylesheets/your_platform/popovers.css.sass +13 -0
- data/app/assets/stylesheets/your_platform/posts.css.sass +32 -0
- data/app/assets/stylesheets/your_platform/profiles.css.sass +153 -0
- data/app/assets/stylesheets/your_platform/search_preview.css.sass +4 -0
- data/app/assets/stylesheets/your_platform/star_tool.css.sass +2 -0
- data/app/assets/stylesheets/your_platform/tooltips.css.sass +7 -0
- data/app/assets/stylesheets/your_platform/turbolinks_loading_spinner.css.sass +3 -0
- data/app/assets/stylesheets/your_platform/user_avatars.css.sass +8 -0
- data/app/assets/stylesheets/your_platform/user_group_memberships.css.sass +4 -0
- data/app/assets/stylesheets/your_platform/vertical_nav.css.sass +7 -0
- data/app/controllers/activities_controller.rb +6 -0
- data/app/controllers/application_controller.rb +236 -0
- data/app/controllers/attachments_controller.rb +97 -0
- data/app/controllers/blog_posts_controller.rb +50 -0
- data/app/controllers/bookmarks_controller.rb +33 -0
- data/app/controllers/corporations_controller.rb +22 -0
- data/app/controllers/errors_controller.rb +27 -0
- data/app/controllers/events_controller.rb +262 -0
- data/app/controllers/groups_controller.rb +257 -0
- data/app/controllers/officers_controller.rb +28 -0
- data/app/controllers/pages_controller.rb +67 -0
- data/app/controllers/posts_controller.rb +81 -0
- data/app/controllers/profile_fields_controller.rb +132 -0
- data/app/controllers/root_controller.rb +35 -0
- data/app/controllers/search_controller.rb +149 -0
- data/app/controllers/sessions_controller.rb +21 -0
- data/app/controllers/setup_controller.rb +80 -0
- data/app/controllers/statistics_controller.rb +38 -0
- data/app/controllers/status_group_memberships_controller.rb +28 -0
- data/app/controllers/terms_of_use_controller.rb +35 -0
- data/app/controllers/user_accounts_controller.rb +55 -0
- data/app/controllers/user_group_memberships_controller.rb +75 -0
- data/app/controllers/user_settings_controller.rb +57 -0
- data/app/controllers/users_controller.rb +125 -0
- data/app/controllers/workflows_controller.rb +19 -0
- data/app/helpers/application_helper.rb +25 -0
- data/app/helpers/attachments_helper.rb +2 -0
- data/app/helpers/auto_completion_helper.rb +33 -0
- data/app/helpers/avatar_helper.rb +70 -0
- data/app/helpers/bookmarks_helper.rb +22 -0
- data/app/helpers/box_helper.rb +56 -0
- data/app/helpers/breadcrumbs_helper.rb +62 -0
- data/app/helpers/corporate_vita_helper.rb +34 -0
- data/app/helpers/events_helper.rb +28 -0
- data/app/helpers/flash_helper.rb +60 -0
- data/app/helpers/footer_helper.rb +13 -0
- data/app/helpers/galleria_helper.rb +13 -0
- data/app/helpers/groups_helper.rb +66 -0
- data/app/helpers/horizontal_nav_helper.rb +11 -0
- data/app/helpers/i18n_helper.rb +10 -0
- data/app/helpers/icon_helper.rb +35 -0
- data/app/helpers/mailer_helper.rb +7 -0
- data/app/helpers/map_helper.rb +26 -0
- data/app/helpers/markdown_helper.rb +22 -0
- data/app/helpers/markup_helper.rb +25 -0
- data/app/helpers/officers_helper.rb +13 -0
- data/app/helpers/password_helper.rb +23 -0
- data/app/helpers/profile_field_helper.rb +40 -0
- data/app/helpers/profile_helper.rb +69 -0
- data/app/helpers/quick_link_helper.rb +53 -0
- data/app/helpers/special_pages_helper.rb +9 -0
- data/app/helpers/structureable_helper.rb +11 -0
- data/app/helpers/sublime_helper.rb +16 -0
- data/app/helpers/title_helper.rb +52 -0
- data/app/helpers/tool_buttons_helper.rb +74 -0
- data/app/helpers/unicode_helper.rb +9 -0
- data/app/helpers/users_helper.rb +13 -0
- data/app/helpers/vertical_nav_helper.rb +84 -0
- data/app/helpers/workflows_helper.rb +37 -0
- data/app/mailers/event_mailer.rb +13 -0
- data/app/mailers/post_mailer.rb +11 -0
- data/app/mailers/user_account_mailer.rb +17 -0
- data/app/models/ability.rb +321 -0
- data/app/models/active_record_associations_patches.rb +26 -0
- data/app/models/active_record_cache_extension.rb +152 -0
- data/app/models/active_record_find_by_extension.rb +20 -0
- data/app/models/active_record_json_url_extension.rb +51 -0
- data/app/models/active_record_metric_events_extension.rb +22 -0
- data/app/models/active_record_read_only_extension.rb +35 -0
- data/app/models/active_record_update_attributes_bip_extension.rb +24 -0
- data/app/models/address_label.rb +50 -0
- data/app/models/app_version.rb +49 -0
- data/app/models/array.rb +15 -0
- data/app/models/attachment.rb +76 -0
- data/app/models/bashpass_password.rb +32 -0
- data/app/models/blog_post.rb +2 -0
- data/app/models/bookmark.rb +67 -0
- data/app/models/cache_additions.rb +15 -0
- data/app/models/cache_store_extension.rb +78 -0
- data/app/models/concerns/user_avatar.rb +16 -0
- data/app/models/concerns/user_corporations.rb +44 -0
- data/app/models/concerns/user_date_of_birth.rb +74 -0
- data/app/models/concerns/user_profile.rb +102 -0
- data/app/models/corporation.rb +80 -0
- data/app/models/dag_link.rb +29 -0
- data/app/models/event.rb +235 -0
- data/app/models/flag.rb +18 -0
- data/app/models/flagable.rb +62 -0
- data/app/models/geo_location.rb +92 -0
- data/app/models/group.rb +224 -0
- data/app/models/group_mixins/corporations.rb +141 -0
- data/app/models/group_mixins/developers.rb +41 -0
- data/app/models/group_mixins/everyone.rb +72 -0
- data/app/models/group_mixins/guests.rb +61 -0
- data/app/models/group_mixins/hidden_users.rb +43 -0
- data/app/models/group_mixins/import.rb +321 -0
- data/app/models/group_mixins/memberships.rb +207 -0
- data/app/models/group_mixins/officers.rb +47 -0
- data/app/models/group_mixins/roles.rb +41 -0
- data/app/models/horizontal_nav.rb +32 -0
- data/app/models/last_seen_activity.rb +10 -0
- data/app/models/list_export.rb +359 -0
- data/app/models/may_need_review.rb +54 -0
- data/app/models/metric_logger.rb +83 -0
- data/app/models/nav_node.rb +169 -0
- data/app/models/navable.rb +46 -0
- data/app/models/object_to_b_extension.rb +12 -0
- data/app/models/page.rb +212 -0
- data/app/models/password.rb +28 -0
- data/app/models/post.rb +199 -0
- data/app/models/profile.rb +36 -0
- data/app/models/profile_field.rb +196 -0
- data/app/models/profile_field_mixins/has_child_profile_fields.rb +114 -0
- data/app/models/profile_field_types/about.rb +9 -0
- data/app/models/profile_field_types/academic_degree.rb +10 -0
- data/app/models/profile_field_types/address.rb +88 -0
- data/app/models/profile_field_types/bank_account.rb +12 -0
- data/app/models/profile_field_types/competence.rb +7 -0
- data/app/models/profile_field_types/custom.rb +12 -0
- data/app/models/profile_field_types/date.rb +14 -0
- data/app/models/profile_field_types/description.rb +15 -0
- data/app/models/profile_field_types/email.rb +20 -0
- data/app/models/profile_field_types/employment.rb +24 -0
- data/app/models/profile_field_types/general.rb +9 -0
- data/app/models/profile_field_types/homepage.rb +19 -0
- data/app/models/profile_field_types/name_surrounding.rb +11 -0
- data/app/models/profile_field_types/organization.rb +24 -0
- data/app/models/profile_field_types/phone.rb +37 -0
- data/app/models/profile_field_types/professional_category.rb +8 -0
- data/app/models/profile_field_types/study.rb +18 -0
- data/app/models/profile_section.rb +49 -0
- data/app/models/profileable.rb +58 -0
- data/app/models/profileable_mixins/address.rb +118 -0
- data/app/models/relationship.rb +78 -0
- data/app/models/role.rb +164 -0
- data/app/models/setting.rb +9 -0
- data/app/models/status_group.rb +28 -0
- data/app/models/status_group_membership.rb +189 -0
- data/app/models/status_group_membership_info.rb +54 -0
- data/app/models/structureable.rb +164 -0
- data/app/models/structureable_mixins/has_special_groups.rb +127 -0
- data/app/models/structureable_mixins/roles.rb +275 -0
- data/app/models/user.rb +878 -0
- data/app/models/user_account.rb +162 -0
- data/app/models/user_alias.rb +112 -0
- data/app/models/user_group_membership.rb +300 -0
- data/app/models/user_group_membership_mixins/validity_range.rb +206 -0
- data/app/models/user_group_membership_mixins/validity_range_for_indirect_memberships.rb +160 -0
- data/app/models/user_mixins/identification.rb +36 -0
- data/app/models/user_mixins/memberships.rb +75 -0
- data/app/models/workflow.rb +40 -0
- data/app/models/workflow_kit/add_to_group_brick.rb +21 -0
- data/app/models/workflow_kit/destroy_account_and_end_memberships_if_needed_brick.rb +19 -0
- data/app/models/workflow_kit/last_membership_needs_review_brick.rb +19 -0
- data/app/models/workflow_kit/mark_as_deceased_brick.rb +17 -0
- data/app/models/workflow_kit/remove_from_group_brick.rb +27 -0
- data/app/models/workflow_kit/test_brick.rb +13 -0
- data/app/pdfs/address_labels_pdf.rb +157 -0
- data/app/presenters/base_presenter.rb +52 -0
- data/app/presenters/horizontal_nav_presenter.rb +106 -0
- data/app/uploaders/attachment_uploader.rb +148 -0
- data/app/views/activities/index.html.haml +25 -0
- data/app/views/attachments/_attachment.html.haml +20 -0
- data/app/views/attachments/_description.html.haml +11 -0
- data/app/views/attachments/_documents.html.haml +17 -0
- data/app/views/attachments/_drop_field.html.haml +46 -0
- data/app/views/attachments/_picture.html.haml +2 -0
- data/app/views/attachments/_pictures.html.haml +10 -0
- data/app/views/attachments/_video.html.haml +8 -0
- data/app/views/attachments/create.js.erb +1 -0
- data/app/views/attachments/destroy.js.erb +1 -0
- data/app/views/blog_posts/create.js.erb +17 -0
- data/app/views/bookmarks/_list.html.haml +7 -0
- data/app/views/bookmarks/update.js.erb +4 -0
- data/app/views/devise/mailer/reset_password_instructions.html.haml +8 -0
- data/app/views/devise/passwords/edit.html.haml +1 -0
- data/app/views/devise/passwords/new.html.haml +12 -0
- data/app/views/devise/registrations/edit.html.haml +1 -0
- data/app/views/devise/sessions/new.html.haml +14 -0
- data/app/views/devise/shared/_links.haml +26 -0
- data/app/views/errors/show.html.haml +5 -0
- data/app/views/errors/unauthorized.html.haml +7 -0
- data/app/views/event_mailer/invitation_email.html.erb +63 -0
- data/app/views/events/_event_details.html.haml +54 -0
- data/app/views/events/_events_lis.html.haml +29 -0
- data/app/views/events/_invitation_text.html.erb +8 -0
- data/app/views/events/_pictures.html.haml +5 -0
- data/app/views/events/_public_index.html.haml +16 -0
- data/app/views/events/index.html.haml +24 -0
- data/app/views/events/show.html.haml +50 -0
- data/app/views/groups/_address_labels_modal.html.haml +27 -0
- data/app/views/groups/_export_button.html.haml +66 -0
- data/app/views/groups/_group_list.html.haml +25 -0
- data/app/views/groups/_member_avatars.html.haml +4 -0
- data/app/views/groups/_member_list.html.haml +15 -0
- data/app/views/groups/index.html.erb +11 -0
- data/app/views/groups/index_mine.html.haml +7 -0
- data/app/views/groups/show.html.haml +79 -0
- data/app/views/last_seen_activities/_index.html.haml +19 -0
- data/app/views/layouts/_add_structureable_additions.html.haml +15 -0
- data/app/views/layouts/_box.html.haml +16 -0
- data/app/views/layouts/_help_button.html.haml +1 -0
- data/app/views/layouts/_role_preview_switcher.html.haml +20 -0
- data/app/views/layouts/_session_bar_avatar.html.haml +1 -0
- data/app/views/layouts/_vertical_nav.html.haml +5 -0
- data/app/views/layouts/bootstrap.html.haml +146 -0
- data/app/views/layouts/mercury.html.erb +23 -0
- data/app/views/officers/_history_notice.html.haml +4 -0
- data/app/views/officers/_officers_box.html.haml +33 -0
- data/app/views/officers/_officers_group_entry.html.haml +45 -0
- data/app/views/pages/_attachments.html.haml +21 -0
- data/app/views/pages/_page.html.haml +28 -0
- data/app/views/pages/_pictures.html.haml +2 -0
- data/app/views/pages/_videos.html.erb +8 -0
- data/app/views/pages/show.html.haml +39 -0
- data/app/views/post_mailer/post_email.html.erb +17 -0
- data/app/views/posts/_new_post_template_text.html.haml +6 -0
- data/app/views/posts/_post.html.haml +13 -0
- data/app/views/posts/_post_quote.html.haml +18 -0
- data/app/views/posts/_posts.html.haml +6 -0
- data/app/views/posts/index.html.haml +9 -0
- data/app/views/posts/new.html.haml +42 -0
- data/app/views/posts/show.html.haml +8 -0
- data/app/views/profile_fields/_postal_address_flag_switch.html.haml +21 -0
- data/app/views/profile_fields/_profile_field.html.haml +41 -0
- data/app/views/profile_fields/create.js.erb +26 -0
- data/app/views/profile_fields/destroy.js.erb +3 -0
- data/app/views/profiles/_add_profile_field_button.html.haml +15 -0
- data/app/views/profiles/_profile_section_ul.html.haml +8 -0
- data/app/views/profiles/_section.html.haml +28 -0
- data/app/views/profiles/_send_group_message_button.html.haml +4 -0
- data/app/views/root/_latest_members_box.html.haml +19 -0
- data/app/views/root/_start_page_elements.html.haml +0 -0
- data/app/views/root/_what_is_new.html.haml +21 -0
- data/app/views/search/_preview_blog_post.html.haml +1 -0
- data/app/views/search/_preview_corporation.html.haml +5 -0
- data/app/views/search/_preview_group.html.haml +4 -0
- data/app/views/search/_preview_page.html.haml +11 -0
- data/app/views/search/_preview_user.html.haml +14 -0
- data/app/views/search/index.html.haml +42 -0
- data/app/views/setup/index.html.haml +56 -0
- data/app/views/shared/_add_structureable.html.haml +22 -0
- data/app/views/shared/_authorization_info.html.haml +22 -0
- data/app/views/shared/_flags.html.haml +5 -0
- data/app/views/shared/_markdown_help.html.haml +4 -0
- data/app/views/shared/_search_box.html.haml +2 -0
- data/app/views/shared/_upcoming_events.html.haml +33 -0
- data/app/views/statistics/index.html.haml +16 -0
- data/app/views/statistics/show.html.haml +13 -0
- data/app/views/terms_of_use/_checkbox.html.haml +1 -0
- data/app/views/terms_of_use/_terms.html.haml +1 -0
- data/app/views/terms_of_use/index.html.haml +19 -0
- data/app/views/user_account_mailer/welcome_email.html.erb +32 -0
- data/app/views/user_accounts/_change_password.html.haml +149 -0
- data/app/views/user_accounts/_user_account.html.haml +39 -0
- data/app/views/user_group_memberships/_list_item.html.haml +9 -0
- data/app/views/user_group_memberships/_memberships_table.html.haml +56 -0
- data/app/views/user_group_memberships/_new.html.haml +18 -0
- data/app/views/user_group_memberships/create.js.erb +9 -0
- data/app/views/user_group_memberships/index.html.haml +5 -0
- data/app/views/user_settings/show.html.haml +36 -0
- data/app/views/users/_avatar.html.haml +16 -0
- data/app/views/users/_communication_box.html.haml +8 -0
- data/app/views/users/_corporate_vita.html.haml +23 -0
- data/app/views/users/_dead_badge.html.haml +3 -0
- data/app/views/users/_deceased_modal.html.haml +24 -0
- data/app/views/users/_hidden_badge.html.haml +4 -0
- data/app/views/users/_hidden_flag_switch.html.haml +20 -0
- data/app/views/users/_special_general_info_fields.html.haml +10 -0
- data/app/views/users/_user_corporation_attribute.html.haml +6 -0
- data/app/views/users/_user_name_attribute.html.haml +4 -0
- data/app/views/users/_user_title.html.haml +5 -0
- data/app/views/users/_workflow_triggers.html.haml +23 -0
- data/app/views/users/new.html.haml +55 -0
- data/app/views/users/show.html.haml +79 -0
- data/config/environment.rb +5 -0
- data/config/initializers/active_record_cache_extension.rb +1 -0
- data/config/initializers/active_record_find_by_extension.rb +1 -0
- data/config/initializers/active_record_flagable_extension.rb +2 -0
- data/config/initializers/active_record_json_url_extension.rb +1 -0
- data/config/initializers/active_record_may_need_review_extension.rb +2 -0
- data/config/initializers/active_record_metric_events_extension.rb +1 -0
- data/config/initializers/active_record_navable_extension.rb +6 -0
- data/config/initializers/active_record_profileable_extension.rb +4 -0
- data/config/initializers/active_record_read_only_extension.rb +1 -0
- data/config/initializers/active_record_structureable_extension.rb +3 -0
- data/config/initializers/active_record_update_attributes_bip_extension.rb +1 -0
- data/config/initializers/array_extension.rb +1 -0
- data/config/initializers/best_in_place_display_definitions.rb +31 -0
- data/config/initializers/cache_store_extension.rb +1 -0
- data/config/initializers/devise.rb +240 -0
- data/config/initializers/fnordmetric.rb +14 -0
- data/config/initializers/formtastic.rb +76 -0
- data/config/initializers/group_type_column_patches.rb +11 -0
- data/config/initializers/mime_types.rb +1 -0
- data/config/initializers/mini_profiler.rb +32 -0
- data/config/initializers/object_to_b_extension.rb +1 -0
- data/config/initializers/refile.rb +22 -0
- data/config/initializers/sidekiq.rb +12 -0
- data/config/locales/attachments/de.yml +33 -0
- data/config/locales/bookmarks/de.yml +3 -0
- data/config/locales/bookmarks/en.yml +3 -0
- data/config/locales/common_expressions/de.yml +5 -0
- data/config/locales/common_expressions/en.yml +5 -0
- data/config/locales/companies/de.yml +4 -0
- data/config/locales/companies/en.yml +4 -0
- data/config/locales/de.yml +30 -0
- data/config/locales/devise/de.yml +60 -0
- data/config/locales/devise/en.yml +62 -0
- data/config/locales/en.yml +25 -0
- data/config/locales/events/de.yml +34 -0
- data/config/locales/events/en.yml +34 -0
- data/config/locales/forms/de.yml +3 -0
- data/config/locales/groups/de.yml +56 -0
- data/config/locales/groups/en.yml +47 -0
- data/config/locales/officers/de.yml +10 -0
- data/config/locales/pages/de.yml +15 -0
- data/config/locales/pages/en.yml +14 -0
- data/config/locales/pagination/de.yml +6 -0
- data/config/locales/pagination/en.yml +5 -0
- data/config/locales/password_strength/de.yml +9 -0
- data/config/locales/password_strength/en.yml +9 -0
- data/config/locales/posts/de.yml +9 -0
- data/config/locales/profile_fields/de.yml +78 -0
- data/config/locales/profile_fields/en.yml +22 -0
- data/config/locales/profiles/de.yml +47 -0
- data/config/locales/profiles/en.yml +44 -0
- data/config/locales/roles/de.yml +9 -0
- data/config/locales/root/de.yml +3 -0
- data/config/locales/root/en.yml +3 -0
- data/config/locales/search/de.yml +11 -0
- data/config/locales/search/en.yml +11 -0
- data/config/locales/sessions/de.yml +37 -0
- data/config/locales/sessions/en.yml +37 -0
- data/config/locales/setup/de.yml +26 -0
- data/config/locales/setup/en.yml +26 -0
- data/config/locales/statistics/de.yml +6 -0
- data/config/locales/terms_of_use/de.yml +6 -0
- data/config/locales/tools/de.yml +9 -0
- data/config/locales/tools/en.yml +9 -0
- data/config/locales/user_accounts/de.yml +16 -0
- data/config/locales/user_accounts/en.yml +13 -0
- data/config/locales/user_settings/de.yml +9 -0
- data/config/locales/users/de.yml +82 -0
- data/config/locales/users/en.yml +51 -0
- data/config/locales/workflows/de.yml +4 -0
- data/config/locales/workflows/en.yml +4 -0
- data/config/routes.rb +104 -0
- data/db/migrate/20120403002734_create_users.rb +12 -0
- data/db/migrate/20120403011601_create_profile_fields.rb +11 -0
- data/db/migrate/20120403161549_remove_user_email_column.rb +5 -0
- data/db/migrate/20120405222050_encrypt_password.rb +8 -0
- data/db/migrate/20120425161138_create_dag_links.rb +14 -0
- data/db/migrate/20120425162644_create_pages.rb +10 -0
- data/db/migrate/20120426023322_create_groups.rb +9 -0
- data/db/migrate/20120426090436_create_nav_nodes.rb +18 -0
- data/db/migrate/20120427021934_create_user_accounts.rb +12 -0
- data/db/migrate/20120427044338_add_foreign_key_to_user_accounts.rb +7 -0
- data/db/migrate/20120427150156_add_group_token.rb +8 -0
- data/db/migrate/20120507165551_make_profile_fields_polymorphic.rb +11 -0
- data/db/migrate/20120508130729_add_profile_field_acts_as_tree.rb +9 -0
- data/db/migrate/20120508152233_change_profile_field_value_to_text.rb +9 -0
- data/db/migrate/20120508201550_add_group_internal_token.rb +11 -0
- data/db/migrate/20120511090234_create_workflows.rb +9 -0
- data/db/migrate/20120701115059_add_password_digest_to_user_accounts.rb +5 -0
- data/db/migrate/20120710193308_remove_salt_from_user_accounts.rb +5 -0
- data/db/migrate/20120713102445_add_deleted_at_to_dag_links.rb +5 -0
- data/db/migrate/20120722005022_create_workflow_kit_workflows.workflow_kit.rb +11 -0
- data/db/migrate/20120722005023_create_workflow_kit_steps.workflow_kit.rb +12 -0
- data/db/migrate/20120722005024_create_workflow_kit_parameters.workflow_kit.rb +12 -0
- data/db/migrate/20120723165226_add_female_to_users.rb +5 -0
- data/db/migrate/20120811140509_create_flags.rb +11 -0
- data/db/migrate/20120814100529_create_attachments.rb +13 -0
- data/db/migrate/20120815205610_add_content_type_and_file_size_to_attachments.rb +6 -0
- data/db/migrate/20130118220014_add_relationships_table_without_dag.rb +10 -0
- data/db/migrate/20130207214331_create_events.rb +12 -0
- data/db/migrate/20130208215253_create_status_group_membership_infos.rb +11 -0
- data/db/migrate/20130220184943_create_stars.rb +11 -0
- data/db/migrate/20130309193623_add_devise_to_user_accounts.rb +72 -0
- data/db/migrate/20130310003840_rename_stars_to_bookmarks.rb +9 -0
- data/db/migrate/20130310004622_fix_column_names_for_bookmarks.rb +6 -0
- data/db/migrate/20130313211414_create_geo_infos.rb +13 -0
- data/db/migrate/20130313234131_create_geo_locations.rb +16 -0
- data/db/migrate/20130314011638_drop_geo_infos.rb +5 -0
- data/db/migrate/20130315072759_add_invalid_to_geo_location.rb +5 -0
- data/db/migrate/20130315073149_exchange_invalid_for_queried_at_in_geo_location.rb +8 -0
- data/db/migrate/20130320003051_add_redirect_to_to_page.rb +5 -0
- data/db/migrate/20130329231657_create_posts.rb +15 -0
- data/db/migrate/20130404223735_add_entire_message_to_posts.rb +5 -0
- data/db/migrate/20130409192959_add_author_to_page.rb +5 -0
- data/db/migrate/20130908011215_add_type_to_pages.rb +5 -0
- data/db/migrate/20131115114715_validity_range_for_dag_links.rb +16 -0
- data/db/migrate/20140611170430_create_activities.rb +23 -0
- data/db/migrate/20140808223512_create_last_seen_activities.rb +12 -0
- data/db/migrate/20141008101744_add_location_to_events.rb +5 -0
- data/db/migrate/20141010130344_add_publish_on_website_to_events.rb +6 -0
- data/db/migrate/20141010134227_add_auth_token_to_user_accounts.rb +5 -0
- data/db/migrate/20141018143323_add_accepted_terms_to_users.rb +6 -0
- data/db/migrate/20141018221659_add_author_to_attachments.rb +5 -0
- data/db/migrate/20141102223954_add_body_to_groups.rb +5 -0
- data/db/migrate/20141110193830_create_settings.rb +17 -0
- data/db/migrate/20141202140522_add_indices.rb +6 -0
- data/db/migrate/20141209161946_add_keys.rb +20 -0
- data/db/migrate/20150127013809_add_incognito_to_users.rb +5 -0
- data/db/migrate/20150129194501_add_indices_for_polymorphic_references.rb +13 -0
- data/db/migrate/20150304192448_add_type_to_groups.rb +5 -0
- data/db/migrate/20150313221004_add_avatar_id_to_users.rb +5 -0
- data/lib/best_in_place/controller_extensions.rb +25 -0
- data/lib/best_in_place/helper.rb +127 -0
- data/lib/tasks/db_bootstrap.rake +37 -0
- data/lib/tasks/your_platform_tasks.rake +4 -0
- data/lib/templates/erb/scaffold/_form.html.erb +11 -0
- data/lib/your_platform.rb +6 -2
- data/lib/your_platform/engine.rb +127 -0
- data/lib/your_platform/version.rb +1 -1
- data/spec/factories/attachment.rb +12 -0
- data/spec/factories/blog_post.rb +10 -0
- data/spec/factories/company.rb +7 -0
- data/spec/factories/corporation.rb +20 -0
- data/spec/factories/event.rb +13 -0
- data/spec/factories/group.rb +36 -0
- data/spec/factories/html_email.eml +1059 -0
- data/spec/factories/mail_message.rb +30 -0
- data/spec/factories/page.rb +10 -0
- data/spec/factories/relationship.rb +13 -0
- data/spec/factories/status_group_membership.rb +21 -0
- data/spec/factories/user.rb +97 -0
- data/spec/factories/workflow.rb +44 -0
- data/spec/features/blog_post_spec.rb +46 -0
- data/spec/features/corporate_vita_events_spec.rb +114 -0
- data/spec/features/corporate_vita_spec.rb +258 -0
- data/spec/features/edit_mode_after_clicking_a_link_spec.rb +20 -0
- data/spec/features/events_spec.rb +356 -0
- data/spec/features/group_export_spec.rb +19 -0
- data/spec/features/group_post_spec.rb +89 -0
- data/spec/features/groups_of_groups_page_spec.rb +67 -0
- data/spec/features/groups_page_spec.rb +66 -0
- data/spec/features/groups_table_spec.rb +32 -0
- data/spec/features/help_page_spec.rb +22 -0
- data/spec/features/intranet_root_page_spec.rb +18 -0
- data/spec/features/locales_spec.rb +36 -0
- data/spec/features/maps_spec.rb +53 -0
- data/spec/features/mini_profiler_spec.rb +37 -0
- data/spec/features/officers_spec.rb +61 -0
- data/spec/features/page_redirects_spec.rb +23 -0
- data/spec/features/page_spec.rb +20 -0
- data/spec/features/postal_address_flag_spec.rb +46 -0
- data/spec/features/relationships_on_user_page_spec.rb +78 -0
- data/spec/features/review_membership_spec.rb +44 -0
- data/spec/features/search_field_spec.rb +121 -0
- data/spec/features/setup_spec.rb +63 -0
- data/spec/features/user_change_date_of_birth_spec.rb +26 -0
- data/spec/features/vertical_nav_spec.rb +27 -0
- data/spec/features/what_is_new_box_spec.rb +33 -0
- data/spec/helpers/attachments_helper_spec.rb +15 -0
- data/spec/models/ability_spec.rb +93 -0
- data/spec/models/active_record_cache_extension_spec.rb +177 -0
- data/spec/models/active_record_find_by_extension_spec.rb +26 -0
- data/spec/models/active_record_json_url_extension_spec.rb +79 -0
- data/spec/models/address_label_spec.rb +144 -0
- data/spec/models/app_version_spec.rb +38 -0
- data/spec/models/attachment_spec.rb +5 -0
- data/spec/models/bookmark_spec.rb +70 -0
- data/spec/models/concerns/user_corporations_spec.rb +71 -0
- data/spec/models/corporation_spec.rb +128 -0
- data/spec/models/dag_link_spec.rb +48 -0
- data/spec/models/event_spec.rb +267 -0
- data/spec/models/flag_spec.rb +20 -0
- data/spec/models/flagable_spec.rb +55 -0
- data/spec/models/geo_location_spec.rb +126 -0
- data/spec/models/group_mixins/corporations_spec.rb +95 -0
- data/spec/models/group_mixins/everyone_spec.rb +64 -0
- data/spec/models/group_mixins/guests_spec.rb +75 -0
- data/spec/models/group_mixins/hidden_users_spec.rb +21 -0
- data/spec/models/group_mixins/import_spec.rb +93 -0
- data/spec/models/group_mixins/memberships_spec.rb +303 -0
- data/spec/models/group_mixins/officers_spec.rb +63 -0
- data/spec/models/group_mixins/roles_spec.rb +46 -0
- data/spec/models/group_spec.rb +341 -0
- data/spec/models/list_export_spec.rb +155 -0
- data/spec/models/may_need_review_spec.rb +114 -0
- data/spec/models/nav_node_spec.rb +277 -0
- data/spec/models/navable_spec.rb +54 -0
- data/spec/models/page_spec.rb +185 -0
- data/spec/models/post_spec.rb +271 -0
- data/spec/models/profile_field_mixins/has_child_profile_fields_spec.rb +73 -0
- data/spec/models/profile_field_spec.rb +482 -0
- data/spec/models/profile_section_spec.rb +89 -0
- data/spec/models/profile_spec.rb +74 -0
- data/spec/models/profileable_mixins/adress_spec.rb +93 -0
- data/spec/models/profileable_spec.rb +152 -0
- data/spec/models/relationship_spec.rb +113 -0
- data/spec/models/status_group_membership_spec.rb +350 -0
- data/spec/models/status_group_spec.rb +103 -0
- data/spec/models/structureable_mixins/has_special_groups_spec.rb +479 -0
- data/spec/models/structureable_mixins/roles_spec.rb +517 -0
- data/spec/models/structureable_spec.rb +128 -0
- data/spec/models/user_account_spec.rb +142 -0
- data/spec/models/user_alias_spec.rb +57 -0
- data/spec/models/user_group_membership_mixins/validity_range_for_indirect_memberships_spec.rb +291 -0
- data/spec/models/user_group_membership_mixins/validity_range_spec.rb +293 -0
- data/spec/models/user_group_membership_spec.rb +428 -0
- data/spec/models/user_mixins/identification_spec.rb +27 -0
- data/spec/models/user_mixins/memberships_spec.rb +138 -0
- data/spec/models/user_spec.rb +1794 -0
- data/spec/old_yp_spec_helper.rb +46 -0
- data/spec/spec_helper.rb +350 -0
- data/spec/support/auto_complete.rb +22 -0
- data/spec/support/capybara/flash_helpers.rb +37 -0
- data/spec/support/capybara/profile_steps.rb +73 -0
- data/spec/support/capybara/session_steps.rb +53 -0
- data/spec/support/capybara/user_account_helpers.rb +15 -0
- data/spec/support/debug.rb +8 -0
- data/spec/support/devise-controller_macros.rb +15 -0
- data/spec/support/geocoder/stubs.rb +60 -0
- data/spec/support/press_enter.rb +15 -0
- data/spec/support/time_travel.rb +9 -0
- data/spec/support/uploads/image-upload.png +0 -0
- data/spec/support/uploads/pdf-upload.pdf +0 -0
- data/spec/support/wait_for_ajax.rb +39 -0
- data/spec/support/wait_for_cache.rb +7 -0
- data/spec/uploaders/attachment_uploader_spec.rb +47 -0
- data/vendor/assets/images/flags.png +0 -0
- data/vendor/assets/images/galleria/classic-loader.gif +0 -0
- data/vendor/assets/images/galleria/classic-map.png +0 -0
- data/vendor/assets/javascripts/best_in_place_datetime.js.coffee +45 -0
- data/vendor/assets/javascripts/galleria-classic.js +100 -0
- data/vendor/assets/javascripts/galleria.js +6919 -0
- data/vendor/assets/javascripts/gmaps4rails.js +2 -0
- data/vendor/assets/javascripts/gmaps4rails/all.js +1 -0
- data/vendor/assets/javascripts/gmaps4rails/base.coffee +1 -0
- data/vendor/assets/javascripts/gmaps4rails/base/common.coffee +43 -0
- data/vendor/assets/javascripts/gmaps4rails/base/configuration.coffee +7 -0
- data/vendor/assets/javascripts/gmaps4rails/base/gmaps.coffee +13 -0
- data/vendor/assets/javascripts/gmaps4rails/base/interfaces/basic_interface.coffee +15 -0
- data/vendor/assets/javascripts/gmaps4rails/base/interfaces/controller_interface.coffee +15 -0
- data/vendor/assets/javascripts/gmaps4rails/base/interfaces/map_interface.coffee +27 -0
- data/vendor/assets/javascripts/gmaps4rails/base/interfaces/marker_interface.coffee +15 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main.coffee +124 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/circle_controller.coffee +29 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/kml_controller.coffee +5 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/marker_controller.coffee +76 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/polygon_controller.coffee +29 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/polyline_controller.coffee +29 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/circle.coffee +12 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/kml.coffee +8 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/map.coffee +62 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/marker.coffee +24 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/polygon.coffee +11 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/polyline.coffee +11 -0
- data/vendor/assets/javascripts/gmaps4rails/bing.coffee +1 -0
- data/vendor/assets/javascripts/gmaps4rails/bing/main.coffee +29 -0
- data/vendor/assets/javascripts/gmaps4rails/bing/objects/map.coffee +63 -0
- data/vendor/assets/javascripts/gmaps4rails/bing/objects/marker.coffee +78 -0
- data/vendor/assets/javascripts/gmaps4rails/bing/shared.coffee +20 -0
- data/vendor/assets/javascripts/gmaps4rails/google.coffee +1 -0
- data/vendor/assets/javascripts/gmaps4rails/google/main.coffee +47 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/circle.coffee +38 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/kml.coffee +16 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/map.coffee +71 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/marker.coffee +114 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/polygon.coffee +38 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/polyline.coffee +49 -0
- data/vendor/assets/javascripts/gmaps4rails/google/shared.coffee +27 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers.coffee +1 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers/main.coffee +138 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers/objects/map.coffee +49 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers/objects/marker.coffee +68 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers/objects/polyline.coffee +39 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers/shared.coffee +19 -0
- data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +2223 -0
- data/vendor/assets/javascripts/jquery-ui-timepicker-de.js +26 -0
- data/vendor/assets/javascripts/jquery.ui.datepicker-de.js +23 -0
- data/vendor/assets/javascripts/password_strength.js +149 -0
- data/vendor/assets/javascripts/zxcvbn.js +43 -0
- data/vendor/assets/stylesheets/flags.css.scss +259 -0
- data/vendor/assets/stylesheets/galleria-classic.css.scss +239 -0
- data/vendor/assets/stylesheets/gmaps4rails.css +24 -0
- data/vendor/assets/stylesheets/mercury.css +24 -0
- data/vendor/scripts/bashpass/README.md +29 -0
- data/vendor/scripts/bashpass/bashpass +124 -0
- data/vendor/scripts/bashpass/bashpass-APACHE-LICENSE +201 -0
- data/vendor/scripts/bashpass/german.dic +40794 -0
- metadata +1540 -16
- data/.gitignore +0 -17
- data/Gemfile +0 -4
- data/LICENSE.txt +0 -4
- data/your_platform.gemspec +0 -19
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe UserMixins::Identification do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
@user1 = create( :user, first_name: "John", last_name: "Doe", email: "john.doe@example.com", :alias => "john.doe" )
|
|
7
|
+
@user2 = create( :user, first_name: "James", last_name: "Doe", email: "james.doe@example.com", :alias => "james.doe" )
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe ".attributes_used_for_identification" do
|
|
11
|
+
subject { User.attributes_used_for_identification }
|
|
12
|
+
it { should be_kind_of( Array ) }
|
|
13
|
+
its( :first ) { should be_kind_of Symbol }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe ".find_all_by_identification_string" do
|
|
17
|
+
it "should return the matching users" do
|
|
18
|
+
User.find_all_by_identification_string( "doe" ).should include( @user1, @user2 )
|
|
19
|
+
User.find_all_by_identification_string( "john doe" ).should include( @user1 )
|
|
20
|
+
User.find_all_by_identification_string( "james doe" ).should include( @user2 )
|
|
21
|
+
User.find_all_by_identification_string( "john.doe" ).should include( @user1 )
|
|
22
|
+
User.find_all_by_identification_string( "John Doe" ).should include( @user1 )
|
|
23
|
+
User.find_all_by_identification_string( "john.doe@example.com" ).should include( @user1 )
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe UserMixins::Memberships do
|
|
4
|
+
|
|
5
|
+
# @indirect_group
|
|
6
|
+
# |------------ @group
|
|
7
|
+
# | |------ @user1
|
|
8
|
+
# | |------ @user2
|
|
9
|
+
# |
|
|
10
|
+
# |------------ @group2
|
|
11
|
+
#
|
|
12
|
+
before do
|
|
13
|
+
@group = create(:group)
|
|
14
|
+
@user1 = create(:user); @group.assign_user(@user1)
|
|
15
|
+
@user2 = create(:user); @group.assign_user(@user2)
|
|
16
|
+
@user = @user1
|
|
17
|
+
@membership1 = UserGroupMembership.find_by(user: @user1, group: @group)
|
|
18
|
+
@membership2 = UserGroupMembership.find_by(user: @user2, group: @group)
|
|
19
|
+
@indirect_group = @group.parent_groups.create
|
|
20
|
+
@indirect_membership1 = UserGroupMembership.find_by(user: @user1, group: @indirect_group)
|
|
21
|
+
@indirect_membership2 = UserGroupMembership.find_by(user: @user2, group: @indirect_group)
|
|
22
|
+
@group2 = @indirect_group.child_groups.create
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# User Group Memberships
|
|
27
|
+
# ==========================================================================================
|
|
28
|
+
|
|
29
|
+
describe "#memberships" do
|
|
30
|
+
subject { @user1.memberships }
|
|
31
|
+
it { should include @membership1 }
|
|
32
|
+
it { should include @indirect_membership1 }
|
|
33
|
+
it "should not include invalidated memberships" do
|
|
34
|
+
@membership1.invalidate at: 10.minutes.ago
|
|
35
|
+
subject { should_not include @membership1 }
|
|
36
|
+
end
|
|
37
|
+
it "should not include invalidated indirect memberships" do
|
|
38
|
+
@membership1.invalidate at: 10.minutes.ago
|
|
39
|
+
subject { should_not include @indirect_membership1 }
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe "#direct_memberships" do
|
|
44
|
+
subject { @user1.direct_memberships }
|
|
45
|
+
it { should include @membership1 }
|
|
46
|
+
it { should_not include @indirect_membership1 }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe "#indirect_memberships" do
|
|
50
|
+
subject { @user1.indirect_memberships }
|
|
51
|
+
it { should include @indirect_membership1 }
|
|
52
|
+
it { should_not include @membership1 }
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
describe "#membership_in( group )" do
|
|
57
|
+
describe "for the user being a direct member" do
|
|
58
|
+
subject { @user.membership_in @group }
|
|
59
|
+
it { should == @membership1 }
|
|
60
|
+
end
|
|
61
|
+
describe "for the user being an indirect member" do
|
|
62
|
+
subject { @user.membership_in @indirect_group }
|
|
63
|
+
it { should == @indirect_membership1 }
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe "#member_of?( group )" do
|
|
68
|
+
describe "for the user being direct member" do
|
|
69
|
+
subject { @user.member_of? @group}
|
|
70
|
+
it { should == true }
|
|
71
|
+
end
|
|
72
|
+
describe "for the user being indirect member" do
|
|
73
|
+
subject { @user.member_of? @indirect_group }
|
|
74
|
+
it { should == true }
|
|
75
|
+
end
|
|
76
|
+
describe "for the user not being a member" do
|
|
77
|
+
subject { @user.member_of? @group2 }
|
|
78
|
+
it { should == false }
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# Groups the user is member of
|
|
84
|
+
# ==========================================================================================
|
|
85
|
+
|
|
86
|
+
describe "#groups" do
|
|
87
|
+
subject { @user1.groups }
|
|
88
|
+
it { should include @group }
|
|
89
|
+
it { should include @indirect_group }
|
|
90
|
+
it "should not include groups of invalidated memberships" do
|
|
91
|
+
@membership1.invalidate at: 10.minutes.ago
|
|
92
|
+
subject.should_not include @group
|
|
93
|
+
subject.should_not include @indirect_group
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
describe "#groups << group" do
|
|
97
|
+
subject { @user.groups << @group2 }
|
|
98
|
+
it "should assign the user to the given group" do
|
|
99
|
+
@user.should_not be_in @group2.members
|
|
100
|
+
subject
|
|
101
|
+
@user.should be_in @group2.members
|
|
102
|
+
@user.should be_in @group2.direct_members
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
describe "#groups.destroy(group)" do
|
|
106
|
+
describe "for the membership being direct" do
|
|
107
|
+
subject { @user.groups.destroy(@group) }
|
|
108
|
+
it "should remove the user from the members list" do
|
|
109
|
+
@user1.should be_in @group.members
|
|
110
|
+
subject
|
|
111
|
+
@user1.should_not be_in @group.members
|
|
112
|
+
end
|
|
113
|
+
it "should remove the membership permanently" do
|
|
114
|
+
subject
|
|
115
|
+
UserGroupMembership.with_invalid.find_by_user_and_group(@user1, @group).should == nil
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
describe "for the membership being indirect" do
|
|
119
|
+
subject { @user.groups.destroy(@indirect_group) }
|
|
120
|
+
it "should raise an error" do
|
|
121
|
+
expect { subject }.to raise_error
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
describe "#direct_groups" do
|
|
127
|
+
subject { @user.direct_groups }
|
|
128
|
+
it { should include @group }
|
|
129
|
+
it { should_not include @indirect_group }
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
describe "#indirect_groups" do
|
|
133
|
+
subject { @user.indirect_groups }
|
|
134
|
+
it { should include @indirect_group }
|
|
135
|
+
it { should_not include @group }
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
@@ -0,0 +1,1794 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
|
|
4
|
+
describe User do
|
|
5
|
+
|
|
6
|
+
before do
|
|
7
|
+
@user = create( :user )
|
|
8
|
+
@user.save
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
subject { @user }
|
|
12
|
+
|
|
13
|
+
# Validation
|
|
14
|
+
# ==========================================================================================
|
|
15
|
+
|
|
16
|
+
it { should be_valid }
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Basic Properties
|
|
20
|
+
# ==========================================================================================
|
|
21
|
+
|
|
22
|
+
describe "accessible attributes" do
|
|
23
|
+
subject { @user }
|
|
24
|
+
[ :first_name, :last_name, :alias, :email, :create_account, :female, :add_to_group ].each do |attr|
|
|
25
|
+
it { should respond_to( attr ) }
|
|
26
|
+
it { should respond_to( "#{attr}=".to_sym ) }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "#name" do
|
|
31
|
+
subject { @user.name }
|
|
32
|
+
it { should == "#{@user.first_name} #{@user.last_name}" }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe "#capitalize_name" do
|
|
36
|
+
[ { first_name: "john", last_name: "doe",
|
|
37
|
+
capitalized_first_name: "John", capitalized_last_name: "Doe" },
|
|
38
|
+
{ first_name: "Bruno", last_name: "de Silva",
|
|
39
|
+
capitalized_first_name: "Bruno", capitalized_last_name: "de Silva" },
|
|
40
|
+
{ first_name: "Klaus-Dieter", last_name: "Kunz",
|
|
41
|
+
capitalized_first_name: "Klaus-Dieter", capitalized_last_name: "Kunz" } ].each do |name_to_test|
|
|
42
|
+
describe "for '#{name_to_test[ :capitalized_last_name ]}'" do
|
|
43
|
+
before do
|
|
44
|
+
@user.first_name = name_to_test[ :first_name ]
|
|
45
|
+
@user.last_name = name_to_test[ :last_name ]
|
|
46
|
+
@user.capitalize_name
|
|
47
|
+
@user.save
|
|
48
|
+
end
|
|
49
|
+
it "should capitalize the first_name and last_name" do
|
|
50
|
+
@user.first_name.should == name_to_test[ :capitalized_first_name ]
|
|
51
|
+
@user.last_name.should == name_to_test[ :capitalized_last_name ]
|
|
52
|
+
@user.name.should == name_to_test[ :capitalized_first_name ] + " " +
|
|
53
|
+
name_to_test[ :capitalized_last_name ]
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
describe "#title" do
|
|
60
|
+
subject { @user.title }
|
|
61
|
+
# the title is likely to be overridden in the main application. Therefore, here are
|
|
62
|
+
# just a few vague tests.
|
|
63
|
+
it { should include( @user.last_name ) }
|
|
64
|
+
it { should_not be_empty }
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe "#gender" do
|
|
68
|
+
it "should return :female if the user is female" do
|
|
69
|
+
@user.female = true
|
|
70
|
+
@user.gender.should == :female
|
|
71
|
+
end
|
|
72
|
+
it "should return :male if the user is not female" do
|
|
73
|
+
@user.female = false
|
|
74
|
+
@user.gender.should == :male
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "#gender=" do
|
|
79
|
+
it "should set :female to true if the gender is female" do
|
|
80
|
+
@user.gender = :female
|
|
81
|
+
@user.female?.should == true
|
|
82
|
+
end
|
|
83
|
+
it "should set :female to false if the gender is male" do
|
|
84
|
+
@user.gender = :male
|
|
85
|
+
@user.female?.should == false
|
|
86
|
+
end
|
|
87
|
+
it "should set :female to false if the gender is something else" do
|
|
88
|
+
@user.gender = :something_else
|
|
89
|
+
@user.female?.should == false
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
describe "#date_of_birth" do
|
|
95
|
+
subject { @user.date_of_birth }
|
|
96
|
+
describe "before setting a date of birth" do
|
|
97
|
+
it { should == nil }
|
|
98
|
+
end
|
|
99
|
+
describe "after setting a date of birth" do
|
|
100
|
+
before { @user.date_of_birth = 24.years.ago.to_date }
|
|
101
|
+
it { should be_kind_of Date }
|
|
102
|
+
it "should persist" do
|
|
103
|
+
@user.save
|
|
104
|
+
@reloaded_user = User.find(@user.id)
|
|
105
|
+
@reloaded_user.date_of_birth.should == @user.date_of_birth
|
|
106
|
+
end
|
|
107
|
+
it "should be stored inside a ProfileField" do
|
|
108
|
+
@user.save
|
|
109
|
+
@profile_field = @user.profile_fields.where( label: 'date_of_birth' ).first
|
|
110
|
+
@profile_field.value.to_date.should == @user.date_of_birth
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
it "should be autosaved" do
|
|
114
|
+
@user = create(:user)
|
|
115
|
+
@user.date_of_birth = "2001-01-01"
|
|
116
|
+
@user.save
|
|
117
|
+
User.find(@user.id).date_of_birth.should == "2001-01-01".to_date
|
|
118
|
+
end
|
|
119
|
+
describe "after a former date of birth has been saved" do
|
|
120
|
+
before do
|
|
121
|
+
@user.date_of_birth = 27.years.ago.to_date
|
|
122
|
+
@user.save
|
|
123
|
+
end
|
|
124
|
+
specify "prelim: the date of birth should be saved before" do
|
|
125
|
+
@user.reload
|
|
126
|
+
@user.date_of_birth.should == 27.years.ago.to_date
|
|
127
|
+
end
|
|
128
|
+
specify "a changed date of birth should be autosaved (bug fix)" do
|
|
129
|
+
@user.reload
|
|
130
|
+
@user.date_of_birth = "2001-01-01".to_date
|
|
131
|
+
@user.save
|
|
132
|
+
User.find(@user.id).date_of_birth.should == "2001-01-01".to_date
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
describe "#date_of_birth=" do
|
|
138
|
+
before { @date_of_birth = 24.years.ago.to_date }
|
|
139
|
+
subject { @user.date_of_birth = @date_of_birth; @user.save }
|
|
140
|
+
it "should set the date of birth" do
|
|
141
|
+
@user.date_of_birth.should == nil
|
|
142
|
+
subject
|
|
143
|
+
@user.date_of_birth.should == @date_of_birth
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
describe "#localized_date_of_birth" do
|
|
148
|
+
subject { @user.localized_date_of_birth }
|
|
149
|
+
describe "for a given date of birth" do
|
|
150
|
+
before do
|
|
151
|
+
@date_of_birth = "1987-01-11".to_date
|
|
152
|
+
@user.date_of_birth = @date_of_birth
|
|
153
|
+
end
|
|
154
|
+
it { should == I18n.localize(@date_of_birth) }
|
|
155
|
+
it "should return the correctly localized date" do
|
|
156
|
+
I18n.locale.should == :de
|
|
157
|
+
subject.should be_in ["11.01.1987", "11.1.1987"]
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
describe "for the user not having a date of birth in the database" do
|
|
161
|
+
it "should return nil" do
|
|
162
|
+
@user.date_of_birth.should == nil
|
|
163
|
+
subject.should == nil
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
describe "#localized_date_of_birth=" do
|
|
168
|
+
subject { @user.localized_date_of_birth = @given_string; @user.save }
|
|
169
|
+
describe "for setting a valid date of birth" do
|
|
170
|
+
before { @given_string = "11.01.1987" }
|
|
171
|
+
it "should set the date correctly" do
|
|
172
|
+
@user.date_of_birth.should_not == "1987-01-11".to_date
|
|
173
|
+
subject
|
|
174
|
+
@user.date_of_birth.should == "1987-01-11".to_date
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
describe "for setting an empty string" do
|
|
178
|
+
before do
|
|
179
|
+
@user.date_of_birth = 24.years.ago.to_date
|
|
180
|
+
@given_string = ""
|
|
181
|
+
end
|
|
182
|
+
it "should set the date of birth to nil" do
|
|
183
|
+
subject
|
|
184
|
+
@user.date_of_birth.should == nil
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
describe "for setting an invalid date string" do
|
|
188
|
+
before do
|
|
189
|
+
@user.date_of_birth = 24.years.ago.to_date
|
|
190
|
+
@given_string = "foo"
|
|
191
|
+
end
|
|
192
|
+
it "should set the date of birth to nil" do
|
|
193
|
+
subject
|
|
194
|
+
@user.date_of_birth.should == nil
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
describe "#date_of_birth_profile_field" do
|
|
200
|
+
subject { @user.date_of_birth_profile_field }
|
|
201
|
+
describe "for no date of birth field created" do
|
|
202
|
+
it { should == nil }
|
|
203
|
+
end
|
|
204
|
+
describe "for an existing date of birth" do
|
|
205
|
+
before { @user.date_of_birth = "1900-01-01".to_date }
|
|
206
|
+
it { should be_kind_of ProfileField }
|
|
207
|
+
its(:type) { should == "ProfileFieldTypes::Date" }
|
|
208
|
+
end
|
|
209
|
+
it "should be autosaved" do
|
|
210
|
+
@field = @user.build_date_of_birth_profile_field
|
|
211
|
+
@field.value = "2001-01-01"
|
|
212
|
+
@user.save
|
|
213
|
+
@user = User.find(@user.id)
|
|
214
|
+
subject.value.to_date.should == "2001-01-01".to_date
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
describe "#find_or_build_date_of_birth_profile_field" do
|
|
218
|
+
subject { @user.find_or_build_date_of_birth_profile_field }
|
|
219
|
+
describe "for no date of birth field created" do
|
|
220
|
+
it { should be_kind_of ProfileField }
|
|
221
|
+
its(:type) { should == "ProfileFieldTypes::Date" }
|
|
222
|
+
its(:new_record?) { should == true }
|
|
223
|
+
end
|
|
224
|
+
describe "for an existing date of birth" do
|
|
225
|
+
before { @user.date_of_birth = "1900-01-01".to_date }
|
|
226
|
+
it { should be_kind_of ProfileField }
|
|
227
|
+
its(:type) { should == "ProfileFieldTypes::Date" }
|
|
228
|
+
end
|
|
229
|
+
describe "for a date of birth existing in the database" do
|
|
230
|
+
before do
|
|
231
|
+
@user.date_of_birth = "1900-01-01".to_date
|
|
232
|
+
@user.save
|
|
233
|
+
@user = User.find(@user.id)
|
|
234
|
+
end
|
|
235
|
+
it { should be_kind_of ProfileField }
|
|
236
|
+
its(:type) { should == "ProfileFieldTypes::Date" }
|
|
237
|
+
its('value.to_date') { should == "1900-01-01".to_date }
|
|
238
|
+
its(:new_record?) { should == false }
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
describe "#find_or_create_date_of_birth_profile_field" do
|
|
242
|
+
subject { @user.find_or_create_date_of_birth_profile_field }
|
|
243
|
+
describe "for no date of birth field existing" do
|
|
244
|
+
it { should be_kind_of ProfileField }
|
|
245
|
+
its(:type) { should == "ProfileFieldTypes::Date" }
|
|
246
|
+
its(:new_record?) { should == false }
|
|
247
|
+
its(:id) { should be_kind_of Integer }
|
|
248
|
+
end
|
|
249
|
+
describe "for a date of birth existing in the database" do
|
|
250
|
+
before do
|
|
251
|
+
@user.date_of_birth = "1900-01-01".to_date
|
|
252
|
+
@user.save
|
|
253
|
+
@user = User.find(@user.id)
|
|
254
|
+
end
|
|
255
|
+
it { should be_kind_of ProfileField }
|
|
256
|
+
its(:type) { should == "ProfileFieldTypes::Date" }
|
|
257
|
+
its('value.to_date') { should == "1900-01-01".to_date }
|
|
258
|
+
its(:new_record?) { should == false }
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
describe "#age" do
|
|
263
|
+
subject { @user.age }
|
|
264
|
+
describe "without date of birth" do
|
|
265
|
+
it { should == nil }
|
|
266
|
+
end
|
|
267
|
+
describe "with date of birth" do
|
|
268
|
+
before { @user.date_of_birth = 24.years.ago }
|
|
269
|
+
it "should return the correct age as number" do
|
|
270
|
+
subject.should == 24
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
describe "#birthday_this_year" do
|
|
276
|
+
subject { @user.birthday_this_year }
|
|
277
|
+
describe "without date of birth" do
|
|
278
|
+
it { should == nil }
|
|
279
|
+
end
|
|
280
|
+
describe "with date of birth" do
|
|
281
|
+
before { @user.date_of_birth = 24.years.ago }
|
|
282
|
+
it "should return the correct date" do
|
|
283
|
+
subject.should == Time.zone.now.to_date
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
describe "postal address: " do
|
|
289
|
+
before do
|
|
290
|
+
@other_field = ProfileFieldTypes::Address.create(label: "My Work", value: "Some Other Address")
|
|
291
|
+
@profile_field = ProfileFieldTypes::Address.create(label: "My Home", value: "Some Address")
|
|
292
|
+
@user.profile_fields << @other_field
|
|
293
|
+
@user.profile_fields << @profile_field
|
|
294
|
+
end
|
|
295
|
+
describe "#postal_address_field" do
|
|
296
|
+
subject { @user.postal_address_field }
|
|
297
|
+
describe "for no primary postal address being set" do
|
|
298
|
+
it "should return nil" do
|
|
299
|
+
subject.should == nil
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
describe "for a primary postal address being set" do
|
|
303
|
+
before { @profile_field.postal_address = true }
|
|
304
|
+
it "should return the address field" do
|
|
305
|
+
subject.should == @profile_field
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
describe "#postal_address" do
|
|
310
|
+
subject { @user.postal_address }
|
|
311
|
+
describe "for no primary postal address being set" do
|
|
312
|
+
it "should return the first address of the user" do
|
|
313
|
+
subject.should == @other_field.value
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
describe "for a primary postal address being set" do
|
|
317
|
+
before { @profile_field.postal_address = true }
|
|
318
|
+
it "should return the address field's value" do
|
|
319
|
+
subject.should == "Some Address"
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
describe "#postal_address_with_name_surrounding" do
|
|
324
|
+
subject { @user.postal_address_with_name_surrounding }
|
|
325
|
+
before do
|
|
326
|
+
@name_surrounding = @user.profile_fields.create(type: 'ProfileFieldTypes::NameSurrounding').becomes(ProfileFieldTypes::NameSurrounding)
|
|
327
|
+
@name_surrounding.name_prefix = "Dr."
|
|
328
|
+
@name_surrounding.name_suffix = "M.Sc."
|
|
329
|
+
@name_surrounding.text_above_name = "Herrn"
|
|
330
|
+
@name_surrounding.text_below_name = "Bankdirektor"
|
|
331
|
+
@name_surrounding.save
|
|
332
|
+
@user.save
|
|
333
|
+
end
|
|
334
|
+
specify "prelims" do
|
|
335
|
+
@user.name_surrounding_profile_field.should == @name_surrounding
|
|
336
|
+
@user.name_surrounding_profile_field.text_above_name.should == "Herrn"
|
|
337
|
+
@user.text_above_name.should == "Herrn"
|
|
338
|
+
end
|
|
339
|
+
it { should ==
|
|
340
|
+
"Herrn\n" +
|
|
341
|
+
"Dr. #{@user.first_name} #{@user.last_name} M.Sc.\n" +
|
|
342
|
+
"Bankdirektor\n" +
|
|
343
|
+
@user.postal_address
|
|
344
|
+
}
|
|
345
|
+
describe "when no name surroundings are given" do
|
|
346
|
+
before { @name_surrounding.destroy }
|
|
347
|
+
it { should == "#{@user.name}\n#{@user.postal_address}" }
|
|
348
|
+
end
|
|
349
|
+
describe "when the user has the same personal title as given in the name prefix" do
|
|
350
|
+
before do
|
|
351
|
+
@user.profile_fields.create(type: 'ProfileFieldTypes::General', label: 'personal_title', value: "Dr.")
|
|
352
|
+
@user.save
|
|
353
|
+
end
|
|
354
|
+
it "should not print it twice" do
|
|
355
|
+
subject.should ==
|
|
356
|
+
"Herrn\n" +
|
|
357
|
+
"Dr. #{@user.first_name} #{@user.last_name} M.Sc.\n" +
|
|
358
|
+
"Bankdirektor\n" +
|
|
359
|
+
@user.postal_address
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
describe "when there is no text below the name" do
|
|
363
|
+
before { @name_surrounding.update_attributes(text_below_name: nil) }
|
|
364
|
+
it "should leave no blank line" do
|
|
365
|
+
subject.should ==
|
|
366
|
+
"Herrn\n" +
|
|
367
|
+
"Dr. #{@user.first_name} #{@user.last_name} M.Sc.\n" +
|
|
368
|
+
@user.postal_address
|
|
369
|
+
end
|
|
370
|
+
end
|
|
371
|
+
describe "when there is no text above the name" do
|
|
372
|
+
before { @name_surrounding.update_attributes(text_above_name: nil) }
|
|
373
|
+
it "should not begin with a blnak line" do
|
|
374
|
+
subject.should ==
|
|
375
|
+
"Dr. #{@user.first_name} #{@user.last_name} M.Sc.\n" +
|
|
376
|
+
"Bankdirektor\n" +
|
|
377
|
+
@user.postal_address
|
|
378
|
+
end
|
|
379
|
+
end
|
|
380
|
+
describe "when there is neither prefix nor personal title" do
|
|
381
|
+
before { @name_surrounding.update_attributes(name_prefix: nil) }
|
|
382
|
+
it "should set no spaces before the name" do
|
|
383
|
+
subject.should ==
|
|
384
|
+
"Herrn\n" +
|
|
385
|
+
"#{@user.first_name} #{@user.last_name} M.Sc.\n" +
|
|
386
|
+
"Bankdirektor\n" +
|
|
387
|
+
@user.postal_address
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
describe "when there is no name suffix" do
|
|
391
|
+
before { @name_surrounding.update_attributes(name_suffix: nil) }
|
|
392
|
+
it "should set no spaces after the name" do
|
|
393
|
+
subject.should ==
|
|
394
|
+
"Herrn\n" +
|
|
395
|
+
"Dr. #{@user.first_name} #{@user.last_name}\n" +
|
|
396
|
+
"Bankdirektor\n" +
|
|
397
|
+
@user.postal_address
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
describe "#phone_profile_fields" do
|
|
404
|
+
subject { @user.phone_profile_fields }
|
|
405
|
+
before do
|
|
406
|
+
@phone_field = @user.profile_fields.create(label: 'Phone', type: 'ProfileFieldTypes::Phone', value: '123456').becomes(ProfileFieldTypes::Phone)
|
|
407
|
+
@fax_field = @user.profile_fields.create(label: 'Fax', type: 'ProfileFieldTypes::Phone', value: '123457').becomes(ProfileFieldTypes::Phone)
|
|
408
|
+
@mobile_field = @user.profile_fields.create(label: 'Mobile', type: 'ProfileFieldTypes::Phone', value: '01234').becomes(ProfileFieldTypes::Phone)
|
|
409
|
+
@user.reload
|
|
410
|
+
end
|
|
411
|
+
it { should include @phone_field }
|
|
412
|
+
it { should_not include @fax_field }
|
|
413
|
+
it { should include @mobile_field }
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
describe "#phone" do
|
|
417
|
+
subject { @user.phone }
|
|
418
|
+
describe "for a phone number given" do
|
|
419
|
+
before { @phone_field = @user.profile_fields.create(label: 'Phone', type: 'ProfileFieldTypes::Phone', value: '09131 123 45 67').becomes(ProfileFieldTypes::Phone) }
|
|
420
|
+
it { should == @phone_field.value }
|
|
421
|
+
end
|
|
422
|
+
describe "for a phone and a mobile number given" do
|
|
423
|
+
before do
|
|
424
|
+
@mobile_field = @user.profile_fields.create(label: 'Mobile', type: 'ProfileFieldTypes::Phone', value: '09131 123 45 67').becomes(ProfileFieldTypes::Phone)
|
|
425
|
+
@phone_field = @user.profile_fields.create(label: 'Phone', type: 'ProfileFieldTypes::Phone', value: '0171 123 45 67').becomes(ProfileFieldTypes::Phone)
|
|
426
|
+
end
|
|
427
|
+
it { should == @phone_field.value }
|
|
428
|
+
end
|
|
429
|
+
describe "for no phone number given" do
|
|
430
|
+
it { should == nil }
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
describe "#phone=" do
|
|
435
|
+
before { @new_phone_number = "+49 9131 123 45" }
|
|
436
|
+
subject { @user.phone = @new_phone_number }
|
|
437
|
+
describe "if no phone field is present" do
|
|
438
|
+
it "should create a new one" do
|
|
439
|
+
@user.phone_profile_fields.count.should == 0
|
|
440
|
+
subject
|
|
441
|
+
@user.phone_profile_fields.first.value.should == @new_phone_number
|
|
442
|
+
@user.phone_profile_fields.first.label.should == "Telefon"
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
describe "if a phone field is present" do
|
|
446
|
+
before { @phone_field = @user.profile_fields.create(label: 'Telefon', value: '09131 123 45 56', type: 'ProfileFieldTypes::Phone') }
|
|
447
|
+
it "should modify the existing one" do
|
|
448
|
+
subject
|
|
449
|
+
@phone_field.reload.value.should == @new_phone_number
|
|
450
|
+
end
|
|
451
|
+
end
|
|
452
|
+
end
|
|
453
|
+
|
|
454
|
+
describe "#mobile" do
|
|
455
|
+
subject { @user.mobile }
|
|
456
|
+
describe "for a mobile phone number given" do
|
|
457
|
+
before { @phone_field = @user.profile_fields.create(label: 'Mobile', type: 'ProfileFieldTypes::Phone', value: '0161 123 45 67').becomes(ProfileFieldTypes::Phone) }
|
|
458
|
+
it { should == @phone_field.value }
|
|
459
|
+
end
|
|
460
|
+
describe "for a phone and a mobile number given" do
|
|
461
|
+
before do
|
|
462
|
+
@phone_field = @user.profile_fields.create(label: 'Phone', type: 'ProfileFieldTypes::Phone', value: '0171 123 45 67').becomes(ProfileFieldTypes::Phone)
|
|
463
|
+
@mobile_field = @user.profile_fields.create(label: 'Mobile', type: 'ProfileFieldTypes::Phone', value: '09131 123 45 67').becomes(ProfileFieldTypes::Phone)
|
|
464
|
+
end
|
|
465
|
+
it { should == @mobile_field.value }
|
|
466
|
+
end
|
|
467
|
+
describe "for no phone number given" do
|
|
468
|
+
it { should == nil }
|
|
469
|
+
end
|
|
470
|
+
end
|
|
471
|
+
describe "#mobile=" do
|
|
472
|
+
before { @new_phone_number = "+49 9131 123 45" }
|
|
473
|
+
subject { @user.mobile = @new_phone_number }
|
|
474
|
+
describe "if no phone field is present" do
|
|
475
|
+
it "should create a new one" do
|
|
476
|
+
@user.phone_profile_fields.count.should == 0
|
|
477
|
+
subject
|
|
478
|
+
@user.phone_profile_fields.first.value.should == @new_phone_number
|
|
479
|
+
@user.phone_profile_fields.first.label.should == "Mobil"
|
|
480
|
+
end
|
|
481
|
+
end
|
|
482
|
+
describe "if a phone field is present" do
|
|
483
|
+
before { @phone_field = @user.profile_fields.create(label: 'Mobil', value: '0161 123 45 56', type: 'ProfileFieldTypes::Phone') }
|
|
484
|
+
it "should modify the existing one" do
|
|
485
|
+
subject
|
|
486
|
+
@phone_field.reload.value.should == @new_phone_number
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
# Associated Objects
|
|
493
|
+
# ==========================================================================================
|
|
494
|
+
|
|
495
|
+
# Alias
|
|
496
|
+
# ------------------------------------------------------------------------------------------
|
|
497
|
+
|
|
498
|
+
describe "#alias" do
|
|
499
|
+
describe "for an already created user" do
|
|
500
|
+
subject { @user.alias }
|
|
501
|
+
it { should be_kind_of( UserAlias ) }
|
|
502
|
+
it { should_not be_empty }
|
|
503
|
+
end
|
|
504
|
+
describe "for a newly built user without alias being set" do
|
|
505
|
+
before do
|
|
506
|
+
@user = User.new(first_name: "James", last_name: "Doe", email: "doe@example.com")
|
|
507
|
+
end
|
|
508
|
+
subject { @user.alias }
|
|
509
|
+
it { should == nil }
|
|
510
|
+
end
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
describe "#alias=" do
|
|
514
|
+
it "should set the alias attribute" do
|
|
515
|
+
@user.alias = "New Alias"
|
|
516
|
+
@user.alias.should == "New Alias"
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
describe "#generate_alias" do
|
|
521
|
+
before do
|
|
522
|
+
@user = build(:user, first_name: "Tamara", last_name: "Sweet")
|
|
523
|
+
end
|
|
524
|
+
subject { @user.generate_alias }
|
|
525
|
+
it "should generate the alias" do
|
|
526
|
+
subject.should be_kind_of UserAlias
|
|
527
|
+
subject.should == "sweet"
|
|
528
|
+
end
|
|
529
|
+
it "should not set the alias of the user" do
|
|
530
|
+
subject
|
|
531
|
+
@user.alias.should_not == "sweet"
|
|
532
|
+
end
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
describe "#generate_alias!" do
|
|
536
|
+
before do
|
|
537
|
+
@user = build(:user, first_name: "Tamara", last_name: "Sweet")
|
|
538
|
+
end
|
|
539
|
+
subject { @user.generate_alias! }
|
|
540
|
+
it "should generate the alias" do
|
|
541
|
+
subject.should be_kind_of UserAlias
|
|
542
|
+
subject.should == "sweet"
|
|
543
|
+
end
|
|
544
|
+
it "should set the alias of the user" do
|
|
545
|
+
subject
|
|
546
|
+
@user.alias.should == "sweet"
|
|
547
|
+
end
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
specify "changed behaviour: on creating the default alias should be nil" do
|
|
551
|
+
@user = User.create(first_name: "James", last_name: "Doe", email: "doe@example.com")
|
|
552
|
+
@user.alias.should == nil
|
|
553
|
+
end
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
# User Account
|
|
557
|
+
# ------------------------------------------------------------------------------------------
|
|
558
|
+
|
|
559
|
+
context "for a user with account" do
|
|
560
|
+
before { @user_with_account = create( :user_with_account ) }
|
|
561
|
+
subject { @user_with_account }
|
|
562
|
+
|
|
563
|
+
describe "#has_account?" do
|
|
564
|
+
subject { @user_with_account.has_account? }
|
|
565
|
+
it { should == true }
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
describe "#activate_account" do
|
|
569
|
+
it "should keep the existing account" do
|
|
570
|
+
@existing_account = @user_with_account.account
|
|
571
|
+
@user_with_account.activate_account
|
|
572
|
+
@user_with_account.account.should == @existing_account
|
|
573
|
+
end
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
describe "#deactivate_account" do
|
|
577
|
+
it "should destroy the existing account" do
|
|
578
|
+
@user_with_account.account.should_not be_nil
|
|
579
|
+
@user_with_account.deactivate_account
|
|
580
|
+
@user_with_account.account.should be_nil
|
|
581
|
+
@user_with_account.has_account?.should == false
|
|
582
|
+
end
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
specify "the new user should have an initial password" do
|
|
586
|
+
# This is to avoid the bug of welcome emails with a blank password.
|
|
587
|
+
subject.account.password.should_not be_empty
|
|
588
|
+
end
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
context "for a user without account" do
|
|
592
|
+
before { @user_without_account = create( :user, :create_account => false ) }
|
|
593
|
+
|
|
594
|
+
describe "#has_account?" do
|
|
595
|
+
subject { @user_without_account.has_account? }
|
|
596
|
+
it { should == false }
|
|
597
|
+
end
|
|
598
|
+
|
|
599
|
+
describe "#activate_account" do
|
|
600
|
+
it "should create an account" do
|
|
601
|
+
@user_without_account.account.should == nil
|
|
602
|
+
@user_without_account.activate_account
|
|
603
|
+
@user_without_account.account.should be_kind_of( UserAccount )
|
|
604
|
+
@user_without_account.should_not be_nil
|
|
605
|
+
end
|
|
606
|
+
end
|
|
607
|
+
|
|
608
|
+
describe "#deactivate_account" do
|
|
609
|
+
it "should raise an error, since no account exists" do
|
|
610
|
+
expect { @user_without_account.deactivate_account }.to raise_error
|
|
611
|
+
end
|
|
612
|
+
end
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
describe "#create_account attribute" do
|
|
616
|
+
describe "#create_account == true" do
|
|
617
|
+
it "should cause the user to be created with account" do
|
|
618
|
+
create( :user, create_account: true ).account.should_not be_nil
|
|
619
|
+
end
|
|
620
|
+
end
|
|
621
|
+
describe "#create_account == false" do
|
|
622
|
+
it "should cause the user to be created without account" do
|
|
623
|
+
create( :user, create_account: false ).account.should be_nil
|
|
624
|
+
end
|
|
625
|
+
end
|
|
626
|
+
describe "#create_account == 0" do
|
|
627
|
+
it "should cause the user to be created without account" do
|
|
628
|
+
create( :user, create_account: 0 ).account.should be_nil
|
|
629
|
+
end
|
|
630
|
+
end
|
|
631
|
+
describe "#create_account == 1" do
|
|
632
|
+
it "should cause the user to be created with account" do
|
|
633
|
+
create( :user, create_account: 1 ).account.should_not be_nil
|
|
634
|
+
end
|
|
635
|
+
end
|
|
636
|
+
describe "#create_account == '0'" do # for HTML forms
|
|
637
|
+
it "should cause the user to be created without account" do
|
|
638
|
+
create( :user, create_account: "0" ).account.should be_nil
|
|
639
|
+
end
|
|
640
|
+
end
|
|
641
|
+
describe "#create_account == '1'" do # for HTML forms
|
|
642
|
+
it "should cause the user to be created with account" do
|
|
643
|
+
create( :user, create_account: "1" ).account.should_not be_nil
|
|
644
|
+
end
|
|
645
|
+
end
|
|
646
|
+
describe "#create_account == ''" do
|
|
647
|
+
it "should cause the user to be created without account" do
|
|
648
|
+
create( :user, create_account: "" ).account.should be_nil
|
|
649
|
+
end
|
|
650
|
+
end
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
# Groups
|
|
655
|
+
# ------------------------------------------------------------------------------------------
|
|
656
|
+
|
|
657
|
+
describe "#groups" do
|
|
658
|
+
before do
|
|
659
|
+
@group = create( :group )
|
|
660
|
+
@everyone_group = Group.everyone
|
|
661
|
+
@group.parent_groups << @everyone_group
|
|
662
|
+
@user.save
|
|
663
|
+
@user.parent_groups << @group
|
|
664
|
+
@user.reload
|
|
665
|
+
end
|
|
666
|
+
subject { @user.groups }
|
|
667
|
+
it "should include the groups the user is a direct member of" do
|
|
668
|
+
subject.should include( @group )
|
|
669
|
+
end
|
|
670
|
+
it "should include the groups the user is an indirect member of" do
|
|
671
|
+
subject.should include( Group.everyone )
|
|
672
|
+
end
|
|
673
|
+
it "should return all ancestor groups" do
|
|
674
|
+
subject.should == @user.ancestor_groups
|
|
675
|
+
end
|
|
676
|
+
end
|
|
677
|
+
|
|
678
|
+
describe "#add_to_group attribute" do
|
|
679
|
+
before do
|
|
680
|
+
@group = create( :group )
|
|
681
|
+
end
|
|
682
|
+
describe "#add_to_group == nil" do
|
|
683
|
+
subject { create( :user, :add_to_group => nil ) }
|
|
684
|
+
it "should not add the user to a group during creation" do
|
|
685
|
+
subject.parent_groups.should_not include( @group )
|
|
686
|
+
end
|
|
687
|
+
end
|
|
688
|
+
describe "#add_to_group == some_group" do
|
|
689
|
+
subject { create( :user, :add_to_group => @group ) }
|
|
690
|
+
it "should add the user to the group during creation" do
|
|
691
|
+
subject.parent_groups.should include( @group )
|
|
692
|
+
end
|
|
693
|
+
end
|
|
694
|
+
describe "#add_to_group == some_group_id" do
|
|
695
|
+
subject { create( :user, :add_to_group => @group.id ) }
|
|
696
|
+
it "should add the user to the group during creation" do
|
|
697
|
+
subject.parent_groups.should include( @group )
|
|
698
|
+
end
|
|
699
|
+
end
|
|
700
|
+
end
|
|
701
|
+
|
|
702
|
+
|
|
703
|
+
# Corporations
|
|
704
|
+
# ------------------------------------------------------------------------------------------
|
|
705
|
+
|
|
706
|
+
describe "#corporations" do
|
|
707
|
+
before do
|
|
708
|
+
@corporation = create( :corporation )
|
|
709
|
+
@subgroup = create( :group ); @subgroup.parent_groups << @corporation
|
|
710
|
+
@user.save
|
|
711
|
+
@user.parent_groups << @subgroup
|
|
712
|
+
@user.reload
|
|
713
|
+
end
|
|
714
|
+
subject { @user.corporations }
|
|
715
|
+
it "should return an array of the user's corporations" do
|
|
716
|
+
subject.should == [ @corporation ]
|
|
717
|
+
end
|
|
718
|
+
it "should return an array of Corporation-type objects" do
|
|
719
|
+
subject.should be_kind_of Array
|
|
720
|
+
subject.first.should be_kind_of Corporation
|
|
721
|
+
end
|
|
722
|
+
end
|
|
723
|
+
|
|
724
|
+
describe "#cached(:corporations)" do
|
|
725
|
+
before do
|
|
726
|
+
@corporationE = create( :corporation_with_status_groups, :token => "E" )
|
|
727
|
+
@corporationS = create( :corporation_with_status_groups, :token => "S" )
|
|
728
|
+
@corporationH = create( :corporation_with_status_groups, :token => "H" )
|
|
729
|
+
@subgroup = create( :group );
|
|
730
|
+
@subgroup.parent_groups << @corporationE
|
|
731
|
+
@user.save
|
|
732
|
+
@first_membership_E = StatusGroupMembership.create( user: @user, group: @corporationE.status_groups.first )
|
|
733
|
+
@user.parent_groups << @subgroup
|
|
734
|
+
@user.reload
|
|
735
|
+
end
|
|
736
|
+
subject { @user.cached(:corporations) }
|
|
737
|
+
it "should return an array of the user's corporations" do
|
|
738
|
+
should == @user.corporations
|
|
739
|
+
end
|
|
740
|
+
context "when user entered corporation S" do
|
|
741
|
+
before do
|
|
742
|
+
@user.cached(:corporations)
|
|
743
|
+
wait_for_cache
|
|
744
|
+
|
|
745
|
+
first_membership_S = StatusGroupMembership.create( user: @user, group: @corporationS.status_groups.first )
|
|
746
|
+
first_membership_S.update_attributes(valid_from: "2010-05-01".to_datetime)
|
|
747
|
+
@user.reload
|
|
748
|
+
end
|
|
749
|
+
it { should == @user.corporations }
|
|
750
|
+
end
|
|
751
|
+
context "when user entered corporation H as guest" do
|
|
752
|
+
before do
|
|
753
|
+
@user.cached(:corporations)
|
|
754
|
+
wait_for_cache
|
|
755
|
+
|
|
756
|
+
first_membership_H = StatusGroupMembership.create( user: @user, group: @corporationH.guests_parent )
|
|
757
|
+
first_membership_H.update_attributes(valid_from: "2010-05-01".to_datetime)
|
|
758
|
+
@user.reload
|
|
759
|
+
end
|
|
760
|
+
it { should == @user.corporations }
|
|
761
|
+
end
|
|
762
|
+
context "when user left corporation E" do
|
|
763
|
+
before do
|
|
764
|
+
@user.cached(:corporations)
|
|
765
|
+
former_group = @corporationE.child_groups.create
|
|
766
|
+
former_group.add_flag :former_members_parent
|
|
767
|
+
second_membership_E = StatusGroupMembership.create( user: @user, group: former_group )
|
|
768
|
+
second_membership_E.update_attributes(valid_from: "2014-05-01".to_datetime)
|
|
769
|
+
@first_membership_E.update_attributes(valid_to: "2014-05-01".to_datetime)
|
|
770
|
+
@user.reload
|
|
771
|
+
end
|
|
772
|
+
it { should == @user.corporations }
|
|
773
|
+
end
|
|
774
|
+
end
|
|
775
|
+
|
|
776
|
+
describe "#current_corporations" do
|
|
777
|
+
before do
|
|
778
|
+
@corporationE = create( :corporation_with_status_groups, :token => "E" )
|
|
779
|
+
@corporationS = create( :corporation_with_status_groups, :token => "S" )
|
|
780
|
+
@corporationH = create( :corporation_with_status_groups, :token => "H" )
|
|
781
|
+
@subgroup = create( :group );
|
|
782
|
+
@subgroup.parent_groups << @corporationE
|
|
783
|
+
@user.save
|
|
784
|
+
@first_membership_E = StatusGroupMembership.create( user: @user, group: @corporationE.status_groups.first )
|
|
785
|
+
@user.parent_groups << @subgroup
|
|
786
|
+
@user.reload
|
|
787
|
+
end
|
|
788
|
+
subject { @user.current_corporations }
|
|
789
|
+
it "should return an array of the user's corporations" do
|
|
790
|
+
should == @user.corporations
|
|
791
|
+
should include @corporationE
|
|
792
|
+
should_not include @corporationS, @corporationH
|
|
793
|
+
end
|
|
794
|
+
context "when user entered corporation S" do
|
|
795
|
+
before do
|
|
796
|
+
first_membership_S = StatusGroupMembership.create( user: @user, group: @corporationS.status_groups.first )
|
|
797
|
+
first_membership_S.update_attributes(valid_from: "2010-05-01".to_datetime)
|
|
798
|
+
@user.reload
|
|
799
|
+
end
|
|
800
|
+
it { should == [ @corporationE, @corporationS ] }
|
|
801
|
+
end
|
|
802
|
+
context "when user entered corporation H as guest" do
|
|
803
|
+
before do
|
|
804
|
+
first_membership_H = StatusGroupMembership.create( user: @user, group: @corporationH.guests_parent )
|
|
805
|
+
first_membership_H.update_attributes(valid_from: "2010-05-01".to_datetime)
|
|
806
|
+
@user.reload
|
|
807
|
+
end
|
|
808
|
+
it { should == [ @corporationE ] }
|
|
809
|
+
end
|
|
810
|
+
context "when user left corporation E" do
|
|
811
|
+
before do
|
|
812
|
+
former_group = @corporationE.child_groups.create
|
|
813
|
+
former_group.add_flag :former_members_parent
|
|
814
|
+
second_membership_E = StatusGroupMembership.create( user: @user, group: former_group )
|
|
815
|
+
second_membership_E.update_attributes(valid_from: "2014-05-01".to_datetime)
|
|
816
|
+
@first_membership_E.update_attributes(valid_to: "2014-05-01".to_datetime)
|
|
817
|
+
@user.reload
|
|
818
|
+
end
|
|
819
|
+
it { should be_empty }
|
|
820
|
+
end
|
|
821
|
+
context "when joining an event of a corporation" do
|
|
822
|
+
before do
|
|
823
|
+
@event = @corporationH.child_events.create
|
|
824
|
+
@user.join @event
|
|
825
|
+
time_travel 2.seconds; @user.reload
|
|
826
|
+
end
|
|
827
|
+
it { should_not include @corporationH }
|
|
828
|
+
end
|
|
829
|
+
end
|
|
830
|
+
|
|
831
|
+
describe "#cached(:current_corporations)" do
|
|
832
|
+
before do
|
|
833
|
+
@corporationE = create( :corporation_with_status_groups, :token => "E" )
|
|
834
|
+
@corporationS = create( :corporation_with_status_groups, :token => "S" )
|
|
835
|
+
@corporationH = create( :corporation_with_status_groups, :token => "H" )
|
|
836
|
+
@subgroup = create( :group );
|
|
837
|
+
@subgroup.parent_groups << @corporationE
|
|
838
|
+
@user.save
|
|
839
|
+
@first_membership_E = StatusGroupMembership.create( user: @user, group: @corporationE.status_groups.first )
|
|
840
|
+
@user.parent_groups << @subgroup
|
|
841
|
+
@user.reload
|
|
842
|
+
end
|
|
843
|
+
subject { @user.cached(:current_corporations) }
|
|
844
|
+
it "should return an array of the user's corporations" do
|
|
845
|
+
should == @user.corporations
|
|
846
|
+
end
|
|
847
|
+
context "when user entered corporation S" do
|
|
848
|
+
before do
|
|
849
|
+
@user.cached(:current_corporations)
|
|
850
|
+
wait_for_cache
|
|
851
|
+
|
|
852
|
+
first_membership_S = StatusGroupMembership.create( user: @user, group: @corporationS.status_groups.first )
|
|
853
|
+
first_membership_S.update_attributes(valid_from: "2010-05-01".to_datetime)
|
|
854
|
+
@user.reload
|
|
855
|
+
end
|
|
856
|
+
it { should == [ @corporationE, @corporationS ] }
|
|
857
|
+
end
|
|
858
|
+
context "when user entered corporation H as guest" do
|
|
859
|
+
before do
|
|
860
|
+
@user.cached(:current_corporations)
|
|
861
|
+
first_membership_H = StatusGroupMembership.create( user: @user, group: @corporationH.guests_parent )
|
|
862
|
+
first_membership_H.update_attributes(valid_from: "2010-05-01".to_datetime)
|
|
863
|
+
@user.reload
|
|
864
|
+
end
|
|
865
|
+
it { should == [ @corporationE ] }
|
|
866
|
+
end
|
|
867
|
+
context "when user left corporation E" do
|
|
868
|
+
before do
|
|
869
|
+
@user.cached(:current_corporations)
|
|
870
|
+
wait_for_cache
|
|
871
|
+
|
|
872
|
+
former_group = @corporationE.child_groups.create
|
|
873
|
+
former_group.add_flag :former_members_parent
|
|
874
|
+
second_membership_E = StatusGroupMembership.create( user: @user, group: former_group )
|
|
875
|
+
second_membership_E.update_attributes(valid_from: "2014-05-01".to_datetime)
|
|
876
|
+
@first_membership_E.update_attributes(valid_to: "2014-05-01".to_datetime)
|
|
877
|
+
@user.reload
|
|
878
|
+
end
|
|
879
|
+
it { should be_empty }
|
|
880
|
+
end
|
|
881
|
+
end
|
|
882
|
+
|
|
883
|
+
describe "#first_corporation" do
|
|
884
|
+
before do
|
|
885
|
+
@corporation1 = create( :corporation_with_status_groups )
|
|
886
|
+
@corporation2 = create( :corporation_with_status_groups )
|
|
887
|
+
@corporation1.status_groups.first.assign_user @user, at: 1.year.ago
|
|
888
|
+
@corporation2.status_groups.first.assign_user @user, at: 3.months.ago
|
|
889
|
+
@user.reload
|
|
890
|
+
end
|
|
891
|
+
subject { @user.first_corporation }
|
|
892
|
+
it "should return the user's first corporation" do
|
|
893
|
+
subject.should == @corporation1
|
|
894
|
+
end
|
|
895
|
+
end
|
|
896
|
+
|
|
897
|
+
describe "#my_groups_in_first_corporation" do
|
|
898
|
+
before do
|
|
899
|
+
@corporation1 = create :corporation_with_status_groups
|
|
900
|
+
@corporation2 = create :corporation_with_status_groups
|
|
901
|
+
@corporation1.status_groups.first.assign_user @user
|
|
902
|
+
@corporation1.status_groups.last.assign_user @user
|
|
903
|
+
@corporation2.status_groups.first.assign_user @user
|
|
904
|
+
@corporation1.admins << @user
|
|
905
|
+
time_travel 5.seconds
|
|
906
|
+
@user.reload
|
|
907
|
+
end
|
|
908
|
+
subject { @user.my_groups_in_first_corporation }
|
|
909
|
+
it "should return the non special groups of user's first corporation" do
|
|
910
|
+
subject.should == [ @corporation1.status_groups.first, @corporation1.status_groups.last ]
|
|
911
|
+
end
|
|
912
|
+
end
|
|
913
|
+
|
|
914
|
+
describe "#last_group_in_first_corporation" do
|
|
915
|
+
before do
|
|
916
|
+
@corporation1 = create :corporation_with_status_groups
|
|
917
|
+
@corporation2 = create :corporation_with_status_groups
|
|
918
|
+
@corporation1.status_groups.first.assign_user @user, at: 10.months.ago
|
|
919
|
+
@corporation1.status_groups.last.assign_user @user, at: 2.months.ago
|
|
920
|
+
@corporation2.status_groups.first.assign_user @user, at: 1.month.ago
|
|
921
|
+
@corporation1.admins << @user
|
|
922
|
+
@user.reload
|
|
923
|
+
end
|
|
924
|
+
subject { @user.cached(:last_group_in_first_corporation) }
|
|
925
|
+
it "should return the last non special group of user's first corporation" do
|
|
926
|
+
subject.should == @corporation1.status_groups.last
|
|
927
|
+
subject.should_not == @corporation1.admins_parent
|
|
928
|
+
end
|
|
929
|
+
end
|
|
930
|
+
|
|
931
|
+
# Status Groups
|
|
932
|
+
# ------------------------------------------------------------------------------------------
|
|
933
|
+
|
|
934
|
+
describe "#status_groups" do
|
|
935
|
+
before do
|
|
936
|
+
@corporation = create( :corporation_with_status_groups )
|
|
937
|
+
@status_group = @corporation.status_groups.first
|
|
938
|
+
@status_group.assign_user @user
|
|
939
|
+
@another_group = create( :group )
|
|
940
|
+
@another_group.assign_user @user
|
|
941
|
+
end
|
|
942
|
+
subject { @user.status_groups }
|
|
943
|
+
|
|
944
|
+
it "should include the status groups of the user" do
|
|
945
|
+
subject.should include @status_group
|
|
946
|
+
end
|
|
947
|
+
it "should not include the non-status groups of the user" do
|
|
948
|
+
subject.should_not include @another_group
|
|
949
|
+
end
|
|
950
|
+
end
|
|
951
|
+
|
|
952
|
+
describe "#current_status_membership_in(corporation)" do
|
|
953
|
+
before do
|
|
954
|
+
@corporation = create( :corporation_with_status_groups )
|
|
955
|
+
@status_group = @corporation.status_groups.first
|
|
956
|
+
@status_group.assign_user @user
|
|
957
|
+
@status_group_membership = StatusGroupMembership.find_by_user_and_group(@user, @status_group)
|
|
958
|
+
end
|
|
959
|
+
subject { @user.current_status_membership_in(@corporation) }
|
|
960
|
+
|
|
961
|
+
it "should return the correct membership" do
|
|
962
|
+
subject.should == @status_group_membership
|
|
963
|
+
end
|
|
964
|
+
end
|
|
965
|
+
|
|
966
|
+
|
|
967
|
+
# Memberships
|
|
968
|
+
# ------------------------------------------------------------------------------------------
|
|
969
|
+
|
|
970
|
+
describe "#memberships" do
|
|
971
|
+
before do
|
|
972
|
+
@group = create( :group )
|
|
973
|
+
@group.child_users << @user
|
|
974
|
+
@membership = UserGroupMembership.find_by( user: @user, group: @group )
|
|
975
|
+
end
|
|
976
|
+
subject { @user.memberships }
|
|
977
|
+
it "should return an array of the user's memberships" do
|
|
978
|
+
subject.should == [ @membership ]
|
|
979
|
+
end
|
|
980
|
+
it "should be the same as UserGroupMembership.find_all_by_user" do
|
|
981
|
+
subject.should == UserGroupMembership.find_all_by_user( @user )
|
|
982
|
+
end
|
|
983
|
+
it "should allow to chain other ActiveRelation scopes, like `only_valid`" do
|
|
984
|
+
subject.only_valid.should == [ @membership ]
|
|
985
|
+
end
|
|
986
|
+
end
|
|
987
|
+
|
|
988
|
+
|
|
989
|
+
# Relationships
|
|
990
|
+
# ------------------------------------------------------------------------------------------
|
|
991
|
+
|
|
992
|
+
describe "#relationships" do
|
|
993
|
+
before do
|
|
994
|
+
@other_user = create( :user )
|
|
995
|
+
@relationship = create( :relationship, who: @user, of: @other_user )
|
|
996
|
+
end
|
|
997
|
+
subject { @user.relationships }
|
|
998
|
+
it "should return the relationships of the user" do
|
|
999
|
+
subject.should == [ @relationship ]
|
|
1000
|
+
end
|
|
1001
|
+
end
|
|
1002
|
+
|
|
1003
|
+
|
|
1004
|
+
# Workflows
|
|
1005
|
+
# ------------------------------------------------------------------------------------------
|
|
1006
|
+
|
|
1007
|
+
describe "#workflows" do
|
|
1008
|
+
before do
|
|
1009
|
+
@group = create( :group )
|
|
1010
|
+
@workflow = create( :workflow ); @workflow.parent_groups << @group
|
|
1011
|
+
@user.save
|
|
1012
|
+
@user.parent_groups << @group
|
|
1013
|
+
@user.reload
|
|
1014
|
+
end
|
|
1015
|
+
subject { @user.workflows }
|
|
1016
|
+
it "should return an array of all workflows of all groups of the user" do
|
|
1017
|
+
subject.should == [ @workflow ]
|
|
1018
|
+
end
|
|
1019
|
+
end
|
|
1020
|
+
|
|
1021
|
+
|
|
1022
|
+
# Events
|
|
1023
|
+
# ------------------------------------------------------------------------------------------
|
|
1024
|
+
|
|
1025
|
+
describe "#upcoming_events" do
|
|
1026
|
+
subject { @user.upcoming_events }
|
|
1027
|
+
describe "(timing)" do
|
|
1028
|
+
before do
|
|
1029
|
+
@group1 = @user.parent_groups.create
|
|
1030
|
+
@group2 = @group1.parent_groups.create
|
|
1031
|
+
@upcoming_events = [ @group1.child_events.create( start_at: 5.hours.from_now ),
|
|
1032
|
+
@group2.child_events.create( start_at: 6.hours.from_now ) ]
|
|
1033
|
+
@recent_events = [ @group1.child_events.create( start_at: 2.days.ago ) ]
|
|
1034
|
+
@unrelated_events = [ Event.create( start_at: 4.hours.from_now ) ]
|
|
1035
|
+
end
|
|
1036
|
+
it { should include *@upcoming_events }
|
|
1037
|
+
it { should_not include *@recent_events }
|
|
1038
|
+
it { should_not include *@unrelated_events }
|
|
1039
|
+
it "should return the upcoming events in ascending order" do
|
|
1040
|
+
subject.first.start_at.should < subject.last.start_at
|
|
1041
|
+
end
|
|
1042
|
+
end
|
|
1043
|
+
describe "(direct/indirect)" do
|
|
1044
|
+
# group_a
|
|
1045
|
+
# |----- event_0 <<===
|
|
1046
|
+
# |----- group_b
|
|
1047
|
+
# | |------ event_1 <<===
|
|
1048
|
+
# | |------ user
|
|
1049
|
+
# |
|
|
1050
|
+
# |----- group_c
|
|
1051
|
+
# |------ event_2
|
|
1052
|
+
before do
|
|
1053
|
+
@group_a = create( :group )
|
|
1054
|
+
@event_0 = @group_a.child_events.create( start_at: 5.hours.from_now )
|
|
1055
|
+
@group_b = @group_a.child_groups.create
|
|
1056
|
+
@group_b.child_users << @user
|
|
1057
|
+
@event_1 = @group_b.child_events.create( start_at: 5.hours.from_now )
|
|
1058
|
+
@group_c = @group_a.child_groups.create
|
|
1059
|
+
@event_2 = @group_c.child_events.create( start_at: 5.hours.from_now )
|
|
1060
|
+
@user.reload
|
|
1061
|
+
end
|
|
1062
|
+
it "should list direct events of the user's groups" do # "<<===" above
|
|
1063
|
+
@user.ancestor_groups.should include @group_a, @group_b
|
|
1064
|
+
subject.should include @event_0, @event_1
|
|
1065
|
+
end
|
|
1066
|
+
it "should not list in-direct events" do
|
|
1067
|
+
# otherwise all users will see all events, since everyone is member of Group.everyone.
|
|
1068
|
+
subject.should_not include @event_2
|
|
1069
|
+
end
|
|
1070
|
+
end
|
|
1071
|
+
end
|
|
1072
|
+
|
|
1073
|
+
describe "#join" do
|
|
1074
|
+
subject { @user.join(@event_or_group); time_travel(2.seconds) }
|
|
1075
|
+
describe "(joining an event)" do
|
|
1076
|
+
before { @event_or_group = @event = create(:event); subject }
|
|
1077
|
+
specify { @event.attendees.should include @user}
|
|
1078
|
+
specify { @event.attendees_group.members.should include @user }
|
|
1079
|
+
specify "the user should be able to join and leave and re-join without error" do
|
|
1080
|
+
@user.join @event; time_travel 2.seconds
|
|
1081
|
+
@user.leave @event; time_travel 2.seconds
|
|
1082
|
+
@user.join @event; time_travel 2.seconds
|
|
1083
|
+
@event.attendees.should include @user
|
|
1084
|
+
end
|
|
1085
|
+
end
|
|
1086
|
+
describe "(joining a group)" do
|
|
1087
|
+
before { @event_or_group = @group = create(:group); subject }
|
|
1088
|
+
specify { @group.members.should include @user }
|
|
1089
|
+
end
|
|
1090
|
+
end
|
|
1091
|
+
describe "#leave" do
|
|
1092
|
+
subject { @user.leave(@event_or_group); time_travel(2.seconds) }
|
|
1093
|
+
before do
|
|
1094
|
+
@event = create :event; @user.join @event
|
|
1095
|
+
@group = create :group; @user.join @group
|
|
1096
|
+
time_travel 2.seconds
|
|
1097
|
+
end
|
|
1098
|
+
describe "(leaving an event)" do
|
|
1099
|
+
# TODO: We need multiple dag links between two nodes!
|
|
1100
|
+
before { @event_or_group = @event; subject }
|
|
1101
|
+
specify { @event.attendees.should_not include @user}
|
|
1102
|
+
specify { @event.attendees_group.members.should_not include @user }
|
|
1103
|
+
specify { @event.attendees_group.child_users.should_not include @user }
|
|
1104
|
+
end
|
|
1105
|
+
describe "(leaving a group)" do
|
|
1106
|
+
before { @event_or_group = @group; subject }
|
|
1107
|
+
# TODO: We need multiple dag links between two nodes!
|
|
1108
|
+
# specify { @group.members.should_not include @user }
|
|
1109
|
+
# specify { @group.members.former.should include @user }
|
|
1110
|
+
# specify { @group.child_users.should include @user }
|
|
1111
|
+
end
|
|
1112
|
+
end
|
|
1113
|
+
|
|
1114
|
+
|
|
1115
|
+
|
|
1116
|
+
# News Pages
|
|
1117
|
+
# ------------------------------------------------------------------------------------------
|
|
1118
|
+
|
|
1119
|
+
# List news (Pages) that concern the user.
|
|
1120
|
+
#
|
|
1121
|
+
# independent_page <--- show
|
|
1122
|
+
#
|
|
1123
|
+
# root_page --- page_0 <--- show
|
|
1124
|
+
# |
|
|
1125
|
+
# everyone ---- page_1 ---- page_2 <--- show
|
|
1126
|
+
# |
|
|
1127
|
+
# |----- group_1 ---- page_3 <--- DO NOT show
|
|
1128
|
+
# |
|
|
1129
|
+
# |----- group_2 ---- user
|
|
1130
|
+
# | |-- page_4 <--- show
|
|
1131
|
+
# |
|
|
1132
|
+
# |--- user
|
|
1133
|
+
#
|
|
1134
|
+
describe "#news_pages" do
|
|
1135
|
+
subject { @user.news_pages }
|
|
1136
|
+
before do
|
|
1137
|
+
@independent_page = create :page, title: 'independent_page'
|
|
1138
|
+
@root_page = Page.find_root
|
|
1139
|
+
@page_0 = @root_page.child_pages.create title: 'page_0'
|
|
1140
|
+
@everyone = Group.everyone
|
|
1141
|
+
@page_1 = @everyone.child_pages.create title: 'page_1'
|
|
1142
|
+
@page_2 = @page_1.child_pages.create title: 'page_2'
|
|
1143
|
+
@group_1 = @everyone.child_groups.create name: 'group_1'
|
|
1144
|
+
@page_3 = @group_1.child_pages.create title: 'page_3'
|
|
1145
|
+
@group_2 = @everyone.child_groups.create name: 'group_2'
|
|
1146
|
+
@group_2.assign_user @user
|
|
1147
|
+
@page_4 = @group_2.child_pages.create title: 'page_4'
|
|
1148
|
+
time_travel 2.seconds
|
|
1149
|
+
@user.reload
|
|
1150
|
+
end
|
|
1151
|
+
specify 'requirements' do
|
|
1152
|
+
@group_1.members.should_not include @user
|
|
1153
|
+
end
|
|
1154
|
+
it "should list pages that are without group" do
|
|
1155
|
+
subject.should include @independent_page
|
|
1156
|
+
end
|
|
1157
|
+
it "should list pages under the root page" do
|
|
1158
|
+
subject.should include @page_0
|
|
1159
|
+
end
|
|
1160
|
+
it "should list pages directly under the everyone group" do
|
|
1161
|
+
subject.should include @page_1, @page_2
|
|
1162
|
+
end
|
|
1163
|
+
it "should NOT list pages of groups the user is not member of" do
|
|
1164
|
+
subject.should_not include @page_3
|
|
1165
|
+
end
|
|
1166
|
+
specify "(but users that are in @group_1 should have @page_3 listed)" do
|
|
1167
|
+
@user_of_group_1 = create :user
|
|
1168
|
+
@group_1.assign_user @user_of_group_1, at: 1.hour.ago
|
|
1169
|
+
@user_of_group_1.reload.news_pages.should include @page_3
|
|
1170
|
+
end
|
|
1171
|
+
it "should list pages of other groups the user is member of" do
|
|
1172
|
+
subject.should include @page_4
|
|
1173
|
+
end
|
|
1174
|
+
end
|
|
1175
|
+
|
|
1176
|
+
# Roles
|
|
1177
|
+
# ==========================================================================================
|
|
1178
|
+
|
|
1179
|
+
describe "#role_for" do
|
|
1180
|
+
before do
|
|
1181
|
+
@object = create( :page )
|
|
1182
|
+
@object.create_main_admins_parent_group
|
|
1183
|
+
@sub_object = create( :group ); @sub_object.parent_pages << @object
|
|
1184
|
+
@sub_sub_object = create( :user ); @sub_sub_object.parent_groups << @sub_object
|
|
1185
|
+
end
|
|
1186
|
+
subject { @user.role_for @object }
|
|
1187
|
+
context "for the user being not related to the object" do
|
|
1188
|
+
it { should == nil }
|
|
1189
|
+
end
|
|
1190
|
+
context "for the user being a member of the object" do
|
|
1191
|
+
before do
|
|
1192
|
+
@group = create( :group )
|
|
1193
|
+
@group.child_users << @user
|
|
1194
|
+
@object.child_groups << @group
|
|
1195
|
+
end
|
|
1196
|
+
it { should == :member }
|
|
1197
|
+
end
|
|
1198
|
+
context "for the user being an admin of the object" do
|
|
1199
|
+
before { @object.admins << @user }
|
|
1200
|
+
it { should == :admin }
|
|
1201
|
+
end
|
|
1202
|
+
context "for the user being a main_admin of the object" do
|
|
1203
|
+
before { @object.main_admins << @user }
|
|
1204
|
+
it { should == :main_admin }
|
|
1205
|
+
end
|
|
1206
|
+
context "for the object being not structureable" do
|
|
1207
|
+
before { @object = "This is a string." }
|
|
1208
|
+
it { should == nil }
|
|
1209
|
+
end
|
|
1210
|
+
context "for descendant objects of administrated objects" do
|
|
1211
|
+
before { @object.admins << @user }
|
|
1212
|
+
it "should return the inherited role" do
|
|
1213
|
+
@user.role_for( @object ).should == :admin
|
|
1214
|
+
@user.role_for( @sub_object ).should == :admin
|
|
1215
|
+
@user.role_for( @sub_sub_object ).should == :admin
|
|
1216
|
+
end
|
|
1217
|
+
end
|
|
1218
|
+
end
|
|
1219
|
+
|
|
1220
|
+
# Member Status
|
|
1221
|
+
# ------------------------------------------------------------------------------------------
|
|
1222
|
+
|
|
1223
|
+
describe "#member_of?" do
|
|
1224
|
+
before do
|
|
1225
|
+
@group = create( :group ); @group.child_users << @user
|
|
1226
|
+
@page = create( :page )
|
|
1227
|
+
end
|
|
1228
|
+
context "for the user being a descendant of the object" do
|
|
1229
|
+
before { @page.child_groups << @group }
|
|
1230
|
+
subject { @user.member_of? @page }
|
|
1231
|
+
it { should == true }
|
|
1232
|
+
end
|
|
1233
|
+
context "for the user not being a descendant of the object" do
|
|
1234
|
+
subject { @user.member_of? @page }
|
|
1235
|
+
it "should be false" do
|
|
1236
|
+
@page.descendants.should_not include @user
|
|
1237
|
+
subject.should == false
|
|
1238
|
+
end
|
|
1239
|
+
end
|
|
1240
|
+
context "for the user being a member of the group object" do
|
|
1241
|
+
subject { @user.member_of? @group }
|
|
1242
|
+
it { should == true }
|
|
1243
|
+
end
|
|
1244
|
+
context "for the argument being not able to having children, e.g. a user or another object" do
|
|
1245
|
+
# this is a bug fix test
|
|
1246
|
+
before do
|
|
1247
|
+
@another_user = create( :user )
|
|
1248
|
+
@another_object = "This is a String."
|
|
1249
|
+
end
|
|
1250
|
+
it "should be simply false and not raise an error" do
|
|
1251
|
+
@user.member_of?( @another_user ).should == false
|
|
1252
|
+
@user.member_of?( @another_object ).should == false
|
|
1253
|
+
end
|
|
1254
|
+
end
|
|
1255
|
+
context "for the user being a former member of the group" do
|
|
1256
|
+
before { @group.unassign_user @user, at: 2.minutes.ago }
|
|
1257
|
+
subject { @user.member_of? @group }
|
|
1258
|
+
it { should == false }
|
|
1259
|
+
end
|
|
1260
|
+
context "for the user being a former indirect member of the group" do
|
|
1261
|
+
before do
|
|
1262
|
+
@ancestor_group = @group.ancestor_groups.create
|
|
1263
|
+
@group.unassign_user @user, at: 2.minutes.ago
|
|
1264
|
+
end
|
|
1265
|
+
subject { @user.member_of? @ancestor_group }
|
|
1266
|
+
it { should == false }
|
|
1267
|
+
end
|
|
1268
|
+
end
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
# Admins
|
|
1272
|
+
# ------------------------------------------------------------------------------------------
|
|
1273
|
+
|
|
1274
|
+
describe "#admin_of" do
|
|
1275
|
+
before do
|
|
1276
|
+
@group = create( :group, name: "Directly Administrated Group" )
|
|
1277
|
+
@group.find_or_create_admins_parent_group
|
|
1278
|
+
@group.admins_parent.child_users << @user
|
|
1279
|
+
end
|
|
1280
|
+
subject { @user.admin_of }
|
|
1281
|
+
it { should == @user.administrated_objects }
|
|
1282
|
+
end
|
|
1283
|
+
|
|
1284
|
+
describe "#admin_of?" do
|
|
1285
|
+
before do
|
|
1286
|
+
@group = create( :group, name: "Directly Administrated Group" )
|
|
1287
|
+
@sub_group = create( :group, name: "Indirectly Administrated Group" )
|
|
1288
|
+
@sub_group.parent_groups << @group
|
|
1289
|
+
end
|
|
1290
|
+
context "for the user being admin" do
|
|
1291
|
+
before do
|
|
1292
|
+
@group.find_or_create_admins_parent_group
|
|
1293
|
+
@group.admins_parent.child_users << @user # the @user is direct admin of @group
|
|
1294
|
+
end
|
|
1295
|
+
context "for directly administrated objects" do
|
|
1296
|
+
subject { @user.admin_of? @group }
|
|
1297
|
+
it "should state that the user is admin" do
|
|
1298
|
+
subject.should == true
|
|
1299
|
+
end
|
|
1300
|
+
end
|
|
1301
|
+
context "for indirectly administrated objects" do
|
|
1302
|
+
subject { @user.admin_of? @sub_group }
|
|
1303
|
+
it "should state that the user is admin" do
|
|
1304
|
+
subject.should == true
|
|
1305
|
+
end
|
|
1306
|
+
end
|
|
1307
|
+
end
|
|
1308
|
+
context "for the user being main admin" do
|
|
1309
|
+
before do
|
|
1310
|
+
@group.create_main_admins_parent_group
|
|
1311
|
+
@group.main_admins_parent.child_users << @user
|
|
1312
|
+
end
|
|
1313
|
+
subject { @user.admin_of? @group }
|
|
1314
|
+
it { should == true }
|
|
1315
|
+
end
|
|
1316
|
+
context "for some object the user is no admin of" do
|
|
1317
|
+
before { @other_object = Page.create }
|
|
1318
|
+
subject { @user.admin_of? @other_object }
|
|
1319
|
+
it { should == false }
|
|
1320
|
+
end
|
|
1321
|
+
end
|
|
1322
|
+
|
|
1323
|
+
describe "#directly_administrated_objects" do
|
|
1324
|
+
before do
|
|
1325
|
+
@group = create( :group, name: "Directly Administrated Group" )
|
|
1326
|
+
@group.find_or_create_admins_parent_group
|
|
1327
|
+
end
|
|
1328
|
+
subject { @user.directly_administrated_objects }
|
|
1329
|
+
it { should be_kind_of Array }
|
|
1330
|
+
context "for the user being admin of objects" do
|
|
1331
|
+
before { @group.admins_parent.child_users << @user }
|
|
1332
|
+
it "should list the objects the user is directly admin of" do
|
|
1333
|
+
subject.should include @group
|
|
1334
|
+
end
|
|
1335
|
+
end
|
|
1336
|
+
end
|
|
1337
|
+
|
|
1338
|
+
describe "#administrated_objects" do
|
|
1339
|
+
before do
|
|
1340
|
+
@group = create( :group, name: "Administrated Group" )
|
|
1341
|
+
@group.find_or_create_admins_parent_group
|
|
1342
|
+
end
|
|
1343
|
+
subject { @user.administrated_objects }
|
|
1344
|
+
it { should be_kind_of Array }
|
|
1345
|
+
context "for the user being admin of an object" do
|
|
1346
|
+
before { @group.admins_parent.child_users << @user }
|
|
1347
|
+
it "should list all objects administrated by the user" do
|
|
1348
|
+
@group.admins_parent.should be_kind_of Group
|
|
1349
|
+
@group.admins_parent.child_users.should include @user
|
|
1350
|
+
subject.should include @group
|
|
1351
|
+
end
|
|
1352
|
+
end
|
|
1353
|
+
context "for the user being an indirect admin of an object" do
|
|
1354
|
+
before do
|
|
1355
|
+
@sub_group = create( :group, name: "Indirectly Administrated Group" )
|
|
1356
|
+
@sub_group.parent_groups << @group
|
|
1357
|
+
@group.admins_parent.child_users << @user
|
|
1358
|
+
end
|
|
1359
|
+
it "should list directly and indirectly administrated objects" do
|
|
1360
|
+
subject.should include( @group, @sub_group )
|
|
1361
|
+
end
|
|
1362
|
+
end
|
|
1363
|
+
end
|
|
1364
|
+
|
|
1365
|
+
# Main Admins
|
|
1366
|
+
# ------------------------------------------------------------------------------------------
|
|
1367
|
+
|
|
1368
|
+
describe "#main_admin_of?" do
|
|
1369
|
+
before do
|
|
1370
|
+
@page = create( :page )
|
|
1371
|
+
end
|
|
1372
|
+
subject { @user.main_admin_of? @page }
|
|
1373
|
+
context "for the main_admins_parent_group existing" do
|
|
1374
|
+
before { @page.create_main_admins_parent_group }
|
|
1375
|
+
context "for the user being a main admin of the object" do
|
|
1376
|
+
before { @page.main_admins << @user }
|
|
1377
|
+
it { should == true }
|
|
1378
|
+
end
|
|
1379
|
+
context "for the user being just a regular admin of the object" do
|
|
1380
|
+
before { @page.admins << @user }
|
|
1381
|
+
it { should == false }
|
|
1382
|
+
end
|
|
1383
|
+
context "for the user being just a regular member of the object" do
|
|
1384
|
+
before do
|
|
1385
|
+
@group = create( :group )
|
|
1386
|
+
@group.child_users << @user
|
|
1387
|
+
@page.child_groups << @group
|
|
1388
|
+
end
|
|
1389
|
+
it "should be false" do
|
|
1390
|
+
@user.member_of?( @page ).should be_true # just to make sure
|
|
1391
|
+
subject.should == false
|
|
1392
|
+
end
|
|
1393
|
+
end
|
|
1394
|
+
end
|
|
1395
|
+
end
|
|
1396
|
+
|
|
1397
|
+
|
|
1398
|
+
# Guest Status
|
|
1399
|
+
# ==========================================================================================
|
|
1400
|
+
|
|
1401
|
+
describe "#guest_of?" do
|
|
1402
|
+
before { @group = create( :group ) }
|
|
1403
|
+
subject { @user.guest_of? @group }
|
|
1404
|
+
context "for the user being not a guest of the given group" do
|
|
1405
|
+
it { should == false }
|
|
1406
|
+
end
|
|
1407
|
+
context "for the user being a guest of the given group" do
|
|
1408
|
+
before do
|
|
1409
|
+
@group.find_or_create_guests_parent_group
|
|
1410
|
+
@group.guests << @user
|
|
1411
|
+
end
|
|
1412
|
+
it { should == true }
|
|
1413
|
+
end
|
|
1414
|
+
end
|
|
1415
|
+
|
|
1416
|
+
|
|
1417
|
+
# Developers
|
|
1418
|
+
# ==========================================================================================
|
|
1419
|
+
|
|
1420
|
+
describe "#developer?" do
|
|
1421
|
+
subject { @user.developer? }
|
|
1422
|
+
describe "for no developers group existing" do
|
|
1423
|
+
it { should == false }
|
|
1424
|
+
end
|
|
1425
|
+
describe "for the user being no member of the developers group" do
|
|
1426
|
+
before { Group.create_developers_group }
|
|
1427
|
+
it { should == false }
|
|
1428
|
+
end
|
|
1429
|
+
describe "for the user being member of the developers group" do
|
|
1430
|
+
before { Group.create_developers_group.assign_user @user }
|
|
1431
|
+
it { should == true }
|
|
1432
|
+
end
|
|
1433
|
+
end
|
|
1434
|
+
describe "#developer = " do
|
|
1435
|
+
describe "true" do
|
|
1436
|
+
subject { @user.developer = true }
|
|
1437
|
+
it "should assign the user to the developers group" do
|
|
1438
|
+
@user.should_not be_member_of Group.developers
|
|
1439
|
+
subject
|
|
1440
|
+
@user.should be_member_of Group.developers
|
|
1441
|
+
end
|
|
1442
|
+
end
|
|
1443
|
+
describe "false" do
|
|
1444
|
+
before { @user.developer = true }
|
|
1445
|
+
subject { @user.developer = false; time_travel 2.seconds }
|
|
1446
|
+
it "should un-assign the user from the developers group" do
|
|
1447
|
+
@user.should be_member_of Group.developers
|
|
1448
|
+
subject
|
|
1449
|
+
@user.should_not be_member_of Group.developers
|
|
1450
|
+
end
|
|
1451
|
+
end
|
|
1452
|
+
end
|
|
1453
|
+
|
|
1454
|
+
|
|
1455
|
+
# Hidden Users
|
|
1456
|
+
# ==========================================================================================
|
|
1457
|
+
|
|
1458
|
+
describe '#hidden?' do
|
|
1459
|
+
subject { @user.hidden? }
|
|
1460
|
+
end
|
|
1461
|
+
|
|
1462
|
+
describe '#cached(:hidden)' do
|
|
1463
|
+
subject { @user.cached(:hidden) }
|
|
1464
|
+
describe 'for the user not being hidden' do
|
|
1465
|
+
before do
|
|
1466
|
+
@user.cached(:hidden)
|
|
1467
|
+
wait_for_cache
|
|
1468
|
+
|
|
1469
|
+
@user.hidden = true
|
|
1470
|
+
@user.reload
|
|
1471
|
+
end
|
|
1472
|
+
it { should == @user.hidden }
|
|
1473
|
+
end
|
|
1474
|
+
describe 'for the user being hidden' do
|
|
1475
|
+
before do
|
|
1476
|
+
@user.hidden = true
|
|
1477
|
+
@user.cached(:hidden)
|
|
1478
|
+
@user.hidden = false
|
|
1479
|
+
end
|
|
1480
|
+
it { should == @user.hidden }
|
|
1481
|
+
end
|
|
1482
|
+
end
|
|
1483
|
+
|
|
1484
|
+
describe '#hidden=' do
|
|
1485
|
+
describe 'true' do
|
|
1486
|
+
subject { @user.hidden = true }
|
|
1487
|
+
describe 'for the user being hidden' do
|
|
1488
|
+
before { @user.hidden = true }
|
|
1489
|
+
it 'should make sure user is in the hidden_users group' do
|
|
1490
|
+
@user.should be_member_of Group.hidden_users
|
|
1491
|
+
subject
|
|
1492
|
+
@user.should be_member_of Group.hidden_users
|
|
1493
|
+
end
|
|
1494
|
+
end
|
|
1495
|
+
describe 'for the user not being hidden' do
|
|
1496
|
+
it 'should assign the user to the hidden_users group' do
|
|
1497
|
+
@user.should_not be_member_of Group.hidden_users
|
|
1498
|
+
subject
|
|
1499
|
+
@user.should be_member_of Group.hidden_users
|
|
1500
|
+
end
|
|
1501
|
+
end
|
|
1502
|
+
end
|
|
1503
|
+
describe 'false' do
|
|
1504
|
+
subject { @user.hidden = false; time_travel 2.seconds }
|
|
1505
|
+
describe 'for the user being hidden' do
|
|
1506
|
+
before { @user.hidden = true }
|
|
1507
|
+
it 'should remove the user from the hidden_users group' do
|
|
1508
|
+
@user.should be_member_of Group.hidden_users
|
|
1509
|
+
subject
|
|
1510
|
+
@user.should_not be_member_of Group.hidden_users
|
|
1511
|
+
end
|
|
1512
|
+
end
|
|
1513
|
+
describe 'for the user not being hidden' do
|
|
1514
|
+
it 'should make sure the user is not in the hidden_users group' do
|
|
1515
|
+
@user.should_not be_member_of Group.hidden_users
|
|
1516
|
+
subject
|
|
1517
|
+
@user.should_not be_member_of Group.hidden_users
|
|
1518
|
+
end
|
|
1519
|
+
end
|
|
1520
|
+
end
|
|
1521
|
+
end
|
|
1522
|
+
|
|
1523
|
+
|
|
1524
|
+
# Group Flags
|
|
1525
|
+
# ==========================================================================================
|
|
1526
|
+
|
|
1527
|
+
describe "#group_flags" do
|
|
1528
|
+
before { @user = create(:user) }
|
|
1529
|
+
subject { @user.group_flags }
|
|
1530
|
+
describe "for the user being hidden" do
|
|
1531
|
+
before { @user.hidden = true }
|
|
1532
|
+
it { should include 'hidden_users' }
|
|
1533
|
+
end
|
|
1534
|
+
describe "for the user not being hidden" do
|
|
1535
|
+
it { should_not include 'hidden_users' }
|
|
1536
|
+
end
|
|
1537
|
+
end
|
|
1538
|
+
|
|
1539
|
+
|
|
1540
|
+
# User Creation
|
|
1541
|
+
# ==========================================================================================
|
|
1542
|
+
|
|
1543
|
+
describe ".create" do
|
|
1544
|
+
before { @params = {first_name: "Johnny", last_name: "Doe"} }
|
|
1545
|
+
subject { @user = User.create(@params) }
|
|
1546
|
+
describe "when #add_to_corporation is set to a corporation" do
|
|
1547
|
+
before do
|
|
1548
|
+
@corporation = create(:corporation_with_status_groups)
|
|
1549
|
+
@params.merge!({:add_to_corporation => @corporation})
|
|
1550
|
+
end
|
|
1551
|
+
it "should add the user to the first status group of this corporation" do
|
|
1552
|
+
subject
|
|
1553
|
+
@corporation.status_groups.first.members.should include @user
|
|
1554
|
+
end
|
|
1555
|
+
end
|
|
1556
|
+
describe "when #add_to_corporation is set to a corporation id" do
|
|
1557
|
+
before do
|
|
1558
|
+
@corporation = create(:corporation_with_status_groups)
|
|
1559
|
+
@params.merge!({:add_to_corporation => @corporation.id})
|
|
1560
|
+
end
|
|
1561
|
+
it "should add the user to the first status group of this corporation" do
|
|
1562
|
+
subject
|
|
1563
|
+
@corporation.status_groups.first.members.should include @user
|
|
1564
|
+
end
|
|
1565
|
+
end
|
|
1566
|
+
describe "when #add_to_corporation is set to a corporation id which is a String (via html form)" do
|
|
1567
|
+
before do
|
|
1568
|
+
@corporation = create(:corporation_with_status_groups)
|
|
1569
|
+
@params.merge!({:add_to_corporation => @corporation.id.to_s})
|
|
1570
|
+
end
|
|
1571
|
+
it "should add the user to the first status group of this corporation" do
|
|
1572
|
+
subject
|
|
1573
|
+
@corporation.status_groups.first.members.should include @user
|
|
1574
|
+
end
|
|
1575
|
+
end
|
|
1576
|
+
end
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
# Finder Methods
|
|
1580
|
+
# ==========================================================================================
|
|
1581
|
+
|
|
1582
|
+
describe ".find_all_by_identification_string" do
|
|
1583
|
+
before do
|
|
1584
|
+
@user.first_name = "Some First Name"
|
|
1585
|
+
@user.last_name = "UniqueLastName"
|
|
1586
|
+
@user.email = "unique@example.com"
|
|
1587
|
+
@user.alias = "s.unique"
|
|
1588
|
+
@user.save
|
|
1589
|
+
end
|
|
1590
|
+
describe "for a given alias" do
|
|
1591
|
+
subject { User.find_all_by_identification_string( @user.alias ) }
|
|
1592
|
+
it { should == [ @user ] }
|
|
1593
|
+
end
|
|
1594
|
+
describe "for a given last_name" do
|
|
1595
|
+
subject { User.find_all_by_identification_string( @user.last_name ) }
|
|
1596
|
+
it { should == [ @user ] }
|
|
1597
|
+
end
|
|
1598
|
+
describe "for a given name" do
|
|
1599
|
+
subject { User.find_all_by_identification_string( "#{@user.first_name} #{@user.last_name}" ) }
|
|
1600
|
+
it { should == [ @user ] }
|
|
1601
|
+
end
|
|
1602
|
+
describe "for a given email" do
|
|
1603
|
+
subject { User.find_all_by_identification_string( @user.email ) }
|
|
1604
|
+
it { should == [ @user ] }
|
|
1605
|
+
end
|
|
1606
|
+
describe "for given nonsense" do
|
|
1607
|
+
subject { User.find_all_by_identification_string( "f kas#dfk aoefak!" ) }
|
|
1608
|
+
it { should == [] }
|
|
1609
|
+
end
|
|
1610
|
+
end
|
|
1611
|
+
|
|
1612
|
+
describe ".find_by_title" do
|
|
1613
|
+
before do
|
|
1614
|
+
@user.first_name = "Johnny"
|
|
1615
|
+
@user.last_name = "Doe"
|
|
1616
|
+
@user.save
|
|
1617
|
+
@title = @user.title
|
|
1618
|
+
end
|
|
1619
|
+
specify { @title.should_not be_empty }
|
|
1620
|
+
subject { User.find_by_title( @title ) }
|
|
1621
|
+
it "should find the user by its title" do
|
|
1622
|
+
subject.should == @user
|
|
1623
|
+
end
|
|
1624
|
+
end
|
|
1625
|
+
|
|
1626
|
+
describe ".find_all_by_name" do
|
|
1627
|
+
before do
|
|
1628
|
+
@user = create( :user )
|
|
1629
|
+
end
|
|
1630
|
+
subject { User.find_all_by_name( @user.name ) }
|
|
1631
|
+
it { should include( @user ) }
|
|
1632
|
+
it "should be case-insensitive" do
|
|
1633
|
+
User.find_all_by_name( @user.name.upcase ).should include( @user )
|
|
1634
|
+
User.find_all_by_name( @user.name.downcase ).should include( @user )
|
|
1635
|
+
end
|
|
1636
|
+
end
|
|
1637
|
+
|
|
1638
|
+
describe ".find_by_name" do
|
|
1639
|
+
before do
|
|
1640
|
+
@user = create( :user )
|
|
1641
|
+
end
|
|
1642
|
+
subject { User.find_by_name( @user.name ) }
|
|
1643
|
+
it { should == @user }
|
|
1644
|
+
end
|
|
1645
|
+
|
|
1646
|
+
describe ".find_all_by_email" do
|
|
1647
|
+
before do
|
|
1648
|
+
@user = create( :user )
|
|
1649
|
+
end
|
|
1650
|
+
subject { User.find_all_by_email( @user.email ) }
|
|
1651
|
+
it { should include( @user ) }
|
|
1652
|
+
it "should be case-insensitive" do
|
|
1653
|
+
User.find_all_by_email( @user.email.upcase ).should include( @user )
|
|
1654
|
+
User.find_all_by_email( @user.email.downcase ).should include( @user )
|
|
1655
|
+
end
|
|
1656
|
+
end
|
|
1657
|
+
|
|
1658
|
+
describe ".hidden" do
|
|
1659
|
+
before do
|
|
1660
|
+
@hidden_user = create(:user); @hidden_user.hidden = true
|
|
1661
|
+
@visible_user = create(:user)
|
|
1662
|
+
end
|
|
1663
|
+
subject { User.hidden }
|
|
1664
|
+
it { should be_kind_of ActiveRecord::Relation }
|
|
1665
|
+
it { should include @hidden_user }
|
|
1666
|
+
it { should_not include @visible_user }
|
|
1667
|
+
it "should be chainable" do
|
|
1668
|
+
subject.where(id: @hidden_user.id).should == User.where(id: @hidden_user.id).hidden
|
|
1669
|
+
subject.count.should > 0
|
|
1670
|
+
end
|
|
1671
|
+
end
|
|
1672
|
+
|
|
1673
|
+
describe ".deceased" do
|
|
1674
|
+
before do
|
|
1675
|
+
@deceased_user = create(:user); @deceased_user.mark_as_deceased(at: 1.year.ago)
|
|
1676
|
+
@alive_user = create(:user)
|
|
1677
|
+
end
|
|
1678
|
+
subject { User.deceased }
|
|
1679
|
+
it { should be_kind_of ActiveRecord::Relation }
|
|
1680
|
+
it { should include @deceased_user }
|
|
1681
|
+
it { should_not include @alive_user }
|
|
1682
|
+
it "should be chainable" do
|
|
1683
|
+
subject.where(id: @deceased_user.id).to_a.should == User.where(id: @deceased_user.id).deceased.to_a
|
|
1684
|
+
end
|
|
1685
|
+
end
|
|
1686
|
+
|
|
1687
|
+
describe ".alive" do
|
|
1688
|
+
before do
|
|
1689
|
+
@deceased_user = create(:user); @deceased_user.mark_as_deceased(at: 1.year.ago)
|
|
1690
|
+
@alive_user = create(:user)
|
|
1691
|
+
end
|
|
1692
|
+
subject { User.alive }
|
|
1693
|
+
it { should be_kind_of ActiveRecord::Relation }
|
|
1694
|
+
it { should_not include @deceased_user }
|
|
1695
|
+
it { should include @alive_user }
|
|
1696
|
+
it "should be chainable" do
|
|
1697
|
+
subject.where(id: @alive_user.id).to_a.should == User.where(id: @alive_user.id).alive.to_a
|
|
1698
|
+
end
|
|
1699
|
+
specify "there should be no user that is deceased and alive" do
|
|
1700
|
+
User.alive.deceased.should == []
|
|
1701
|
+
User.deceased.alive.should == []
|
|
1702
|
+
end
|
|
1703
|
+
end
|
|
1704
|
+
|
|
1705
|
+
describe ".without_account" do
|
|
1706
|
+
before do
|
|
1707
|
+
@user_with_account = create(:user_with_account)
|
|
1708
|
+
@user_without_account = create(:user)
|
|
1709
|
+
end
|
|
1710
|
+
subject { User.without_account }
|
|
1711
|
+
it { should be_kind_of ActiveRecord::Relation }
|
|
1712
|
+
it { should include @user_without_account }
|
|
1713
|
+
it { should_not include @user_with_account }
|
|
1714
|
+
it "should be chainable" do
|
|
1715
|
+
subject.where(id: @user_without_account.id).to_a.should == User.where(id: @user_without_account.id).without_account.to_a
|
|
1716
|
+
end
|
|
1717
|
+
end
|
|
1718
|
+
|
|
1719
|
+
describe ".with_email" do
|
|
1720
|
+
before do
|
|
1721
|
+
@user_with_email = create(:user)
|
|
1722
|
+
@user_without_email = create(:user)
|
|
1723
|
+
@user_without_email.profile_fields.destroy_all
|
|
1724
|
+
@user_with_empty_email = create(:user)
|
|
1725
|
+
@user_with_empty_email.profile_fields.where(type: 'ProfileFieldTypes::Email').first.update_attributes(:value => nil) # to circumvent validation
|
|
1726
|
+
end
|
|
1727
|
+
subject { User.with_email }
|
|
1728
|
+
specify "prelims" do
|
|
1729
|
+
@user_with_empty_email.email.should == nil
|
|
1730
|
+
end
|
|
1731
|
+
it { should be_kind_of ActiveRecord::Relation }
|
|
1732
|
+
it { should include @user_with_email }
|
|
1733
|
+
it { should_not include @user_without_email }
|
|
1734
|
+
it { should_not include @user_with_empty_email }
|
|
1735
|
+
it "should be chainable" do
|
|
1736
|
+
subject.where(id: @user_with_email.id).to_a.should == User.where(id: @user_with_email.id).with_email.to_a
|
|
1737
|
+
end
|
|
1738
|
+
end
|
|
1739
|
+
|
|
1740
|
+
describe ".applicable_for_new_account" do
|
|
1741
|
+
before do
|
|
1742
|
+
@hidden_user = create(:user); @hidden_user.hidden = true
|
|
1743
|
+
@visible_user = create(:user)
|
|
1744
|
+
@deceased_user = create(:user); @deceased_user.mark_as_deceased(at: 1.year.ago)
|
|
1745
|
+
@alive_user = create(:user)
|
|
1746
|
+
@user_with_account = create(:user_with_account)
|
|
1747
|
+
@user_without_account = create(:user)
|
|
1748
|
+
@user_with_email = create(:user)
|
|
1749
|
+
@user_without_email = create(:user)
|
|
1750
|
+
@user_without_email.profile_fields.destroy_all
|
|
1751
|
+
@user_with_empty_email = create(:user)
|
|
1752
|
+
@user_with_empty_email.profile_fields.where(type: 'ProfileFieldTypes::Email').first.update_attribute(:value, '')
|
|
1753
|
+
end
|
|
1754
|
+
subject { User.applicable_for_new_account }
|
|
1755
|
+
it { should be_kind_of ActiveRecord::Relation }
|
|
1756
|
+
it { should include @hidden_user }
|
|
1757
|
+
it { should include @visible_user }
|
|
1758
|
+
it { should_not include @deceased_user }
|
|
1759
|
+
it { should include @alive_user }
|
|
1760
|
+
it { should_not include @user_with_account }
|
|
1761
|
+
it { should include @user_without_account }
|
|
1762
|
+
it { should include @user_with_email }
|
|
1763
|
+
it { should_not include @user_without_email }
|
|
1764
|
+
it { should_not include @user_with_empty_email }
|
|
1765
|
+
end
|
|
1766
|
+
|
|
1767
|
+
describe "(postal address finder methods)" do
|
|
1768
|
+
before do
|
|
1769
|
+
@user_with_address = create(:user)
|
|
1770
|
+
@user_with_address.profile_fields.create(type: 'ProfileFieldTypes::Address', value: "Pariser Platz 1\n 10117 Berlin")
|
|
1771
|
+
@user_without_address = create(:user)
|
|
1772
|
+
@user_with_empty_address = create(:user)
|
|
1773
|
+
@user_with_empty_address.profile_fields.create(type: 'ProfileFieldTypes::Address', value: "")
|
|
1774
|
+
end
|
|
1775
|
+
|
|
1776
|
+
describe ".with_postal_address" do
|
|
1777
|
+
subject { User.with_postal_address }
|
|
1778
|
+
it { should be_kind_of ActiveRecord::Relation }
|
|
1779
|
+
it { should include @user_with_address }
|
|
1780
|
+
it { should_not include @user_without_address }
|
|
1781
|
+
it { should_not include @user_with_empty_address }
|
|
1782
|
+
end
|
|
1783
|
+
|
|
1784
|
+
describe ".without_postal_address" do
|
|
1785
|
+
subject { User.without_postal_address }
|
|
1786
|
+
it { should be_kind_of ActiveRecord::Relation }
|
|
1787
|
+
it { should include @user_without_address }
|
|
1788
|
+
it { should include @user_with_empty_address }
|
|
1789
|
+
it { should_not include @user_with_address }
|
|
1790
|
+
end
|
|
1791
|
+
end
|
|
1792
|
+
|
|
1793
|
+
end
|
|
1794
|
+
|