diff options
Diffstat (limited to 'spec/models')
-rw-r--r-- | spec/models/uploads/fog_spec.rb | 87 |
1 files changed, 84 insertions, 3 deletions
diff --git a/spec/models/uploads/fog_spec.rb b/spec/models/uploads/fog_spec.rb index 1ffe7c6c43b..a1b0bcf95e0 100644 --- a/spec/models/uploads/fog_spec.rb +++ b/spec/models/uploads/fog_spec.rb @@ -3,10 +3,21 @@ require 'spec_helper' RSpec.describe Uploads::Fog do + let(:credentials) do + { + provider: "AWS", + aws_access_key_id: "AWS_ACCESS_KEY_ID", + aws_secret_access_key: "AWS_SECRET_ACCESS_KEY", + region: "eu-central-1" + } + end + + let(:bucket_prefix) { nil } let(:data_store) { described_class.new } + let(:config) { { connection: credentials, bucket_prefix: bucket_prefix, remote_directory: 'uploads' } } before do - stub_uploads_object_storage(FileUploader) + stub_uploads_object_storage(FileUploader, config: config) end describe '#available?' do @@ -18,7 +29,7 @@ RSpec.describe Uploads::Fog do context 'when object storage is disabled' do before do - stub_uploads_object_storage(FileUploader, enabled: false) + stub_uploads_object_storage(FileUploader, config: config, enabled: false) end it { is_expected.to be_falsy } @@ -28,6 +39,60 @@ RSpec.describe Uploads::Fog do context 'model with uploads' do let(:project) { create(:project) } let(:relation) { project.uploads } + let(:connection) { ::Fog::Storage.new(credentials) } + let(:paths) { relation.pluck(:path) } + + # Only fog-aws simulates mocking of deleting an object properly. + # We'll just test that the various providers implement the require methods. + describe 'Fog provider acceptance tests' do + let!(:uploads) { create_list(:upload, 2, :with_file, :issuable_upload, model: project) } + + shared_examples 'Fog provider' do + describe '#get_object' do + it 'returns a Hash with a body' do + expect(connection.get_object('uploads', paths.first)[:body]).not_to be_nil + end + end + + describe '#delete_object' do + it 'returns true' do + expect(connection.delete_object('uploads', paths.first)).to be_truthy + end + end + end + + before do + uploads.each { |upload| upload.retrieve_uploader.migrate!(2) } + end + + context 'with AWS provider' do + it_behaves_like 'Fog provider' + end + + context 'with Google provider' do + let(:credentials) do + { + provider: "Google", + google_storage_access_key_id: 'ACCESS_KEY_ID', + google_storage_secret_access_key: 'SECRET_ACCESS_KEY' + } + end + + it_behaves_like 'Fog provider' + end + + context 'with AzureRM provider' do + let(:credentials) do + { + provider: 'AzureRM', + azure_storage_account_name: 'test-access-id', + azure_storage_access_key: 'secret' + } + end + + it_behaves_like 'Fog provider' + end + end describe '#keys' do let!(:uploads) { create_list(:upload, 2, :object_storage, uploader: FileUploader, model: project) } @@ -40,7 +105,7 @@ RSpec.describe Uploads::Fog do end describe '#delete_keys' do - let(:connection) { ::Fog::Storage.new(FileUploader.object_store_credentials) } + let(:connection) { ::Fog::Storage.new(credentials) } let(:keys) { data_store.keys(relation) } let(:paths) { relation.pluck(:path) } let!(:uploads) { create_list(:upload, 2, :with_file, :issuable_upload, model: project) } @@ -63,6 +128,22 @@ RSpec.describe Uploads::Fog do end end + context 'with bucket prefix' do + let(:bucket_prefix) { 'test-prefix' } + + it 'deletes multiple data' do + paths.each do |path| + expect(connection.get_object('uploads', File.join(bucket_prefix, path))[:body]).not_to be_nil + end + + subject + + paths.each do |path| + expect { connection.get_object('uploads', File.join(bucket_prefix, path))[:body] }.to raise_error(Excon::Error::NotFound) + end + end + end + context 'when one of keys is missing' do let(:keys) { ['unknown'] + super() } |