2015-01-28 16:18:22 -05:00
|
|
|
require 'spec_helper'
|
|
|
|
|
|
|
|
describe UsersController do
|
2015-07-18 17:54:56 -04:00
|
|
|
let(:user) { create(:user) }
|
2015-01-28 16:18:22 -05:00
|
|
|
|
2015-03-13 06:39:26 -04:00
|
|
|
describe 'GET #show' do
|
2015-07-18 17:54:56 -04:00
|
|
|
context 'with rendered views' do
|
|
|
|
render_views
|
|
|
|
|
2015-11-18 06:32:35 -05:00
|
|
|
describe 'when logged in' do
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
2015-07-18 17:54:56 -04:00
|
|
|
|
2015-11-18 06:32:35 -05:00
|
|
|
it 'renders the show template' do
|
|
|
|
get :show, username: user.username
|
2015-07-18 17:54:56 -04:00
|
|
|
|
2015-11-18 06:32:35 -05:00
|
|
|
expect(response).to be_success
|
|
|
|
expect(response).to render_template('show')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when logged out' do
|
|
|
|
it 'renders the show template' do
|
|
|
|
get :show, username: user.username
|
|
|
|
|
2016-06-27 14:10:42 -04:00
|
|
|
expect(response).to have_http_status(200)
|
2015-11-18 06:32:35 -05:00
|
|
|
expect(response).to render_template('show')
|
|
|
|
end
|
2015-07-18 17:54:56 -04:00
|
|
|
end
|
2015-01-28 16:18:22 -05:00
|
|
|
end
|
2016-03-30 16:14:21 -04:00
|
|
|
|
2016-04-05 17:56:07 -04:00
|
|
|
context 'when public visibility level is restricted' do
|
2016-03-30 16:14:21 -04:00
|
|
|
before do
|
|
|
|
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when logged out' do
|
2017-05-04 17:20:13 -04:00
|
|
|
it 'redirects to login page' do
|
2016-03-30 16:14:21 -04:00
|
|
|
get :show, username: user.username
|
2017-05-04 17:20:13 -04:00
|
|
|
expect(response).to redirect_to new_user_session_path
|
2016-03-30 16:14:21 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when logged in' do
|
2017-06-14 14:18:56 -04:00
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
2016-03-30 16:14:21 -04:00
|
|
|
|
2016-03-31 10:36:40 -04:00
|
|
|
it 'renders show' do
|
2016-03-30 16:14:21 -04:00
|
|
|
get :show, username: user.username
|
2016-06-27 14:10:42 -04:00
|
|
|
expect(response).to have_http_status(200)
|
2016-03-31 10:36:40 -04:00
|
|
|
expect(response).to render_template('show')
|
2016-03-30 16:14:21 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2017-05-01 16:46:30 -04:00
|
|
|
|
2017-05-03 18:26:44 -04:00
|
|
|
context 'when a user by that username does not exist' do
|
|
|
|
context 'when logged out' do
|
2017-05-04 17:20:13 -04:00
|
|
|
it 'redirects to login page' do
|
2017-05-03 18:26:44 -04:00
|
|
|
get :show, username: 'nonexistent'
|
2017-05-04 17:20:13 -04:00
|
|
|
expect(response).to redirect_to new_user_session_path
|
2017-05-03 18:26:44 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when logged in' do
|
2017-06-14 14:18:56 -04:00
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
2017-05-03 18:26:44 -04:00
|
|
|
|
|
|
|
it 'renders 404' do
|
|
|
|
get :show, username: 'nonexistent'
|
|
|
|
expect(response).to have_http_status(404)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2015-01-29 11:55:57 -05:00
|
|
|
end
|
2015-01-28 16:18:22 -05:00
|
|
|
|
2015-03-13 06:39:26 -04:00
|
|
|
describe 'GET #calendar' do
|
|
|
|
it 'renders calendar' do
|
2015-07-18 17:54:56 -04:00
|
|
|
sign_in(user)
|
|
|
|
|
2017-07-19 02:44:38 -04:00
|
|
|
get :calendar, username: user.username, format: :json
|
2015-07-18 17:54:56 -04:00
|
|
|
|
2017-07-19 02:44:38 -04:00
|
|
|
expect(response).to have_http_status(200)
|
2015-01-28 16:18:22 -05:00
|
|
|
end
|
2016-02-22 09:46:29 -05:00
|
|
|
|
|
|
|
context 'forked project' do
|
2017-01-25 16:44:33 -05:00
|
|
|
let(:project) { create(:empty_project) }
|
2016-09-19 14:28:41 -04:00
|
|
|
let(:forked_project) { Projects::ForkService.new(project, user).execute }
|
2016-02-22 09:46:29 -05:00
|
|
|
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
project.team << [user, :developer]
|
|
|
|
EventCreateService.new.push(project, user, [])
|
|
|
|
EventCreateService.new.push(forked_project, user, [])
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'includes forked projects' do
|
|
|
|
get :calendar, username: user.username
|
|
|
|
expect(assigns(:contributions_calendar).projects.count).to eq(2)
|
|
|
|
end
|
|
|
|
end
|
2015-01-28 16:18:22 -05:00
|
|
|
end
|
|
|
|
|
2015-03-13 06:39:26 -04:00
|
|
|
describe 'GET #calendar_activities' do
|
2017-01-25 16:44:33 -05:00
|
|
|
let!(:project) { create(:empty_project) }
|
2017-05-01 16:46:30 -04:00
|
|
|
let(:user) { create(:user) }
|
2015-03-13 06:39:26 -04:00
|
|
|
|
|
|
|
before do
|
|
|
|
allow_any_instance_of(User).to receive(:contributed_projects_ids).and_return([project.id])
|
2015-07-18 17:54:56 -04:00
|
|
|
|
|
|
|
sign_in(user)
|
2015-03-13 06:39:26 -04:00
|
|
|
project.team << [user, :developer]
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'assigns @calendar_date' do
|
2015-03-22 14:14:42 -04:00
|
|
|
get :calendar_activities, username: user.username, date: '2014-07-31'
|
2015-03-13 06:39:26 -04:00
|
|
|
expect(assigns(:calendar_date)).to eq(Date.parse('2014-07-31'))
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'renders calendar_activities' do
|
2015-03-22 14:14:42 -04:00
|
|
|
get :calendar_activities, username: user.username
|
2015-03-13 06:39:26 -04:00
|
|
|
expect(response).to render_template('calendar_activities')
|
|
|
|
end
|
|
|
|
end
|
2016-05-08 11:06:19 -04:00
|
|
|
|
|
|
|
describe 'GET #snippets' do
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'format html' do
|
|
|
|
it 'renders snippets page' do
|
|
|
|
get :snippets, username: user.username
|
2016-06-27 14:10:42 -04:00
|
|
|
expect(response).to have_http_status(200)
|
2016-05-08 11:06:19 -04:00
|
|
|
expect(response).to render_template('show')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'format json' do
|
|
|
|
it 'response with snippets json data' do
|
|
|
|
get :snippets, username: user.username, format: :json
|
2016-06-27 14:10:42 -04:00
|
|
|
expect(response).to have_http_status(200)
|
2016-05-08 11:06:19 -04:00
|
|
|
expect(JSON.parse(response.body)).to have_key('html')
|
|
|
|
end
|
|
|
|
end
|
2017-05-01 16:46:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'GET #exists' do
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when user exists' do
|
|
|
|
it 'returns JSON indicating the user exists' do
|
|
|
|
get :exists, username: user.username
|
|
|
|
|
|
|
|
expected_json = { exists: true }.to_json
|
|
|
|
expect(response.body).to eq(expected_json)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the casing is different' do
|
|
|
|
let(:user) { create(:user, username: 'CamelCaseUser') }
|
|
|
|
|
|
|
|
it 'returns JSON indicating the user exists' do
|
|
|
|
get :exists, username: user.username.downcase
|
|
|
|
|
|
|
|
expected_json = { exists: true }.to_json
|
|
|
|
expect(response.body).to eq(expected_json)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the user does not exist' do
|
|
|
|
it 'returns JSON indicating the user does not exist' do
|
|
|
|
get :exists, username: 'foo'
|
|
|
|
|
|
|
|
expected_json = { exists: false }.to_json
|
|
|
|
expect(response.body).to eq(expected_json)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when a user changed their username' do
|
|
|
|
let(:redirect_route) { user.namespace.redirect_routes.create(path: 'old-username') }
|
|
|
|
|
|
|
|
it 'returns JSON indicating a user by that username does not exist' do
|
|
|
|
get :exists, username: 'old-username'
|
|
|
|
|
|
|
|
expected_json = { exists: false }.to_json
|
|
|
|
expect(response.body).to eq(expected_json)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2016-05-08 11:06:19 -04:00
|
|
|
end
|
2017-05-11 16:57:03 -04:00
|
|
|
|
2017-05-18 15:56:39 -04:00
|
|
|
describe '#ensure_canonical_path' do
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'for a GET request' do
|
|
|
|
context 'when requesting users at the root path' do
|
|
|
|
context 'when requesting the canonical path' do
|
|
|
|
let(:user) { create(:user, username: 'CamelCaseUser') }
|
|
|
|
|
|
|
|
context 'with exactly matching casing' do
|
|
|
|
it 'responds with success' do
|
|
|
|
get :show, username: user.username
|
|
|
|
|
|
|
|
expect(response).to be_success
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with different casing' do
|
|
|
|
it 'redirects to the correct casing' do
|
|
|
|
get :show, username: user.username.downcase
|
|
|
|
|
|
|
|
expect(response).to redirect_to(user)
|
|
|
|
expect(controller).not_to set_flash[:notice]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when requesting a redirected path' do
|
|
|
|
let(:redirect_route) { user.namespace.redirect_routes.create(path: 'old-path') }
|
|
|
|
|
|
|
|
it 'redirects to the canonical path' do
|
|
|
|
get :show, username: redirect_route.path
|
|
|
|
|
|
|
|
expect(response).to redirect_to(user)
|
|
|
|
expect(controller).to set_flash[:notice].to(user_moved_message(redirect_route, user))
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the old path is a substring of the scheme or host' do
|
|
|
|
let(:redirect_route) { user.namespace.redirect_routes.create(path: 'http') }
|
|
|
|
|
|
|
|
it 'does not modify the requested host' do
|
|
|
|
get :show, username: redirect_route.path
|
|
|
|
|
|
|
|
expect(response).to redirect_to(user)
|
|
|
|
expect(controller).to set_flash[:notice].to(user_moved_message(redirect_route, user))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the old path is substring of users' do
|
|
|
|
let(:redirect_route) { user.namespace.redirect_routes.create(path: 'ser') }
|
|
|
|
|
|
|
|
it 'redirects to the canonical path' do
|
|
|
|
get :show, username: redirect_route.path
|
|
|
|
|
|
|
|
expect(response).to redirect_to(user)
|
|
|
|
expect(controller).to set_flash[:notice].to(user_moved_message(redirect_route, user))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when requesting users under the /users path' do
|
|
|
|
context 'when requesting the canonical path' do
|
|
|
|
let(:user) { create(:user, username: 'CamelCaseUser') }
|
|
|
|
|
|
|
|
context 'with exactly matching casing' do
|
|
|
|
it 'responds with success' do
|
|
|
|
get :projects, username: user.username
|
|
|
|
|
|
|
|
expect(response).to be_success
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with different casing' do
|
|
|
|
it 'redirects to the correct casing' do
|
|
|
|
get :projects, username: user.username.downcase
|
|
|
|
|
|
|
|
expect(response).to redirect_to(user_projects_path(user))
|
|
|
|
expect(controller).not_to set_flash[:notice]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when requesting a redirected path' do
|
|
|
|
let(:redirect_route) { user.namespace.redirect_routes.create(path: 'old-path') }
|
|
|
|
|
|
|
|
it 'redirects to the canonical path' do
|
|
|
|
get :projects, username: redirect_route.path
|
|
|
|
|
|
|
|
expect(response).to redirect_to(user_projects_path(user))
|
|
|
|
expect(controller).to set_flash[:notice].to(user_moved_message(redirect_route, user))
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the old path is a substring of the scheme or host' do
|
|
|
|
let(:redirect_route) { user.namespace.redirect_routes.create(path: 'http') }
|
|
|
|
|
|
|
|
it 'does not modify the requested host' do
|
|
|
|
get :projects, username: redirect_route.path
|
|
|
|
|
|
|
|
expect(response).to redirect_to(user_projects_path(user))
|
|
|
|
expect(controller).to set_flash[:notice].to(user_moved_message(redirect_route, user))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the old path is substring of users' do
|
|
|
|
let(:redirect_route) { user.namespace.redirect_routes.create(path: 'ser') }
|
|
|
|
|
|
|
|
# I.e. /users/ser should not become /ufoos/ser
|
|
|
|
it 'does not modify the /users part of the path' do
|
|
|
|
get :projects, username: redirect_route.path
|
|
|
|
|
|
|
|
expect(response).to redirect_to(user_projects_path(user))
|
|
|
|
expect(controller).to set_flash[:notice].to(user_moved_message(redirect_route, user))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-05-11 16:57:03 -04:00
|
|
|
def user_moved_message(redirect_route, user)
|
|
|
|
"User '#{redirect_route.path}' was moved to '#{user.full_path}'. Please update any links and bookmarks that may still have the old path."
|
|
|
|
end
|
2015-03-13 06:39:26 -04:00
|
|
|
end
|