diff options
author | Alejandro RodrÃguez <alejorro70@gmail.com> | 2018-03-06 21:12:29 -0300 |
---|---|---|
committer | Alejandro RodrÃguez <alejorro70@gmail.com> | 2018-03-06 21:12:29 -0300 |
commit | 5171e2f3d4fdc681a58e11f9615afa968324a278 (patch) | |
tree | 256a12ed77a7a6aabff58bc267a70d476cc4dfa7 /spec/lib | |
parent | 35f6efaee05835b75e605e1f269e57a8d6daf3fa (diff) | |
download | gitlab-ce-5171e2f3d4fdc681a58e11f9615afa968324a278.tar.gz |
Refactor RepositoryCache to make it usable in other classes
Diffstat (limited to 'spec/lib')
-rw-r--r-- | spec/lib/gitlab/repository_cache_adapter_spec.rb | 76 | ||||
-rw-r--r-- | spec/lib/gitlab/repository_cache_spec.rb (renamed from spec/lib/repository_cache_spec.rb) | 16 |
2 files changed, 85 insertions, 7 deletions
diff --git a/spec/lib/gitlab/repository_cache_adapter_spec.rb b/spec/lib/gitlab/repository_cache_adapter_spec.rb new file mode 100644 index 00000000000..85971f2a7ef --- /dev/null +++ b/spec/lib/gitlab/repository_cache_adapter_spec.rb @@ -0,0 +1,76 @@ +require 'spec_helper' + +describe Gitlab::RepositoryCacheAdapter do + let(:project) { create(:project, :repository) } + let(:repository) { project.repository } + let(:cache) { repository.send(:cache) } + + describe '#cache_method_output', :use_clean_rails_memory_store_caching do + let(:fallback) { 10 } + + context 'with a non-existing repository' do + let(:project) { create(:project) } # No repository + + subject do + repository.cache_method_output(:cats, fallback: fallback) do + repository.cats_call_stub + end + end + + it 'returns the fallback value' do + expect(subject).to eq(fallback) + end + + it 'avoids calling the original method' do + expect(repository).not_to receive(:cats_call_stub) + + subject + end + end + + context 'with a method throwing a non-existing-repository error' do + subject do + repository.cache_method_output(:cats, fallback: fallback) do + raise Gitlab::Git::Repository::NoRepository + end + end + + it 'returns the fallback value' do + expect(subject).to eq(fallback) + end + + it 'does not cache the data' do + subject + + expect(repository.instance_variable_defined?(:@cats)).to eq(false) + expect(cache.exist?(:cats)).to eq(false) + end + end + + context 'with an existing repository' do + it 'caches the output' do + object = double + + expect(object).to receive(:number).once.and_return(10) + + 2.times do + val = repository.cache_method_output(:cats) { object.number } + + expect(val).to eq(10) + end + + expect(repository.send(:cache).exist?(:cats)).to eq(true) + expect(repository.instance_variable_get(:@cats)).to eq(10) + end + end + end + + describe '#expire_method_caches' do + it 'expires the caches of the given methods' do + expect(cache).to receive(:expire).with(:readme) + expect(cache).to receive(:expire).with(:gitignore) + + repository.expire_method_caches(%i(readme gitignore)) + end + end +end diff --git a/spec/lib/repository_cache_spec.rb b/spec/lib/gitlab/repository_cache_spec.rb index 8b0c7254b5e..f4789421663 100644 --- a/spec/lib/repository_cache_spec.rb +++ b/spec/lib/gitlab/repository_cache_spec.rb @@ -1,34 +1,36 @@ require 'spec_helper' -describe RepositoryCache do - let(:project) { create(:project) } +describe Gitlab::RepositoryCache do let(:backend) { double('backend').as_null_object } - let(:cache) { described_class.new('example', project.id, backend) } + let(:project) { create(:project) } + let(:repository) { project.repository } + let(:namespace) { "#{repository.full_path}:#{project.id}" } + let(:cache) { described_class.new(repository, backend) } describe '#cache_key' do it 'includes the namespace' do - expect(cache.cache_key(:foo)).to eq "foo:example:#{project.id}" + expect(cache.cache_key(:foo)).to eq "foo:#{namespace}" end end describe '#expire' do it 'expires the given key from the cache' do cache.expire(:foo) - expect(backend).to have_received(:delete).with("foo:example:#{project.id}") + expect(backend).to have_received(:delete).with("foo:#{namespace}") end end describe '#fetch' do it 'fetches the given key from the cache' do cache.fetch(:bar) - expect(backend).to have_received(:fetch).with("bar:example:#{project.id}") + expect(backend).to have_received(:fetch).with("bar:#{namespace}") end it 'accepts a block' do p = -> {} cache.fetch(:baz, &p) - expect(backend).to have_received(:fetch).with("baz:example:#{project.id}", &p) + expect(backend).to have_received(:fetch).with("baz:#{namespace}", &p) end end end |