diff options
Diffstat (limited to 'spec/support/shared_examples/models')
8 files changed, 176 insertions, 60 deletions
diff --git a/spec/support/shared_examples/models/boards/listable_shared_examples.rb b/spec/support/shared_examples/models/boards/listable_shared_examples.rb index e733a5488fb..250a4c1b1bd 100644 --- a/spec/support/shared_examples/models/boards/listable_shared_examples.rb +++ b/spec/support/shared_examples/models/boards/listable_shared_examples.rb @@ -16,18 +16,23 @@ RSpec.shared_examples 'boards listable model' do |list_factory| end describe 'scopes' do + let_it_be(:list1) { create(list_factory, list_type: :backlog) } + let_it_be(:list2) { create(list_factory, list_type: :closed) } + let_it_be(:list3) { create(list_factory, position: 1) } + let_it_be(:list4) { create(list_factory, position: 2) } + describe '.ordered' do it 'returns lists ordered by type and position' do - # rubocop:disable Rails/SaveBang - lists = [ - create(list_factory, list_type: :backlog), - create(list_factory, list_type: :closed), - create(list_factory, position: 1), - create(list_factory, position: 2) - ] - # rubocop:enable Rails/SaveBang - - expect(described_class.where(id: lists).ordered).to eq([lists[0], lists[2], lists[3], lists[1]]) + expect(described_class.where(id: [list1, list2, list3, list4]).ordered) + .to eq([list1, list3, list4, list2]) + end + end + + describe '.without_types' do + it 'excludes lists of given types' do + lists = described_class.without_types([:label, :closed]) + + expect(lists).to match_array([list1]) end end end diff --git a/spec/support/shared_examples/models/cluster_application_status_shared_examples.rb b/spec/support/shared_examples/models/cluster_application_status_shared_examples.rb index 7603787a54e..d3f3e15d299 100644 --- a/spec/support/shared_examples/models/cluster_application_status_shared_examples.rb +++ b/spec/support/shared_examples/models/cluster_application_status_shared_examples.rb @@ -138,7 +138,7 @@ RSpec.shared_examples 'cluster application status specs' do |application_name| it 'is installed' do subject.make_externally_installed - expect(subject).to be_installed + expect(subject).to be_externally_installed end context 'helm record does not exist' do @@ -170,7 +170,7 @@ RSpec.shared_examples 'cluster application status specs' do |application_name| it 'is installed' do subject.make_externally_installed - expect(subject).to be_installed + expect(subject).to be_externally_installed end end @@ -180,7 +180,7 @@ RSpec.shared_examples 'cluster application status specs' do |application_name| it 'is installed' do subject.make_externally_installed - expect(subject).to be_installed + expect(subject).to be_externally_installed end it 'clears #status_reason' do @@ -317,6 +317,7 @@ RSpec.shared_examples 'cluster application status specs' do |application_name| :uninstall_errored | false :uninstalled | false :timed_out | false + :externally_installed | true end with_them do diff --git a/spec/support/shared_examples/models/cluster_application_version_shared_examples.rb b/spec/support/shared_examples/models/cluster_application_version_shared_examples.rb index ed2e4fee2de..3acc43eb0da 100644 --- a/spec/support/shared_examples/models/cluster_application_version_shared_examples.rb +++ b/spec/support/shared_examples/models/cluster_application_version_shared_examples.rb @@ -47,4 +47,15 @@ RSpec.shared_examples 'cluster application version specs' do |application_name| end end end + + describe '#make_externally_installed' do + subject { build(application_name) } + + it 'sets to a special version' do + subject.make_externally_installed! + + expect(subject).to be_persisted + expect(subject.version).to eq('EXTERNALLY_INSTALLED') + end + end end diff --git a/spec/support/shared_examples/models/clusters/prometheus_client_shared.rb b/spec/support/shared_examples/models/clusters/prometheus_client_shared.rb new file mode 100644 index 00000000000..8d6dcfef925 --- /dev/null +++ b/spec/support/shared_examples/models/clusters/prometheus_client_shared.rb @@ -0,0 +1,86 @@ +# frozen_string_literal: true + +# Input +# - factory: [:clusters_applications_prometheus, :clusters_integrations_prometheus] +RSpec.shared_examples '#prometheus_client shared' do + shared_examples 'exception caught for prometheus client' do + before do + allow(kube_client).to receive(:proxy_url).and_raise(exception) + end + + it 'returns nil' do + expect(subject.prometheus_client).to be_nil + end + end + + context 'cluster is nil' do + it 'returns nil' do + expect(subject.cluster).to be_nil + expect(subject.prometheus_client).to be_nil + end + end + + context "cluster doesn't have kubeclient" do + let(:cluster) { create(:cluster) } + + subject { create(factory, cluster: cluster) } + + it 'returns nil' do + expect(subject.prometheus_client).to be_nil + end + end + + context 'cluster has kubeclient' do + let(:cluster) { create(:cluster, :project, :provided_by_gcp) } + let(:kubernetes_url) { subject.cluster.platform_kubernetes.api_url } + let(:kube_client) { subject.cluster.kubeclient.core_client } + + subject { create(factory, cluster: cluster) } + + before do + subject.cluster.platform_kubernetes.namespace = 'a-namespace' + stub_kubeclient_discover(cluster.platform_kubernetes.api_url) + + create(:cluster_kubernetes_namespace, + cluster: cluster, + cluster_project: cluster.cluster_project, + project: cluster.cluster_project.project) + end + + it 'creates proxy prometheus_client' do + expect(subject.prometheus_client).to be_instance_of(Gitlab::PrometheusClient) + end + + it 'merges proxy_url, options and headers from kube client with prometheus_client options' do + expect(Gitlab::PrometheusClient) + .to(receive(:new)) + .with(a_valid_url, kube_client.rest_client.options.merge({ + headers: kube_client.headers, + timeout: PrometheusAdapter::DEFAULT_PROMETHEUS_REQUEST_TIMEOUT_SEC + })) + subject.prometheus_client + end + + context 'when cluster is not reachable' do + it_behaves_like 'exception caught for prometheus client' do + let(:exception) { Kubeclient::HttpError.new(401, 'Unauthorized', nil) } + end + end + + context 'when there is a socket error while contacting cluster' do + it_behaves_like 'exception caught for prometheus client' do + let(:exception) { Errno::ECONNREFUSED } + end + + it_behaves_like 'exception caught for prometheus client' do + let(:exception) { Errno::ECONNRESET } + end + end + + context 'when the network is unreachable' do + it_behaves_like 'exception caught for prometheus client' do + let(:exception) { Errno::ENETUNREACH } + end + end + end +end diff --git a/spec/support/shared_examples/models/packages/debian/architecture_shared_examples.rb b/spec/support/shared_examples/models/packages/debian/architecture_shared_examples.rb index b73ff516670..fbb94b4f5c1 100644 --- a/spec/support/shared_examples/models/packages/debian/architecture_shared_examples.rb +++ b/spec/support/shared_examples/models/packages/debian/architecture_shared_examples.rb @@ -34,7 +34,7 @@ RSpec.shared_examples 'Debian Distribution Architecture' do |factory, container, subject { described_class.with_distribution(architecture.distribution) } it 'does not return other distributions' do - expect(subject.to_a).to eq([architecture, architecture_same_distribution]) + expect(subject.to_a).to match_array([architecture, architecture_same_distribution]) end end @@ -42,7 +42,7 @@ RSpec.shared_examples 'Debian Distribution Architecture' do |factory, container, subject { described_class.with_name(architecture.name) } it 'does not return other distributions' do - expect(subject.to_a).to eq([architecture, architecture_same_name]) + expect(subject.to_a).to match_array([architecture, architecture_same_name]) end end end diff --git a/spec/support/shared_examples/models/packages/debian/component_shared_examples.rb b/spec/support/shared_examples/models/packages/debian/component_shared_examples.rb index bf6fc23116c..23e76d32fb0 100644 --- a/spec/support/shared_examples/models/packages/debian/component_shared_examples.rb +++ b/spec/support/shared_examples/models/packages/debian/component_shared_examples.rb @@ -36,7 +36,7 @@ RSpec.shared_examples 'Debian Distribution Component' do |factory, container, ca subject { described_class.with_distribution(component.distribution) } it 'does not return other distributions' do - expect(subject.to_a).to eq([component, component_same_distribution]) + expect(subject.to_a).to match_array([component, component_same_distribution]) end end @@ -44,7 +44,7 @@ RSpec.shared_examples 'Debian Distribution Component' do |factory, container, ca subject { described_class.with_name(component.name) } it 'does not return other distributions' do - expect(subject.to_a).to eq([component, component_same_name]) + expect(subject.to_a).to match_array([component, component_same_name]) end end end diff --git a/spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb b/spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb index b4ec146df14..9eacacf725f 100644 --- a/spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb +++ b/spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb @@ -179,7 +179,7 @@ RSpec.shared_examples 'Debian Distribution' do |factory, container, can_freeze| subject { described_class.with_codename_or_suite(distribution_with_suite.codename) } it 'does not return other distributions' do - expect(subject.to_a).to eq([distribution_with_suite, distribution_with_same_codename, distribution_with_codename_and_suite_flipped]) + expect(subject.to_a).to contain_exactly(distribution_with_suite, distribution_with_same_codename, distribution_with_codename_and_suite_flipped) end end @@ -187,7 +187,7 @@ RSpec.shared_examples 'Debian Distribution' do |factory, container, can_freeze| subject { described_class.with_codename_or_suite(distribution_with_suite.suite) } it 'does not return other distributions' do - expect(subject.to_a).to eq([distribution_with_suite, distribution_with_same_suite, distribution_with_codename_and_suite_flipped]) + expect(subject.to_a).to contain_exactly(distribution_with_suite, distribution_with_same_suite, distribution_with_codename_and_suite_flipped) end end end diff --git a/spec/support/shared_examples/models/wiki_shared_examples.rb b/spec/support/shared_examples/models/wiki_shared_examples.rb index abc6e3ecce8..6b243aef3e6 100644 --- a/spec/support/shared_examples/models/wiki_shared_examples.rb +++ b/spec/support/shared_examples/models/wiki_shared_examples.rb @@ -354,33 +354,29 @@ RSpec.shared_examples 'wiki model' do subject.repository.create_file(user, 'image.png', image, branch_name: subject.default_branch, message: 'add image') end - shared_examples 'find_file results' do - it 'returns the latest version of the file if it exists' do - file = subject.find_file('image.png') + it 'returns the latest version of the file if it exists' do + file = subject.find_file('image.png') - expect(file.mime_type).to eq('image/png') - end + expect(file.mime_type).to eq('image/png') + end - it 'returns nil if the page does not exist' do - expect(subject.find_file('non-existent')).to eq(nil) - end + it 'returns nil if the page does not exist' do + expect(subject.find_file('non-existent')).to eq(nil) + end - it 'returns a Gitlab::Git::WikiFile instance' do - file = subject.find_file('image.png') + it 'returns a Gitlab::Git::WikiFile instance' do + file = subject.find_file('image.png') - expect(file).to be_a Gitlab::Git::WikiFile - end + expect(file).to be_a Gitlab::Git::WikiFile + end - it 'returns the whole file' do - file = subject.find_file('image.png') - image.rewind + it 'returns the whole file' do + file = subject.find_file('image.png') + image.rewind - expect(file.raw_data.b).to eq(image.read.b) - end + expect(file.raw_data.b).to eq(image.read.b) end - it_behaves_like 'find_file results' - context 'when load_content is disabled' do it 'includes the file data in the Gitlab::Git::WikiFile' do file = subject.find_file('image.png', load_content: false) @@ -388,14 +384,6 @@ RSpec.shared_examples 'wiki model' do expect(file.raw_data).to be_empty end end - - context 'when feature flag :gitaly_find_file is disabled' do - before do - stub_feature_flags(gitaly_find_file: false) - end - - it_behaves_like 'find_file results' - end end describe '#create_page' do @@ -481,28 +469,53 @@ RSpec.shared_examples 'wiki model' do end describe '#delete_page' do - let(:page) { create(:wiki_page, wiki: wiki) } + shared_examples 'delete_page operations' do + let(:page) { create(:wiki_page, wiki: wiki) } - it 'deletes the page' do - subject.delete_page(page) + it 'deletes the page' do + subject.delete_page(page) - expect(subject.list_pages.count).to eq(0) - end + expect(subject.list_pages.count).to eq(0) + end - it 'sets the correct commit email' do - subject.delete_page(page) + it 'sets the correct commit email' do + subject.delete_page(page) - expect(user.commit_email).not_to eq(user.email) - expect(commit.author_email).to eq(user.commit_email) - expect(commit.committer_email).to eq(user.commit_email) + expect(user.commit_email).not_to eq(user.email) + expect(commit.author_email).to eq(user.commit_email) + expect(commit.committer_email).to eq(user.commit_email) + end + + it 'runs after_wiki_activity callbacks' do + page + + expect(subject).to receive(:after_wiki_activity) + + subject.delete_page(page) + end end - it 'runs after_wiki_activity callbacks' do - page + it_behaves_like 'delete_page operations' - expect(subject).to receive(:after_wiki_activity) + context 'when an error is raised' do + it 'logs the error and returns false' do + page = build(:wiki_page, wiki: wiki) + exception = Gitlab::Git::Index::IndexError.new('foo') + + allow(subject.repository).to receive(:delete_file).and_raise(exception) + + expect(Gitlab::ErrorTracking).to receive(:log_exception).with(exception, action: :deleted, wiki_id: wiki.id) + + expect(subject.delete_page(page)).to be_falsey + end + end + + context 'when feature flag :gitaly_replace_wiki_delete_page is disabled' do + before do + stub_feature_flags(gitaly_replace_wiki_delete_page: false) + end - subject.delete_page(page) + it_behaves_like 'delete_page operations' end end |