Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/graphql/deprecation_spec.rb')
-rw-r--r--spec/lib/gitlab/graphql/deprecation_spec.rb213
1 files changed, 213 insertions, 0 deletions
diff --git a/spec/lib/gitlab/graphql/deprecation_spec.rb b/spec/lib/gitlab/graphql/deprecation_spec.rb
new file mode 100644
index 00000000000..8b41145b855
--- /dev/null
+++ b/spec/lib/gitlab/graphql/deprecation_spec.rb
@@ -0,0 +1,213 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require 'active_model'
+
+RSpec.describe ::Gitlab::Graphql::Deprecation do
+ let(:options) { {} }
+
+ subject(:deprecation) { described_class.parse(options) }
+
+ describe '.parse' do
+ context 'with nil' do
+ let(:options) { nil }
+
+ it 'parses to nil' do
+ expect(deprecation).to be_nil
+ end
+ end
+
+ context 'with empty options' do
+ let(:options) { {} }
+
+ it 'parses to an empty deprecation' do
+ expect(deprecation).to eq(described_class.new)
+ end
+ end
+
+ context 'with defined options' do
+ let(:options) { { reason: :renamed, milestone: '10.10' } }
+
+ it 'assigns the properties' do
+ expect(deprecation).to eq(described_class.new(reason: 'This was renamed', milestone: '10.10'))
+ end
+ end
+ end
+
+ describe 'validations' do
+ let(:options) { { reason: :renamed, milestone: '10.10' } }
+
+ it { is_expected.to be_valid }
+
+ context 'when the milestone is absent' do
+ before do
+ options.delete(:milestone)
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when the milestone is not milestone-ish' do
+ before do
+ options[:milestone] = 'next year'
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when the milestone is not a string' do
+ before do
+ options[:milestone] = 10.01
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when the reason is absent' do
+ before do
+ options.delete(:reason)
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when the reason is not a known reason' do
+ before do
+ options[:reason] = :not_stylish_enough
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when the reason is a string' do
+ before do
+ options[:reason] = 'not stylish enough'
+ end
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when the reason is a string ending with a period' do
+ before do
+ options[:reason] = 'not stylish enough.'
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+ end
+
+ describe '#deprecation_reason' do
+ context 'when there is a replacement' do
+ let(:options) { { reason: :renamed, milestone: '10.10', replacement: 'X.y' } }
+
+ it 'renders as reason-replacement-milestone' do
+ expect(deprecation.deprecation_reason).to eq('This was renamed. Please use `X.y`. Deprecated in 10.10.')
+ end
+ end
+
+ context 'when there is no replacement' do
+ let(:options) { { reason: :renamed, milestone: '10.10' } }
+
+ it 'renders as reason-milestone' do
+ expect(deprecation.deprecation_reason).to eq('This was renamed. Deprecated in 10.10.')
+ end
+ end
+
+ describe 'processing of reason' do
+ described_class::REASONS.each_key do |known_reason|
+ context "when the reason is a known reason such as #{known_reason.inspect}" do
+ let(:options) { { reason: known_reason } }
+
+ it 'renders the reason_text correctly' do
+ expect(deprecation.deprecation_reason).to start_with(described_class::REASONS[known_reason])
+ end
+ end
+ end
+
+ context 'when the reason is any other string' do
+ let(:options) { { reason: 'unhelpful' } }
+
+ it 'appends a period' do
+ expect(deprecation.deprecation_reason).to start_with('unhelpful.')
+ end
+ end
+ end
+ end
+
+ describe '#edit_description' do
+ let(:options) { { reason: :renamed, milestone: '10.10' } }
+
+ it 'appends milestone:reason with a leading space if there is a description' do
+ desc = deprecation.edit_description('Some description.')
+
+ expect(desc).to eq('Some description. Deprecated in 10.10: This was renamed.')
+ end
+
+ it 'returns nil if there is no description' do
+ desc = deprecation.edit_description(nil)
+
+ expect(desc).to be_nil
+ end
+ end
+
+ describe '#original_description' do
+ it 'records the description passed to it' do
+ deprecation.edit_description('Some description.')
+
+ expect(deprecation.original_description).to eq('Some description.')
+ end
+ end
+
+ describe '#markdown' do
+ context 'when there is a replacement' do
+ let(:options) { { reason: :renamed, milestone: '10.10', replacement: 'X.y' } }
+
+ context 'when the context is :inline' do
+ it 'renders on one line' do
+ expectation = '**Deprecated** in 10.10. This was renamed. Use: `X.y`.'
+
+ expect(deprecation.markdown).to eq(expectation)
+ expect(deprecation.markdown(context: :inline)).to eq(expectation)
+ end
+ end
+
+ context 'when the context is :block' do
+ it 'renders a warning note' do
+ expectation = <<~MD.chomp
+ WARNING:
+ **Deprecated** in 10.10.
+ This was renamed.
+ Use: `X.y`.
+ MD
+
+ expect(deprecation.markdown(context: :block)).to eq(expectation)
+ end
+ end
+ end
+
+ context 'when there is no replacement' do
+ let(:options) { { reason: 'Removed', milestone: '10.10' } }
+
+ context 'when the context is :inline' do
+ it 'renders on one line' do
+ expectation = '**Deprecated** in 10.10. Removed.'
+
+ expect(deprecation.markdown).to eq(expectation)
+ expect(deprecation.markdown(context: :inline)).to eq(expectation)
+ end
+ end
+
+ context 'when the context is :block' do
+ it 'renders a warning note' do
+ expectation = <<~MD.chomp
+ WARNING:
+ **Deprecated** in 10.10.
+ Removed.
+ MD
+
+ expect(deprecation.markdown(context: :block)).to eq(expectation)
+ end
+ end
+ end
+ end
+end