diff --git a/app/tasks/maintenance/fix_decimal_number_with_spaces_task.rb b/app/tasks/maintenance/fix_decimal_number_with_spaces_task.rb new file mode 100644 index 000000000..7e6fe41b8 --- /dev/null +++ b/app/tasks/maintenance/fix_decimal_number_with_spaces_task.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module Maintenance + class FixDecimalNumberWithSpacesTask < MaintenanceTasks::Task + ANY_SPACES = /[[:space:]]/ + def collection + Champs::DecimalNumberChamp.where.not(value: nil) + end + + def process(element) + if element.value.present? && ANY_SPACES.match?(element.value) + element.update_column(:value, element.value.gsub(ANY_SPACES, '')) + end + end + + def count + # not really interested in counting because it raises PG Statement timeout + end + end +end diff --git a/spec/models/champs/decimal_number_champ_spec.rb b/spec/models/champs/decimal_number_champ_spec.rb index 39ead6506..3a5674f73 100644 --- a/spec/models/champs/decimal_number_champ_spec.rb +++ b/spec/models/champs/decimal_number_champ_spec.rb @@ -51,4 +51,21 @@ describe Champs::DecimalNumberChamp do it { is_expected.to be_truthy } end end + + describe 'for_export' do + let(:champ) { create(:champ_decimal_number, value:) } + subject { champ.for_export } + context 'with nil' do + let(:value) { 0 } + it { is_expected.to eq(0.0) } + end + context 'with simple number' do + let(:value) { "120" } + it { is_expected.to eq(120) } + end + context 'with number having spaces' do + let(:value) { " 120 " } + it { is_expected.to be_nil } + end + end end diff --git a/spec/tasks/maintenance/fix_decimal_number_with_spaces_task_spec.rb b/spec/tasks/maintenance/fix_decimal_number_with_spaces_task_spec.rb new file mode 100644 index 000000000..1e257144f --- /dev/null +++ b/spec/tasks/maintenance/fix_decimal_number_with_spaces_task_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require "rails_helper" + +module Maintenance + RSpec.describe FixDecimalNumberWithSpacesTask do + describe "#process" do + subject(:process) { described_class.process(element) } + let(:champ) { create(:champ_decimal_number, value:) } + let(:element) { champ } + + context 'with nil' do + let(:value) { 0 } + it { expect { process }.not_to change { champ.reload.valid_value } } + end + context 'with simple number' do + let(:value) { "120" } + it { expect { process }.not_to change { champ.reload.valid_value } } + end + context 'with number having leading spaces' do + let(:value) { " 120" } + it { expect { process }.to change { champ.reload.valid_value }.from(nil).to("120") } + end + context 'with number having trailing spaces' do + let(:value) { "120 " } + it { expect { process }.to change { champ.reload.valid_value }.from(nil).to("120") } + end + context 'with number having leading and trailing spaces' do + let(:value) { " 120 " } + it { expect { process }.to change { champ.reload.valid_value }.from(nil).to("120") } + end + context 'with number having in between spaces' do + let(:value) { "1 2 0" } + it { expect { process }.to change { champ.reload.valid_value }.from(nil).to("120") } + end + context 'with number having in between tab' do + let(:value) { "\t120\t" } + it { expect { process }.to change { champ.reload.valid_value }.from(nil).to("120") } + end + end + end +end