aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert2017-10-03 21:20:16 +0200
committerRobert2017-10-09 15:04:22 +0200
commit2f68a7e9ea109c4667a64ee183c052eaa6b3d5e8 (patch)
tree20670e4eef1f33e04935150bd2d7f30e37f54cba
parentef82645b9a0227d7628c0cbac0df1c041ee83396 (diff)
downloadchouette-core-2f68a7e9ea109c4667a64ee183c052eaa6b3d5e8.tar.bz2
Refs: #4629@1.5h;
Specs and implements coherent direct and indirect ComplianceControlSet parentship for ComplianceControls
-rw-r--r--app/models/compliance_control.rb7
-rw-r--r--config/locales/compliance_controls.en.yml2
-rw-r--r--config/locales/compliance_controls.fr.yml2
-rw-r--r--spec/models/compliance_control_spec.rb53
4 files changed, 53 insertions, 11 deletions
diff --git a/app/models/compliance_control.rb b/app/models/compliance_control.rb
index 947a10719..7e4e22636 100644
--- a/app/models/compliance_control.rb
+++ b/app/models/compliance_control.rb
@@ -12,6 +12,13 @@ class ComplianceControl < ActiveRecord::Base
validates :origin_code, presence: true
validates :compliance_control_set, presence: true
+ validate def coherent_control_set
+ return true if compliance_control_block_id.nil?
+ ids = [compliance_control_block.compliance_control_set_id, compliance_control_set_id]
+ return true if ids.first == ids.last
+ errors.add(:coherent_control_set, I18n.t('compliance_controls.errors.incoherent_control_sets', indirect_set_id: ids.first, direct_set_id: ids.last))
+ end
+
class << self
def create *args
super.tap do | x |
diff --git a/config/locales/compliance_controls.en.yml b/config/locales/compliance_controls.en.yml
index bef39515c..ee98367cf 100644
--- a/config/locales/compliance_controls.en.yml
+++ b/config/locales/compliance_controls.en.yml
@@ -1,5 +1,7 @@
en:
compliance_controls:
+ errors:
+ incoherent_control_sets: "Directly associated control_set (id: %{direct_set_id}) and indirectly associated one (id: %{indirect_set_id}) differ"
show:
title: "Compliance control"
index:
diff --git a/config/locales/compliance_controls.fr.yml b/config/locales/compliance_controls.fr.yml
index 05e47665c..0f3e586bf 100644
--- a/config/locales/compliance_controls.fr.yml
+++ b/config/locales/compliance_controls.fr.yml
@@ -1,5 +1,7 @@
fr:
compliance_controls:
+ errors:
+ incoherent_control_sets: "ControlSet associé directement (id: %{direct_set_id}) et indirectement (id: %{indirect_set_id}) ne sont pas égeaux"
show:
title: "Jeu de controle"
index:
diff --git a/spec/models/compliance_control_spec.rb b/spec/models/compliance_control_spec.rb
index 641209d4f..7c58eaf3e 100644
--- a/spec/models/compliance_control_spec.rb
+++ b/spec/models/compliance_control_spec.rb
@@ -1,20 +1,51 @@
RSpec.describe ComplianceControl, type: :model do
- let(:compliance_control) { create :compliance_control }
+ context 'standard validation' do
- it 'should have a valid factory' do
- expect(compliance_control).to be_valid
- end
+ let(:compliance_control) { build_stubbed :compliance_control }
+
+ it 'should have a valid factory' do
+ expect(compliance_control).to be_valid
+ end
- it { should belong_to :compliance_control_set }
- it { should belong_to :compliance_control_block }
+ it { should belong_to :compliance_control_set }
+ it { should belong_to :compliance_control_block }
- it { should validate_presence_of :criticity }
- it 'should validate_presence_of :name' do
- expect( build :compliance_control, name: '' ).to_not be_valid
+ it { should validate_presence_of :criticity }
+ it 'should validate_presence_of :name' do
+ expect( build :compliance_control, name: '' ).to_not be_valid
+ end
+ it { should validate_presence_of :code }
+ it { should validate_presence_of :origin_code }
+
end
- it { should validate_presence_of :code }
- it { should validate_presence_of :origin_code }
+ context 'validates that direct and indirect (via control_block) control_set are not different instances' do
+
+ it 'not attached to control_block -> valid' do
+ compliance_control = create :compliance_control, compliance_control_block_id: nil
+ expect(compliance_control).to be_valid
+ end
+
+ it 'attached to a control_block belonging to the same control_set -> valid' do
+ compliance_control_block = create :compliance_control_block
+ compliance_control = create :compliance_control,
+ compliance_control_block_id: compliance_control_block.id,
+ compliance_control_set_id: compliance_control_block.compliance_control_set.id # DO NOT change the last . to _
+ # We need to be sure that is is not nil
+ expect(compliance_control).to be_valid
+ end
+
+ it 'attached to a control_block **not** belonging to the same control_set -> invalid' do
+ compliance_control_block = create :compliance_control_block
+ compliance_control = build :compliance_control,
+ compliance_control_block_id: compliance_control_block.id,
+ compliance_control_set_id: create( :compliance_control_set ).id
+ expect(compliance_control).to_not be_valid
+ selected_error_message =
+ compliance_control.errors.messages[:coherent_control_set].grep(%r{ControlSet associé})
+ expect( selected_error_message ).to_not be_empty
+ end
+ end
end