summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-08-05 09:10:01 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-08-05 09:10:01 +0000
commit88ad172d0417292fc1bf70a0dfb3877a0ecb7c79 (patch)
treee776a9c0a62297c292131e2009e3fc8734ed44d5 /spec
parentbd4eece38d24e421c8745c365f94be756589e892 (diff)
downloadgitlab-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.js92
-rw-r--r--spec/lib/object_storage/config_spec.rb150
-rw-r--r--spec/lib/object_storage/direct_upload_spec.rb44
-rw-r--r--spec/presenters/packages/detail/package_presenter_spec.rb24
-rw-r--r--spec/requests/api/group_packages_spec.rb182
-rw-r--r--spec/uploaders/object_storage_spec.rb71
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