Commit 1705c02b authored by Stan Hu's avatar Stan Hu

Merge branch 'vij-improve-snippet-api-specs' into 'master'

Improve spec performance for snippets API specs

See merge request gitlab-org/gitlab!45049
parents 21dfdd32 ea346826
...@@ -2,19 +2,28 @@ ...@@ -2,19 +2,28 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe API::Snippets do RSpec.describe API::Snippets, factory_default: :keep do
include SnippetHelpers include SnippetHelpers
let_it_be(:admin) { create(:user, :admin) } let_it_be(:admin) { create(:user, :admin) }
let_it_be(:user) { create(:user) } let_it_be(:user) { create(:user) }
let_it_be(:other_user) { create(:user) } let_it_be(:other_user) { create(:user) }
let_it_be(:public_snippet) { create(:personal_snippet, :repository, :public, author: user) } let_it_be(:public_snippet) { create(:personal_snippet, :repository, :public, author: user) }
let_it_be(:private_snippet) { create(:personal_snippet, :repository, :private, author: user) } let_it_be(:private_snippet) { create(:personal_snippet, :repository, :private, author: user) }
let_it_be(:internal_snippet) { create(:personal_snippet, :repository, :internal, author: user) } let_it_be(:internal_snippet) { create(:personal_snippet, :repository, :internal, author: user) }
let_it_be(:user_token) { create(:personal_access_token, user: user) }
let_it_be(:other_user_token) { create(:personal_access_token, user: other_user) }
let_it_be(:project) do
create_default(:project, :public).tap do |p|
p.add_maintainer(user)
end
end
describe 'GET /snippets/' do describe 'GET /snippets/' do
it 'returns snippets available for user' do it 'returns snippets available for user' do
get api("/snippets/", user) get api("/snippets/", personal_access_token: user_token)
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers expect(response).to include_pagination_headers
...@@ -30,7 +39,7 @@ RSpec.describe API::Snippets do ...@@ -30,7 +39,7 @@ RSpec.describe API::Snippets do
end end
it 'hides private snippets from regular user' do it 'hides private snippets from regular user' do
get api("/snippets/", other_user) get api("/snippets/", personal_access_token: other_user_token)
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers expect(response).to include_pagination_headers
...@@ -45,12 +54,10 @@ RSpec.describe API::Snippets do ...@@ -45,12 +54,10 @@ RSpec.describe API::Snippets do
end end
it 'does not return snippets related to a project with disable feature visibility' do it 'does not return snippets related to a project with disable feature visibility' do
project = create(:project) public_snippet = create(:project_snippet, :public, author: user, project: project)
create(:project_member, project: project, user: user)
public_snippet = create(:personal_snippet, :public, author: user, project: project)
project.project_feature.update_attribute(:snippets_access_level, 0) project.project_feature.update_attribute(:snippets_access_level, 0)
get api("/snippets/", user) get api("/snippets/", personal_access_token: user_token)
json_response.each do |snippet| json_response.each do |snippet|
expect(snippet["id"]).not_to eq(public_snippet.id) expect(snippet["id"]).not_to eq(public_snippet.id)
...@@ -69,7 +76,7 @@ RSpec.describe API::Snippets do ...@@ -69,7 +76,7 @@ RSpec.describe API::Snippets do
let(:path) { "/snippets/public" } let(:path) { "/snippets/public" }
it 'returns only public snippets from all users when authenticated' do it 'returns only public snippets from all users when authenticated' do
get api(path, user) get api(path, personal_access_token: user_token)
aggregate_failures do aggregate_failures do
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
...@@ -101,7 +108,7 @@ RSpec.describe API::Snippets do ...@@ -101,7 +108,7 @@ RSpec.describe API::Snippets do
end end
it 'returns raw text' do it 'returns raw text' do
get api("/snippets/#{snippet.id}/raw", user) get api("/snippets/#{snippet.id}/raw", personal_access_token: user_token)
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
expect(response.media_type).to eq 'text/plain' expect(response.media_type).to eq 'text/plain'
...@@ -111,7 +118,7 @@ RSpec.describe API::Snippets do ...@@ -111,7 +118,7 @@ RSpec.describe API::Snippets do
it 'returns 404 for invalid snippet id' do it 'returns 404 for invalid snippet id' do
snippet.destroy! snippet.destroy!
get api("/snippets/#{snippet.id}/raw", user) get api("/snippets/#{snippet.id}/raw", personal_access_token: user_token)
expect(response).to have_gitlab_http_status(:not_found) expect(response).to have_gitlab_http_status(:not_found)
expect(json_response['message']).to eq('404 Snippet Not Found') expect(json_response['message']).to eq('404 Snippet Not Found')
...@@ -120,12 +127,12 @@ RSpec.describe API::Snippets do ...@@ -120,12 +127,12 @@ RSpec.describe API::Snippets do
it_behaves_like 'snippet blob content' do it_behaves_like 'snippet blob content' do
let_it_be(:snippet_with_empty_repo) { create(:personal_snippet, :empty_repo, :private, author: user) } let_it_be(:snippet_with_empty_repo) { create(:personal_snippet, :empty_repo, :private, author: user) }
subject { get api("/snippets/#{snippet.id}/raw", snippet.author) } subject { get api("/snippets/#{snippet.id}/raw", snippet.author, personal_access_token: user_token) }
end end
end end
describe 'GET /snippets/:id/files/:ref/:file_path/raw' do describe 'GET /snippets/:id/files/:ref/:file_path/raw' do
let_it_be(:snippet) { create(:personal_snippet, :repository, :private) } let(:snippet) { private_snippet }
it_behaves_like 'raw snippet files' do it_behaves_like 'raw snippet files' do
let(:api_path) { "/snippets/#{snippet_id}/files/#{ref}/#{file_path}/raw" } let(:api_path) { "/snippets/#{snippet_id}/files/#{ref}/#{file_path}/raw" }
...@@ -139,7 +146,7 @@ RSpec.describe API::Snippets do ...@@ -139,7 +146,7 @@ RSpec.describe API::Snippets do
describe 'GET /snippets/:id' do describe 'GET /snippets/:id' do
let(:snippet_id) { private_snippet.id } let(:snippet_id) { private_snippet.id }
subject { get api("/snippets/#{snippet_id}", user) } subject { get api("/snippets/#{snippet_id}", personal_access_token: user_token) }
context 'with the author' do context 'with the author' do
it 'returns snippet json' do it 'returns snippet json' do
...@@ -189,7 +196,7 @@ RSpec.describe API::Snippets do ...@@ -189,7 +196,7 @@ RSpec.describe API::Snippets do
let(:file_params) { { files: [{ file_path: file_path, content: file_content }] } } let(:file_params) { { files: [{ file_path: file_path, content: file_content }] } }
let(:extra_params) { {} } let(:extra_params) { {} }
subject { post api("/snippets/", user), params: params } subject { post api("/snippets/", personal_access_token: user_token), params: params }
shared_examples 'snippet creation' do shared_examples 'snippet creation' do
let(:snippet) { Snippet.find(json_response["id"]) } let(:snippet) { Snippet.find(json_response["id"]) }
...@@ -255,6 +262,7 @@ RSpec.describe API::Snippets do ...@@ -255,6 +262,7 @@ RSpec.describe API::Snippets do
context 'with an external user' do context 'with an external user' do
let(:user) { create(:user, :external) } let(:user) { create(:user, :external) }
let(:user_token) { create(:personal_access_token, user: user) }
it 'does not create a new snippet' do it 'does not create a new snippet' do
subject subject
...@@ -328,8 +336,6 @@ RSpec.describe API::Snippets do ...@@ -328,8 +336,6 @@ RSpec.describe API::Snippets do
end end
describe 'PUT /snippets/:id' do describe 'PUT /snippets/:id' do
let_it_be(:other_user) { create(:user) }
let(:visibility_level) { Snippet::PUBLIC } let(:visibility_level) { Snippet::PUBLIC }
let(:snippet) do let(:snippet) do
create(:personal_snippet, :repository, author: user, visibility_level: visibility_level) create(:personal_snippet, :repository, author: user, visibility_level: visibility_level)
...@@ -409,11 +415,10 @@ RSpec.describe API::Snippets do ...@@ -409,11 +415,10 @@ RSpec.describe API::Snippets do
end end
context "when admin" do context "when admin" do
let(:admin) { create(:admin) } let_it_be(:token) { create(:personal_access_token, user: admin, scopes: [:sudo]) }
let(:token) { create(:personal_access_token, user: admin, scopes: [:sudo]) }
subject do subject do
put api("/snippets/#{snippet.id}", admin, personal_access_token: token), params: { visibility: 'private', sudo: user.id } put api("/snippets/#{snippet.id}", personal_access_token: token), params: { visibility: 'private', sudo: user.id }
end end
context 'when sudo is defined' do context 'when sudo is defined' do
...@@ -440,34 +445,32 @@ RSpec.describe API::Snippets do ...@@ -440,34 +445,32 @@ RSpec.describe API::Snippets do
end end
describe 'DELETE /snippets/:id' do describe 'DELETE /snippets/:id' do
let!(:public_snippet) { create(:personal_snippet, :public, author: user) }
it 'deletes snippet' do it 'deletes snippet' do
expect do expect do
delete api("/snippets/#{public_snippet.id}", user) delete api("/snippets/#{public_snippet.id}", personal_access_token: user_token)
expect(response).to have_gitlab_http_status(:no_content) expect(response).to have_gitlab_http_status(:no_content)
end.to change { PersonalSnippet.count }.by(-1) end.to change { PersonalSnippet.count }.by(-1)
end end
it 'returns 404 for invalid snippet id' do it 'returns 404 for invalid snippet id' do
delete api("/snippets/#{non_existing_record_id}", user) delete api("/snippets/#{non_existing_record_id}", personal_access_token: user_token)
expect(response).to have_gitlab_http_status(:not_found) expect(response).to have_gitlab_http_status(:not_found)
expect(json_response['message']).to eq('404 Snippet Not Found') expect(json_response['message']).to eq('404 Snippet Not Found')
end end
it_behaves_like '412 response' do it_behaves_like '412 response' do
let(:request) { api("/snippets/#{public_snippet.id}", user) } let(:request) { api("/snippets/#{public_snippet.id}", personal_access_token: user_token) }
end end
end end
describe "GET /snippets/:id/user_agent_detail" do describe "GET /snippets/:id/user_agent_detail" do
let(:admin) { create(:admin) } let(:snippet) { public_snippet }
let(:snippet) { create(:personal_snippet, :public, author: user) }
let!(:user_agent_detail) { create(:user_agent_detail, subject: snippet) }
it 'exposes known attributes' do it 'exposes known attributes' do
user_agent_detail = create(:user_agent_detail, subject: snippet)
get api("/snippets/#{snippet.id}/user_agent_detail", admin) get api("/snippets/#{snippet.id}/user_agent_detail", admin)
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment