diff --git a/app/controllers/management/sessions_controller.rb b/app/controllers/management/sessions_controller.rb
index d3a85402b..bca17bf4c 100644
--- a/app/controllers/management/sessions_controller.rb
+++ b/app/controllers/management/sessions_controller.rb
@@ -4,7 +4,7 @@ class Management::SessionsController < ActionController::Base
def create
destroy_session
- if admin? || manager?
+ if admin? || manager? || authenticated_manager?
redirect_to management_root_path
else
raise CanCan::AccessDenied
@@ -31,6 +31,12 @@ class Management::SessionsController < ActionController::Base
end
def manager?
+ if current_user.try(:manager?)
+ session[:manager] = {login: "manager_user_#{current_user.id}"}
+ end
+ end
+
+ def authenticated_manager?
if manager = ManagerAuthenticator.new(params).auth
session[:manager] = manager
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 7da80b6fb..4839d3ced 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -12,6 +12,7 @@ class User < ActiveRecord::Base
has_one :administrator
has_one :moderator
has_one :valuator
+ has_one :manager
has_one :organization
has_one :lock
has_many :flags
@@ -104,6 +105,10 @@ class User < ActiveRecord::Base
valuator.present?
end
+ def manager?
+ manager.present?
+ end
+
def organization?
organization.present?
end
diff --git a/app/views/shared/_admin_login_items.html.erb b/app/views/shared/_admin_login_items.html.erb
index 3625432a8..6ba10bbca 100644
--- a/app/views/shared/_admin_login_items.html.erb
+++ b/app/views/shared/_admin_login_items.html.erb
@@ -17,7 +17,7 @@
<% end %>
- <% if current_user.administrator? %>
+ <% if current_user.administrator? || current_user.manager? %>
<%= link_to t("layouts.header.management"), management_sign_in_path %>
diff --git a/spec/controllers/management/sessions_controller_spec.rb b/spec/controllers/management/sessions_controller_spec.rb
index a07067ed9..d2d6b5f8b 100644
--- a/spec/controllers/management/sessions_controller_spec.rb
+++ b/spec/controllers/management/sessions_controller_spec.rb
@@ -6,31 +6,44 @@ describe Management::SessionsController do
it "should deny access if wrong manager credentials" do
allow_any_instance_of(ManagerAuthenticator).to receive(:auth).and_return(false)
expect { get :create, login: "nonexistent" , clave_usuario: "wrong"}.to raise_error CanCan::AccessDenied
+ expect(session[:manager]).to be_nil
end
- it "should redirect to management root path if right credentials" do
+ it "should redirect to management root path if authorized manager with right credentials" do
manager = {login: "JJB033", user_key: "31415926" , date: "20151031135905"}
allow_any_instance_of(ManagerAuthenticator).to receive(:auth).and_return(manager)
get :create, login: "JJB033" , clave_usuario: "31415926", fecha_conexion: "20151031135905"
expect(response).to be_redirect
+ expect(session[:manager][:login]).to eq "JJB033"
end
it "should redirect to management root path if user is admin" do
- sign_in create(:administrator).user
+ user = create(:administrator).user
+ sign_in user
get :create
expect(response).to be_redirect
+ expect(session[:manager][:login]).to eq "admin_user_#{user.id}"
end
- it "should deny access if user is not admin" do
+ it "should redirect to management root path if user is manager" do
+ user = create(:manager).user
+ sign_in user
+ get :create
+ expect(response).to be_redirect
+ expect(session[:manager][:login]).to eq "manager_user_#{user.id}"
+ end
+
+ it "should deny access if user is not admin or manager" do
sign_in create(:user)
expect { get :create}.to raise_error CanCan::AccessDenied
+ expect(session[:manager]).to be_nil
end
end
describe 'Sign out' do
it "should destroy the session data and redirect" do
- session[:manager] = {user_key: "31415926" , date: "20151031135905", login: "JJB033"}
+ session[:manager] = {user_key: "31415926", date: "20151031135905", login: "JJB033"}
session[:document_type] = "1"
session[:document_number] = "12345678Z"
diff --git a/spec/features/management/account_spec.rb b/spec/features/management/account_spec.rb
index 3b9951d41..04a2e7213 100644
--- a/spec/features/management/account_spec.rb
+++ b/spec/features/management/account_spec.rb
@@ -26,7 +26,7 @@ feature 'Account' do
expect(page).to have_content "User account deleted."
- expect(user.reload.erase_reason).to eq "Deleted by manager: JJB042"
+ expect(user.reload.erase_reason).to eq "Deleted by manager: manager_user_#{Manager.last.user_id}"
end
end
\ No newline at end of file
diff --git a/spec/features/management/users_spec.rb b/spec/features/management/users_spec.rb
index 021edaaad..1a0618e60 100644
--- a/spec/features/management/users_spec.rb
+++ b/spec/features/management/users_spec.rb
@@ -59,7 +59,7 @@ feature 'Users' do
expect(page).to have_content "User account deleted."
- expect(level_2_user.reload.erase_reason).to eq "Deleted by manager: JJB042"
+ expect(level_2_user.reload.erase_reason).to eq "Deleted by manager: manager_user_#{Manager.last.user_id}"
visit management_document_verifications_path
fill_in 'document_verification_document_number', with: '13579'
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index b49e3cc6b..054e043f9 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -121,6 +121,18 @@ describe User do
end
end
+ describe "manager?" do
+ it "is false when the user is not a manager" do
+ expect(subject.manager?).to be false
+ end
+
+ it "is true when the user is a manager" do
+ subject.save
+ create(:manager, user: subject)
+ expect(subject.manager?).to be true
+ end
+ end
+
describe "organization?" do
it "is false when the user is not an organization" do
expect(subject.organization?).to be false
diff --git a/spec/support/common_actions.rb b/spec/support/common_actions.rb
index bba79441b..18a3f9499 100644
--- a/spec/support/common_actions.rb
+++ b/spec/support/common_actions.rb
@@ -24,12 +24,18 @@ module CommonActions
click_button 'Enter'
end
- def login_as_manager
+ def login_as_authenticated_manager
login, user_key, date = "JJB042", "31415926", Time.now.strftime("%Y%m%d%H%M%S")
allow_any_instance_of(ManagerAuthenticator).to receive(:auth).and_return({login: login, user_key: user_key, date: date}.with_indifferent_access)
visit management_sign_in_path(login: login, clave_usuario: user_key, fecha_conexion: date)
end
+ def login_as_manager
+ manager = create(:manager)
+ login_as(manager.user)
+ visit management_sign_in_path
+ end
+
def login_managed_user(user)
allow_any_instance_of(Management::BaseController).to receive(:managed_user).and_return(user)
end