diff options
Diffstat (limited to 'spec')
| -rw-r--r-- | spec/lib/compliance_control_set_copier_spec.rb | 88 | ||||
| -rw-r--r-- | spec/models/compliance_check_block_spec.rb | 1 | ||||
| -rw-r--r-- | spec/models/compliance_check_set_spec.rb | 3 | ||||
| -rw-r--r-- | spec/models/compliance_check_spec.rb | 2 | ||||
| -rw-r--r-- | spec/models/compliance_control_set_spec.rb | 1 | ||||
| -rw-r--r-- | spec/models/compliance_control_spec.rb | 76 | ||||
| -rw-r--r-- | spec/workers/line_referential_sync_worker_spec.rb | 1 |
7 files changed, 141 insertions, 31 deletions
diff --git a/spec/lib/compliance_control_set_copier_spec.rb b/spec/lib/compliance_control_set_copier_spec.rb new file mode 100644 index 000000000..b620d0657 --- /dev/null +++ b/spec/lib/compliance_control_set_copier_spec.rb @@ -0,0 +1,88 @@ +RSpec.describe ComplianceControlSetCopier do + + subject{ described_class.new } + + let( :cc_set ){ create :compliance_control_set } + + context 'Copying empty set' do + context 'incorrect organisation' do + # Assuring the organisation missmatch + before { referential.organisation_id = cc_set.organisation_id.succ } + it 'fails' do + expect{ subject.copy(cc_set.id, referential.id) }.to raise_error(ArgumentError) + end + it 'does not create any objects in the database' do + expect{ subject.copy(cc_set.id, referential.id) rescue nil }.to_not change{ComplianceCheckSet.count} + expect{ subject.copy(cc_set.id, referential.id) rescue nil }.to_not change{ComplianceCheckBlock.count} + expect{ subject.copy(cc_set.id, referential.id) rescue nil }.to_not change{ComplianceCheck.count} + end + end + + context 'correct organisation' do + let(:ref){ create :referential, organisation_id: cc_set.organisation_id } + + let(:cc_blox){ + 3.times.map{ |_| create :compliance_control_block, compliance_control_set: cc_set } + } + let!(:direct_ccs){ + 3.times.map{ |n| create :compliance_control, compliance_control_set: cc_set, name: "direct #{n.succ}" } + } + # Needed to check we do not dulicate a node (compliance_control) twice + let!(:indirect_ccs){ + # Create 1 child for each block and also associate first of the direct ccs to the first block + # seconf of the direct css to the second block + cc_blox.take(2).zip(direct_ccs.take(2)).each do | cc_block, cc | + cc.update compliance_control_block_id: cc_block.id + end + cc_blox.each_with_index.map{ | cc_block, n | + create(:compliance_control, compliance_control_set: cc_set, compliance_control_block: cc_block, name: "indirect #{n.succ}") + } + } + + let( :cck_set ){ ComplianceCheckSet.last } + let( :cck_blox ){ cck_set.compliance_check_blocks } + let( :ccks ){ cck_set.compliance_checks } + + it 'correctly creates a cck_set for a complete DAG' do + # Slowness of tests constrain us to create a minimum of objects in the DB, + # hence only one example :( + counts = object_counts + subject.copy(cc_set.id, ref.id) + + # Did not change the original objects + # Correct numbers + expect( ComplianceControlSet.count).to eq(counts.cc_set_count) + expect( ComplianceControlBlock.count).to eq(counts.cc_block_count) + expect( ComplianceControl.count).to eq(counts.cc_count) + + expect( ComplianceCheckSet.count ).to eq(counts.cck_set_count + 1) + expect( cck_blox.count ).to eq(counts.cck_block_count + cc_blox.size) + expect( ccks.count ).to eq(counts.cck_count + direct_ccs.size + indirect_ccs.size) + + # Correcly associated + expect( cck_blox.map(&:compliance_checks).map(&:size) ) + .to eq([2, 2, 1]) + expect( ComplianceCheck.where(name: mk_name('direct 1')).first.compliance_check_block_id ) + .to eq( cck_blox.first.id ) + expect( ComplianceCheck.where(name: mk_name('direct 3')).first.compliance_check_block_id ).to be_nil + end + + end + + + def object_counts + OpenStruct.new \ + cc_set_count: ComplianceControlSet.count, + cc_block_count: ComplianceControlBlock.count, + cc_count: ComplianceControl.count, + cck_set_count: ComplianceCheckSet.count, + cck_block_count: ComplianceCheckBlock.count, + cck_count: ComplianceCheck.count + end + + def mk_name name + [name, ref.name].join('-') + end + end + +end diff --git a/spec/models/compliance_check_block_spec.rb b/spec/models/compliance_check_block_spec.rb index f581d5085..a3d98d459 100644 --- a/spec/models/compliance_check_block_spec.rb +++ b/spec/models/compliance_check_block_spec.rb @@ -6,4 +6,5 @@ RSpec.describe ComplianceCheckBlock, type: :model do end it { should belong_to :compliance_check_set } + it { should have_many :compliance_checks } end diff --git a/spec/models/compliance_check_set_spec.rb b/spec/models/compliance_check_set_spec.rb index 6e53c9def..8afea5b3e 100644 --- a/spec/models/compliance_check_set_spec.rb +++ b/spec/models/compliance_check_set_spec.rb @@ -9,4 +9,7 @@ RSpec.describe ComplianceCheckSet, type: :model do it { should belong_to :workbench } it { should belong_to :compliance_control_set } it { should belong_to :parent } + + it { should have_many :compliance_checks } + it { should have_many :compliance_check_blocks } end diff --git a/spec/models/compliance_check_spec.rb b/spec/models/compliance_check_spec.rb index acdcc3ebf..710cd4b4f 100644 --- a/spec/models/compliance_check_spec.rb +++ b/spec/models/compliance_check_spec.rb @@ -1,5 +1,3 @@ -require 'rails_helper' - RSpec.describe ComplianceCheck, type: :model do it 'should have a valid factory' do expect(FactoryGirl.build(:compliance_check)).to be_valid diff --git a/spec/models/compliance_control_set_spec.rb b/spec/models/compliance_control_set_spec.rb index edc684bbc..04d1c418c 100644 --- a/spec/models/compliance_control_set_spec.rb +++ b/spec/models/compliance_control_set_spec.rb @@ -7,6 +7,7 @@ RSpec.describe ComplianceControlSet, type: :model do it { should belong_to :organisation } it { should have_many(:compliance_controls).dependent(:destroy) } + it { should have_many(:compliance_control_blocks).dependent(:destroy) } it { should validate_presence_of :name } end diff --git a/spec/models/compliance_control_spec.rb b/spec/models/compliance_control_spec.rb index 50c2b7b8d..db73dab21 100644 --- a/spec/models/compliance_control_spec.rb +++ b/spec/models/compliance_control_spec.rb @@ -1,39 +1,59 @@ 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 belong_to :compliance_control_set } - it { should belong_to :compliance_control_block } + it 'should have a valid factory' do + expect(compliance_control).to be_valid + end - it 'should validate_presence_of criticity' do - compliance_control.criticity = nil - expect(compliance_control).not_to be_valid - end + it { should belong_to :compliance_control_set } + it { should belong_to :compliance_control_block } - it 'should validate_presence_of name' do - compliance_control.name = nil - expect(compliance_control).not_to be_valid - end - it 'should validate_presence_of code' do - compliance_control.code = nil - expect(compliance_control).not_to be_valid - end + 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 } - it 'should validate_presence_of origin_code' do - compliance_control.origin_code = nil - expect(compliance_control).not_to be_valid end - #TODO dont know why the 'shortcuts' below to validates presence dont work - # That's why we dont it 'manually' - # it { should validate_presence_of :criticity } - # it { should validate_presence_of :name } - # 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 + + direct_name = compliance_control.compliance_control_set.name + indirect_name = compliance_control_block.compliance_control_set.name + expected_message = "Le contrôle ne peut pas être associé à un jeu de contrôle (id: #{direct_name}) différent de celui de son groupe (id: #{indirect_name})" + + selected_error_message = + compliance_control + .errors + .messages[:coherent_control_set] + .first + expect( selected_error_message ).to eq(expected_message) + end + end end diff --git a/spec/workers/line_referential_sync_worker_spec.rb b/spec/workers/line_referential_sync_worker_spec.rb index f1a63c9db..f8d7eed91 100644 --- a/spec/workers/line_referential_sync_worker_spec.rb +++ b/spec/workers/line_referential_sync_worker_spec.rb @@ -1,4 +1,3 @@ -require 'rails_helper' RSpec.describe LineReferentialSyncWorker, type: :worker do let!(:line_referential_sync) { create :line_referential_sync } |
