Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancisco Javier López <fjlopez@gitlab.com>2018-07-05 16:55:10 +0300
committerDouwe Maan <douwe@gitlab.com>2018-07-05 16:55:10 +0300
commita7a1531fe5d030d47d63bfcd86a7168a8437ff86 (patch)
tree65854ce75eb6b6f6061fef114f95076fae2ab9a8 /spec/controllers
parent9a62e72db9892708ab360c59a9f77695d9253c34 (diff)
Web Terminal Ci Build
Diffstat (limited to 'spec/controllers')
-rw-r--r--spec/controllers/projects/jobs_controller_spec.rb101
1 files changed, 101 insertions, 0 deletions
diff --git a/spec/controllers/projects/jobs_controller_spec.rb b/spec/controllers/projects/jobs_controller_spec.rb
index b10421b8f26..e6332a10265 100644
--- a/spec/controllers/projects/jobs_controller_spec.rb
+++ b/spec/controllers/projects/jobs_controller_spec.rb
@@ -562,4 +562,105 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
end
end
end
+
+ describe 'GET #terminal' do
+ before do
+ project.add_developer(user)
+ sign_in(user)
+ end
+
+ context 'when job exists' do
+ context 'and it has a terminal' do
+ let!(:job) { create(:ci_build, :running, :with_runner_session, pipeline: pipeline) }
+
+ it 'has a job' do
+ get_terminal(id: job.id)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(assigns(:build).id).to eq(job.id)
+ end
+ end
+
+ context 'and does not have a terminal' do
+ let!(:job) { create(:ci_build, :running, pipeline: pipeline) }
+
+ it 'returns not_found' do
+ get_terminal(id: job.id)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ context 'when job does not exist' do
+ it 'renders not_found' do
+ get_terminal(id: 1234)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ def get_terminal(**extra_params)
+ params = {
+ namespace_id: project.namespace.to_param,
+ project_id: project
+ }
+
+ get :terminal, params.merge(extra_params)
+ end
+ end
+
+ describe 'GET #terminal_websocket_authorize' do
+ let!(:job) { create(:ci_build, :running, :with_runner_session, pipeline: pipeline) }
+
+ before do
+ project.add_developer(user)
+ sign_in(user)
+ end
+
+ context 'with valid workhorse signature' do
+ before do
+ allow(Gitlab::Workhorse).to receive(:verify_api_request!).and_return(nil)
+ end
+
+ context 'and valid id' do
+ it 'returns the terminal for the job' do
+ expect(Gitlab::Workhorse)
+ .to receive(:terminal_websocket)
+ .and_return(workhorse: :response)
+
+ get_terminal_websocket(id: job.id)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response.headers["Content-Type"]).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE)
+ expect(response.body).to eq('{"workhorse":"response"}')
+ end
+ end
+
+ context 'and invalid id' do
+ it 'returns 404' do
+ get_terminal_websocket(id: 1234)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+ end
+ end
+
+ context 'with invalid workhorse signature' do
+ it 'aborts with an exception' do
+ allow(Gitlab::Workhorse).to receive(:verify_api_request!).and_raise(JWT::DecodeError)
+
+ expect { get_terminal_websocket(id: job.id) }.to raise_error(JWT::DecodeError)
+ end
+ end
+
+ def get_terminal_websocket(**extra_params)
+ params = {
+ namespace_id: project.namespace.to_param,
+ project_id: project
+ }
+
+ get :terminal_websocket_authorize, params.merge(extra_params)
+ end
+ end
end