diff options
| author | Xinhui | 2017-07-11 16:44:56 +0200 |
|---|---|---|
| committer | Xinhui | 2017-07-13 17:32:33 +0200 |
| commit | 5742cb48f987ede482b5c4faca6b199f7200eee8 (patch) | |
| tree | 9fe0cabb48dca8163c7a3c503ffe263fc98f2a65 | |
| parent | d46df6c67767eea788145278cbba2615c20869e9 (diff) | |
| download | chouette-core-5742cb48f987ede482b5c4faca6b199f7200eee8.tar.bz2 | |
Add model concerns ChecksumSupport & spec
Refs #3845
| -rw-r--r-- | app/models/chouette/footnote.rb | 15 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey_at_stop.rb | 1 | ||||
| -rw-r--r-- | app/models/concerns/checksum_support.rb | 27 | ||||
| -rw-r--r-- | spec/models/chouette/footnote_spec.rb | 36 | ||||
| -rw-r--r-- | spec/support/checksum_support.rb | 44 |
5 files changed, 87 insertions, 36 deletions
diff --git a/app/models/chouette/footnote.rb b/app/models/chouette/footnote.rb index 00a2b223a..1664faf23 100644 --- a/app/models/chouette/footnote.rb +++ b/app/models/chouette/footnote.rb @@ -1,24 +1,13 @@ class Chouette::Footnote < Chouette::ActiveRecord + include ChecksumSupport + belongs_to :line, inverse_of: :footnotes has_and_belongs_to_many :vehicle_journeys, :class_name => 'Chouette::VehicleJourney' validates_presence_of :line - before_save :update_checksum def checksum_attributes attrs = ['code', 'label'] self.slice(*attrs).values end - - def current_checksum_source - source = self.checksum_attributes.map!{ |x| x || '-' } - source.join('|') - end - - def update_checksum - self.checksum_source = self.current_checksum_source - if self.checksum_source_changed? - self.checksum = Digest::SHA256.new.hexdigest(self.checksum_source) - end - end end diff --git a/app/models/chouette/vehicle_journey_at_stop.rb b/app/models/chouette/vehicle_journey_at_stop.rb index 5dfec8352..4518d09cf 100644 --- a/app/models/chouette/vehicle_journey_at_stop.rb +++ b/app/models/chouette/vehicle_journey_at_stop.rb @@ -2,6 +2,7 @@ module Chouette class VehicleJourneyAtStop < ActiveRecord include ForBoardingEnumerations include ForAlightingEnumerations + include ChecksumSupport # FIXME http://jira.codehaus.org/browse/JRUBY-6358 self.primary_key = "id" diff --git a/app/models/concerns/checksum_support.rb b/app/models/concerns/checksum_support.rb new file mode 100644 index 000000000..13c476607 --- /dev/null +++ b/app/models/concerns/checksum_support.rb @@ -0,0 +1,27 @@ +module ChecksumSupport + extend ActiveSupport::Concern + SEPARATOR = '|' + VALUE_FOR_NIL_ATTRIBUTE = '-' + + included do + before_save :set_current_checksum_source, :update_checksum + end + + def checksum_attributes + self.attributes.values + end + + def current_checksum_source + self.checksum_attributes.map!{ |x| x || VALUE_FOR_NIL_ATTRIBUTE }.join(SEPARATOR) + end + + def set_current_checksum_source + self.checksum_source = self.current_checksum_source + end + + def update_checksum + if self.checksum_source_changed? + self.checksum = Digest::SHA256.new.hexdigest(self.checksum_source) + end + end +end diff --git a/spec/models/chouette/footnote_spec.rb b/spec/models/chouette/footnote_spec.rb index b87afd8ed..bf1018593 100644 --- a/spec/models/chouette/footnote_spec.rb +++ b/spec/models/chouette/footnote_spec.rb @@ -1,32 +1,22 @@ require 'spec_helper' -describe Chouette::Footnote do - subject { build(:footnote) } - it { should validate_presence_of :line } - - # context '#checksum_attributes' do - # it 'should return attributes values' do - # expect(subject.checksum_attributes).to eq [subject.code, subject.label] - # end - # end +describe Chouette::Footnote, type: :model do + let(:footnote) { create(:footnote) } - # context '#current_checksum_source' do - # it 'should return instance current checksum source' do - # expect(subject.current_checksum_source).to eq("#{subject.code}|#{subject.label}") - # end + it { should validate_presence_of :line } - # it 'should replace nil attributes by dash (-)' do - # subject.code = nil - # expect(subject.current_checksum_source).to eq("-|#{subject.label}") - # end - # end + context 'checksum' do + it_behaves_like 'checksum support', :footnote - context '#checksum' do - let(:footnote) { create(:footnote) } + context '#checksum_attributes' do + it 'should return code and label' do + expected = [footnote.code, footnote.label] + expect(footnote.checksum_attributes).to include(*expected) + end - it 'should update checksum on update' do - ap footnote.checksum_source - ap footnote.checksum + it 'should not return other atrributes' do + expect(footnote.checksum_attributes).to_not include(footnote.updated_at) + end end end end diff --git a/spec/support/checksum_support.rb b/spec/support/checksum_support.rb new file mode 100644 index 000000000..31d024698 --- /dev/null +++ b/spec/support/checksum_support.rb @@ -0,0 +1,44 @@ +shared_examples 'checksum support' do |factory_name| + let(:instance) { create(factory_name) } + + context '#current_checksum_source' do + let(:attributes) { ['code_value', 'label_value'] } + let(:seperator) { ChecksumSupport::SEPARATOR } + let(:nil_value) { ChecksumSupport::VALUE_FOR_NIL_ATTRIBUTE } + + before do + allow_any_instance_of(instance.class).to receive(:checksum_attributes).and_return(attributes) + end + + it 'should separate attribute by seperator' do + expect(instance.current_checksum_source).to eq("code_value#{seperator}label_value") + end + + context 'default for nil value' do + let(:attributes) { ['code_value', nil] } + + it 'should replace nil attributes by default value' do + source = "code_value#{seperator}#{nil_value}" + expect(instance.current_checksum_source).to eq(source) + end + end + end + + it 'should save checksum on create' do + expect(instance.checksum).to_not be_nil + end + + it 'should save checksum_source' do + expect(instance.checksum_source).to_not be_nil + end + + it 'should trigger set_current_checksum_source on save' do + expect(instance).to receive(:set_current_checksum_source) + instance.save + end + + it 'should trigger update_checksum on save' do + expect(instance).to receive(:update_checksum) + instance.save + end +end |
