diff options
Diffstat (limited to 'spec/models/concerns/ignorable_columns_spec.rb')
-rw-r--r-- | spec/models/concerns/ignorable_columns_spec.rb | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/spec/models/concerns/ignorable_columns_spec.rb b/spec/models/concerns/ignorable_columns_spec.rb new file mode 100644 index 00000000000..55efa1b5fda --- /dev/null +++ b/spec/models/concerns/ignorable_columns_spec.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe IgnorableColumns do + let(:record_class) do + Class.new(ApplicationRecord) do + include IgnorableColumns + end + end + + subject { record_class } + + it 'adds columns to ignored_columns' do + expect do + subject.ignore_columns(:name, :created_at, remove_after: '2019-12-01', remove_with: '12.6') + end.to change { subject.ignored_columns }.from([]).to(%w(name created_at)) + end + + it 'adds columns to ignored_columns (array version)' do + expect do + subject.ignore_columns(%i[name created_at], remove_after: '2019-12-01', remove_with: '12.6') + end.to change { subject.ignored_columns }.from([]).to(%w(name created_at)) + end + + it 'requires remove_after attribute to be set' do + expect { subject.ignore_columns(:name, remove_after: nil, remove_with: 12.6) }.to raise_error(ArgumentError, /Please indicate/) + end + + it 'requires remove_after attribute to be set' do + expect { subject.ignore_columns(:name, remove_after: "not a date", remove_with: 12.6) }.to raise_error(ArgumentError, /Please indicate/) + end + + it 'requires remove_with attribute to be set' do + expect { subject.ignore_columns(:name, remove_after: '2019-12-01', remove_with: nil) }.to raise_error(ArgumentError, /Please indicate/) + end + + describe '.ignored_columns_details' do + shared_examples_for 'storing removal information' do + it 'storing removal information' do + subject.ignore_column(columns, remove_after: '2019-12-01', remove_with: '12.6') + + [columns].flatten.each do |column| + expect(subject.ignored_columns_details[column].remove_after).to eq(Date.parse('2019-12-01')) + expect(subject.ignored_columns_details[column].remove_with).to eq('12.6') + end + end + end + + context 'with single column' do + let(:columns) { :name } + it_behaves_like 'storing removal information' + end + + context 'with array column' do + let(:columns) { %i[name created_at] } + it_behaves_like 'storing removal information' + end + + it 'defaults to empty Hash' do + expect(subject.ignored_columns_details).to eq({}) + end + end + + describe IgnorableColumns::ColumnIgnore do + subject { described_class.new(remove_after, remove_with) } + + let(:remove_with) { double } + + describe '#safe_to_remove?' do + context 'after remove_after date has passed' do + let(:remove_after) { Date.parse('2019-01-10') } + + it 'returns true (safe to remove)' do + expect(subject.safe_to_remove?).to be_truthy + end + end + + context 'before remove_after date has passed' do + let(:remove_after) { Date.today } + + it 'returns false (not safe to remove)' do + expect(subject.safe_to_remove?).to be_falsey + end + end + end + end +end |