From 6ed4ec3e0b1340f96b7c043ef51d1b33bbe85fde Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 19 Sep 2022 23:18:09 +0000 Subject: Add latest changes from gitlab-org/gitlab@15-4-stable-ee --- spec/requests/api/commits_spec.rb | 616 ++++++++++++++++++++++---------------- 1 file changed, 359 insertions(+), 257 deletions(-) (limited to 'spec/requests/api/commits_spec.rb') 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 ' + ) + 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 ' - ) + 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 -- cgit v1.2.3