diff options
Diffstat (limited to 'spec/controllers/projects/boards_controller_spec.rb')
-rw-r--r-- | spec/controllers/projects/boards_controller_spec.rb | 150 |
1 files changed, 51 insertions, 99 deletions
diff --git a/spec/controllers/projects/boards_controller_spec.rb b/spec/controllers/projects/boards_controller_spec.rb index cde3a8d4761..89d0669f47b 100644 --- a/spec/controllers/projects/boards_controller_spec.rb +++ b/spec/controllers/projects/boards_controller_spec.rb @@ -3,11 +3,14 @@ require 'spec_helper' RSpec.describe Projects::BoardsController do - let(:project) { create(:project) } - let(:user) { create(:user) } + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } - before do + before_all do project.add_maintainer(user) + end + + before do sign_in(user) end @@ -16,77 +19,63 @@ RSpec.describe Projects::BoardsController do expect { list_boards }.to change(project.boards, :count).by(1) end - it 'sets boards_endpoint instance variable to a boards path' do + it 'renders template' do list_boards - expect(assigns(:boards_endpoint)).to eq project_boards_path(project) + expect(response).to render_template :index + expect(response.media_type).to eq 'text/html' end - context 'when format is HTML' do - it 'renders template' do - list_boards + context 'when there are recently visited boards' do + let_it_be(:boards) { create_list(:board, 3, resource_parent: project) } - expect(response).to render_template :index - expect(response.media_type).to eq 'text/html' + before_all do + visit_board(boards[2], Time.current + 1.minute) + visit_board(boards[0], Time.current + 2.minutes) + visit_board(boards[1], Time.current + 5.minutes) end - context 'with unauthorized user' do - before do - expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original - allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(true) - allow(Ability).to receive(:allowed?).with(user, :read_issue_board, project).and_return(false) - end - - it 'returns a not found 404 response' do - list_boards + it 'redirects to latest visited board' do + list_boards - expect(response).to have_gitlab_http_status(:not_found) - expect(response.media_type).to eq 'text/html' - end + expect(response).to redirect_to( + namespace_project_board_path(namespace_id: project.namespace, project_id: project, id: boards[1].id) + ) end - context 'when user is signed out' do - let(:project) { create(:project, :public) } - - it 'renders template' do - sign_out(user) + def visit_board(board, time) + create(:board_project_recent_visit, project: project, board: board, user: user, updated_at: time) + end + end - board = create(:board, project: project) - create(:board_project_recent_visit, project: board.project, board: board, user: user) + context 'with unauthorized user' do + before do + expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original + allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(true) + allow(Ability).to receive(:allowed?).with(user, :read_issue_board, project).and_return(false) + end - list_boards + it 'returns a not found 404 response' do + list_boards - expect(response).to render_template :index - expect(response.media_type).to eq 'text/html' - end + expect(response).to have_gitlab_http_status(:not_found) + expect(response.media_type).to eq 'text/html' end end - context 'when format is JSON' do - it 'returns a list of project boards' do - create_list(:board, 2, project: project) - - expect(Boards::VisitsFinder).not_to receive(:new) - - list_boards format: :json + context 'when user is signed out' do + let(:project) { create(:project, :public) } - expect(response).to match_response_schema('boards') - expect(json_response.length).to eq 2 - end + it 'renders template' do + sign_out(user) - context 'with unauthorized user' do - before do - expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original - allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(true) - allow(Ability).to receive(:allowed?).with(user, :read_issue_board, project).and_return(false) - end + board = create(:board, project: project) + create(:board_project_recent_visit, project: board.project, board: board, user: user) - it 'returns a not found 404 response' do - list_boards format: :json + list_boards - expect(response).to have_gitlab_http_status(:not_found) - expect(response.media_type).to eq 'application/json' - end + expect(response).to render_template :index + expect(response.media_type).to eq 'text/html' end end @@ -104,23 +93,16 @@ RSpec.describe Projects::BoardsController do subject { list_boards } end - def list_boards(format: :html) + def list_boards get :index, params: { namespace_id: project.namespace, project_id: project - }, - format: format + } end end describe 'GET show' do - let!(:board) { create(:board, project: project) } - - it 'sets boards_endpoint instance variable to a boards path' do - read_board board: board - - expect(assigns(:boards_endpoint)).to eq project_boards_path(project) - end + let_it_be(:board) { create(:board, project: project) } context 'when format is HTML' do it 'renders template' do @@ -146,12 +128,12 @@ RSpec.describe Projects::BoardsController do end context 'when user is signed out' do - let(:project) { create(:project, :public) } + let(:public_board) { create(:board, project: create(:project, :public)) } it 'does not save visit' do sign_out(user) - expect { read_board board: board }.to change(BoardProjectRecentVisit, :count).by(0) + expect { read_board board: public_board }.to change(BoardProjectRecentVisit, :count).by(0) expect(response).to render_template :show expect(response.media_type).to eq 'text/html' @@ -159,48 +141,18 @@ RSpec.describe Projects::BoardsController do end end - context 'when format is JSON' do - it 'returns project board' do - expect(Boards::Visits::CreateService).not_to receive(:new) - - read_board board: board, format: :json - - expect(response).to match_response_schema('board') - end - - context 'with unauthorized user' do - before do - expect(Ability).to receive(:allowed?).with(user, :log_in, :global).and_call_original - allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(true) - allow(Ability).to receive(:allowed?).with(user, :read_issue_board, project).and_return(false) - end - - it 'returns a not found 404 response' do - read_board board: board, format: :json - - expect(response).to have_gitlab_http_status(:not_found) - expect(response.media_type).to eq 'application/json' - end - end - end - context 'when board does not belong to project' do it 'returns a not found 404 response' do another_board = create(:board) - read_board board: another_board + get :show, params: { namespace_id: project.namespace, project_id: project, id: another_board.to_param } expect(response).to have_gitlab_http_status(:not_found) end end - def read_board(board:, format: :html) - get :show, params: { - namespace_id: project.namespace, - project_id: project, - id: board.to_param - }, - format: format + def read_board(board:) + get :show, params: { namespace_id: board.project.namespace, project_id: board.project, id: board.to_param } end end end |