2019-07-31 22:56:46 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2015-04-26 12:48:37 +05:30
|
|
|
require 'spec_helper'
|
|
|
|
|
2020-06-23 00:09:42 +05:30
|
|
|
RSpec.describe UsersController do
|
2015-09-11 14:41:01 +05:30
|
|
|
let(:user) { create(:user) }
|
2018-11-18 11:00:15 +05:30
|
|
|
let(:private_user) { create(:user, private_profile: true) }
|
|
|
|
let(:public_user) { create(:user) }
|
2015-04-26 12:48:37 +05:30
|
|
|
|
|
|
|
describe 'GET #show' do
|
2015-09-11 14:41:01 +05:30
|
|
|
context 'with rendered views' do
|
|
|
|
render_views
|
|
|
|
|
2015-11-26 14:37:03 +05:30
|
|
|
describe 'when logged in' do
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
2015-09-11 14:41:01 +05:30
|
|
|
|
2015-11-26 14:37:03 +05:30
|
|
|
it 'renders the show template' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: user.username }
|
2015-09-11 14:41:01 +05:30
|
|
|
|
2019-12-04 20:38:33 +05:30
|
|
|
expect(response).to be_successful
|
2015-11-26 14:37:03 +05:30
|
|
|
expect(response).to render_template('show')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when logged out' do
|
|
|
|
it 'renders the show template' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: user.username }
|
2015-11-26 14:37:03 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2016-06-02 11:05:42 +05:30
|
|
|
expect(response).to render_template('show')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when public visibility level is restricted' do
|
|
|
|
before do
|
|
|
|
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when logged out' do
|
2017-08-17 22:00:37 +05:30
|
|
|
it 'redirects to login page' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: user.username }
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(response).to redirect_to new_user_session_path
|
2016-06-02 11:05:42 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when logged in' do
|
2017-09-10 17:25:29 +05:30
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
2016-06-02 11:05:42 +05:30
|
|
|
|
|
|
|
it 'renders show' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: user.username }
|
2020-03-13 15:44:24 +05:30
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2015-11-26 14:37:03 +05:30
|
|
|
expect(response).to render_template('show')
|
|
|
|
end
|
2015-09-11 14:41:01 +05:30
|
|
|
end
|
2015-04-26 12:48:37 +05:30
|
|
|
end
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
context 'when a user by that username does not exist' do
|
|
|
|
context 'when logged out' do
|
|
|
|
it 'redirects to login page' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: 'nonexistent' }
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(response).to redirect_to new_user_session_path
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when logged in' do
|
2017-09-10 17:25:29 +05:30
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
it 'renders 404' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: 'nonexistent' }
|
2020-03-13 15:44:24 +05:30
|
|
|
expect(response).to have_gitlab_http_status(:not_found)
|
2017-08-17 22:00:37 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2018-03-27 19:54:05 +05:30
|
|
|
|
|
|
|
context 'json with events' do
|
|
|
|
let(:project) { create(:project) }
|
2020-03-13 15:44:24 +05:30
|
|
|
|
2018-03-27 19:54:05 +05:30
|
|
|
before do
|
|
|
|
project.add_developer(user)
|
|
|
|
Gitlab::DataBuilder::Push.build_sample(project, user)
|
|
|
|
|
|
|
|
sign_in(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'loads events' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: user }, format: :json
|
2018-03-27 19:54:05 +05:30
|
|
|
|
|
|
|
expect(assigns(:events)).not_to be_empty
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'hides events if the user cannot read cross project' do
|
|
|
|
allow(Ability).to receive(:allowed?).and_call_original
|
|
|
|
expect(Ability).to receive(:allowed?).with(user, :read_cross_project) { false }
|
|
|
|
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: user }, format: :json
|
2018-03-27 19:54:05 +05:30
|
|
|
|
|
|
|
expect(assigns(:events)).to be_empty
|
|
|
|
end
|
2018-11-18 11:00:15 +05:30
|
|
|
|
|
|
|
it 'hides events if the user has a private profile' do
|
|
|
|
Gitlab::DataBuilder::Push.build_sample(project, private_user)
|
|
|
|
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: private_user.username }, format: :json
|
2018-11-18 11:00:15 +05:30
|
|
|
|
|
|
|
expect(assigns(:events)).to be_empty
|
|
|
|
end
|
2018-03-27 19:54:05 +05:30
|
|
|
end
|
2015-04-26 12:48:37 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
describe 'GET #calendar' do
|
2018-11-18 11:00:15 +05:30
|
|
|
context 'for user' do
|
|
|
|
let(:project) { create(:project) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
project.add_developer(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with public profile' do
|
|
|
|
it 'renders calendar' do
|
|
|
|
push_data = Gitlab::DataBuilder::Push.build_sample(project, public_user)
|
|
|
|
EventCreateService.new.push(project, public_user, push_data)
|
|
|
|
|
2019-02-15 15:39:39 +05:30
|
|
|
get :calendar, params: { username: public_user.username }, format: :json
|
2015-09-11 14:41:01 +05:30
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2018-11-18 11:00:15 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with private profile' do
|
|
|
|
it 'does not render calendar' do
|
|
|
|
push_data = Gitlab::DataBuilder::Push.build_sample(project, private_user)
|
|
|
|
EventCreateService.new.push(project, private_user, push_data)
|
2015-09-11 14:41:01 +05:30
|
|
|
|
2019-02-15 15:39:39 +05:30
|
|
|
get :calendar, params: { username: private_user.username }, format: :json
|
2018-11-18 11:00:15 +05:30
|
|
|
|
|
|
|
expect(response).to have_gitlab_http_status(:not_found)
|
|
|
|
end
|
|
|
|
end
|
2015-04-26 12:48:37 +05:30
|
|
|
end
|
2016-06-02 11:05:42 +05:30
|
|
|
|
|
|
|
context 'forked project' do
|
2017-09-10 17:25:29 +05:30
|
|
|
let(:project) { create(:project) }
|
2016-10-01 15:18:49 +05:30
|
|
|
let(:forked_project) { Projects::ForkService.new(project, user).execute }
|
2016-06-02 11:05:42 +05:30
|
|
|
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
2018-03-17 18:26:18 +05:30
|
|
|
project.add_developer(user)
|
2017-09-10 17:25:29 +05:30
|
|
|
|
|
|
|
push_data = Gitlab::DataBuilder::Push.build_sample(project, user)
|
|
|
|
|
|
|
|
fork_push_data = Gitlab::DataBuilder::Push
|
|
|
|
.build_sample(forked_project, user)
|
|
|
|
|
|
|
|
EventCreateService.new.push(project, user, push_data)
|
|
|
|
EventCreateService.new.push(forked_project, user, fork_push_data)
|
2016-06-02 11:05:42 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'includes forked projects' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :calendar, params: { username: user.username }
|
2016-06-02 11:05:42 +05:30
|
|
|
expect(assigns(:contributions_calendar).projects.count).to eq(2)
|
|
|
|
end
|
|
|
|
end
|
2015-04-26 12:48:37 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
describe 'GET #calendar_activities' do
|
2017-09-10 17:25:29 +05:30
|
|
|
let!(:project) { create(:project) }
|
2017-08-17 22:00:37 +05:30
|
|
|
let(:user) { create(:user) }
|
2015-04-26 12:48:37 +05:30
|
|
|
|
|
|
|
before do
|
2019-12-26 22:10:19 +05:30
|
|
|
allow_next_instance_of(User) do |instance|
|
|
|
|
allow(instance).to receive(:contributed_projects_ids).and_return([project.id])
|
|
|
|
end
|
2015-09-11 14:41:01 +05:30
|
|
|
|
|
|
|
sign_in(user)
|
2018-03-17 18:26:18 +05:30
|
|
|
project.add_developer(user)
|
2015-04-26 12:48:37 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'assigns @calendar_date' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :calendar_activities, params: { username: user.username, date: '2014-07-31' }
|
2015-04-26 12:48:37 +05:30
|
|
|
expect(assigns(:calendar_date)).to eq(Date.parse('2014-07-31'))
|
|
|
|
end
|
|
|
|
|
2018-11-18 11:00:15 +05:30
|
|
|
context 'for user' do
|
|
|
|
context 'with public profile' do
|
2019-07-07 11:18:12 +05:30
|
|
|
let(:issue) { create(:issue, project: project, author: user) }
|
|
|
|
let(:note) { create(:note, noteable: issue, author: user, project: project) }
|
|
|
|
|
|
|
|
render_views
|
|
|
|
|
|
|
|
before do
|
|
|
|
create_push_event
|
|
|
|
create_note_event
|
|
|
|
end
|
2019-05-18 00:54:41 +05:30
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
it 'renders calendar_activities' do
|
2019-05-18 00:54:41 +05:30
|
|
|
get :calendar_activities, params: { username: public_user.username }
|
2019-07-07 11:18:12 +05:30
|
|
|
|
2019-05-30 16:15:17 +05:30
|
|
|
expect(assigns[:events]).not_to be_empty
|
2019-05-18 00:54:41 +05:30
|
|
|
end
|
2019-07-07 11:18:12 +05:30
|
|
|
|
|
|
|
it 'avoids N+1 queries', :request_store do
|
|
|
|
get :calendar_activities, params: { username: public_user.username }
|
|
|
|
|
|
|
|
control = ActiveRecord::QueryRecorder.new { get :calendar_activities, params: { username: public_user.username } }
|
|
|
|
|
|
|
|
create_push_event
|
|
|
|
create_note_event
|
|
|
|
|
|
|
|
expect { get :calendar_activities, params: { username: public_user.username } }.not_to exceed_query_limit(control)
|
|
|
|
end
|
2018-11-18 11:00:15 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
context 'with private profile' do
|
|
|
|
it 'does not render calendar_activities' do
|
|
|
|
push_data = Gitlab::DataBuilder::Push.build_sample(project, private_user)
|
|
|
|
EventCreateService.new.push(project, private_user, push_data)
|
|
|
|
|
2019-02-15 15:39:39 +05:30
|
|
|
get :calendar_activities, params: { username: private_user.username }
|
2018-11-18 11:00:15 +05:30
|
|
|
expect(response).to have_gitlab_http_status(:not_found)
|
|
|
|
end
|
|
|
|
end
|
2019-07-07 11:18:12 +05:30
|
|
|
|
|
|
|
context 'external authorization' do
|
|
|
|
subject { get :calendar_activities, params: { username: user.username } }
|
|
|
|
|
|
|
|
it_behaves_like 'disabled when using an external authorization service'
|
|
|
|
end
|
|
|
|
|
|
|
|
def create_push_event
|
|
|
|
push_data = Gitlab::DataBuilder::Push.build_sample(project, public_user)
|
|
|
|
EventCreateService.new.push(project, public_user, push_data)
|
|
|
|
end
|
|
|
|
|
|
|
|
def create_note_event
|
|
|
|
EventCreateService.new.leave_note(note, public_user)
|
|
|
|
end
|
2015-04-26 12:48:37 +05:30
|
|
|
end
|
|
|
|
end
|
2016-06-02 11:05:42 +05:30
|
|
|
|
2019-02-02 18:00:53 +05:30
|
|
|
describe 'GET #contributed' do
|
|
|
|
let(:project) { create(:project, :public) }
|
2020-12-08 15:28:05 +05:30
|
|
|
|
|
|
|
subject do
|
|
|
|
get :contributed, params: { username: author.username }, format: format
|
|
|
|
end
|
2019-02-02 18:00:53 +05:30
|
|
|
|
|
|
|
before do
|
2020-12-08 15:28:05 +05:30
|
|
|
sign_in(user)
|
2019-02-02 18:00:53 +05:30
|
|
|
|
|
|
|
project.add_developer(public_user)
|
|
|
|
project.add_developer(private_user)
|
2020-12-08 15:28:05 +05:30
|
|
|
create(:push_event, project: project, author: author)
|
|
|
|
|
|
|
|
subject
|
2019-02-02 18:00:53 +05:30
|
|
|
end
|
|
|
|
|
2020-12-08 15:28:05 +05:30
|
|
|
shared_examples_for 'renders contributed projects' do
|
2019-02-02 18:00:53 +05:30
|
|
|
it 'renders contributed projects' do
|
2020-12-08 15:28:05 +05:30
|
|
|
expect(assigns[:contributed_projects]).not_to be_empty
|
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
|
|
|
end
|
|
|
|
end
|
2019-02-02 18:00:53 +05:30
|
|
|
|
2020-12-08 15:28:05 +05:30
|
|
|
%i(html json).each do |format|
|
|
|
|
context "format: #{format}" do
|
|
|
|
let(:format) { format }
|
2019-02-02 18:00:53 +05:30
|
|
|
|
2020-12-08 15:28:05 +05:30
|
|
|
context 'with public profile' do
|
|
|
|
let(:author) { public_user }
|
|
|
|
|
|
|
|
it_behaves_like 'renders contributed projects'
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with private profile' do
|
|
|
|
let(:author) { private_user }
|
|
|
|
|
|
|
|
it 'returns 404' do
|
|
|
|
expect(response).to have_gitlab_http_status(:not_found)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a user that has the ability to read private profiles', :enable_admin_mode do
|
|
|
|
let(:user) { create(:admin) }
|
|
|
|
|
|
|
|
it_behaves_like 'renders contributed projects'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'GET #starred' do
|
|
|
|
let(:project) { create(:project, :public) }
|
|
|
|
|
|
|
|
subject do
|
|
|
|
get :starred, params: { username: author.username }, format: format
|
|
|
|
end
|
|
|
|
|
|
|
|
before do
|
|
|
|
author.toggle_star(project)
|
|
|
|
|
|
|
|
sign_in(user)
|
|
|
|
subject
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples_for 'renders starred projects' do
|
|
|
|
it 'renders starred projects' do
|
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
|
|
|
expect(assigns[:starred_projects]).not_to be_empty
|
2019-02-02 18:00:53 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-12-08 15:28:05 +05:30
|
|
|
%i(html json).each do |format|
|
|
|
|
context "format: #{format}" do
|
|
|
|
let(:format) { format }
|
2019-02-02 18:00:53 +05:30
|
|
|
|
2020-12-08 15:28:05 +05:30
|
|
|
context 'with public profile' do
|
|
|
|
let(:author) { public_user }
|
|
|
|
|
|
|
|
it_behaves_like 'renders starred projects'
|
|
|
|
end
|
2019-02-02 18:00:53 +05:30
|
|
|
|
2020-12-08 15:28:05 +05:30
|
|
|
context 'with private profile' do
|
|
|
|
let(:author) { private_user }
|
|
|
|
|
|
|
|
it 'returns 404' do
|
|
|
|
expect(response).to have_gitlab_http_status(:not_found)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a user that has the ability to read private profiles', :enable_admin_mode do
|
|
|
|
let(:user) { create(:admin) }
|
|
|
|
|
|
|
|
it_behaves_like 'renders starred projects'
|
|
|
|
end
|
|
|
|
end
|
2019-02-02 18:00:53 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-06-02 11:05:42 +05:30
|
|
|
describe 'GET #snippets' do
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'format html' do
|
|
|
|
it 'renders snippets page' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :snippets, params: { username: user.username }
|
2020-03-13 15:44:24 +05:30
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2016-06-02 11:05:42 +05:30
|
|
|
expect(response).to render_template('show')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'format json' do
|
|
|
|
it 'response with snippets json data' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :snippets, params: { username: user.username }, format: :json
|
2020-03-13 15:44:24 +05:30
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2019-09-30 21:07:59 +05:30
|
|
|
expect(json_response).to have_key('html')
|
2016-06-02 11:05:42 +05:30
|
|
|
end
|
|
|
|
end
|
2019-07-07 11:18:12 +05:30
|
|
|
|
|
|
|
context 'external authorization' do
|
|
|
|
subject { get :snippets, params: { username: user.username } }
|
|
|
|
|
|
|
|
it_behaves_like 'disabled when using an external authorization service'
|
|
|
|
end
|
2016-06-02 11:05:42 +05:30
|
|
|
end
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
describe 'GET #exists' do
|
|
|
|
before do
|
|
|
|
sign_in(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when user exists' do
|
|
|
|
it 'returns JSON indicating the user exists' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :exists, params: { username: user.username }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :exists, params: { username: user.username.downcase }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :exists, params: { username: 'foo' }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :exists, params: { username: 'old-username' }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
expected_json = { exists: false }.to_json
|
|
|
|
expect(response.body).to eq(expected_json)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-12-26 22:10:19 +05:30
|
|
|
describe 'GET #suggests' do
|
|
|
|
context 'when user exists' do
|
|
|
|
it 'returns JSON indicating the user exists and a suggestion' do
|
|
|
|
get :suggests, params: { username: user.username }
|
|
|
|
|
|
|
|
expected_json = { exists: true, suggests: ["#{user.username}1"] }.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 and a suggestion' do
|
|
|
|
get :suggests, params: { username: user.username.downcase }
|
|
|
|
|
|
|
|
expected_json = { exists: true, suggests: ["#{user.username.downcase}1"] }.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 :suggests, params: { username: 'foo' }
|
|
|
|
|
|
|
|
expected_json = { exists: false, suggests: [] }.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 :suggests, params: { username: 'old-username' }
|
|
|
|
|
|
|
|
expected_json = { exists: false, suggests: [] }.to_json
|
|
|
|
expect(response.body).to eq(expected_json)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: user.username }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2019-12-04 20:38:33 +05:30
|
|
|
expect(response).to be_successful
|
2017-08-17 22:00:37 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with different casing' do
|
|
|
|
it 'redirects to the correct casing' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: user.username.downcase }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: redirect_route.path }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: redirect_route.path }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :show, params: { username: redirect_route.path }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :projects, params: { username: user.username }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
2019-12-04 20:38:33 +05:30
|
|
|
expect(response).to be_successful
|
2017-08-17 22:00:37 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with different casing' do
|
|
|
|
it 'redirects to the correct casing' do
|
2019-02-15 15:39:39 +05:30
|
|
|
get :projects, params: { username: user.username.downcase }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :projects, params: { username: redirect_route.path }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :projects, params: { username: redirect_route.path }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
2019-02-15 15:39:39 +05:30
|
|
|
get :projects, params: { username: redirect_route.path }
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|
|
|
|
|
2018-11-29 20:51:05 +05:30
|
|
|
context 'token authentication' do
|
|
|
|
it_behaves_like 'authenticates sessionless user', :show, :atom, public: true do
|
|
|
|
before do
|
|
|
|
default_params.merge!(username: user.username)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
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-04-26 12:48:37 +05:30
|
|
|
end
|