diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb new file mode 100644 index 000000000..8e49a49f6 --- /dev/null +++ b/app/controllers/account_controller.rb @@ -0,0 +1,12 @@ +class AccountController < ApplicationController + # GET /account + # + def show + end + + # GET /account/edit + # + def edit + @user = current_user + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 2b934011e..923b2a603 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -47,7 +47,7 @@ def store_location def after_sign_in_path_for(user) if user.members.present? - users_path + members_path else page_path("about") end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index d257c39e4..6da7e5d10 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -1,5 +1,5 @@ class HomeController < ApplicationController def index - redirect_to :users if current_user + redirect_to :members if current_user end end diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index c88ea52df..3fc377730 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -1,11 +1,36 @@ class MembersController < ApplicationController before_filter :authenticate_user! + # GET /members + # + def index + context = current_organization + .members + .includes(:account, :user) + context = context.where(active: true) unless (admin? || superadmin?) + + @memberships = context + end + + # GET /members/:member_uid + # + def show + find_member + @user = @member.user + @movements = @member + .movements + .order('created_at DESC') + .page(params[:page]) + .per(10) + end + + # DELETE /members/:member_uid + # def destroy find_member toggle_active_posts @member.destroy - redirect_to users_path + redirect_to members_path end def toggle_manager @@ -31,14 +56,54 @@ def toggle_active end end + # TODO: move to service and probably different controller + def give_time + find_member + @destination = @member.account.id + @source = find_transfer_source + @offer = find_transfer_offer + @transfer = Transfer.new( + source: @source, + destination: @destination, + post: @offer + ) + @sources = find_transfer_sources_for_admin + end + private + # TODO: rely on organization scope instead of current_organization def find_member - @member ||= current_organization.members.find(params[:id]) + @member ||= Member.where( + organization_id: current_organization.id, + member_uid: params[:member_uid] + ).first + + # TODO: better not found management please + raise unless @member end def toggle_active_posts current_organization.posts.where(user_id: @member.user_id). each { |post| post.update_attributes(active: false) } end + + # TODO: move to service and probably different controller + def find_transfer_offer + current_organization.offers. + find(params[:offer]) if params[:offer].present? + end + + # TODO: move to service and probably different controller + def find_transfer_source + current_user.members. + find_by(organization: current_organization).account.id + end + + # TODO: move to service and probably different controller + def find_transfer_sources_for_admin + return unless admin? + [current_organization.account] + + current_organization.member_accounts.where("members.active is true") + end end diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 08c47942c..fcd7c31b0 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -60,7 +60,11 @@ def show else model.all.active.of_active_members end - post = scope.find params[:id] + post = scope.find(params[:id]) + @member = Member.where( + organization: post.organization, + user: post.user + ) instance_variable_set("@#{resource}", post) end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 68f6fb828..723a57006 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -5,20 +5,13 @@ def scoped_users current_organization.users end - def index - @users = scoped_users - @memberships = current_organization.members. - where(user_id: @users.map(&:id)). - includes(:account).each_with_object({}) do |mem, ob| - ob[mem.user_id] = mem - end - end - + # GET /users/:id + # def show - @user = find_user - @member = @user.as_member_of(current_organization) - @movements = @member.movements.order("created_at DESC").page(params[:page]). - per(10) + @user = User.find_by_id(params[:id]) + # TODO: better not found management please + raise unless @user + authorize @user end def new @@ -61,18 +54,6 @@ def update end end - def give_time - @user = scoped_users.find(params[:id]) - @destination = @user.members. - find_by(organization: current_organization).account.id - @source = find_transfer_source - @offer = find_transfer_offer - @transfer = Transfer.new(source: @source, - destination: @destination, - post: @offer) - @sources = find_transfer_sources_for_admin - end - private def user_params @@ -85,22 +66,6 @@ def user_params params.require(:user).permit *fields_to_permit end - def find_transfer_offer - current_organization.offers. - find(params[:offer]) if params[:offer].present? - end - - def find_transfer_source - current_user.members. - find_by(organization: current_organization).account.id - end - - def find_transfer_sources_for_admin - return unless admin? - [current_organization.account] + - current_organization.member_accounts.where("members.active is true") - end - def find_user if current_user.id == params[:id].to_i current_user diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 947b95fa0..757cedfc8 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -1,28 +1,26 @@ module UsersHelper - # TODO refactor or eliminate - poosibly the second. + # TODO refactor or eliminate - possibly the second. def users_as_json - @users = (admin? || superadmin?) ? @users : @users.actives - @users.map do |user| - membership = @memberships[user.id] + @memberships.map do |membership| { - id: user.id, - avatar: avatar_url(user), - member_id: membership.member_uid, - username: user.username, - email: user.email_if_real, - unconfirmed_email: user.unconfirmed_email, - phone: user.phone, - alt_phone: user.alt_phone, + id: membership.user_id, + avatar: avatar_url(membership.user), + member_uid: membership.member_uid, + username: membership.user.username, + email: membership.user.email_if_real, + unconfirmed_email: membership.user.unconfirmed_email, + phone: membership.user.phone, + alt_phone: membership.user.alt_phone, balance: membership.account_balance.to_i, - url: user_path(user), - edit_link: edit_user_path(user), + url: member_path(membership.member_uid), + edit_link: edit_user_path(membership.user), cancel_link: cancel_member_path(membership), toggle_manager_link: toggle_manager_member_path(membership), manager: !!membership.manager, toggle_active_link: toggle_active_member_path(membership), active: membership.active?, - valid_email: user.has_valid_email? + valid_email: membership.user.has_valid_email? } end.to_json.html_safe end diff --git a/app/models/post.rb b/app/models/post.rb index e8b2ee624..25d749d45 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -36,13 +36,16 @@ def self.inherited(child) end end + # TODO: what is this? Can we delete it? attr_reader :member_id belongs_to :category belongs_to :user belongs_to :organization + # TODO: what is this? belongs_to :publisher, class_name: "User", foreign_key: "publisher_id" + # TODO: what is this? Can we delete it? # belongs_to :member, class_name: "Member", foreign_key: "user_id" has_many :user_members, class_name: "Member", through: :user, source: :members has_many :transfers diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb index a0b6b3739..504ce20be 100644 --- a/app/policies/user_policy.rb +++ b/app/policies/user_policy.rb @@ -3,6 +3,14 @@ def new? user.admins?(organization) end + def show? + return true if user.id == record.id + + record.organizations.any? do |org| + user.admins?(org) + end + end + def create? user.admins?(organization) end diff --git a/app/views/account/edit.html.erb b/app/views/account/edit.html.erb new file mode 100644 index 000000000..8b9133d95 --- /dev/null +++ b/app/views/account/edit.html.erb @@ -0,0 +1,6 @@ +<h1> + <%= @user.username %> + <small><%= t ".edit_user" %></small> +</h1> + +<%= render "users/form" %> diff --git a/app/views/account/show.html.erb b/app/views/account/show.html.erb new file mode 100644 index 000000000..5fed0574c --- /dev/null +++ b/app/views/account/show.html.erb @@ -0,0 +1,54 @@ +<div class="panel user-profile"> + <div class="panel-body"> + <h1> + <%= current_user.username %> + <small> + <% if current_user.superadmin? %> + <span class="label label-important"> + <%= t ".superadmin" %> + </span> + <% end %> + </small> + </h1> + <div class="row"> + <div class="col-sm-3 col-xs-5 text-center"> + <a href="https://www.gravatar.com" target="_blank"> + <%= image_tag avatar_url(current_user, 160) %> + </a> + </div> + <div class="col-sm-9 col-xs-7 break-word"> + <%= m current_user.description %> + <ul class="nav nav-pills pull-right"> + <li> + <%= link_to account_edit_path do %> + <%= glyph :pencil %> + <%= t "global.edit" %> + <% end %> + </li> + </ul> + <dl class="dl-horizontal"> + <h3> + <%= t "global.contact_details" %> + </h3> + <% if current_user.email_if_real != "" %> + <dt> + <%= User.human_attribute_name(:email) %> + </dt> + <dd> + <%= current_user.email_if_real %> + </dd> + <% end %> + <% phones = [current_user.phone, current_user.alt_phone].select(&:present?) %> + <% if phones.present? %> + <dt> + <%= t(".phone", count: phones.size) %> + </dt> + <dd> + <%= phones.map(&:to_s).join('—') %> + </dd> + <% end %> + </dl> + </div> + </div> + </div> +</div> diff --git a/app/views/application/_navbar.html.erb b/app/views/application/_navbar.html.erb index f6520881d..283aba0ea 100644 --- a/app/views/application/_navbar.html.erb +++ b/app/views/application/_navbar.html.erb @@ -48,7 +48,7 @@ <div class="row"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> <ul class="nav nav-pills actions-menu"> - <%= render 'application/menus/user_list_link' %> + <%= render 'application/menus/members_list_link' %> <%= render 'application/menus/offers_dashboard_link' %> <%= render 'application/menus/inquiries_list_link' %> <%= render 'application/menus/offers_by_tag_link' %> @@ -63,4 +63,4 @@ </div> </div> </nav> -<% end %> \ No newline at end of file +<% end %> diff --git a/app/views/application/menus/_members_list_link.html.erb b/app/views/application/menus/_members_list_link.html.erb new file mode 100644 index 000000000..ee8c9ccbb --- /dev/null +++ b/app/views/application/menus/_members_list_link.html.erb @@ -0,0 +1,6 @@ +<li class="<%= "active" if current_page?(members_path) %>"> + <%= link_to members_path do %> + <%= glyph :user %> + <%= Member.model_name.human.pluralize %> + <% end %> +</li> diff --git a/app/views/application/menus/_user_admin_menu.html.erb b/app/views/application/menus/_user_admin_menu.html.erb index 58f394025..d46a7697c 100644 --- a/app/views/application/menus/_user_admin_menu.html.erb +++ b/app/views/application/menus/_user_admin_menu.html.erb @@ -25,7 +25,7 @@ <li class="divider" role="presentation"></li> <% end %> <li role="presentation"> - <%= link_to current_user do %> + <%= link_to account_path do %> <%= glyph :user %> <%= t "layouts.application.edit_profile" %> <% end %> diff --git a/app/views/application/menus/_user_list_link.html.erb b/app/views/application/menus/_user_list_link.html.erb deleted file mode 100644 index e3bf2c45e..000000000 --- a/app/views/application/menus/_user_list_link.html.erb +++ /dev/null @@ -1,6 +0,0 @@ -<li class="<%= "active" if current_page?(users_path) %>"> - <%= link_to users_path do %> - <%= glyph :user %> - <%= User.model_name.human(count: :many) %> - <% end %> -</li> diff --git a/app/views/users/_user_rows.html.erb b/app/views/members/_members_rows.html.erb similarity index 91% rename from app/views/users/_user_rows.html.erb rename to app/views/members/_members_rows.html.erb index 0f7ada7b8..4f45bcc47 100644 --- a/app/views/users/_user_rows.html.erb +++ b/app/views/members/_members_rows.html.erb @@ -3,7 +3,7 @@ <td> <img ng-src="{{user.avatar}}" height: "32px" width: "32px"> </td> - <td>{{user.member_id}}</td> + <td>{{user.member_uid}}</td> <td> <span class="glyphicon glyphicon-time" ng-if="!user.active"></span> <a ng-href="{{user.url}}">{{user.username}}</a> @@ -21,10 +21,6 @@ <td> {{user.balance | timeBalance}} </td> <% if current_user.manages?(current_organization) %> <td class="hover-actions"> - <a class="action" ng-if="user.edit_link" ng-href="{{user.edit_link}}"> - <%= glyph :pencil %> - <%= t "global.edit" %> - </a> <a class="action" ng-if="user.cancel_link && !user.active" ng-href="{{user.cancel_link}}" diff --git a/app/views/users/give_time.html.erb b/app/views/members/give_time.html.erb similarity index 91% rename from app/views/users/give_time.html.erb rename to app/views/members/give_time.html.erb index 2b5b143df..0e5d7f9c4 100644 --- a/app/views/users/give_time.html.erb +++ b/app/views/members/give_time.html.erb @@ -2,7 +2,7 @@ <small> <%= t ".give_time" %> </small> - <%= link_to @user.member(current_organization).display_name_with_uid, user_path(@user) %> + <%= link_to @member.display_name_with_uid, member_path(@member.member_uid) %> </h1> <% if @offer %> <h3> @@ -49,7 +49,7 @@ <%= f.input :post, readonly: true %> <%= f.input :post_id, as: :hidden %> <% else %> - <%= f.input :post_id, collection: @user.member(current_organization).offers.active %> + <%= f.input :post_id, collection: @member.offers.active %> <% end %> </div> <div class="form-actions"> diff --git a/app/views/users/index.html.erb b/app/views/members/index.html.erb similarity index 95% rename from app/views/users/index.html.erb rename to app/views/members/index.html.erb index 546e630fa..d0f549e2a 100644 --- a/app/views/users/index.html.erb +++ b/app/views/members/index.html.erb @@ -1,6 +1,6 @@ <div ng-controller="UserListCtrl"> <h1> - <%= User.model_name.human.pluralize %> + <%= Member.model_name.human.pluralize %> — <%= link_to current_organization.name, organization_path(current_organization) %> @@ -23,7 +23,7 @@ <li> <a href="<%= new_user_path %>"> <span class="glyphicon glyphicon-plus"></span> - <%= t "helpers.submit.create", model: User.model_name.human %> + <%= t "helpers.submit.create", model: Member.model_name.human %> </a> </li> <% end %> @@ -78,7 +78,7 @@ </tr> </thead> <tbody> - <%= render "user_rows", users: @users %> + <%= render "members_rows", users: @memberships %> </tbody> </table> </div> diff --git a/app/views/members/show.html.erb b/app/views/members/show.html.erb new file mode 100644 index 000000000..781192652 --- /dev/null +++ b/app/views/members/show.html.erb @@ -0,0 +1,168 @@ +<div class="panel user-profile"> + <div class="panel-body"> + <h1> + <small> + <% unless @member.active %> + <%= t ".inactive" %> + <% end %> + </small> + <%= @member.display_name_with_uid %> + <small> + <% if @user.superadmin? %> + <span class="label label-important"> + <%= t ".superadmin" %> + </span> + <% end %> + </small> + </h1> + <div class="row"> + <div class="col-sm-3 col-xs-5 text-center"> + <% if @user == current_user %> + <a href="https://www.gravatar.com" target="_blank"> + <%= image_tag avatar_url(@user, 160) %> + </a> + <% else %> + <%= image_tag avatar_url(@user, 160) %> + <% end %> + </div> + <div class="col-sm-9 col-xs-7 break-word"> + <%= m @user.description %> + <ul class="nav nav-pills pull-right"> + <% if admin? || @user == current_user %> + <li> + <%= link_to edit_user_path(@user) do %> + <%= glyph :pencil %> + <%= t "global.edit" %> + <% end %> + </li> + <% end %> + <% if admin? || @user != current_user %> + <li> + <%= link_to give_time_member_path(@member.member_uid) do %> + <%= glyph :time %> + <%= t "global.give_time" %> + <% end %> + </li> + <% end %> + </ul> + <dl class="dl-horizontal"> + <h3> + <%= t "global.contact_details" %> + </h3> + <% if @user.email_if_real != "" %> + <dt> + <%= User.human_attribute_name(:email) %> + </dt> + <dd> + <%= @user.email_if_real %> + </dd> + <% end %> + <% phones = [@user.phone, @user.alt_phone].select(&:present?) %> + <% if phones.present? %> + <dt> + <%= t(".phone", count: phones.size) %> + </dt> + <dd> + <%= phones.map(&:to_s).join('—') %> + </dd> + <% end %> + </dl> + </div> + </div> + </div> +</div> +<div class="row"> + <div class="col-sm-6 offers"> + <div class="panel panel-default break-word"> + <div class="panel-heading"> + <h2 class="panel-title"> + <%= Offer.model_name.human(count: :many) %> + <% if @user == current_user %> + <a class="pull-right" href="<%= new_offer_path %>"> + <%= glyph :plus %> + </a> + <% end %> + </h2> + </div> + <% @member.offers.active.each do |post| %> + <div class="row panel-body"> + <div class="col-sm-3"> + <%= link_to post, post %> + </div> + <div class="col-sm-8"> + <%= strip_tags(post.rendered_description.to_html) %> + </div> + <div class="col-sm-1"> + <% if @user != current_user %> + <%= link_to give_time_member_path(@member.member_uid, offer: post.id) do %> + <%= glyph :time %> + <% end %> + <% end %> + </div> + </div> + <% end %> + </table> + </div> + </div> + <div class="col-sm-6 inquiries"> + <div class="panel panel-default break-word"> + <div class="panel-heading"> + <h2 class="panel-title"> + <%= Inquiry.model_name.human(count: :many) %> + <% if @user == current_user %> + <a class="pull-right" href="<%= new_inquiry_path %>"> + <%= glyph :plus %> + </a> + <% end %> + </h2> + </div> + <% @member.inquiries.active.each do |post| %> + <div class="row panel-body"> + <div class="col-sm-3"> + <%= link_to post, post %> + </div> + <div class="col-sm-9"> + <%= strip_tags(post.rendered_description.to_html) %> + </div> + </div> + <% end %> + </table> + </div> + </div> +</div> +<div class="row"> + <div class="col-sm-4"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title"> + <%= t(".accounts") %> + </h3> + </div> + <div class="panel-body"> + <% if @member.manager %> + <p class="danger"> + ADMIN + </p> + <% end %> + <p> + <strong> + <%= t(".created_at") %> + </strong> + <%= @member.entry_date ? l(@member.entry_date, format: :long) : mdash %> + <br/> + <strong> + <%= t(".user_no") %> + </strong> + <%= @member.member_uid || mdash %> + <br/> + <strong class="lead <%= green_red(@member.account&.balance) %>"> + <%= t(".balance") %> + <%= seconds_to_hm(@member.account.try(:balance) || mdash) %> + </strong> + </p> + </div> + </div> + </div> +</div> + +<%= render 'shared/movements' %> diff --git a/app/views/offers/show.html.erb b/app/views/offers/show.html.erb index 95d9e3a98..7a76503e9 100644 --- a/app/views/offers/show.html.erb +++ b/app/views/offers/show.html.erb @@ -12,7 +12,7 @@ <% end %> <% end %> <% if current_user and @offer.user != current_user %> - <%= link_to give_time_user_path(@offer.user, offer: @offer.id), + <%= link_to give_time_member_path(@member.member_uid, offer: @offer.id), class: "btn btn-success" do %> <%= glyph :time %> <%= t ".give_time_for" %> diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index f5e7fa4c9..101e6579a 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -1,12 +1,7 @@ <div class="panel user-profile"> <div class="panel-body"> <h1> - <small> - <% unless @member.active %> - <%= t ".inactive" %> - <% end %> - </small> - <%= @member.display_name_with_uid %> + <%= @user.username %> <small> <% if @user.superadmin? %> <span class="label label-important"> @@ -30,20 +25,12 @@ <ul class="nav nav-pills pull-right"> <% if @user == current_user %> <li> - <%= link_to edit_user_path(@user) do %> + <%= link_to account_edit_path do %> <%= glyph :pencil %> <%= t "global.edit" %> <% end %> </li> <% end %> - <% if admin? || @user != current_user %> - <li> - <%= link_to give_time_user_path(@user) do %> - <%= glyph :time %> - <%= t "global.give_time" %> - <% end %> - </li> - <% end %> </ul> <dl class="dl-horizontal"> <h3> @@ -71,98 +58,3 @@ </div> </div> </div> -<div class="row"> - <div class="col-sm-6 offers"> - <div class="panel panel-default break-word"> - <div class="panel-heading"> - <h2 class="panel-title"> - <%= Offer.model_name.human(count: :many) %> - <% if @user == current_user %> - <a class="pull-right" href="<%= new_offer_path %>"> - <%= glyph :plus %> - </a> - <% end %> - </h2> - </div> - <% @member.offers.active.each do |post| %> - <div class="row panel-body"> - <div class="col-sm-3"> - <%= link_to post, post %> - </div> - <div class="col-sm-8"> - <%= strip_tags(post.rendered_description.to_html) %> - </div> - <div class="col-sm-1"> - <% if @user != current_user %> - <%= link_to give_time_user_path(@user, offer: post.id) do %> - <%= glyph :time %> - <% end %> - <% end %> - </div> - </div> - <% end %> - </table> - </div> - </div> - <div class="col-sm-6 inquiries"> - <div class="panel panel-default break-word"> - <div class="panel-heading"> - <h2 class="panel-title"> - <%= Inquiry.model_name.human(count: :many) %> - <% if @user == current_user %> - <a class="pull-right" href="<%= new_inquiry_path %>"> - <%= glyph :plus %> - </a> - <% end %> - </h2> - </div> - <% @member.inquiries.active.each do |post| %> - <div class="row panel-body"> - <div class="col-sm-3"> - <%= link_to post, post %> - </div> - <div class="col-sm-9"> - <%= strip_tags(post.rendered_description.to_html) %> - </div> - </div> - <% end %> - </table> - </div> - </div> -</div> -<div class="row"> - <div class="col-sm-4"> - <div class="panel panel-default"> - <div class="panel-heading"> - <h3 class="panel-title"> - <%= t(".accounts") %> - </h3> - </div> - <div class="panel-body"> - <% if @member.manager %> - <p class="danger"> - ADMIN - </p> - <% end %> - <p> - <strong> - <%= t(".created_at") %> - </strong> - <%= @member.entry_date ? l(@member.entry_date, format: :long) : mdash %> - <br/> - <strong> - <%= t(".user_no") %> - </strong> - <%= @member.member_uid || mdash %> - <br/> - <strong class="lead <%= green_red(@member.account&.balance) %>"> - <%= t(".balance") %> - <%= seconds_to_hm(@member.account.try(:balance) || mdash) %> - </strong> - </p> - </div> - </div> - </div> -</div> - -<%= render 'shared/movements' %> diff --git a/config/routes.rb b/config/routes.rb index e03841279..d3f287fad 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,6 +11,9 @@ get "global/switch_lang", as: :switch_lang + get :account, controller: :account, action: :show + get 'account/edit', controller: :account, action: :edit + resources :offers do collection do get :dashboard @@ -29,7 +32,7 @@ end end - resources :users, concerns: :accountable, except: :destroy, :path => "members" + resources :users, except: :destroy resources :transfers, only: [:create] do member do @@ -39,7 +42,7 @@ resources :documents - resources :members, only: [:destroy] do + resources :members, param: :member_uid, concerns: :accountable, only: [:index, :show, :destroy] do member do put :toggle_manager put :toggle_active diff --git a/spec/controllers/members_controller_spec.rb b/spec/controllers/members_controller_spec.rb new file mode 100644 index 000000000..5d9bc9cec --- /dev/null +++ b/spec/controllers/members_controller_spec.rb @@ -0,0 +1,137 @@ +require 'spec_helper' + +describe MembersController do + let(:organization) { Fabricate(:organization) } + let!(:member_admin) do + Fabricate( + :member, + organization: organization, + manager: true + ) + end + let!(:member) do + Fabricate( + :member, + organization: organization, + manager: false + ) + end + let!(:another_member) do + Fabricate( + :member, + organization: organization, + manager: false + ) + end + let!(:inactive_member) do + Fabricate( + :member, + organization: organization, + manager: false, + active: false + ) + end + let(:user) { member.user } + let(:admin) { member_admin.user } + + describe '#index' do + context 'when the user is not logged in' do + it 'responds with a redirect' do + get :index + + expect(response.status).to eq(302) + end + end + + context 'when the logged user is not an admin' do + before { login(user) } + + it 'populates an array of active members' do + get :index + expect(assigns(:memberships)).to eq( + [ + member_admin, + member, + another_member + ] + ) + end + end + + context 'when the logged user is an admin' do + before { login(admin) } + + it 'populates a collection of all members' do + get :index + expect(assigns(:memberships)).to eq( + [ + member_admin, + member, + another_member, + inactive_member + ] + ) + end + end + end + + describe 'GET #show' do + context 'when the user is not logged in' do + it 'responds with a redirect' do + get :show, member_uid: member.member_uid + + expect(response.status).to eq(302) + end + end + + context 'when the user is logged in' do + context 'as an admin' do + before { login(admin) } + + it 'renders a page with a link to edit user\'s details' do + get :show, member_uid: member.member_uid + + expect(response.body).to include("<a href=\"/users/#{member.user_id}/edit\">") + end + + it 'renders a page with a link to give time to the member' do + get :show, member_uid: member.member_uid + + expect(response.body).to include("<a href=\"/members/#{member.member_uid}/give_time\">") + end + end + + context 'as a member' do + before { login(user) } + + context 'and the member is associated to the current user' do + it 'renders a page with a link to edit user\'s details' do + get :show, member_uid: member.member_uid + + expect(response.body).to include("<a href=\"/users/#{member.user_id}/edit\">") + end + + it 'renders a page without a link to give time to the member' do + get :show, member_uid: member.member_uid + + expect(response.body).to_not include("<a href=\"/members/#{member.member_uid}/give_time\">") + end + end + + context 'and the member is not associated to the current user' do + it 'renders a page without a link to edit user\'s details' do + get :show, member_uid: member_admin.member_uid + + expect(response.body).to_not include("<a href=\"/users/#{member_admin.user_id}/edit\">") + end + + it 'renders a page with a link to give time to the member' do + get :show, member_uid: member_admin.member_uid + + expect(response.body).to include("<a href=\"/members/#{member_admin.member_uid}/give_time\">") + end + end + end + end + end +end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index d6dc83b50..3f4741fdf 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -1,4 +1,4 @@ -require "spec_helper" +require 'spec_helper' describe UsersController do let (:test_organization) { Fabricate(:organization) } @@ -37,45 +37,96 @@ include_context "stub browser locale" before { set_browser_locale("ca") } - describe "GET #index" do - context "with an normal logged user" do - it "populates and array of users" do - login(user) + describe 'GET #show' do + context 'when the user is the same user' do + before { login(user) } - get "index" - expect(assigns(:users)).to eq([user, another_user, - admin_user, wrong_user, - empty_email_user]) + it 'assigns user to @user' do + get :show, id: user + expect(assigns(:user)).to eq(user) end - end - context "with an admin logged user" do - it "populates and array of users" do - login(admin_user) - - get "index" - expect(assigns(:users)).to eq([user, another_user, - admin_user, wrong_user, - empty_email_user]) + + it 'renders a page with the user username' do + get :show, id: user + expect(response.body).to include(user.username) + end + + it 'renders a page with the user avatar as link to Gravatar' do + get :show, id: user + expect(response.body).to include("<a href=\"https://www.gravatar.com\" target=\"_blank\">") + expect(response.body).to include("<img style=\"margin: -8px auto\" src=\"https://www.gravatar.com/avatar/") + end + + it 'renders a page with the user description' do + get :show, id: user + expect(response.body).to include(user.description) + end + + it 'renders a page with a link to edit the user profile' do + get :show, id: user + expect(response.body).to include("<a href=\"/account/edit\"") end end - end - describe "GET #show" do - context "with valid params" do - context "with a normal logged user" do - it "assigns the requested user to @user" do - login(user) + context 'when the user is not the same' do + before { login(user) } + + context 'and is not a member of the same organization' do + let(:other_organization) { Fabricate(:organization) } + let(:other_admin) do + Fabricate( + :member, + organization: test_organization, + manager: true + ) + end + let(:other_user) { other_admin.user } + + it 'redirects to root path' do + get :show, id: other_user + + expect(response).to redirect_to(root_path) + end + + it 'sets an error flash message' do + get :show, id: other_user - get "show", id: user.id - expect(assigns(:user)).to eq(user) + expect(flash[:error]).to match(/You are not authorized to perform this action./) end end - context "with an admin logged user" do - it "assigns the requested user to @user" do - login(admin_user) - get "show", id: user.id - expect(assigns(:user)).to eq(user) + context 'and is a member of the same organization' do + context 'and is not an admin of the organization' do + it 'redirects to root path' do + get :show, id: another_user + + expect(response).to redirect_to(root_path) + end + + it 'sets an error flash message' do + get :show, id: another_user + + expect(flash[:error]).to match(/You are not authorized to perform this action./) + end + end + + context 'and is an admin of the organization' do + before { login(admin_user) } + + it 'assigns user to @user' do + get :show, id: user + expect(assigns(:user)).to eq(user) + end + + it 'renders a page with the user username' do + get :show, id: user + expect(response.body).to include(user.username) + end + + it 'renders a page with the user avatar' do + get :show, id: user + expect(response.body).to include("<img style=\"margin: -8px auto\" src=\"https://www.gravatar.com/avatar/") + end end end end