aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXinhui2017-07-11 16:44:56 +0200
committerXinhui2017-07-13 17:32:33 +0200
commit5742cb48f987ede482b5c4faca6b199f7200eee8 (patch)
tree9fe0cabb48dca8163c7a3c503ffe263fc98f2a65
parentd46df6c67767eea788145278cbba2615c20869e9 (diff)
downloadchouette-core-5742cb48f987ede482b5c4faca6b199f7200eee8.tar.bz2
Add model concerns ChecksumSupport & spec
Refs #3845
-rw-r--r--app/models/chouette/footnote.rb15
-rw-r--r--app/models/chouette/vehicle_journey_at_stop.rb1
-rw-r--r--app/models/concerns/checksum_support.rb27
-rw-r--r--spec/models/chouette/footnote_spec.rb36
-rw-r--r--spec/support/checksum_support.rb44
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