aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert2017-12-05 11:37:25 +0100
committerRobert2017-12-05 12:19:42 +0100
commit642d2bd3a46a4b459acf18748dbfebf0cb6ca7df (patch)
tree773a01b7a4dc86a5dabfab98f6f44bdc9f949a50
parent089c6935ca0e036de484834381e5beda7545d499 (diff)
downloadchouette-core-642d2bd3a46a4b459acf18748dbfebf0cb6ca7df.tar.bz2
Refs: #5179@1.25h; Referential Creation Enforces objectid_format from associated Workbench
- changed ObjectIdFormatterSupport as requested - respeced all defined cases - implemented respec Missing: What to do in `define_default_attributes` if ref has no workbench and no `objectid_format`?
-rw-r--r--app/models/concerns/objectid_formatter_support.rb13
-rw-r--r--app/models/referential.rb6
-rw-r--r--spec/models/referential/referential_oid_format_from_wkbch_spec.rb77
-rw-r--r--spec/support/random.rb9
4 files changed, 61 insertions, 44 deletions
diff --git a/app/models/concerns/objectid_formatter_support.rb b/app/models/concerns/objectid_formatter_support.rb
index d0b85d8ac..3ef45334c 100644
--- a/app/models/concerns/objectid_formatter_support.rb
+++ b/app/models/concerns/objectid_formatter_support.rb
@@ -1,19 +1,16 @@
module ObjectidFormatterSupport
extend ActiveSupport::Concern
- class << self
- def legal_formats
- %w(netex stif_netex stif_reflex stif_codifligne)
- end
-
- def default_format; 'netex' end
+ def self.legal_formats
+ %w(netex stif_netex stif_reflex stif_codifligne)
end
+
included do
extend Enumerize
- enumerize :objectid_format, in: ObjectidFormatterSupport.legal_formats, default: ObjectidFormatterSupport.default_format
+ enumerize :objectid_format, in: ObjectidFormatterSupport.legal_formats
validates_presence_of :objectid_format
-
+
def objectid_formatter
objectid_formatter_class.new
end
diff --git a/app/models/referential.rb b/app/models/referential.rb
index 233a9f24a..e8fb2888e 100644
--- a/app/models/referential.rb
+++ b/app/models/referential.rb
@@ -127,10 +127,11 @@ class Referential < ActiveRecord::Base
Chouette::RoutingConstraintZone.all
end
- after_initialize :define_default_attributes
+ before_validation :define_default_attributes
def define_default_attributes
self.time_zone ||= Time.zone.name
+ self.objectid_format ||= workbench.try(:objectid_format) || ObjectidFormatterSupport.legal_formats.first
end
def switch
@@ -140,7 +141,7 @@ class Referential < ActiveRecord::Base
end
def self.new_from(from, functional_scope)
-e Referential.new(
+ Referential.new(
name: I18n.t("activerecord.copy", name: from.name),
slug: "#{from.slug}_clone",
prefix: from.prefix,
@@ -149,6 +150,7 @@ e Referential.new(
line_referential: from.line_referential,
stop_area_referential: from.stop_area_referential,
created_from: from,
+ objectid_format: from.objectid_format,
metadatas: from.metadatas.map { |m| ReferentialMetadata.new_from(m, functional_scope) }
)
end
diff --git a/spec/models/referential/referential_oid_format_from_wkbch_spec.rb b/spec/models/referential/referential_oid_format_from_wkbch_spec.rb
index fe359ac6b..b0d78fcf2 100644
--- a/spec/models/referential/referential_oid_format_from_wkbch_spec.rb
+++ b/spec/models/referential/referential_oid_format_from_wkbch_spec.rb
@@ -1,39 +1,48 @@
RSpec.describe Referential do
+ let( :legal_formats ){ ObjectidFormatterSupport.legal_formats }
+
+
describe 'default attributes' do
- let( :referential ){ described_class.new }
- let( :workbench ){ Workbench.new }
- it "of a referential with a workbench contain the workbench's objectid_format" do
- ObjectidFormatterSupport.legal_formats.each do |legal_format|
- workbench.objectid_format = legal_format
+ context 'referential w/o an objectid_format' do
+ let( :referential ){ described_class.new }
+ let( :workbench ){ build_stubbed :workbench, objectid_format: random_element(legal_formats) }
+
+ it "but a workbench will take the format of the workbench" do
referential.workbench = workbench
referential.define_default_attributes
- expect( referential.objectid_format ).to eq(legal_format)
+ expect( referential.objectid_format ).to eq(workbench.objectid_format)
+ end
+
+ xit 'and w/o a workbench will take the default objectid_format' do
+ referential.define_default_attributes
+ expect( referential.objectid_format ).to eq(some_value_to_be_defined)
end
end
- it 'of a referential w/o a workbench contain the default objectid_format' do
- referential.define_default_attributes
- expect( referential.objectid_format ).to eq(ObjectidFormatterSupport.default_format)
+
+ context 'referential with an objectid_format' do
+ let( :distinct_formats ){ distinct_random_elements(legal_formats, count: 2) }
+
+ let( :referential ){ build_stubbed :referential, objectid_format: distinct_formats.first}
+ let( :workbench ){ build_stubbed :workbench, objectid_format: distinct_formats.second }
+
+ it "and a workbench will not take the format of the workbench" do
+ referential.workbench = workbench
+ expect{ referential.define_default_attributes }.not_to change{ referential.objectid_format }
+ end
+
+ it 'and w/o a workbench will not take the default objectid_format' do
+ expect{ referential.define_default_attributes }.not_to change{ referential.objectid_format }
+ end
end
+
end
-
+
+
describe 'self.new_from' do
-
- # Referential.new(
- # name:
- # slug: "#{from.slug}_clone",
- # prefix: from.prefix,
- # time_zone: from.time_zone,
- # bounds: from.bounds,
- # line_referential: from.line_referential,
- # stop_area_referential: from.stop_area_referential,
- # created_from: from,
- # metadatas: from.metadatas.map { |m| ReferentialMetadata.new_from(m, functional_scope) }
- # )
- #
let( :source ){ build :referential }
let( :functional_scope ){ double('functional scope') }
@@ -41,17 +50,17 @@ RSpec.describe Referential do
it 'copies objectid_format from source' do
expect( described_class )
.to receive(:new)
- .with(name: I18n.t("activerecord.copy", name: source.name),
- slug: "#{source.slug}_clone",
- prefix: source.prefix,
- time_zone: source.time_zone,
- bounds: source.bounds,
- line_referential: source.line_referential,
- stop_area_referential: source.stop_area_referential,
- created_from: source,
- objectid_format: source.objectid_format,
- metadatas: source.metadatas.map { |m| ReferentialMetadata.new_from(m, functional_scope) })
-
+ .with(name: I18n.t("activerecord.copy", name: source.name),
+ slug: "#{source.slug}_clone",
+ prefix: source.prefix,
+ time_zone: source.time_zone,
+ bounds: source.bounds,
+ line_referential: source.line_referential,
+ stop_area_referential: source.stop_area_referential,
+ created_from: source,
+ objectid_format: source.objectid_format,
+ metadatas: source.metadatas.map { |m| ReferentialMetadata.new_from(m, functional_scope) })
+
described_class.new_from( source, functional_scope )
end
diff --git a/spec/support/random.rb b/spec/support/random.rb
index 0ebc2ee5e..16d8b4df3 100644
--- a/spec/support/random.rb
+++ b/spec/support/random.rb
@@ -10,6 +10,15 @@ module Support
def random_element from
from[random_int(from.size)]
end
+
+ def random_elements( from, count: )
+ (1..count).map{ |_| random_element from }
+ end
+
+ def distinct_random_elements( from, count: )
+ f = from.dup
+ (1..count).map { |_| f.delete_at( random_int(f.size) ) }
+ end
def random_int max_plus_one=PRETTY_LARGE_INT
(random_number * max_plus_one).to_i