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/models/repository_spec.rb')
-rw-r--r--spec/models/repository_spec.rb191
1 files changed, 124 insertions, 67 deletions
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 4e386bf584f..6fbf69ec23a 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -8,12 +8,12 @@ RSpec.describe Repository do
TestBlob = Struct.new(:path)
- let(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+
let(:repository) { project.repository }
let(:broken_repository) { create(:project, :broken_storage).repository }
- let(:user) { create(:user) }
let(:git_user) { Gitlab::Git::User.from_gitlab(user) }
-
let(:message) { 'Test message' }
let(:merge_commit) do
@@ -40,16 +40,20 @@ RSpec.describe Repository do
end
describe '#branch_names_contains' do
- let_it_be(:project) { create(:project, :repository) }
+ subject { repository.branch_names_contains(sample_commit.id, **opts) }
- let(:repository) { project.repository }
-
- subject { repository.branch_names_contains(sample_commit.id) }
+ let(:opts) { {} }
it { is_expected.to include('master') }
it { is_expected.not_to include('feature') }
it { is_expected.not_to include('fix') }
+ context 'when limit is provided' do
+ let(:opts) { { limit: 1 } }
+
+ it { is_expected.to match_array(["'test'"]) }
+ end
+
describe 'when storage is broken', :broken_storage do
it 'raises a storage error' do
expect_to_raise_storage_error do
@@ -60,10 +64,18 @@ RSpec.describe Repository do
end
describe '#tag_names_contains' do
- subject { repository.tag_names_contains(sample_commit.id) }
+ subject { repository.tag_names_contains(sample_commit.id, **opts) }
+
+ let(:opts) { {} }
it { is_expected.to include('v1.1.0') }
it { is_expected.not_to include('v1.0.0') }
+
+ context 'when limit is provided' do
+ let(:opts) { { limit: 1 } }
+
+ it { is_expected.to match_array(['v1.1.0']) }
+ end
end
describe '#tags_sorted_by' do
@@ -359,6 +371,8 @@ RSpec.describe Repository do
end
describe '#commits' do
+ let_it_be(:project) { create(:project, :repository) }
+
context 'when neither the all flag nor a ref are specified' do
it 'returns every commit from default branch' do
expect(repository.commits(nil, limit: 60).size).to eq(37)
@@ -431,10 +445,6 @@ RSpec.describe Repository do
end
describe '#new_commits' do
- let_it_be(:project) { create(:project, :repository) }
-
- let(:repository) { project.repository }
-
subject { repository.new_commits(rev) }
context 'when there are no new commits' do
@@ -498,6 +508,8 @@ RSpec.describe Repository do
end
describe '#commits_between' do
+ let_it_be(:project) { create(:project, :repository) }
+
let(:commit) { project.commit }
it 'delegates to Gitlab::Git::Commit#between, returning decorated commits' do
@@ -614,6 +626,8 @@ RSpec.describe Repository do
end
describe '#merged_to_root_ref?' do
+ let_it_be(:project) { create(:project, :repository) }
+
context 'merged branch without ff' do
subject { repository.merged_to_root_ref?('branch-merged') }
@@ -843,14 +857,16 @@ RSpec.describe Repository do
end
describe "#create_dir" do
+ let_it_be(:project) { create(:project, :repository) }
+
it "commits a change that creates a new directory" do
expect do
- repository.create_dir(user, 'newdir',
+ repository.create_dir(user, 'newdir1',
message: 'Create newdir', branch_name: 'master')
end.to change { repository.count_commits(ref: 'master') }.by(1)
- newdir = repository.tree('master', 'newdir')
- expect(newdir.path).to eq('newdir')
+ newdir = repository.tree('master', 'newdir1')
+ expect(newdir.path).to eq('newdir1')
end
context "when committing to another project" do
@@ -858,7 +874,7 @@ RSpec.describe Repository do
it "creates a fork and commit to the forked project" do
expect do
- repository.create_dir(user, 'newdir',
+ repository.create_dir(user, 'newdir2',
message: 'Create newdir', branch_name: 'patch',
start_branch_name: 'master', start_project: forked_project)
end.to change { repository.count_commits(ref: 'master') }.by(0)
@@ -866,15 +882,15 @@ RSpec.describe Repository do
expect(repository.branch_exists?('patch')).to be_truthy
expect(forked_project.repository.branch_exists?('patch')).to be_falsy
- newdir = repository.tree('patch', 'newdir')
- expect(newdir.path).to eq('newdir')
+ newdir = repository.tree('patch', 'newdir2')
+ expect(newdir.path).to eq('newdir2')
end
end
context "when an author is specified" do
it "uses the given email/name to set the commit's author" do
expect do
- repository.create_dir(user, 'newdir',
+ repository.create_dir(user, 'newdir3',
message: 'Add newdir',
branch_name: 'master',
author_email: author_email, author_name: author_name)
@@ -987,6 +1003,8 @@ RSpec.describe Repository do
end
describe "#delete_file" do
+ let(:project) { create(:project, :repository) }
+
it 'removes file successfully' do
expect do
repository.delete_file(user, 'README',
@@ -1013,6 +1031,8 @@ RSpec.describe Repository do
end
describe "search_files_by_content" do
+ let_it_be(:project) { create(:project, :repository) }
+
let(:results) { repository.search_files_by_content('feature', 'master') }
subject { results }
@@ -1248,6 +1268,8 @@ RSpec.describe Repository do
end
describe "#changelog", :use_clean_rails_memory_store_caching do
+ let(:project) { create(:project, :repository) }
+
it 'accepts changelog' do
expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('changelog')])
@@ -1280,6 +1302,8 @@ RSpec.describe Repository do
end
describe "#license_blob", :use_clean_rails_memory_store_caching do
+ let(:project) { create(:project, :repository) }
+
before do
repository.delete_file(
user, 'LICENSE', message: 'Remove LICENSE', branch_name: 'master')
@@ -1323,7 +1347,9 @@ RSpec.describe Repository do
end
end
- describe '#license_key', :use_clean_rails_memory_store_caching do
+ describe '#license_key', :clean_gitlab_redis_cache do
+ let(:project) { create(:project, :repository) }
+
before do
repository.delete_file(user, 'LICENSE',
message: 'Remove LICENSE', branch_name: 'master')
@@ -1367,50 +1393,52 @@ RSpec.describe Repository do
end
end
- describe '#license' do
- before do
- repository.delete_file(user, 'LICENSE',
- message: 'Remove LICENSE', branch_name: 'master')
- end
+ [true, false].each do |ff|
+ context "with feature flag license_from_gitaly=#{ff}" do
+ before do
+ stub_feature_flags(license_from_gitaly: ff)
+ end
- it 'returns nil when no license is detected' do
- expect(repository.license).to be_nil
- end
+ describe '#license', :use_clean_rails_memory_store_caching, :clean_gitlab_redis_cache do
+ let(:project) { create(:project, :repository) }
- it 'returns nil when the repository does not exist' do
- expect(repository).to receive(:exists?).and_return(false)
+ before do
+ repository.delete_file(user, 'LICENSE',
+ message: 'Remove LICENSE', branch_name: 'master')
+ end
- expect(repository.license).to be_nil
- end
+ it 'returns nil when no license is detected' do
+ expect(repository.license).to be_nil
+ end
- it 'returns nil when license_key is not recognized' do
- expect(repository).to receive(:license_key).twice.and_return('not-recognized')
- expect(Gitlab::ErrorTracking).to receive(:track_exception) do |ex|
- expect(ex).to be_a(Licensee::InvalidLicense)
- end
+ it 'returns nil when the repository does not exist' do
+ expect(repository).to receive(:exists?).and_return(false)
- expect(repository.license).to be_nil
- end
+ expect(repository.license).to be_nil
+ end
- it 'returns other when the content is not recognizable' do
- license = Licensee::License.new('other')
- repository.create_file(user, 'LICENSE', 'Gitlab B.V.',
- message: 'Add LICENSE', branch_name: 'master')
+ it 'returns other when the content is not recognizable' do
+ repository.create_file(user, 'LICENSE', 'Gitlab B.V.',
+ message: 'Add LICENSE', branch_name: 'master')
- expect(repository.license).to eq(license)
- end
+ expect(repository.license_key).to eq('other')
+ end
- it 'returns the license' do
- license = Licensee::License.new('mit')
- repository.create_file(user, 'LICENSE',
- license.content,
- message: 'Add LICENSE', branch_name: 'master')
+ it 'returns the license' do
+ license = Licensee::License.new('mit')
+ repository.create_file(user, 'LICENSE',
+ license.content,
+ message: 'Add LICENSE', branch_name: 'master')
- expect(repository.license).to eq(license)
+ expect(repository.license_key).to eq(license.key)
+ end
+ end
end
end
describe "#gitlab_ci_yml", :use_clean_rails_memory_store_caching do
+ let(:project) { create(:project, :repository) }
+
it 'returns valid file' do
files = [TestBlob.new('file'), TestBlob.new('.gitlab-ci.yml'), TestBlob.new('copying')]
expect(repository.tree).to receive(:blobs).and_return(files)
@@ -1430,11 +1458,11 @@ RSpec.describe Repository do
end
describe '#ambiguous_ref?' do
- let(:ref) { 'ref' }
-
subject { repository.ambiguous_ref?(ref) }
context 'when ref is ambiguous' do
+ let(:ref) { 'ref' }
+
before do
repository.add_tag(project.creator, ref, 'master')
repository.add_branch(project.creator, ref, 'master')
@@ -1446,6 +1474,8 @@ RSpec.describe Repository do
end
context 'when ref is not ambiguous' do
+ let(:ref) { 'another_ref' }
+
before do
repository.add_tag(project.creator, ref, 'master')
end
@@ -1457,6 +1487,8 @@ RSpec.describe Repository do
end
describe '#has_ambiguous_refs?' do
+ let(:project) { create(:project, :repository) }
+
using RSpec::Parameterized::TableSyntax
where(:branch_names, :tag_names, :result) do
@@ -1484,6 +1516,7 @@ RSpec.describe Repository do
end
describe '#expand_ref' do
+ let(:project) { create(:project, :repository) }
let(:ref) { 'ref' }
subject { repository.expand_ref(ref) }
@@ -1520,6 +1553,7 @@ RSpec.describe Repository do
describe '#add_branch' do
let(:branch_name) { 'new_feature' }
let(:target) { 'master' }
+ let(:project) { create(:project, :repository) }
subject { repository.add_branch(user, branch_name, target) }
@@ -1604,6 +1638,8 @@ RSpec.describe Repository do
end
describe '#exists?' do
+ let(:project) { create(:project, :repository) }
+
it 'returns true when a repository exists' do
expect(repository.exists?).to be(true)
end
@@ -1624,6 +1660,8 @@ RSpec.describe Repository do
end
describe '#has_visible_content?' do
+ let(:project) { create(:project, :repository) }
+
it 'delegates to raw_repository when true' do
expect(repository.raw_repository).to receive(:has_visible_content?)
.and_return(true)
@@ -1690,6 +1728,8 @@ RSpec.describe Repository do
end
describe '#branch_names', :clean_gitlab_redis_cache do
+ let_it_be(:project) { create(:project, :repository) }
+
let(:fake_branch_names) { ['foobar'] }
it 'gets cached across Repository instances' do
@@ -1706,6 +1746,7 @@ RSpec.describe Repository do
end
describe '#empty?' do
+ let(:project) { create(:project, :repository) }
let(:empty_repository) { create(:project_empty_repo).repository }
it 'returns true for an empty repository' do
@@ -1752,6 +1793,8 @@ RSpec.describe Repository do
end
describe '#root_ref' do
+ let(:project) { create(:project, :repository) }
+
it 'returns a branch name' do
expect(repository.root_ref).to be_an_instance_of(String)
end
@@ -1792,6 +1835,8 @@ RSpec.describe Repository do
describe '#expire_branch_cache' do
# This method is private but we need it for testing purposes. Sadly there's
# no other proper way of testing caching operations.
+ let_it_be(:project) { create(:project, :repository) }
+
let(:cache) { repository.send(:cache) }
it 'expires the cache for all branches' do
@@ -2003,6 +2048,7 @@ RSpec.describe Repository do
end
describe '#revert' do
+ let(:project) { create(:project, :repository) }
let(:new_image_commit) { repository.commit('33f3729a45c02fc67d00adb1b8bca394b0e761d9') }
let(:update_image_commit) { repository.commit('2f63565e7aac07bcdadb654e253078b727143ec4') }
let(:message) { 'revert message' }
@@ -2039,6 +2085,7 @@ RSpec.describe Repository do
end
describe '#cherry_pick' do
+ let(:project) { create(:project, :repository) }
let(:conflict_commit) { repository.commit('c642fe9b8b9f28f9225d7ea953fe14e74748d53b') }
let(:pickable_commit) { repository.commit('7d3b0f7cff5f37573aea97cebfd5692ea1689924') }
let(:pickable_merge) { repository.commit('e56497bb5f03a90a51293fc6d516788730953899') }
@@ -2174,7 +2221,8 @@ RSpec.describe Repository do
:contribution_guide,
:changelog,
:license_blob,
- :license_key,
+ :license_licensee,
+ :license_gitaly,
:gitignore,
:gitlab_ci_yml,
:branch_names,
@@ -2404,7 +2452,7 @@ RSpec.describe Repository do
end
it 'returns a Gitlab::Git::Tag object' do
- tag = repository.add_tag(user, '8.5', 'master', 'foo')
+ tag = repository.add_tag(user, '8.6', 'master', 'foo')
expect(tag).to be_a(Gitlab::Git::Tag)
end
@@ -2412,12 +2460,14 @@ RSpec.describe Repository do
context 'with an invalid target' do
it 'returns false' do
- expect(repository.add_tag(user, '8.5', 'bar', 'foo')).to be false
+ expect(repository.add_tag(user, '8.7', 'bar', 'foo')).to be false
end
end
end
describe '#rm_branch' do
+ let(:project) { create(:project, :repository) }
+
it 'removes a branch' do
expect(repository).to receive(:before_remove_branch)
expect(repository).to receive(:after_remove_branch)
@@ -2452,6 +2502,8 @@ RSpec.describe Repository do
end
describe '#find_tag' do
+ let_it_be(:project) { create(:project, :repository) }
+
before do
allow(Gitlab::GitalyClient).to receive(:call).and_call_original
end
@@ -2477,6 +2529,8 @@ RSpec.describe Repository do
end
describe '#avatar' do
+ let(:project) { create(:project, :repository) }
+
it 'returns nil if repo does not exist' do
allow(repository).to receive(:root_ref).and_raise(Gitlab::Git::Repository::NoRepository)
@@ -2519,6 +2573,8 @@ RSpec.describe Repository do
end
describe '#xcode_project?' do
+ let(:project) { create(:project, :repository) }
+
before do
allow(repository).to receive(:tree).with(:head).and_return(double(:tree, trees: [tree]))
end
@@ -2654,7 +2710,7 @@ RSpec.describe Repository do
match[1].to_sym if match
end.compact
- expect(Repository::CACHED_METHODS + Repository::MEMOIZED_CACHED_METHODS).to include(*methods)
+ expect(Repository::CACHED_METHODS).to include(*methods)
end
end
@@ -2819,18 +2875,20 @@ RSpec.describe Repository do
describe '#refresh_method_caches' do
it 'refreshes the caches of the given types' do
expect(repository).to receive(:expire_method_caches)
- .with(%i(readme_path license_blob license_key license))
+ .with(%i(readme_path license_blob license_licensee license_gitaly))
expect(repository).to receive(:readme_path)
expect(repository).to receive(:license_blob)
- expect(repository).to receive(:license_key)
- expect(repository).to receive(:license)
+ expect(repository).to receive(:license_licensee)
+ expect(repository).to receive(:license_gitaly)
repository.refresh_method_caches(%i(readme license))
end
end
describe '#gitlab_ci_yml_for' do
+ let(:project) { create(:project, :repository) }
+
before do
repository.create_file(User.last, '.gitlab-ci.yml', 'CONTENT', message: 'Add .gitlab-ci.yml', branch_name: 'master')
end
@@ -2849,7 +2907,7 @@ RSpec.describe Repository do
end
describe '#changelog_config' do
- let(:user) { create(:user) }
+ let(:project) { create(:project, :repository) }
let(:changelog_config_path) { Gitlab::Changelog::Config::DEFAULT_FILE_PATH }
before do
@@ -2865,6 +2923,7 @@ RSpec.describe Repository do
context 'when there is a changelog_config_path at the commit' do
it 'returns the content' do
expect(repository.changelog_config(repository.commit.sha, changelog_config_path)).to eq('CONTENT')
+ expect(repository.changelog_config(repository.commit.parent.sha, changelog_config_path)).to be_nil
end
end
@@ -2876,6 +2935,8 @@ RSpec.describe Repository do
end
describe '#route_map_for' do
+ let(:project) { create(:project, :repository) }
+
before do
repository.create_file(User.last, '.gitlab/route-map.yml', 'CONTENT', message: 'Add .gitlab/route-map.yml', branch_name: 'master')
end
@@ -3148,7 +3209,6 @@ RSpec.describe Repository do
describe '#create_if_not_exists' do
let(:project) { create(:project) }
- let(:repository) { project.repository }
it 'creates the repository if it did not exist' do
expect { repository.create_if_not_exists }.to change { repository.exists? }.from(false).to(true)
@@ -3204,7 +3264,6 @@ RSpec.describe Repository do
describe '#create_from_bundle' do
let(:project) { create(:project) }
- let(:repository) { project.repository }
let(:valid_bundle_path) { File.join(Dir.tmpdir, "repo-#{SecureRandom.hex}.bundle") }
let(:raw_repository) { repository.raw }
@@ -3244,8 +3303,6 @@ RSpec.describe Repository do
describe "#blobs_metadata" do
let_it_be(:project) { create(:project, :repository) }
- let(:repository) { project.repository }
-
def expect_metadata_blob(thing)
expect(thing).to be_a(Blob)
expect(thing.data).to be_empty
@@ -3313,8 +3370,6 @@ RSpec.describe Repository do
subject { repository.lfs_enabled? }
context 'for a project repository' do
- let(:repository) { project.repository }
-
it 'returns true when LFS is enabled' do
stub_lfs_setting(enabled: true)
@@ -3425,6 +3480,8 @@ RSpec.describe Repository do
end
describe '#change_head' do
+ let_it_be(:project) { create(:project, :repository) }
+
let(:branch) { repository.container.default_branch }
context 'when the branch exists' do