diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-08-05 09:10:01 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-08-05 09:10:01 +0000 |
commit | 88ad172d0417292fc1bf70a0dfb3877a0ecb7c79 (patch) | |
tree | e776a9c0a62297c292131e2009e3fc8734ed44d5 /spec | |
parent | bd4eece38d24e421c8745c365f94be756589e892 (diff) | |
download | gitlab-ce-88ad172d0417292fc1bf70a0dfb3877a0ecb7c79.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r-- | spec/frontend/vue_shared/components/issue/related_issuable_item_spec.js | 92 | ||||
-rw-r--r-- | spec/lib/object_storage/config_spec.rb | 150 | ||||
-rw-r--r-- | spec/lib/object_storage/direct_upload_spec.rb | 44 | ||||
-rw-r--r-- | spec/presenters/packages/detail/package_presenter_spec.rb | 24 | ||||
-rw-r--r-- | spec/requests/api/group_packages_spec.rb | 182 | ||||
-rw-r--r-- | spec/uploaders/object_storage_spec.rb | 71 |
6 files changed, 385 insertions, 178 deletions
diff --git a/spec/frontend/vue_shared/components/issue/related_issuable_item_spec.js b/spec/frontend/vue_shared/components/issue/related_issuable_item_spec.js index fe9a5156539..c6c21034a79 100644 --- a/spec/frontend/vue_shared/components/issue/related_issuable_item_spec.js +++ b/spec/frontend/vue_shared/components/issue/related_issuable_item_spec.js @@ -1,7 +1,7 @@ -import Vue from 'vue'; import { mount } from '@vue/test-utils'; import { formatDate } from '~/lib/utils/datetime_utility'; import RelatedIssuableItem from '~/vue_shared/components/issue/related_issuable_item.vue'; +import IssueDueDate from '~/boards/components/issue_due_date.vue'; import { defaultAssignees, defaultMilestone } from './related_issuable_mock_data'; import { TEST_HOST } from 'jest/helpers/test_constants'; @@ -71,85 +71,65 @@ describe('RelatedIssuableItem', () => { }); describe('token state', () => { - let tokenState; + const tokenState = () => wrapper.find({ ref: 'iconElementXL' }); - beforeEach(done => { + beforeEach(() => { wrapper.setProps({ state: 'opened' }); - - Vue.nextTick(() => { - tokenState = wrapper.find('.issue-token-state-icon-open'); - - done(); - }); }); it('renders if hasState', () => { - expect(tokenState.exists()).toBe(true); + expect(tokenState().exists()).toBe(true); }); it('renders state title', () => { - const stateTitle = tokenState.attributes('title'); + const stateTitle = tokenState().attributes('title'); const formattedCreateDate = formatDate(props.createdAt); expect(stateTitle).toContain('<span class="bold">Opened</span>'); - expect(stateTitle).toContain(`<span class="text-tertiary">${formattedCreateDate}</span>`); }); it('renders aria label', () => { - expect(tokenState.attributes('aria-label')).toEqual('opened'); + expect(tokenState().attributes('aria-label')).toEqual('opened'); }); it('renders open icon when open state', () => { - expect(tokenState.classes('issue-token-state-icon-open')).toBe(true); + expect(tokenState().classes('issue-token-state-icon-open')).toBe(true); }); - it('renders close icon when close state', done => { + it('renders close icon when close state', async () => { wrapper.setProps({ state: 'closed', closedAt: '2018-12-01T00:00:00.00Z', }); + await wrapper.vm.$nextTick(); - Vue.nextTick(() => { - expect(tokenState.classes('issue-token-state-icon-closed')).toBe(true); - - done(); - }); + expect(tokenState().classes('issue-token-state-icon-closed')).toBe(true); }); }); describe('token metadata', () => { - let tokenMetadata; - - beforeEach(done => { - Vue.nextTick(() => { - tokenMetadata = wrapper.find('.item-meta'); - - done(); - }); - }); + const tokenMetadata = () => wrapper.find('.item-meta'); it('renders item path and ID', () => { - const pathAndID = tokenMetadata.find('.item-path-id').text(); + const pathAndID = tokenMetadata() + .find('.item-path-id') + .text(); expect(pathAndID).toContain('gitlab-org/gitlab-test'); expect(pathAndID).toContain('#1'); }); it('renders milestone icon and name', () => { - const milestoneIcon = tokenMetadata.find('.item-milestone svg use'); - const milestoneTitle = tokenMetadata.find('.item-milestone .milestone-title'); + const milestoneIcon = tokenMetadata().find('.item-milestone svg use'); + const milestoneTitle = tokenMetadata().find('.item-milestone .milestone-title'); expect(milestoneIcon.attributes('href')).toContain('clock'); expect(milestoneTitle.text()).toContain('Milestone title'); }); - it('renders due date component', () => { - expect(tokenMetadata.find('.js-due-date-slot').exists()).toBe(true); - }); - - it('renders weight component', () => { - expect(tokenMetadata.find('.js-weight-slot').exists()).toBe(true); + it('renders due date component with correct due date', () => { + expect(wrapper.find(IssueDueDate).props('date')).toBe(props.dueDate); }); }); @@ -163,40 +143,30 @@ describe('RelatedIssuableItem', () => { }); describe('remove button', () => { - let removeBtn; + const removeButton = () => wrapper.find({ ref: 'removeButton' }); - beforeEach(done => { + beforeEach(() => { wrapper.setProps({ canRemove: true }); - Vue.nextTick(() => { - removeBtn = wrapper.find({ ref: 'removeButton' }); - - done(); - }); }); it('renders if canRemove', () => { - expect(removeBtn.exists()).toBe(true); + expect(removeButton().exists()).toBe(true); }); - it('renders disabled button when removeDisabled', done => { - wrapper.vm.removeDisabled = true; + it('renders disabled button when removeDisabled', async () => { + wrapper.setData({ removeDisabled: true }); + await wrapper.vm.$nextTick(); - Vue.nextTick(() => { - expect(removeBtn.attributes('disabled')).toEqual('disabled'); - - done(); - }); + expect(removeButton().attributes('disabled')).toEqual('disabled'); }); - it('triggers onRemoveRequest when clicked', () => { - removeBtn.trigger('click'); + it('triggers onRemoveRequest when clicked', async () => { + removeButton().trigger('click'); + await wrapper.vm.$nextTick(); + const { relatedIssueRemoveRequest } = wrapper.emitted(); - return wrapper.vm.$nextTick().then(() => { - const { relatedIssueRemoveRequest } = wrapper.emitted(); - - expect(relatedIssueRemoveRequest.length).toBe(1); - expect(relatedIssueRemoveRequest[0]).toEqual([props.idKey]); - }); + expect(relatedIssueRemoveRequest.length).toBe(1); + expect(relatedIssueRemoveRequest[0]).toEqual([props.idKey]); }); }); }); diff --git a/spec/lib/object_storage/config_spec.rb b/spec/lib/object_storage/config_spec.rb new file mode 100644 index 00000000000..6cbd96608dd --- /dev/null +++ b/spec/lib/object_storage/config_spec.rb @@ -0,0 +1,150 @@ +# frozen_string_literal: true + +require 'fast_spec_helper' + +RSpec.describe ObjectStorage::Config do + let(:region) { 'us-east-1' } + let(:bucket_name) { 'test-bucket' } + let(:path_style) { false } + let(:use_iam_profile) { false } + let(:credentials) do + { + provider: 'AWS', + aws_access_key_id: 'AWS_ACCESS_KEY_ID', + aws_secret_access_key: 'AWS_SECRET_ACCESS_KEY', + region: region, + path_style: path_style, + use_iam_profile: use_iam_profile + } + end + + let(:storage_options) do + { + server_side_encryption: 'AES256', + server_side_encryption_kms_key_id: 'arn:aws:12345' + } + end + + let(:raw_config) do + { + enabled: true, + connection: credentials, + remote_directory: bucket_name, + storage_options: storage_options + } + end + + subject { described_class.new(raw_config.as_json) } + + describe '#credentials' do + it { expect(subject.credentials).to eq(credentials) } + end + + describe '#storage_options' do + it { expect(subject.storage_options).to eq(storage_options) } + end + + describe '#enabled?' do + it { expect(subject.enabled?).to eq(true) } + end + + describe '#bucket' do + it { expect(subject.bucket).to eq(bucket_name) } + end + + context 'with unconsolidated settings' do + describe 'consolidated_settings? returns false' do + it { expect(subject.consolidated_settings?).to be false } + end + end + + context 'with consolidated settings' do + before do + raw_config[:consolidated_settings] = true + end + + describe 'consolidated_settings? returns true' do + it { expect(subject.consolidated_settings?).to be true } + end + end + + context 'with IAM profile in use' do + let(:use_iam_profile) { true } + + it '#use_iam_profile? returns true' do + expect(subject.use_iam_profile?).to be true + end + end + + context 'with IAM profile not in use' do + it '#use_iam_profile? returns false' do + expect(subject.use_iam_profile?).to be false + end + end + + context 'with path style' do + let(:path_style) { true } + + it '#use_path_style? returns true' do + expect(subject.use_path_style?).to be true + end + end + + context 'with hostname style access' do + it '#use_path_style? returns false' do + expect(subject.use_path_style?).to be false + end + end + + context 'with AWS credentials' do + it { expect(subject.provider).to eq('AWS') } + it { expect(subject.aws?).to be true } + it { expect(subject.google?).to be false } + end + + context 'with Google credentials' do + let(:credentials) do + { + provider: 'Google', + google_client_email: 'foo@gcp-project.example.com', + google_json_key_location: '/path/to/gcp.json' + } + end + + it { expect(subject.provider).to eq('Google') } + it { expect(subject.aws?).to be false } + it { expect(subject.google?).to be true } + it { expect(subject.fog_attributes).to eq({}) } + end + + context 'with SSE-KMS enabled' do + it { expect(subject.server_side_encryption).to eq('AES256') } + it { expect(subject.server_side_encryption_kms_key_id).to eq('arn:aws:12345') } + it { expect(subject.fog_attributes.keys).to match_array(%w(x-amz-server-side-encryption x-amz-server-side-encryption-aws-kms-key-id)) } + end + + context 'with only server side encryption enabled' do + let(:storage_options) { { server_side_encryption: 'AES256' } } + + it { expect(subject.server_side_encryption).to eq('AES256') } + it { expect(subject.server_side_encryption_kms_key_id).to be_nil } + it { expect(subject.fog_attributes).to eq({ 'x-amz-server-side-encryption' => 'AES256' }) } + end + + context 'without encryption enabled' do + let(:storage_options) { {} } + + it { expect(subject.server_side_encryption).to be_nil } + it { expect(subject.server_side_encryption_kms_key_id).to be_nil } + it { expect(subject.fog_attributes).to eq({}) } + end + + context 'with object storage disabled' do + before do + raw_config['enabled'] = false + end + + it { expect(subject.enabled?).to be false } + it { expect(subject.fog_attributes).to eq({}) } + end +end diff --git a/spec/lib/object_storage/direct_upload_spec.rb b/spec/lib/object_storage/direct_upload_spec.rb index 1c1455e2456..7e0f31cbd23 100644 --- a/spec/lib/object_storage/direct_upload_spec.rb +++ b/spec/lib/object_storage/direct_upload_spec.rb @@ -18,13 +18,25 @@ RSpec.describe ObjectStorage::DirectUpload do } end + let(:storage_options) { {} } + let(:raw_config) do + { + enabled: true, + connection: credentials, + remote_directory: bucket_name, + storage_options: storage_options, + consolidated_settings: consolidated_settings + } + end + + let(:config) { ObjectStorage::Config.new(raw_config) } let(:storage_url) { 'https://uploads.s3.amazonaws.com/' } let(:bucket_name) { 'uploads' } let(:object_name) { 'tmp/uploads/my-file' } let(:maximum_size) { 1.gigabyte } - let(:direct_upload) { described_class.new(credentials, bucket_name, object_name, has_length: has_length, maximum_size: maximum_size, consolidated_settings: consolidated_settings) } + let(:direct_upload) { described_class.new(config, object_name, has_length: has_length, maximum_size: maximum_size) } before do Fog.unmock! @@ -62,7 +74,7 @@ RSpec.describe ObjectStorage::DirectUpload do end describe '#get_url' do - subject { described_class.new(credentials, bucket_name, object_name, has_length: true) } + subject { described_class.new(config, object_name, has_length: true) } context 'when AWS is used' do it 'calls the proper method' do @@ -111,6 +123,7 @@ RSpec.describe ObjectStorage::DirectUpload do expect(s3_config[:Region]).to eq(region) expect(s3_config[:PathStyle]).to eq(path_style) expect(s3_config[:UseIamProfile]).to eq(use_iam_profile) + expect(s3_config.keys).not_to include(%i(ServerSideEncryption SSEKMSKeyID)) end context 'when feature flag is disabled' do @@ -150,6 +163,33 @@ RSpec.describe ObjectStorage::DirectUpload do expect(subject[:UseWorkhorseClient]).to be true end end + + context 'when only server side encryption is used' do + let(:storage_options) { { server_side_encryption: 'AES256' } } + + it 'sends server side encryption settings' do + s3_config = subject[:ObjectStorage][:S3Config] + + expect(s3_config[:ServerSideEncryption]).to eq('AES256') + expect(s3_config.keys).not_to include(:SSEKMSKeyID) + end + end + + context 'when SSE-KMS is used' do + let(:storage_options) do + { + server_side_encryption: 'AES256', + server_side_encryption_kms_key_id: 'arn:aws:12345' + } + end + + it 'sends server side encryption settings' do + s3_config = subject[:ObjectStorage][:S3Config] + + expect(s3_config[:ServerSideEncryption]).to eq('AES256') + expect(s3_config[:SSEKMSKeyID]).to eq('arn:aws:12345') + end + end end shared_examples 'a valid Google upload' do diff --git a/spec/presenters/packages/detail/package_presenter_spec.rb b/spec/presenters/packages/detail/package_presenter_spec.rb index 34582957364..732d8d0f6ad 100644 --- a/spec/presenters/packages/detail/package_presenter_spec.rb +++ b/spec/presenters/packages/detail/package_presenter_spec.rb @@ -10,13 +10,14 @@ RSpec.describe ::Packages::Detail::PackagePresenter do let_it_be(:user_info) { { name: user.name, avatar_url: user.avatar_url } } let!(:expected_package_files) do - npm_file = package.package_files.first - [{ - created_at: npm_file.created_at, - download_path: npm_file.download_path, - file_name: npm_file.file_name, - size: npm_file.size - }] + package.package_files.map do |file| + { + created_at: file.created_at, + download_path: file.download_path, + file_name: file.file_name, + size: file.size + } + end end let(:pipeline_info) do pipeline = package.build_info.pipeline @@ -67,6 +68,15 @@ RSpec.describe ::Packages::Detail::PackagePresenter do end end + context 'with composer metadata' do + let(:package) { create(:composer_package, :with_metadatum, sha: '123', project: project) } + let(:expected_package_details) { super().merge(composer_metadatum: package.composer_metadatum) } + + it 'returns composer_metadatum' do + expect(presenter.detail_view).to eq expected_package_details + end + end + context 'with nuget_metadatum' do let_it_be(:package) { create(:nuget_package, project: project) } let_it_be(:nuget_metadatum) { create(:nuget_metadatum, package: package) } diff --git a/spec/requests/api/group_packages_spec.rb b/spec/requests/api/group_packages_spec.rb index 7c7e8da3fb1..e02f6099637 100644 --- a/spec/requests/api/group_packages_spec.rb +++ b/spec/requests/api/group_packages_spec.rb @@ -13,135 +13,133 @@ RSpec.describe API::GroupPackages do let(:url) { "/groups/#{group.id}/packages" } let(:package_schema) { 'public_api/v4/packages/group_packages' } - context 'without the need for a license' do - context 'with sorting' do - let_it_be(:package1) { create(:npm_package, project: project, version: '3.1.0', name: "@#{project.root_namespace.path}/foo1") } - let_it_be(:package2) { create(:nuget_package, project: project, version: '2.0.4') } - let(:package3) { create(:maven_package, project: project, version: '1.1.1', name: 'zzz') } - - before do - travel_to(1.day.ago) do - package3 - end + context 'with sorting' do + let_it_be(:package1) { create(:npm_package, project: project, version: '3.1.0', name: "@#{project.root_namespace.path}/foo1") } + let_it_be(:package2) { create(:nuget_package, project: project, version: '2.0.4') } + let(:package3) { create(:maven_package, project: project, version: '1.1.1', name: 'zzz') } + + before do + travel_to(1.day.ago) do + package3 end + end - context 'without sorting params' do - let(:packages) { [package3, package1, package2] } + context 'without sorting params' do + let(:packages) { [package3, package1, package2] } - it 'sorts by created_at asc' do - subject + it 'sorts by created_at asc' do + subject - expect(json_response.map { |package| package['id'] }).to eq(packages.map(&:id)) - end + expect(json_response.map { |package| package['id'] }).to eq(packages.map(&:id)) end + end - it_behaves_like 'package sorting', 'name' do - let(:packages) { [package1, package2, package3] } - end + it_behaves_like 'package sorting', 'name' do + let(:packages) { [package1, package2, package3] } + end - it_behaves_like 'package sorting', 'created_at' do - let(:packages) { [package3, package1, package2] } - end + it_behaves_like 'package sorting', 'created_at' do + let(:packages) { [package3, package1, package2] } + end - it_behaves_like 'package sorting', 'version' do - let(:packages) { [package3, package2, package1] } - end + it_behaves_like 'package sorting', 'version' do + let(:packages) { [package3, package2, package1] } + end - it_behaves_like 'package sorting', 'type' do - let(:packages) { [package3, package1, package2] } - end + it_behaves_like 'package sorting', 'type' do + let(:packages) { [package3, package1, package2] } + end - it_behaves_like 'package sorting', 'project_path' do - let(:another_project) { create(:project, :public, namespace: group, name: 'project B') } - let!(:package4) { create(:npm_package, project: another_project, version: '3.1.0', name: "@#{project.root_namespace.path}/bar") } + it_behaves_like 'package sorting', 'project_path' do + let(:another_project) { create(:project, :public, namespace: group, name: 'project B') } + let!(:package4) { create(:npm_package, project: another_project, version: '3.1.0', name: "@#{project.root_namespace.path}/bar") } - let(:packages) { [package1, package2, package3, package4] } - end + let(:packages) { [package1, package2, package3, package4] } end + end - context 'with private group' do - let!(:package1) { create(:package, project: project) } - let!(:package2) { create(:package, project: project) } + context 'with private group' do + let!(:package1) { create(:package, project: project) } + let!(:package2) { create(:package, project: project) } - let(:group) { create(:group, :private) } - let(:subgroup) { create(:group, :private, parent: group) } - let(:project) { create(:project, :private, namespace: group) } - let(:subproject) { create(:project, :private, namespace: subgroup) } + let(:group) { create(:group, :private) } + let(:subgroup) { create(:group, :private, parent: group) } + let(:project) { create(:project, :private, namespace: group) } + let(:subproject) { create(:project, :private, namespace: subgroup) } - context 'with unauthenticated user' do - it_behaves_like 'rejects packages access', :group, :no_type, :not_found - end + context 'with unauthenticated user' do + it_behaves_like 'rejects packages access', :group, :no_type, :not_found + end + + context 'with authenticated user' do + subject { get api(url, user) } + + it_behaves_like 'returns packages', :group, :owner + it_behaves_like 'returns packages', :group, :maintainer + it_behaves_like 'returns packages', :group, :developer + it_behaves_like 'rejects packages access', :group, :reporter, :forbidden + it_behaves_like 'rejects packages access', :group, :guest, :forbidden - context 'with authenticated user' do - subject { get api(url, user) } + context 'with subgroup' do + let(:subgroup) { create(:group, :private, parent: group) } + let(:subproject) { create(:project, :private, namespace: subgroup) } + let!(:package3) { create(:npm_package, project: subproject) } - it_behaves_like 'returns packages', :group, :owner - it_behaves_like 'returns packages', :group, :maintainer - it_behaves_like 'returns packages', :group, :developer + it_behaves_like 'returns packages with subgroups', :group, :owner + it_behaves_like 'returns packages with subgroups', :group, :maintainer + it_behaves_like 'returns packages with subgroups', :group, :developer it_behaves_like 'rejects packages access', :group, :reporter, :forbidden it_behaves_like 'rejects packages access', :group, :guest, :forbidden - context 'with subgroup' do - let(:subgroup) { create(:group, :private, parent: group) } - let(:subproject) { create(:project, :private, namespace: subgroup) } - let!(:package3) { create(:npm_package, project: subproject) } + context 'excluding subgroup' do + let(:url) { "/groups/#{group.id}/packages?exclude_subgroups=true" } - it_behaves_like 'returns packages with subgroups', :group, :owner - it_behaves_like 'returns packages with subgroups', :group, :maintainer - it_behaves_like 'returns packages with subgroups', :group, :developer + it_behaves_like 'returns packages', :group, :owner + it_behaves_like 'returns packages', :group, :maintainer + it_behaves_like 'returns packages', :group, :developer it_behaves_like 'rejects packages access', :group, :reporter, :forbidden it_behaves_like 'rejects packages access', :group, :guest, :forbidden - - context 'excluding subgroup' do - let(:url) { "/groups/#{group.id}/packages?exclude_subgroups=true" } - - it_behaves_like 'returns packages', :group, :owner - it_behaves_like 'returns packages', :group, :maintainer - it_behaves_like 'returns packages', :group, :developer - it_behaves_like 'rejects packages access', :group, :reporter, :forbidden - it_behaves_like 'rejects packages access', :group, :guest, :forbidden - end end end end + end - context 'with public group' do - let_it_be(:package1) { create(:package, project: project) } - let_it_be(:package2) { create(:package, project: project) } + context 'with public group' do + let_it_be(:package1) { create(:package, project: project) } + let_it_be(:package2) { create(:package, project: project) } - context 'with unauthenticated user' do - it_behaves_like 'returns packages', :group, :no_type - end + context 'with unauthenticated user' do + it_behaves_like 'returns packages', :group, :no_type + end - context 'with authenticated user' do - subject { get api(url, user) } + context 'with authenticated user' do + subject { get api(url, user) } - it_behaves_like 'returns packages', :group, :owner - it_behaves_like 'returns packages', :group, :maintainer - it_behaves_like 'returns packages', :group, :developer - it_behaves_like 'returns packages', :group, :reporter - it_behaves_like 'returns packages', :group, :guest - end + it_behaves_like 'returns packages', :group, :owner + it_behaves_like 'returns packages', :group, :maintainer + it_behaves_like 'returns packages', :group, :developer + it_behaves_like 'returns packages', :group, :reporter + it_behaves_like 'returns packages', :group, :guest end + end - context 'with pagination params' do - let_it_be(:package1) { create(:package, project: project) } - let_it_be(:package2) { create(:package, project: project) } - let_it_be(:package3) { create(:npm_package, project: project) } - let_it_be(:package4) { create(:npm_package, project: project) } + context 'with pagination params' do + let_it_be(:package1) { create(:package, project: project) } + let_it_be(:package2) { create(:package, project: project) } + let_it_be(:package3) { create(:npm_package, project: project) } + let_it_be(:package4) { create(:npm_package, project: project) } - it_behaves_like 'returns paginated packages' - end + it_behaves_like 'returns paginated packages' + end - it_behaves_like 'filters on each package_type', is_project: false + it_behaves_like 'filters on each package_type', is_project: false - context 'does not accept non supported package_type value' do - include_context 'package filter context' + context 'does not accept non supported package_type value' do + include_context 'package filter context' - let(:url) { group_filter_url(:type, 'foo') } + let(:url) { group_filter_url(:type, 'foo') } - it_behaves_like 'returning response status', :bad_request - end + it_behaves_like 'returning response status', :bad_request end end end diff --git a/spec/uploaders/object_storage_spec.rb b/spec/uploaders/object_storage_spec.rb index 694aafe5ed5..12c936e154b 100644 --- a/spec/uploaders/object_storage_spec.rb +++ b/spec/uploaders/object_storage_spec.rb @@ -382,6 +382,32 @@ RSpec.describe ObjectStorage do it { is_expected.to eq(nil) } end + describe '#fog_attributes' do + subject { uploader.fog_attributes } + + it { is_expected.to eq({}) } + + context 'with encryption configured' do + let(:raw_options) do + { + "enabled" => true, + "connection" => { "provider" => 'AWS' }, + "storage_options" => { "server_side_encryption" => "AES256" } + } + end + + let(:options) { Settingslogic.new(raw_options) } + + before do + allow(uploader_class).to receive(:options) do + double(object_store: options) + end + end + + it { is_expected.to eq({ "x-amz-server-side-encryption" => "AES256" }) } + end + end + describe '.workhorse_authorize' do let(:has_length) { true } let(:maximum_size) { nil } @@ -459,13 +485,18 @@ RSpec.describe ObjectStorage do context 'uses AWS' do let(:storage_url) { "https://uploads.s3-eu-central-1.amazonaws.com/" } + 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 before do - expect(uploader_class).to receive(:object_store_credentials) do - { provider: "AWS", - aws_access_key_id: "AWS_ACCESS_KEY_ID", - aws_secret_access_key: "AWS_SECRET_ACCESS_KEY", - region: "eu-central-1" } + expect_next_instance_of(ObjectStorage::Config) do |instance| + allow(instance).to receive(:credentials).and_return(credentials) end end @@ -502,12 +533,17 @@ RSpec.describe ObjectStorage do context 'uses Google' do let(:storage_url) { "https://storage.googleapis.com/uploads/" } + let(:credentials) do + { + provider: "Google", + google_storage_access_key_id: 'ACCESS_KEY_ID', + google_storage_secret_access_key: 'SECRET_ACCESS_KEY' + } + end before do - expect(uploader_class).to receive(:object_store_credentials) do - { provider: "Google", - google_storage_access_key_id: 'ACCESS_KEY_ID', - google_storage_secret_access_key: 'SECRET_ACCESS_KEY' } + expect_next_instance_of(ObjectStorage::Config) do |instance| + allow(instance).to receive(:credentials).and_return(credentials) end end @@ -537,15 +573,18 @@ RSpec.describe ObjectStorage do context 'uses GDK/minio' do let(:storage_url) { "http://minio:9000/uploads/" } + let(:credentials) do + { provider: "AWS", + aws_access_key_id: "AWS_ACCESS_KEY_ID", + aws_secret_access_key: "AWS_SECRET_ACCESS_KEY", + endpoint: 'http://minio:9000', + path_style: true, + region: "gdk" } + end before do - expect(uploader_class).to receive(:object_store_credentials) do - { provider: "AWS", - aws_access_key_id: "AWS_ACCESS_KEY_ID", - aws_secret_access_key: "AWS_SECRET_ACCESS_KEY", - endpoint: 'http://minio:9000', - path_style: true, - region: "gdk" } + expect_next_instance_of(ObjectStorage::Config) do |instance| + allow(instance).to receive(:credentials).and_return(credentials) end end |