diff options
| author | Xinhui Xu | 2017-09-12 15:53:47 +0200 | 
|---|---|---|
| committer | GitHub | 2017-09-12 15:53:47 +0200 | 
| commit | 515b7eb4bfd1623c443cd89b11320a1864ed6306 (patch) | |
| tree | 3aacd609bfbd277a5e33e8ee2208a3293f85a3ba | |
| parent | 4aa19d931f8585c061dd3da49e31b2ddbbb1bf6b (diff) | |
| parent | 095dd5151d40d25c9abb015808834b32e575c750 (diff) | |
| download | chouette-core-515b7eb4bfd1623c443cd89b11320a1864ed6306.tar.bz2 | |
Merge pull request #65 from af83/compliance_control
Compliance control
35 files changed, 413 insertions, 27 deletions
| diff --git a/app/models/compliance_check.rb b/app/models/compliance_check.rb index a9dbc4211..85cf5e37e 100644 --- a/app/models/compliance_check.rb +++ b/app/models/compliance_check.rb @@ -1,3 +1,9 @@ -class ComplianceCheck +class ComplianceCheck < ActiveRecord::Base +  belongs_to :compliance_check_set +  belongs_to :compliance_check_block +  enum criticity: [:info, :warning, :error] +  validates :criticity, presence: true +  validates :name, presence: true +  validates :code, presence: true  end diff --git a/app/models/compliance_check_block.rb b/app/models/compliance_check_block.rb new file mode 100644 index 000000000..035c03ed9 --- /dev/null +++ b/app/models/compliance_check_block.rb @@ -0,0 +1,3 @@ +class ComplianceCheckBlock < ActiveRecord::Base +  belongs_to :compliance_check_set +end diff --git a/app/models/compliance_check_resource.rb b/app/models/compliance_check_resource.rb new file mode 100644 index 000000000..7826f00c3 --- /dev/null +++ b/app/models/compliance_check_resource.rb @@ -0,0 +1,5 @@ +class ComplianceCheckResource < ActiveRecord::Base +  extend Enumerize + +  enumerize :status, in: %w[new successful warning failed] +end diff --git a/app/models/compliance_check_result.rb b/app/models/compliance_check_result.rb index 06f8649f5..161e45189 100644 --- a/app/models/compliance_check_result.rb +++ b/app/models/compliance_check_result.rb @@ -1,3 +1,4 @@ -class ComplianceCheckResult - +class ComplianceCheckResult < ActiveRecord::Base +  belongs_to :compliance_check +  belongs_to :compliance_check_resource  end diff --git a/app/models/compliance_check_set.rb b/app/models/compliance_check_set.rb new file mode 100644 index 000000000..7b6400a21 --- /dev/null +++ b/app/models/compliance_check_set.rb @@ -0,0 +1,10 @@ +class ComplianceCheckSet < ActiveRecord::Base +  extend Enumerize + +  belongs_to :referential +  belongs_to :compliance_control_set +  belongs_to :workbench +  belongs_to :parent, polymorphic: true + +  enumerize :status, in: %w[new pending successful warning failed running aborted canceled] +end diff --git a/app/models/compliance_control.rb b/app/models/compliance_control.rb new file mode 100644 index 000000000..64556b524 --- /dev/null +++ b/app/models/compliance_control.rb @@ -0,0 +1,9 @@ +class ComplianceControl < ActiveRecord::Base +  belongs_to :compliance_control_set +  belongs_to :compliance_control_block + +  enum criticity: [:info, :warning, :error] +  validates :criticity, presence: true +  validates :name, presence: true +  validates :code, presence: true +end diff --git a/app/models/compliance_control_block.rb b/app/models/compliance_control_block.rb new file mode 100644 index 000000000..cf5a9d72b --- /dev/null +++ b/app/models/compliance_control_block.rb @@ -0,0 +1,3 @@ +class ComplianceControlBlock < ActiveRecord::Base +  belongs_to :compliance_control_set +end diff --git a/app/models/compliance_control_set.rb b/app/models/compliance_control_set.rb new file mode 100644 index 000000000..7801eb612 --- /dev/null +++ b/app/models/compliance_control_set.rb @@ -0,0 +1,3 @@ +class ComplianceControlSet < ActiveRecord::Base +  belongs_to :organisation +end diff --git a/config/initializers/apartment.rb b/config/initializers/apartment.rb index e1e86449c..0d65c3505 100644 --- a/config/initializers/apartment.rb +++ b/config/initializers/apartment.rb @@ -46,7 +46,14 @@ Apartment.configure do |config|      'NetexImport',      'WorkbenchImport',      'ImportMessage', -    'ImportResource' +    'ImportResource', +    'ComplianceControl', +    'ComplianceControlSet', +    'ComplianceControlBlock', +    'ComplianceCheck', +    'ComplianceCheckSet', +    'ComplianceCheckBlock', +    'ComplianceCheckResource',    ]    # use postgres schemas? diff --git a/db/migrate/20131029115820_create_compliance_check_results.rb b/db/migrate/20131029115820_create_compliance_check_results.rb deleted file mode 100644 index 7f5c8e436..000000000 --- a/db/migrate/20131029115820_create_compliance_check_results.rb +++ /dev/null @@ -1,23 +0,0 @@ -class CreateComplianceCheckResults < ActiveRecord::Migration -  def up -    unless table_exists? :compliance_check_results -      create_table :compliance_check_results do |t| -        t.belongs_to :compliance_check_task , :null => :no ,:limit => 8 -        t.string :rule_code      # rule code value -        t.string :severity      # warning, error, improvement -        t.string :status      # NA, OK, NOK -        t.integer :violation_count # number of violation occurences -        t.text :detail # detail of violation location -        t.timestamps -      end -      add_foreign_key :compliance_check_results, :compliance_check_tasks, :on_delete => :cascade -    end -  end - -  def down -    if table_exists? :compliance_check_results -      execute "drop table compliance_check_results" -      # drop_table :compliance_check_results -    end -  end -end diff --git a/db/migrate/20170905101656_create_compliance_control_sets.rb b/db/migrate/20170905101656_create_compliance_control_sets.rb new file mode 100644 index 000000000..d074267cd --- /dev/null +++ b/db/migrate/20170905101656_create_compliance_control_sets.rb @@ -0,0 +1,10 @@ +class CreateComplianceControlSets < ActiveRecord::Migration +  def change +    create_table :compliance_control_sets do |t| +      t.string :name +      t.references :organisation, index: true, foreign_key: true + +      t.timestamps null: false +    end +  end +end diff --git a/db/migrate/20170905122539_create_compliance_control_blocks.rb b/db/migrate/20170905122539_create_compliance_control_blocks.rb new file mode 100644 index 000000000..54ed027ff --- /dev/null +++ b/db/migrate/20170905122539_create_compliance_control_blocks.rb @@ -0,0 +1,11 @@ +class CreateComplianceControlBlocks < ActiveRecord::Migration +  def change +    create_table :compliance_control_blocks do |t| +      t.string :name +      t.hstore :condition_attributes +      t.references :compliance_control_set, index: true, foreign_key: true + +      t.timestamps null: false +    end +  end +end diff --git a/db/migrate/20170905123421_create_compliance_controls.rb b/db/migrate/20170905123421_create_compliance_controls.rb new file mode 100644 index 000000000..6b507bb8d --- /dev/null +++ b/db/migrate/20170905123421_create_compliance_controls.rb @@ -0,0 +1,16 @@ +class CreateComplianceControls < ActiveRecord::Migration +  def change +    create_table :compliance_controls do |t| +      t.references :compliance_control_set, index: true, foreign_key: true +      t.references :compliance_control_block, index: true, foreign_key: true +      t.string :type +      t.json :control_attributes +      t.string :name +      t.string :code +      t.integer :criticity +      t.text :comment + +      t.timestamps null: false +    end +  end +end diff --git a/db/migrate/20170905130413_create_compliance_check_sets.rb b/db/migrate/20170905130413_create_compliance_check_sets.rb new file mode 100644 index 000000000..21055a3f2 --- /dev/null +++ b/db/migrate/20170905130413_create_compliance_check_sets.rb @@ -0,0 +1,14 @@ +class CreateComplianceCheckSets < ActiveRecord::Migration +  def change +    create_table :compliance_check_sets do |t| +      t.references :referential, index: true, foreign_key: true +      t.references :compliance_control_set, index: true, foreign_key: true +      t.references :workbench, index: true, foreign_key: true +      t.string :creator +      t.string :status +      t.references :parent, polymorphic: true, index: true + +      t.timestamps null: false +    end +  end +end diff --git a/db/migrate/20170905135646_create_compliance_check_blocks.rb b/db/migrate/20170905135646_create_compliance_check_blocks.rb new file mode 100644 index 000000000..c461e656b --- /dev/null +++ b/db/migrate/20170905135646_create_compliance_check_blocks.rb @@ -0,0 +1,11 @@ +class CreateComplianceCheckBlocks < ActiveRecord::Migration +  def change +    create_table :compliance_check_blocks do |t| +      t.string :name +      t.hstore :condition_attributes +      t.references :compliance_check_set, index: true, foreign_key: true + +      t.timestamps null: false +    end +  end +end diff --git a/db/migrate/20170906084628_create_compliance_checks.rb b/db/migrate/20170906084628_create_compliance_checks.rb new file mode 100644 index 000000000..1d6bdaaf2 --- /dev/null +++ b/db/migrate/20170906084628_create_compliance_checks.rb @@ -0,0 +1,16 @@ +class CreateComplianceChecks < ActiveRecord::Migration +  def change +    create_table :compliance_checks do |t| +      t.references :compliance_check_set, index: true, foreign_key: true +      t.references :compliance_check_block, index: true, foreign_key: true +      t.string :type +      t.json :control_attributes +      t.string :name +      t.string :code +      t.integer :criticity +      t.text :comment + +      t.timestamps null: false +    end +  end +end diff --git a/db/migrate/20170906091136_create_compliance_check_resources.rb b/db/migrate/20170906091136_create_compliance_check_resources.rb new file mode 100644 index 000000000..45713fed5 --- /dev/null +++ b/db/migrate/20170906091136_create_compliance_check_resources.rb @@ -0,0 +1,13 @@ +class CreateComplianceCheckResources < ActiveRecord::Migration +  def change +    create_table :compliance_check_resources do |t| +      t.string :status +      t.string :name +      t.string :type +      t.string :reference +      t.hstore :metrics + +      t.timestamps null: false +    end +  end +end diff --git a/db/migrate/20170906092619_create_compliance_check_results.rb b/db/migrate/20170906092619_create_compliance_check_results.rb new file mode 100644 index 000000000..e917d384e --- /dev/null +++ b/db/migrate/20170906092619_create_compliance_check_results.rb @@ -0,0 +1,13 @@ +class CreateComplianceCheckResults < ActiveRecord::Migration +  def change +    create_table :compliance_check_results do |t| +      t.references :compliance_check, index: true, foreign_key: true +      t.references :compliance_check_resource, index: true, foreign_key: true +      t.string :message_key +      t.hstore :message_attributes +      t.hstore :resource_attributes + +      t.timestamps null: false +    end +  end +end diff --git a/db/schema.rb b/db/schema.rb index 98e60c909..9207590b5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -145,6 +145,107 @@ ActiveRecord::Schema.define(version: 20170907082913) do    add_index "companies", ["objectid"], name: "companies_objectid_key", unique: true, using: :btree    add_index "companies", ["registration_number"], name: "companies_registration_number_key", using: :btree +  create_table "compliance_check_blocks", id: :bigserial, force: :cascade do |t| +    t.string   "name" +    t.hstore   "condition_attributes" +    t.integer  "compliance_check_set_id" +    t.datetime "created_at",              null: false +    t.datetime "updated_at",              null: false +  end + +  add_index "compliance_check_blocks", ["compliance_check_set_id"], name: "index_compliance_check_blocks_on_compliance_check_set_id", using: :btree + +  create_table "compliance_check_resources", id: :bigserial, force: :cascade do |t| +    t.string   "status" +    t.string   "name" +    t.string   "type" +    t.string   "reference" +    t.hstore   "metrics" +    t.datetime "created_at", null: false +    t.datetime "updated_at", null: false +  end + +  create_table "compliance_check_results", id: :bigserial, force: :cascade do |t| +    t.integer  "compliance_check_id" +    t.integer  "compliance_check_resource_id" +    t.string   "message_key" +    t.hstore   "message_attributes" +    t.hstore   "resource_attributes" +    t.datetime "created_at",                   null: false +    t.datetime "updated_at",                   null: false +  end + +  add_index "compliance_check_results", ["compliance_check_id"], name: "index_compliance_check_results_on_compliance_check_id", using: :btree +  add_index "compliance_check_results", ["compliance_check_resource_id"], name: "index_compliance_check_results_on_compliance_check_resource_id", using: :btree + +  create_table "compliance_check_sets", id: :bigserial, force: :cascade do |t| +    t.integer  "referential_id" +    t.integer  "compliance_control_set_id" +    t.integer  "workbench_id" +    t.string   "creator" +    t.string   "status" +    t.integer  "parent_id" +    t.string   "parent_type" +    t.datetime "created_at",                null: false +    t.datetime "updated_at",                null: false +  end + +  add_index "compliance_check_sets", ["compliance_control_set_id"], name: "index_compliance_check_sets_on_compliance_control_set_id", using: :btree +  add_index "compliance_check_sets", ["parent_type", "parent_id"], name: "index_compliance_check_sets_on_parent_type_and_parent_id", using: :btree +  add_index "compliance_check_sets", ["referential_id"], name: "index_compliance_check_sets_on_referential_id", using: :btree +  add_index "compliance_check_sets", ["workbench_id"], name: "index_compliance_check_sets_on_workbench_id", using: :btree + +  create_table "compliance_checks", id: :bigserial, force: :cascade do |t| +    t.integer  "compliance_check_set_id" +    t.integer  "compliance_check_block_id" +    t.string   "type" +    t.json     "control_attributes" +    t.string   "name" +    t.string   "code" +    t.integer  "criticity" +    t.text     "comment" +    t.datetime "created_at",                null: false +    t.datetime "updated_at",                null: false +  end + +  add_index "compliance_checks", ["compliance_check_block_id"], name: "index_compliance_checks_on_compliance_check_block_id", using: :btree +  add_index "compliance_checks", ["compliance_check_set_id"], name: "index_compliance_checks_on_compliance_check_set_id", using: :btree + +  create_table "compliance_control_blocks", id: :bigserial, force: :cascade do |t| +    t.string   "name" +    t.hstore   "condition_attributes" +    t.integer  "compliance_control_set_id" +    t.datetime "created_at",                null: false +    t.datetime "updated_at",                null: false +  end + +  add_index "compliance_control_blocks", ["compliance_control_set_id"], name: "index_compliance_control_blocks_on_compliance_control_set_id", using: :btree + +  create_table "compliance_control_sets", id: :bigserial, force: :cascade do |t| +    t.string   "name" +    t.integer  "organisation_id" +    t.datetime "created_at",      null: false +    t.datetime "updated_at",      null: false +  end + +  add_index "compliance_control_sets", ["organisation_id"], name: "index_compliance_control_sets_on_organisation_id", using: :btree + +  create_table "compliance_controls", id: :bigserial, force: :cascade do |t| +    t.integer  "compliance_control_set_id" +    t.integer  "compliance_control_block_id" +    t.string   "type" +    t.json     "control_attributes" +    t.string   "name" +    t.string   "code" +    t.integer  "criticity" +    t.text     "comment" +    t.datetime "created_at",                  null: false +    t.datetime "updated_at",                  null: false +  end + +  add_index "compliance_controls", ["compliance_control_block_id"], name: "index_compliance_controls_on_compliance_control_block_id", using: :btree +  add_index "compliance_controls", ["compliance_control_set_id"], name: "index_compliance_controls_on_compliance_control_set_id", using: :btree +    create_table "connection_links", id: :bigserial, force: :cascade do |t|      t.integer  "departure_id",                           limit: 8      t.integer  "arrival_id",                             limit: 8 @@ -864,6 +965,18 @@ ActiveRecord::Schema.define(version: 20170907082913) do    add_foreign_key "access_links", "access_points", name: "aclk_acpt_fkey"    add_foreign_key "api_keys", "organisations" +  add_foreign_key "compliance_check_blocks", "compliance_check_sets" +  add_foreign_key "compliance_check_results", "compliance_check_resources" +  add_foreign_key "compliance_check_results", "compliance_checks" +  add_foreign_key "compliance_check_sets", "compliance_control_sets" +  add_foreign_key "compliance_check_sets", "referentials" +  add_foreign_key "compliance_check_sets", "workbenches" +  add_foreign_key "compliance_checks", "compliance_check_blocks" +  add_foreign_key "compliance_checks", "compliance_check_sets" +  add_foreign_key "compliance_control_blocks", "compliance_control_sets" +  add_foreign_key "compliance_control_sets", "organisations" +  add_foreign_key "compliance_controls", "compliance_control_blocks" +  add_foreign_key "compliance_controls", "compliance_control_sets"    add_foreign_key "group_of_lines_lines", "group_of_lines", name: "groupofline_group_fkey", on_delete: :cascade    add_foreign_key "journey_frequencies", "timebands", on_delete: :nullify    add_foreign_key "journey_frequencies", "vehicle_journeys", on_delete: :nullify diff --git a/spec/factories/compliance_check_blocks.rb b/spec/factories/compliance_check_blocks.rb new file mode 100644 index 000000000..0bd23c0d6 --- /dev/null +++ b/spec/factories/compliance_check_blocks.rb @@ -0,0 +1,6 @@ +FactoryGirl.define do +  factory :compliance_check_block do +    sequence(:name) { |n| "Compliance check block #{n}" } +    association :compliance_check_set +  end +end diff --git a/spec/factories/compliance_check_resources.rb b/spec/factories/compliance_check_resources.rb new file mode 100644 index 000000000..813153be2 --- /dev/null +++ b/spec/factories/compliance_check_resources.rb @@ -0,0 +1,6 @@ +FactoryGirl.define do +  factory :compliance_check_resource do +    status :new +    sequence(:name) { |n| "Compliance check resource #{n}" } +  end +end diff --git a/spec/factories/compliance_check_results.rb b/spec/factories/compliance_check_results.rb new file mode 100644 index 000000000..a56d77ce4 --- /dev/null +++ b/spec/factories/compliance_check_results.rb @@ -0,0 +1,7 @@ +FactoryGirl.define do +  factory :compliance_check_result do +    association :compliance_check +    association :compliance_check_resource +    message_key "message_key" +  end +end diff --git a/spec/factories/compliance_check_sets.rb b/spec/factories/compliance_check_sets.rb new file mode 100644 index 000000000..9fd6ef4e0 --- /dev/null +++ b/spec/factories/compliance_check_sets.rb @@ -0,0 +1,8 @@ +FactoryGirl.define do +  factory :compliance_check_set do +    status :new +    association :referential +    association :compliance_control_set +    association :workbench +  end +end diff --git a/spec/factories/compliance_checks.rb b/spec/factories/compliance_checks.rb new file mode 100644 index 000000000..4009653da --- /dev/null +++ b/spec/factories/compliance_checks.rb @@ -0,0 +1,11 @@ +FactoryGirl.define do +  factory :compliance_check do +    sequence(:name) { |n| "Compliance check #{n}" } +    type "Type" +    criticity :info +    code "code" +    comment "Text" +    association :compliance_check_set +    association :compliance_check_block +  end +end diff --git a/spec/factories/compliance_control_blocks.rb b/spec/factories/compliance_control_blocks.rb new file mode 100644 index 000000000..5bc45cc75 --- /dev/null +++ b/spec/factories/compliance_control_blocks.rb @@ -0,0 +1,6 @@ +FactoryGirl.define do +  factory :compliance_control_block do +    sequence(:name) { |n| "Compliance control block #{n}" } +    association :compliance_control_set +  end +end diff --git a/spec/factories/compliance_control_sets.rb b/spec/factories/compliance_control_sets.rb new file mode 100644 index 000000000..5e4acf3c4 --- /dev/null +++ b/spec/factories/compliance_control_sets.rb @@ -0,0 +1,6 @@ +FactoryGirl.define do +  factory :compliance_control_set do +    sequence(:name) { |n| "Compliance control set #{n}" } +    association :organisation +  end +end diff --git a/spec/factories/compliance_controls.rb b/spec/factories/compliance_controls.rb new file mode 100644 index 000000000..28b760383 --- /dev/null +++ b/spec/factories/compliance_controls.rb @@ -0,0 +1,11 @@ +FactoryGirl.define do +  factory :compliance_control do +    sequence(:name) { |n| "Compliance control #{n}" } +    type "Type" +    criticity :info +    code "code" +    comment "Text" +    association :compliance_control_set +    association :compliance_control_block +  end +end diff --git a/spec/models/compliance_check_block_spec.rb b/spec/models/compliance_check_block_spec.rb new file mode 100644 index 000000000..f581d5085 --- /dev/null +++ b/spec/models/compliance_check_block_spec.rb @@ -0,0 +1,9 @@ +require 'rails_helper' + +RSpec.describe ComplianceCheckBlock, type: :model do +  it 'should have a valid factory' do +    expect(FactoryGirl.build(:compliance_check_block)).to be_valid +  end + +  it { should belong_to :compliance_check_set } +end diff --git a/spec/models/compliance_check_resource_spec.rb b/spec/models/compliance_check_resource_spec.rb new file mode 100644 index 000000000..a9366bea2 --- /dev/null +++ b/spec/models/compliance_check_resource_spec.rb @@ -0,0 +1,7 @@ +require 'rails_helper' + +RSpec.describe ComplianceCheckResource, type: :model do +  it 'should have a valid factory' do +    expect(FactoryGirl.build(:compliance_check_resource)).to be_valid +  end +end diff --git a/spec/models/compliance_check_result_spec.rb b/spec/models/compliance_check_result_spec.rb new file mode 100644 index 000000000..95586862f --- /dev/null +++ b/spec/models/compliance_check_result_spec.rb @@ -0,0 +1,10 @@ +require 'rails_helper' + +RSpec.describe ComplianceCheckResult, type: :model do +  it 'should have a valid factory' do +    expect(FactoryGirl.build(:compliance_check_result)).to be_valid +  end + +  it { should belong_to :compliance_check } +  it { should belong_to :compliance_check_resource } +end diff --git a/spec/models/compliance_check_set_spec.rb b/spec/models/compliance_check_set_spec.rb new file mode 100644 index 000000000..6e53c9def --- /dev/null +++ b/spec/models/compliance_check_set_spec.rb @@ -0,0 +1,12 @@ +require 'rails_helper' + +RSpec.describe ComplianceCheckSet, type: :model do +  it 'should have a valid factory' do +    expect(FactoryGirl.build(:compliance_check_set)).to be_valid +  end + +  it { should belong_to :referential } +  it { should belong_to :workbench } +  it { should belong_to :compliance_control_set } +  it { should belong_to :parent } +end diff --git a/spec/models/compliance_check_spec.rb b/spec/models/compliance_check_spec.rb new file mode 100644 index 000000000..4fbc23d42 --- /dev/null +++ b/spec/models/compliance_check_spec.rb @@ -0,0 +1,14 @@ +require 'rails_helper' + +RSpec.describe ComplianceCheck, type: :model do +  it 'should have a valid factory' do +    expect(FactoryGirl.build(:compliance_check)).to be_valid +  end + +  it { should belong_to :compliance_check_set } +  it { should belong_to :compliance_check_block } + +  it { should validate_presence_of :criticity } +  it { should validate_presence_of :name } +  it { should validate_presence_of :code } +end diff --git a/spec/models/compliance_control_block_spec.rb b/spec/models/compliance_control_block_spec.rb new file mode 100644 index 000000000..248049b0c --- /dev/null +++ b/spec/models/compliance_control_block_spec.rb @@ -0,0 +1,9 @@ +require 'rails_helper' + +RSpec.describe ComplianceControlBlock, type: :model do +  it 'should have a valid factory' do +    expect(FactoryGirl.build(:compliance_control_block)).to be_valid +  end + +  it { should belong_to :compliance_control_set } +end diff --git a/spec/models/compliance_control_set_spec.rb b/spec/models/compliance_control_set_spec.rb new file mode 100644 index 000000000..fb46bc65a --- /dev/null +++ b/spec/models/compliance_control_set_spec.rb @@ -0,0 +1,9 @@ +require 'rails_helper' + +RSpec.describe ComplianceControlSet, type: :model do +  it 'should have a valid factory' do +    expect(FactoryGirl.build(:compliance_control_set)).to be_valid +  end + +  it { should belong_to :organisation } +end diff --git a/spec/models/compliance_control_spec.rb b/spec/models/compliance_control_spec.rb new file mode 100644 index 000000000..b00ff4c5a --- /dev/null +++ b/spec/models/compliance_control_spec.rb @@ -0,0 +1,14 @@ +require 'rails_helper' + +RSpec.describe ComplianceControl, type: :model do +  it 'should have a valid factory' do +    expect(FactoryGirl.build(:compliance_control)).to be_valid +  end + +  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 } +  it { should validate_presence_of :code } +end | 
