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:
Diffstat (limited to 'spec/requests/api/commits_spec.rb')
-rw-r--r--spec/requests/api/commits_spec.rb616
1 files changed, 359 insertions, 257 deletions
diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb
index 68fe45cd026..8a08d5203fd 100644
--- a/spec/requests/api/commits_spec.rb
+++ b/spec/requests/api/commits_spec.rb
@@ -7,14 +7,17 @@ RSpec.describe API::Commits do
include ProjectForksHelper
include SessionHelpers
- let(:user) { create(:user) }
- let(:guest) { create(:user).tap { |u| project.add_guest(u) } }
- let(:developer) { create(:user).tap { |u| project.add_developer(u) } }
- let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository, creator: user, path: 'my.project') }
+ let_it_be(:guest) { create(:user).tap { |u| project.add_guest(u) } }
+ let_it_be(:developer) { create(:user).tap { |u| project.add_developer(u) } }
+
let(:branch_with_dot) { project.repository.find_branch('ends-with.json') }
let(:branch_with_slash) { project.repository.find_branch('improve/awesome') }
let(:project_id) { project.id }
let(:current_user) { nil }
+ let(:group) { create(:group, :public) }
+ let(:inherited_guest) { create(:user).tap { |u| group.add_guest(u) } }
before do
project.add_maintainer(user)
@@ -44,7 +47,7 @@ RSpec.describe API::Commits do
end
context 'when unauthenticated', 'and project is public' do
- let(:project) { create(:project, :public, :repository) }
+ let_it_be(:project) { create(:project, :public, :repository) }
it_behaves_like 'project commits'
end
@@ -56,311 +59,340 @@ RSpec.describe API::Commits do
end
end
- context 'when authenticated', 'as a maintainer' do
- let(:current_user) { user }
+ context 'when authenticated' do
+ context 'when user is a direct project member' do
+ context 'and user is a maintainer' do
+ let(:current_user) { user }
- it_behaves_like 'project commits'
+ it_behaves_like 'project commits'
- context "since optional parameter" do
- it "returns project commits since provided parameter" do
- commits = project.repository.commits("master", limit: 2)
- after = commits.second.created_at
+ context "since optional parameter" do
+ it "returns project commits since provided parameter" do
+ commits = project.repository.commits("master", limit: 2)
+ after = commits.second.created_at
- get api("/projects/#{project_id}/repository/commits?since=#{after.utc.iso8601}", user)
+ get api("/projects/#{project_id}/repository/commits?since=#{after.utc.iso8601}", user)
- expect(json_response.size).to eq 2
- expect(json_response.first["id"]).to eq(commits.first.id)
- expect(json_response.second["id"]).to eq(commits.second.id)
- end
+ expect(json_response.size).to eq 2
+ expect(json_response.first["id"]).to eq(commits.first.id)
+ expect(json_response.second["id"]).to eq(commits.second.id)
+ end
- it 'include correct pagination headers' do
- commits = project.repository.commits("master", limit: 2)
- after = commits.second.created_at
+ it 'include correct pagination headers' do
+ commits = project.repository.commits("master", limit: 2)
+ after = commits.second.created_at
- get api("/projects/#{project_id}/repository/commits?since=#{after.utc.iso8601}", user)
+ get api("/projects/#{project_id}/repository/commits?since=#{after.utc.iso8601}", user)
- expect(response).to include_limited_pagination_headers
- expect(response.headers['X-Page']).to eql('1')
- end
- end
+ expect(response).to include_limited_pagination_headers
+ expect(response.headers['X-Page']).to eql('1')
+ end
+ end
- context "until optional parameter" do
- it "returns project commits until provided parameter" do
- commits = project.repository.commits("master", limit: 20)
- before = commits.second.created_at
+ context "until optional parameter" do
+ it "returns project commits until provided parameter" do
+ commits = project.repository.commits("master", limit: 20)
+ before = commits.second.created_at
- get api("/projects/#{project_id}/repository/commits?until=#{before.utc.iso8601}", user)
+ get api("/projects/#{project_id}/repository/commits?until=#{before.utc.iso8601}", user)
- if commits.size == 20
- expect(json_response.size).to eq(20)
- else
- expect(json_response.size).to eq(commits.size - 1)
- end
+ if commits.size == 20
+ expect(json_response.size).to eq(20)
+ else
+ expect(json_response.size).to eq(commits.size - 1)
+ end
- expect(json_response.first["id"]).to eq(commits.second.id)
- expect(json_response.second["id"]).to eq(commits.third.id)
- end
+ expect(json_response.first["id"]).to eq(commits.second.id)
+ expect(json_response.second["id"]).to eq(commits.third.id)
+ end
- it 'include correct pagination headers' do
- commits = project.repository.commits("master", limit: 2)
- before = commits.second.created_at
+ it 'include correct pagination headers' do
+ commits = project.repository.commits("master", limit: 2)
+ before = commits.second.created_at
- get api("/projects/#{project_id}/repository/commits?until=#{before.utc.iso8601}", user)
+ get api("/projects/#{project_id}/repository/commits?until=#{before.utc.iso8601}", user)
- expect(response).to include_limited_pagination_headers
- expect(response.headers['X-Page']).to eql('1')
- end
- end
+ expect(response).to include_limited_pagination_headers
+ expect(response.headers['X-Page']).to eql('1')
+ end
+ end
- context "invalid xmlschema date parameters" do
- it "returns an invalid parameter error message" do
- get api("/projects/#{project_id}/repository/commits?since=invalid-date", user)
+ context "invalid xmlschema date parameters" do
+ it "returns an invalid parameter error message" do
+ get api("/projects/#{project_id}/repository/commits?since=invalid-date", user)
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error']).to eq('since is invalid')
- end
- end
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('since is invalid')
+ end
+ end
- context "with empty ref_name parameter" do
- let(:route) { "/projects/#{project_id}/repository/commits?ref_name=" }
+ context "with empty ref_name parameter" do
+ let(:route) { "/projects/#{project_id}/repository/commits?ref_name=" }
- it_behaves_like 'project commits'
- end
+ it_behaves_like 'project commits'
+ end
- context 'when repository does not exist' do
- let(:project) { create(:project, creator: user, path: 'my.project') }
+ context 'when repository does not exist' do
+ let(:project) { create(:project, creator: user, path: 'my.project') }
- it_behaves_like '404 response' do
- let(:request) { get api(route, current_user) }
- let(:message) { '404 Repository Not Found' }
- end
- end
+ it_behaves_like '404 response' do
+ let(:request) { get api(route, current_user) }
+ let(:message) { '404 Repository Not Found' }
+ end
+ end
- context "path optional parameter" do
- it "returns project commits matching provided path parameter" do
- path = 'files/ruby/popen.rb'
+ context "path optional parameter" do
+ it "returns project commits matching provided path parameter" do
+ path = 'files/ruby/popen.rb'
- get api("/projects/#{project_id}/repository/commits?path=#{path}", user)
+ get api("/projects/#{project_id}/repository/commits?path=#{path}", user)
- expect(json_response.size).to eq(3)
- expect(json_response.first["id"]).to eq("570e7b2abdd848b95f2f578043fc23bd6f6fd24d")
- expect(response).to include_limited_pagination_headers
- end
+ expect(json_response.size).to eq(3)
+ expect(json_response.first["id"]).to eq("570e7b2abdd848b95f2f578043fc23bd6f6fd24d")
+ expect(response).to include_limited_pagination_headers
+ end
- it 'include correct pagination headers' do
- path = 'files/ruby/popen.rb'
+ it 'include correct pagination headers' do
+ path = 'files/ruby/popen.rb'
- get api("/projects/#{project_id}/repository/commits?path=#{path}", user)
+ get api("/projects/#{project_id}/repository/commits?path=#{path}", user)
- expect(response).to include_limited_pagination_headers
- expect(response.headers['X-Page']).to eql('1')
- end
- end
+ expect(response).to include_limited_pagination_headers
+ expect(response.headers['X-Page']).to eql('1')
+ end
+ end
- context 'all optional parameter' do
- it 'returns all project commits' do
- expected_commit_ids = project.repository.commits(nil, all: true, limit: 50).map(&:id)
+ context 'all optional parameter' do
+ it 'returns all project commits' do
+ expected_commit_ids = project.repository.commits(nil, all: true, limit: 50).map(&:id)
- get api("/projects/#{project_id}/repository/commits?all=true&per_page=50", user)
+ get api("/projects/#{project_id}/repository/commits?all=true&per_page=50", user)
- commit_ids = json_response.map { |c| c['id'] }
+ commit_ids = json_response.map { |c| c['id'] }
- expect(response).to include_limited_pagination_headers
- expect(commit_ids).to eq(expected_commit_ids)
- expect(response.headers['X-Page']).to eql('1')
- end
- end
+ expect(response).to include_limited_pagination_headers
+ expect(commit_ids).to eq(expected_commit_ids)
+ expect(response.headers['X-Page']).to eql('1')
+ end
+ end
- context 'first_parent optional parameter' do
- it 'returns all first_parent commits' do
- expected_commit_ids = project.repository.commits(SeedRepo::Commit::ID, limit: 50, first_parent: true).map(&:id)
+ context 'first_parent optional parameter' do
+ it 'returns all first_parent commits' do
+ expected_commit_ids = project.repository.commits(SeedRepo::Commit::ID, limit: 50, first_parent: true).map(&:id)
- get api("/projects/#{project_id}/repository/commits?per_page=50", user), params: { ref_name: SeedRepo::Commit::ID, first_parent: 'true' }
+ get api("/projects/#{project_id}/repository/commits?per_page=50", user), params: { ref_name: SeedRepo::Commit::ID, first_parent: 'true' }
- commit_ids = json_response.map { |c| c['id'] }
+ commit_ids = json_response.map { |c| c['id'] }
- expect(response).to include_limited_pagination_headers
- expect(expected_commit_ids.size).to eq(12)
- expect(commit_ids).to eq(expected_commit_ids)
- end
- end
+ expect(response).to include_limited_pagination_headers
+ expect(expected_commit_ids.size).to eq(12)
+ expect(commit_ids).to eq(expected_commit_ids)
+ end
+ end
- context 'with_stats optional parameter' do
- let(:project) { create(:project, :public, :repository) }
+ context 'with_stats optional parameter' do
+ let(:project) { create(:project, :public, :repository) }
- it_behaves_like 'project commits', schema: 'public_api/v4/commits_with_stats' do
- let(:route) { "/projects/#{project_id}/repository/commits?with_stats=true" }
+ it_behaves_like 'project commits', schema: 'public_api/v4/commits_with_stats' do
+ let(:route) { "/projects/#{project_id}/repository/commits?with_stats=true" }
- it 'include commits details' do
- commit = project.repository.commit
- get api(route, current_user)
+ it 'include commits details' do
+ commit = project.repository.commit
+ get api(route, current_user)
- expect(json_response.first['stats']['additions']).to eq(commit.stats.additions)
- expect(json_response.first['stats']['deletions']).to eq(commit.stats.deletions)
- expect(json_response.first['stats']['total']).to eq(commit.stats.total)
+ expect(json_response.first['stats']['additions']).to eq(commit.stats.additions)
+ expect(json_response.first['stats']['deletions']).to eq(commit.stats.deletions)
+ expect(json_response.first['stats']['total']).to eq(commit.stats.total)
+ end
+ end
end
- end
- end
- context 'with pagination params' do
- let(:page) { 1 }
- let(:per_page) { 5 }
- let(:ref_name) { 'master' }
- let(:request) do
- get api("/projects/#{project_id}/repository/commits?page=#{page}&per_page=#{per_page}&ref_name=#{ref_name}", user)
- end
+ context 'with pagination params' do
+ let(:page) { 1 }
+ let(:per_page) { 5 }
+ let(:ref_name) { 'master' }
+ let(:request) do
+ get api("/projects/#{project_id}/repository/commits?page=#{page}&per_page=#{per_page}&ref_name=#{ref_name}", user)
+ end
- it 'returns correct headers' do
- request
+ it 'returns correct headers' do
+ request
- expect(response).to include_limited_pagination_headers
- expect(response.headers['Link']).to match(/page=1&per_page=5/)
- expect(response.headers['Link']).to match(/page=2&per_page=5/)
- end
+ expect(response).to include_limited_pagination_headers
+ expect(response.headers['Link']).to match(/page=1&per_page=5/)
+ expect(response.headers['Link']).to match(/page=2&per_page=5/)
+ end
- context 'viewing the first page' do
- it 'returns the first 5 commits' do
- request
+ context 'viewing the first page' do
+ it 'returns the first 5 commits' do
+ request
- commit = project.repository.commit
+ commit = project.repository.commit
- expect(json_response.size).to eq(per_page)
- expect(json_response.first['id']).to eq(commit.id)
- expect(response.headers['X-Page']).to eq('1')
- end
- end
+ expect(json_response.size).to eq(per_page)
+ expect(json_response.first['id']).to eq(commit.id)
+ expect(response.headers['X-Page']).to eq('1')
+ end
+ end
- context 'viewing the third page' do
- let(:page) { 3 }
+ context 'viewing the third page' do
+ let(:page) { 3 }
- it 'returns the third 5 commits' do
- request
+ it 'returns the third 5 commits' do
+ request
- commit = project.repository.commits('HEAD', limit: per_page, offset: (page - 1) * per_page).first
+ commit = project.repository.commits('HEAD', limit: per_page, offset: (page - 1) * per_page).first
- expect(json_response.size).to eq(per_page)
- expect(json_response.first['id']).to eq(commit.id)
- expect(response.headers['X-Page']).to eq('3')
- end
- end
+ expect(json_response.size).to eq(per_page)
+ expect(json_response.first['id']).to eq(commit.id)
+ expect(response.headers['X-Page']).to eq('3')
+ end
+ end
- context 'when pagination params are invalid' do
- let_it_be(:project) { create(:project, :repository) }
+ context 'when pagination params are invalid' do
+ let_it_be(:project) { create(:project, :repository) }
- using RSpec::Parameterized::TableSyntax
+ using RSpec::Parameterized::TableSyntax
- where(:page, :per_page, :error_message) do
- 0 | nil | 'page does not have a valid value'
- -1 | nil | 'page does not have a valid value'
- 'a' | nil | 'page is invalid'
- nil | 0 | 'per_page does not have a valid value'
- nil | -1 | 'per_page does not have a valid value'
- nil | 'a' | 'per_page is invalid'
- end
+ where(:page, :per_page, :error_message) do
+ 0 | nil | 'page does not have a valid value'
+ -1 | nil | 'page does not have a valid value'
+ 'a' | nil | 'page is invalid'
+ nil | 0 | 'per_page does not have a valid value'
+ nil | -1 | 'per_page does not have a valid value'
+ nil | 'a' | 'per_page is invalid'
+ end
- with_them do
- it 'returns 400 response' do
- request
+ with_them do
+ it 'returns 400 response' do
+ request
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error']).to eq(error_message)
- end
- end
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq(error_message)
+ end
+ end
- context 'when FF is off' do
- before do
- stub_feature_flags(only_positive_pagination_values: false)
- end
+ context 'when FF is off' do
+ before do
+ stub_feature_flags(only_positive_pagination_values: false)
+ end
- where(:page, :per_page, :error_message, :status) do
- 0 | nil | nil | :success
- -10 | nil | nil | :internal_server_error
- 'a' | nil | 'page is invalid' | :bad_request
- nil | 0 | 'per_page has a value not allowed' | :bad_request
- nil | -1 | nil | :success
- nil | 'a' | 'per_page is invalid' | :bad_request
- end
+ where(:page, :per_page, :error_message, :status) do
+ 0 | nil | nil | :success
+ -10 | nil | nil | :internal_server_error
+ 'a' | nil | 'page is invalid' | :bad_request
+ nil | 0 | 'per_page has a value not allowed' | :bad_request
+ nil | -1 | nil | :success
+ nil | 'a' | 'per_page is invalid' | :bad_request
+ end
- with_them do
- it 'returns a response' do
- request
+ with_them do
+ it 'returns a response' do
+ request
- expect(response).to have_gitlab_http_status(status)
+ expect(response).to have_gitlab_http_status(status)
- if error_message
- expect(json_response['error']).to eq(error_message)
+ if error_message
+ expect(json_response['error']).to eq(error_message)
+ end
+ end
end
end
end
end
- end
- end
- context 'with order parameter' do
- let(:route) { "/projects/#{project_id}/repository/commits?ref_name=0031876&per_page=6&order=#{order}" }
+ context 'with order parameter' do
+ let(:route) { "/projects/#{project_id}/repository/commits?ref_name=0031876&per_page=6&order=#{order}" }
- context 'set to topo' do
- let(:order) { 'topo' }
+ context 'set to topo' do
+ let(:order) { 'topo' }
- # git log --graph -n 6 --pretty=format:"%h" --topo-order 0031876
- # * 0031876
- # |\
- # | * 48ca272
- # | * 335bc94
- # * | bf6e164
- # * | 9d526f8
- # |/
- # * 1039376
- it 'returns project commits ordered by topo order' do
- commits = project.repository.commits("0031876", limit: 6, order: 'topo')
+ # git log --graph -n 6 --pretty=format:"%h" --topo-order 0031876
+ # * 0031876
+ # |\
+ # | * 48ca272
+ # | * 335bc94
+ # * | bf6e164
+ # * | 9d526f8
+ # |/
+ # * 1039376
+ it 'returns project commits ordered by topo order' do
+ commits = project.repository.commits("0031876", limit: 6, order: 'topo')
- get api(route, current_user)
+ get api(route, current_user)
- expect(json_response.size).to eq(6)
- expect(json_response.map { |entry| entry["id"] }).to eq(commits.map(&:id))
- end
- end
+ expect(json_response.size).to eq(6)
+ expect(json_response.map { |entry| entry["id"] }).to eq(commits.map(&:id))
+ end
+ end
+
+ context 'set to default' do
+ let(:order) { 'default' }
+
+ # git log --graph -n 6 --pretty=format:"%h" --date-order 0031876
+ # * 0031876
+ # |\
+ # * | bf6e164
+ # | * 48ca272
+ # * | 9d526f8
+ # | * 335bc94
+ # |/
+ # * 1039376
+ it 'returns project commits ordered by default order' do
+ commits = project.repository.commits("0031876", limit: 6, order: 'default')
+
+ get api(route, current_user)
+
+ expect(json_response.size).to eq(6)
+ expect(json_response.map { |entry| entry["id"] }).to eq(commits.map(&:id))
+ end
+ end
- context 'set to default' do
- let(:order) { 'default' }
+ context 'set to an invalid parameter' do
+ let(:order) { 'invalid' }
- # git log --graph -n 6 --pretty=format:"%h" --date-order 0031876
- # * 0031876
- # |\
- # * | bf6e164
- # | * 48ca272
- # * | 9d526f8
- # | * 335bc94
- # |/
- # * 1039376
- it 'returns project commits ordered by default order' do
- commits = project.repository.commits("0031876", limit: 6, order: 'default')
+ it_behaves_like '400 response' do
+ let(:request) { get api(route, current_user) }
+ end
+ end
+ end
- get api(route, current_user)
+ context 'with the optional trailers parameter' do
+ it 'includes the Git trailers' do
+ get api("/projects/#{project_id}/repository/commits?ref_name=6d394385cf567f80a8fd85055db1ab4c5295806f&trailers=true", current_user)
- expect(json_response.size).to eq(6)
- expect(json_response.map { |entry| entry["id"] }).to eq(commits.map(&:id))
+ commit = json_response[0]
+
+ expect(commit['trailers']).to eq(
+ 'Signed-off-by' => 'Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>'
+ )
+ end
end
end
+ end
- context 'set to an invalid parameter' do
- let(:order) { 'invalid' }
+ context 'when user is an inherited member from the group' do
+ context 'when project is public with private repository' do
+ let(:project) { create(:project, :public, :repository, :repository_private, group: group) }
- it_behaves_like '400 response' do
- let(:request) { get api(route, current_user) }
+ context 'and user is a guest' do
+ let(:current_user) { inherited_guest }
+
+ it_behaves_like 'project commits'
end
end
- end
- context 'with the optional trailers parameter' do
- it 'includes the Git trailers' do
- get api("/projects/#{project_id}/repository/commits?ref_name=6d394385cf567f80a8fd85055db1ab4c5295806f&trailers=true", current_user)
+ context 'when project is private' do
+ let(:project) { create(:project, :private, :repository, group: group) }
- commit = json_response[0]
+ context 'and user is a guest' do
+ let(:current_user) { inherited_guest }
- expect(commit['trailers']).to eq(
- 'Signed-off-by' => 'Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>'
- )
+ it_behaves_like '404 response' do
+ let(:request) { get api(route) }
+ let(:message) { '404 Project Not Found' }
+ end
+ end
end
end
end
@@ -382,6 +414,9 @@ RSpec.describe API::Commits do
end
describe 'create' do
+ let_it_be(:sequencer) { FactoryBot::Sequence.new(:new_file_path) { |n| "files/test/#{n}.rb" } }
+
+ let(:new_file_path) { sequencer.next }
let(:message) { 'Created a new file with a very very looooooooooooooooooooooooooooooooooooooooooooooong commit message' }
let(:invalid_c_params) do
{
@@ -404,7 +439,7 @@ RSpec.describe API::Commits do
actions: [
{
action: 'create',
- file_path: 'foo/bar/baz.txt',
+ file_path: new_file_path,
content: 'puts 8'
}
]
@@ -418,7 +453,7 @@ RSpec.describe API::Commits do
actions: [
{
action: 'create',
- file_path: 'foo/bar/baz.txt',
+ file_path: new_file_path,
content: 'puts 🦊'
}
]
@@ -466,11 +501,57 @@ RSpec.describe API::Commits do
end
context 'a new file in project repo' do
- before do
- post api(url, user), params: valid_c_params
+ context 'when user is a direct project member' do
+ before do
+ post api(url, user), params: valid_c_params
+ end
+
+ it_behaves_like 'successfully creates the commit'
end
- it_behaves_like "successfully creates the commit"
+ context 'when user is an inherited member from the group' do
+ context 'when project is public with private repository' do
+ let(:project) { create(:project, :public, :repository, :repository_private, group: group) }
+
+ context 'and user is a guest' do
+ it_behaves_like '403 response' do
+ let(:request) { post api(url, inherited_guest), params: valid_c_params }
+ let(:message) { '403 Forbidden' }
+ end
+ end
+ end
+
+ context 'when project is private' do
+ let(:project) { create(:project, :private, :repository, group: group) }
+
+ context 'and user is a guest' do
+ it_behaves_like '403 response' do
+ let(:request) { post api(url, inherited_guest), params: valid_c_params }
+ let(:message) { '403 Forbidden' }
+ end
+ end
+ end
+ end
+ end
+
+ context 'when repository is empty' do
+ let!(:project) { create(:project, :empty_repo) }
+
+ context 'when params are valid' do
+ before do
+ post api(url, user), params: valid_c_params
+ end
+
+ it_behaves_like "successfully creates the commit"
+ end
+
+ context 'when branch name is invalid' do
+ before do
+ post api(url, user), params: valid_c_params.merge(branch: 'wrong:name')
+ end
+
+ it { expect(response).to have_gitlab_http_status(:bad_request) }
+ end
end
context 'a new file with utf8 chars in project repo' do
@@ -882,6 +963,7 @@ RSpec.describe API::Commits do
end
describe 'multiple operations' do
+ let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
let(:message) { 'Multiple actions' }
let(:invalid_mo_params) do
{
@@ -951,17 +1033,11 @@ RSpec.describe API::Commits do
}
end
- it 'are committed as one in project repo' do
+ it 'is committed as one in project repo and includes stats' do
post api(url, user), params: valid_mo_params
expect(response).to have_gitlab_http_status(:created)
expect(json_response['title']).to eq(message)
- end
-
- it 'includes the commit stats' do
- post api(url, user), params: valid_mo_params
-
- expect(response).to have_gitlab_http_status(:created)
expect(json_response).to include 'stats'
end
@@ -1047,7 +1123,8 @@ RSpec.describe API::Commits do
end
describe 'GET /projects/:id/repository/commits/:sha/refs' do
- let(:project) { create(:project, :public, :repository) }
+ let_it_be(:project) { create(:project, :public, :repository) }
+
let(:tag) { project.repository.find_tag('v1.1.0') }
let(:commit_id) { tag.dereferenced_target.id }
let(:route) { "/projects/#{project_id}/repository/commits/#{commit_id}/refs" }
@@ -1062,6 +1139,8 @@ RSpec.describe API::Commits do
end
context 'when repository is disabled' do
+ let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
+
include_context 'disabled repository'
it_behaves_like '404 response' do
@@ -1151,6 +1230,8 @@ RSpec.describe API::Commits do
end
context 'when repository is disabled' do
+ let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
+
include_context 'disabled repository'
it_behaves_like '404 response' do
@@ -1192,8 +1273,14 @@ RSpec.describe API::Commits do
end
shared_examples_for 'ref with unaccessible pipeline' do
- let!(:pipeline) do
- create(:ci_empty_pipeline, project: project, status: :created, source: :push, ref: 'master', sha: commit.sha, protected: false)
+ let(:pipeline) do
+ create(:ci_empty_pipeline,
+ project: project,
+ status: :created,
+ source: :push,
+ ref: 'master',
+ sha: commit.sha,
+ protected: false)
end
it 'does not include last_pipeline' do
@@ -1231,7 +1318,7 @@ RSpec.describe API::Commits do
end
context 'when unauthenticated', 'and project is public' do
- let(:project) { create(:project, :public, :repository) }
+ let_it_be_with_reload(:project) { create(:project, :public, :repository) }
it_behaves_like 'ref commit'
it_behaves_like 'ref with pipeline'
@@ -1261,6 +1348,7 @@ RSpec.describe API::Commits do
context 'when builds are disabled' do
before do
project
+ .reload
.project_feature
.update!(builds_access_level: ProjectFeature::DISABLED)
end
@@ -1312,7 +1400,7 @@ RSpec.describe API::Commits do
context 'with private builds' do
before do
- project.project_feature.update!(builds_access_level: ProjectFeature::PRIVATE)
+ project.reload.project_feature.update!(builds_access_level: ProjectFeature::PRIVATE)
end
it_behaves_like 'ref with pipeline'
@@ -1338,8 +1426,8 @@ RSpec.describe API::Commits do
end
context 'when authenticated', 'as non_member and project is public' do
- let(:current_user) { create(:user) }
- let(:project) { create(:project, :public, :repository) }
+ let_it_be(:current_user) { create(:user) }
+ let_it_be_with_reload(:project) { create(:project, :public, :repository) }
it_behaves_like 'ref with pipeline'
@@ -1392,6 +1480,8 @@ RSpec.describe API::Commits do
end
context 'when repository is disabled' do
+ let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
+
include_context 'disabled repository'
it_behaves_like '404 response' do
@@ -1401,7 +1491,7 @@ RSpec.describe API::Commits do
end
context 'when unauthenticated', 'and project is public' do
- let(:project) { create(:project, :public, :repository) }
+ let_it_be(:project) { create(:project, :public, :repository) }
it_behaves_like 'ref diff'
end
@@ -1491,6 +1581,8 @@ RSpec.describe API::Commits do
end
context 'when repository is disabled' do
+ let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
+
include_context 'disabled repository'
it_behaves_like '404 response' do
@@ -1500,7 +1592,7 @@ RSpec.describe API::Commits do
end
context 'when unauthenticated', 'and project is public' do
- let(:project) { create(:project, :public, :repository) }
+ let_it_be(:project) { create(:project, :public, :repository) }
it_behaves_like 'ref comments'
end
@@ -1589,6 +1681,7 @@ RSpec.describe API::Commits do
end
describe 'POST :id/repository/commits/:sha/cherry_pick' do
+ let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
let(:commit) { project.commit('7d3b0f7cff5f37573aea97cebfd5692ea1689924') }
let(:commit_id) { commit.id }
let(:branch) { 'master' }
@@ -1626,6 +1719,8 @@ RSpec.describe API::Commits do
end
context 'when repository is disabled' do
+ let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
+
include_context 'disabled repository'
it_behaves_like '404 response' do
@@ -1635,7 +1730,7 @@ RSpec.describe API::Commits do
end
context 'when unauthenticated', 'and project is public' do
- let(:project) { create(:project, :public, :repository) }
+ let_it_be(:project) { create(:project, :public, :repository) }
it_behaves_like '403 response' do
let(:request) { post api(route), params: { branch: 'master' } }
@@ -1774,6 +1869,7 @@ RSpec.describe API::Commits do
end
describe 'POST :id/repository/commits/:sha/revert' do
+ let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
let(:commit_id) { 'b83d6e391c22777fca1ed3012fce84f633d7fed0' }
let(:commit) { project.commit(commit_id) }
let(:branch) { 'master' }
@@ -1814,7 +1910,7 @@ RSpec.describe API::Commits do
end
context 'when unauthenticated', 'and project is public' do
- let(:project) { create(:project, :public, :repository) }
+ let_it_be(:project) { create(:project, :public, :repository) }
it_behaves_like '403 response' do
let(:request) { post api(route), params: { branch: branch } }
@@ -1921,6 +2017,7 @@ RSpec.describe API::Commits do
end
describe 'POST /projects/:id/repository/commits/:sha/comments' do
+ let(:project) { create(:project, :repository, :private) }
let(:commit) { project.repository.commit }
let(:commit_id) { commit.id }
let(:note) { 'My comment' }
@@ -1941,6 +2038,8 @@ RSpec.describe API::Commits do
end
context 'when repository is disabled' do
+ let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
+
include_context 'disabled repository'
it_behaves_like '404 response' do
@@ -1950,7 +2049,7 @@ RSpec.describe API::Commits do
end
context 'when unauthenticated', 'and project is public' do
- let(:project) { create(:project, :public, :repository) }
+ let_it_be(:project) { create(:project, :public, :repository) }
it_behaves_like '400 response' do
let(:request) { post api(route), params: { note: 'My comment' } }
@@ -1970,12 +2069,13 @@ RSpec.describe API::Commits do
it_behaves_like 'ref new comment'
it 'returns the inline comment' do
- post api(route, current_user), params: { note: 'My comment', path: project.repository.commit.raw_diffs.first.new_path, line: 1, line_type: 'new' }
+ path = project.repository.commit.raw_diffs.first.new_path
+ post api(route, current_user), params: { note: 'My comment', path: path, line: 1, line_type: 'new' }
expect(response).to have_gitlab_http_status(:created)
expect(response).to match_response_schema('public_api/v4/commit_note')
expect(json_response['note']).to eq('My comment')
- expect(json_response['path']).to eq(project.repository.commit.raw_diffs.first.new_path)
+ expect(json_response['path']).to eq(path)
expect(json_response['line']).to eq(1)
expect(json_response['line_type']).to eq('new')
end
@@ -2050,7 +2150,8 @@ RSpec.describe API::Commits do
end
describe 'GET /projects/:id/repository/commits/:sha/merge_requests' do
- let(:project) { create(:project, :repository, :private) }
+ let_it_be(:project) { create(:project, :repository, :private) }
+
let(:merged_mr) { create(:merge_request, source_project: project, source_branch: 'master', target_branch: 'feature') }
let(:commit) { merged_mr.merge_request_diff.commits.last }
@@ -2082,7 +2183,8 @@ RSpec.describe API::Commits do
end
context 'public project' do
- let(:project) { create(:project, :repository, :public, :merge_requests_private) }
+ let_it_be(:project) { create(:project, :repository, :public, :merge_requests_private) }
+
let(:non_member) { create(:user) }
it 'responds 403 when only members are allowed to read merge requests' do