diff options
| author | Robert | 2017-10-03 21:20:16 +0200 | 
|---|---|---|
| committer | Robert | 2017-10-03 23:00:07 +0200 | 
| commit | 92a4ed553ab430e7af47ff7421f0a1fcdd9fb56b (patch) | |
| tree | 35f60a85ebeebac729ccd5bfb3667d941e4cc574 | |
| parent | 71f03bd0c987cdcc5d99d34b19211c730766340e (diff) | |
| download | chouette-core-92a4ed553ab430e7af47ff7421f0a1fcdd9fb56b.tar.bz2 | |
Refs: #4629@1.5h;
        Specs and implements coherent direct and indirect ComplianceControlSet parentship for ComplianceControls
| -rw-r--r-- | app/models/compliance_control.rb | 7 | ||||
| -rw-r--r-- | config/locales/compliance_controls.en.yml | 2 | ||||
| -rw-r--r-- | config/locales/compliance_controls.fr.yml | 2 | ||||
| -rw-r--r-- | spec/models/compliance_control_spec.rb | 53 | 
4 files changed, 53 insertions, 11 deletions
| diff --git a/app/models/compliance_control.rb b/app/models/compliance_control.rb index 40eb7b335..52838ef74 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 | 
