metasploit_data_models 0.17.2-java → 0.17.3-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/mdm/api_key.rb +1 -1
  3. data/app/models/mdm/client.rb +1 -1
  4. data/app/models/mdm/cred.rb +4 -2
  5. data/app/models/mdm/event.rb +1 -1
  6. data/app/models/mdm/exploit_attempt.rb +1 -1
  7. data/app/models/mdm/exploited_host.rb +1 -1
  8. data/app/models/mdm/host.rb +1 -1
  9. data/app/models/mdm/host_detail.rb +1 -1
  10. data/app/models/mdm/host_tag.rb +1 -1
  11. data/app/models/mdm/listener.rb +1 -2
  12. data/app/models/mdm/loot.rb +3 -1
  13. data/app/models/mdm/macro.rb +1 -1
  14. data/app/models/mdm/mod_ref.rb +1 -1
  15. data/app/models/mdm/module/action.rb +1 -1
  16. data/app/models/mdm/module/arch.rb +1 -1
  17. data/app/models/mdm/module/author.rb +1 -1
  18. data/app/models/mdm/module/detail.rb +1 -1
  19. data/app/models/mdm/module/mixin.rb +1 -1
  20. data/app/models/mdm/module/platform.rb +1 -1
  21. data/app/models/mdm/module/ref.rb +1 -1
  22. data/app/models/mdm/module/target.rb +1 -1
  23. data/app/models/mdm/nexpose_console.rb +1 -1
  24. data/app/models/mdm/note.rb +3 -1
  25. data/app/models/mdm/profile.rb +1 -1
  26. data/app/models/mdm/ref.rb +1 -1
  27. data/app/models/mdm/route.rb +1 -1
  28. data/app/models/mdm/service.rb +1 -1
  29. data/app/models/mdm/session.rb +3 -1
  30. data/app/models/mdm/session_event.rb +1 -1
  31. data/app/models/mdm/tag.rb +1 -1
  32. data/app/models/mdm/task.rb +3 -1
  33. data/app/models/mdm/task_cred.rb +2 -0
  34. data/app/models/mdm/task_host.rb +2 -0
  35. data/app/models/mdm/task_service.rb +2 -0
  36. data/app/models/mdm/task_session.rb +2 -0
  37. data/app/models/mdm/user.rb +1 -1
  38. data/app/models/mdm/vuln.rb +3 -1
  39. data/app/models/mdm/vuln_attempt.rb +1 -1
  40. data/app/models/mdm/vuln_detail.rb +1 -1
  41. data/app/models/mdm/vuln_ref.rb +1 -1
  42. data/app/models/mdm/web_form.rb +1 -1
  43. data/app/models/mdm/web_page.rb +1 -1
  44. data/app/models/mdm/web_site.rb +1 -1
  45. data/app/models/mdm/web_vuln.rb +1 -1
  46. data/app/models/mdm/wmap_request.rb +1 -1
  47. data/app/models/mdm/wmap_target.rb +1 -1
  48. data/app/models/mdm/workspace.rb +3 -1
  49. data/app/models/metasploit_data_models/search/visitor/attribute.rb +2 -0
  50. data/app/models/metasploit_data_models/search/visitor/includes.rb +2 -0
  51. data/app/models/metasploit_data_models/search/visitor/joins.rb +2 -0
  52. data/app/models/metasploit_data_models/search/visitor/method.rb +2 -0
  53. data/app/models/metasploit_data_models/search/visitor/relation.rb +4 -0
  54. data/app/models/metasploit_data_models/search/visitor/where.rb +2 -0
  55. data/lib/metasploit_data_models.rb +1 -0
  56. data/lib/metasploit_data_models/version.rb +1 -1
  57. data/metasploit_data_models.gemspec +2 -1
  58. data/spec/app/models/mdm/api_key_spec.rb +5 -0
  59. data/spec/app/models/mdm/client_spec.rb +2 -0
  60. data/spec/app/models/mdm/cred_spec.rb +1 -0
  61. data/spec/app/models/mdm/{events_spec.rb → event_spec.rb} +1 -0
  62. data/spec/app/models/mdm/exploit_attempt_spec.rb +1 -0
  63. data/spec/app/models/mdm/exploited_host_spec.rb +34 -32
  64. data/spec/app/models/mdm/host_detail_spec.rb +1 -0
  65. data/spec/app/models/mdm/host_spec.rb +2 -0
  66. data/spec/app/models/mdm/host_tag_spec.rb +1 -0
  67. data/spec/app/models/mdm/listener_spec.rb +1 -0
  68. data/spec/app/models/mdm/loot_spec.rb +66 -64
  69. data/spec/app/models/mdm/macro_spec.rb +5 -0
  70. data/spec/app/models/mdm/mod_ref_spec.rb +5 -0
  71. data/spec/app/models/mdm/module/action_spec.rb +3 -0
  72. data/spec/app/models/mdm/module/arch_spec.rb +3 -0
  73. data/spec/app/models/mdm/module/author_spec.rb +3 -0
  74. data/spec/app/models/mdm/module/detail_spec.rb +2 -0
  75. data/spec/app/models/mdm/module/mixin_spec.rb +3 -0
  76. data/spec/app/models/mdm/module/platform_spec.rb +3 -0
  77. data/spec/app/models/mdm/module/ref_spec.rb +3 -0
  78. data/spec/app/models/mdm/module/target_spec.rb +3 -0
  79. data/spec/app/models/mdm/nexpose_console_spec.rb +1 -0
  80. data/spec/app/models/mdm/note_spec.rb +1 -0
  81. data/spec/app/models/mdm/profile_spec.rb +5 -0
  82. data/spec/app/models/mdm/ref_spec.rb +2 -0
  83. data/spec/app/models/mdm/route_spec.rb +1 -0
  84. data/spec/app/models/mdm/service_spec.rb +1 -0
  85. data/spec/app/models/mdm/session_event_spec.rb +2 -0
  86. data/spec/app/models/mdm/session_spec.rb +1 -0
  87. data/spec/app/models/mdm/tag_spec.rb +1 -0
  88. data/spec/app/models/mdm/{task_creds_spec.rb → task_cred_spec.rb} +1 -0
  89. data/spec/app/models/mdm/task_host_spec.rb +1 -0
  90. data/spec/app/models/mdm/task_service_spec.rb +1 -0
  91. data/spec/app/models/mdm/{task_sessions_spec.rb → task_session_spec.rb} +1 -0
  92. data/spec/app/models/mdm/task_spec.rb +1 -0
  93. data/spec/app/models/mdm/user_spec.rb +1 -0
  94. data/spec/app/models/mdm/vuln_attempt_spec.rb +1 -0
  95. data/spec/app/models/mdm/{vuln_details_spec.rb → vuln_detail_spec.rb} +1 -0
  96. data/spec/app/models/mdm/vuln_ref_spec.rb +2 -0
  97. data/spec/app/models/mdm/vuln_spec.rb +2 -0
  98. data/spec/app/models/mdm/web_form_spec.rb +1 -0
  99. data/spec/app/models/mdm/web_page_spec.rb +1 -0
  100. data/spec/app/models/mdm/web_site_spec.rb +1 -0
  101. data/spec/app/models/mdm/web_vuln_spec.rb +2 -0
  102. data/spec/app/models/mdm/wmap_request_spec.rb +5 -0
  103. data/spec/app/models/mdm/wmap_target_spec.rb +5 -0
  104. data/spec/app/models/mdm/workspace_spec.rb +2 -0
  105. data/spec/app/models/metasploit_data_models/search/visitor/attribute_spec.rb +2 -0
  106. data/spec/app/models/metasploit_data_models/search/visitor/includes_spec.rb +2 -0
  107. data/spec/app/models/metasploit_data_models/search/visitor/joins_spec.rb +2 -0
  108. data/spec/app/models/metasploit_data_models/search/visitor/method_spec.rb +2 -0
  109. data/spec/app/models/metasploit_data_models/search/visitor/relation_spec.rb +2 -0
  110. data/spec/app/models/metasploit_data_models/search/visitor/where_spec.rb +2 -0
  111. data/spec/spec_helper.rb +11 -3
  112. metadata +38 -12
@@ -25,4 +25,6 @@ class MetasploitDataModels::Search::Visitor::Includes
25
25
  visit 'Metasploit::Model::Search::Operator::Attribute' do |_operator|
26
26
  []
27
27
  end
28
+
29
+ Metasploit::Concern.run(self)
28
30
  end
@@ -44,4 +44,6 @@ class MetasploitDataModels::Search::Visitor::Joins
44
44
  visit 'Metasploit::Model::Search::Operator::Attribute' do |_|
45
45
  []
46
46
  end
47
+
48
+ Metasploit::Concern.run(self)
47
49
  end
@@ -10,4 +10,6 @@ class MetasploitDataModels::Search::Visitor::Method
10
10
  'Metasploit::Model::Search::Operation::Union' do
11
11
  :or
12
12
  end
13
+
14
+ Metasploit::Concern.run(self)
13
15
  end
@@ -84,4 +84,8 @@ class MetasploitDataModels::Search::Visitor::Relation < Metasploit::Model::Base
84
84
  errors.add(:query, :invalid)
85
85
  end
86
86
  end
87
+
88
+ private
89
+
90
+ Metasploit::Concern.run(self)
87
91
  end
@@ -62,4 +62,6 @@ class MetasploitDataModels::Search::Visitor::Where
62
62
  def method_visitor
63
63
  @method_visitor ||= MetasploitDataModels::Search::Visitor::Method.new
64
64
  end
65
+
66
+ Metasploit::Concern.run(self)
65
67
  end
@@ -10,6 +10,7 @@ require 'active_record'
10
10
  require 'active_support'
11
11
  require 'active_support/all'
12
12
  require 'active_support/dependencies'
13
+ require 'metasploit/concern'
13
14
  require 'metasploit/model'
14
15
 
15
16
  #
@@ -4,5 +4,5 @@ module MetasploitDataModels
4
4
  # metasploit-framework/data/sql/migrate to db/migrate in this project, not all models have specs that verify the
5
5
  # migrations (with have_db_column and have_db_index) and certain models may not be shared between metasploit-framework
6
6
  # and pro, so models may be removed in the future. Because of the unstable API the version should remain below 1.0.0
7
- VERSION = '0.17.2'
7
+ VERSION = '0.17.3'
8
8
  end
@@ -38,7 +38,8 @@ Gem::Specification.new do |s|
38
38
  # @see MSP-2971
39
39
  s.add_runtime_dependency 'activerecord', '>= 3.2.13', '< 4.0.0'
40
40
  s.add_runtime_dependency 'activesupport'
41
- s.add_runtime_dependency 'metasploit-model', '>= 0.24.1.pre.semantic.pre.versioning.pre.2.pre.0', '< 0.25'
41
+ s.add_runtime_dependency 'metasploit-concern', '~> 0.1.0'
42
+ s.add_runtime_dependency 'metasploit-model', '>= 0.24.1', '< 0.25'
42
43
 
43
44
  if RUBY_PLATFORM =~ /java/
44
45
  # markdown formatting for yard
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mdm::ApiKey do
4
+ it_should_behave_like 'Metasploit::Concern.run'
5
+ end
@@ -2,6 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Mdm::Client do
4
4
 
5
+ it_should_behave_like 'Metasploit::Concern.run'
6
+
5
7
  context 'associations' do
6
8
  it { should belong_to(:host).class_name('Mdm::Host') }
7
9
  end
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::Cred do
4
+ it_should_behave_like 'Metasploit::Concern.run'
4
5
 
5
6
  context "Associations" do
6
7
  it { should have_many(:task_creds).class_name('Mdm::TaskCred').dependent(:destroy) }
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::Event do
4
+ it_should_behave_like 'Metasploit::Concern.run'
4
5
 
5
6
  context 'associations' do
6
7
  it { should belong_to(:host).class_name('Mdm::Host') }
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::ExploitAttempt do
4
+ it_should_behave_like 'Metasploit::Concern.run'
4
5
 
5
6
  context 'associations' do
6
7
  it { should belong_to(:host).class_name('Mdm::Host') }
@@ -1,38 +1,40 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::ExploitedHost do
4
- context 'associations' do
5
- it { should belong_to(:host).class_name('Mdm::Host') }
6
- it { should belong_to(:service).class_name('Mdm::Service') }
7
- end
8
-
9
- context 'database' do
10
-
11
- context 'timestamps'do
12
- it { should have_db_column(:created_at).of_type(:datetime).with_options(:null => false) }
13
- it { should have_db_column(:updated_at).of_type(:datetime).with_options(:null => false) }
14
- end
15
-
16
- context 'columns' do
17
- it { should have_db_column(:host_id).of_type(:integer).with_options(:null => false) }
18
- it { should have_db_column(:service_id).of_type(:integer) }
19
- it { should have_db_column(:name).of_type(:string) }
20
- it { should have_db_column(:session_uuid).of_type(:string) }
21
- it { should have_db_column(:payload).of_type(:string) }
22
- end
23
- end
24
-
25
- context '#destroy' do
26
- it 'should successfully destroy the object and all dependent objects' do
27
- exploited_host = FactoryGirl.create(:mdm_exploited_host)
28
- expect {
29
- exploited_host.destroy
30
- }.to_not raise_error
31
- expect {
32
- exploited_host.reload
33
- }.to raise_error(ActiveRecord::RecordNotFound)
34
- end
35
- end
4
+ it_should_behave_like 'Metasploit::Concern.run'
5
+
6
+ context 'associations' do
7
+ it { should belong_to(:host).class_name('Mdm::Host') }
8
+ it { should belong_to(:service).class_name('Mdm::Service') }
9
+ end
10
+
11
+ context 'database' do
12
+
13
+ context 'timestamps'do
14
+ it { should have_db_column(:created_at).of_type(:datetime).with_options(:null => false) }
15
+ it { should have_db_column(:updated_at).of_type(:datetime).with_options(:null => false) }
16
+ end
17
+
18
+ context 'columns' do
19
+ it { should have_db_column(:host_id).of_type(:integer).with_options(:null => false) }
20
+ it { should have_db_column(:service_id).of_type(:integer) }
21
+ it { should have_db_column(:name).of_type(:string) }
22
+ it { should have_db_column(:session_uuid).of_type(:string) }
23
+ it { should have_db_column(:payload).of_type(:string) }
24
+ end
25
+ end
26
+
27
+ context '#destroy' do
28
+ it 'should successfully destroy the object and all dependent objects' do
29
+ exploited_host = FactoryGirl.create(:mdm_exploited_host)
30
+ expect {
31
+ exploited_host.destroy
32
+ }.to_not raise_error
33
+ expect {
34
+ exploited_host.reload
35
+ }.to raise_error(ActiveRecord::RecordNotFound)
36
+ end
37
+ end
36
38
 
37
39
  context 'factory' do
38
40
  it 'should be valid' do
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::HostDetail do
4
+ it_should_behave_like 'Metasploit::Concern.run'
4
5
 
5
6
  context 'associations' do
6
7
  it { should belong_to(:host).class_name('Mdm::Host') }
@@ -37,6 +37,8 @@ describe Mdm::Host do
37
37
  ]
38
38
  end
39
39
 
40
+ it_should_behave_like 'Metasploit::Concern.run'
41
+
40
42
  context 'factory' do
41
43
  it 'should be valid' do
42
44
  host = FactoryGirl.build(:mdm_host)
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::HostTag do
4
+ it_should_behave_like 'Metasploit::Concern.run'
4
5
 
5
6
  context 'associations' do
6
7
  it { should belong_to(:host).class_name('Mdm::Host') }
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::Listener do
4
+ it_should_behave_like 'Metasploit::Concern.run'
4
5
 
5
6
  context 'associations' do
6
7
  it { should belong_to(:workspace).class_name('Mdm::Workspace') }
@@ -1,77 +1,79 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::Loot do
4
- context 'associations' do
5
- it { should belong_to(:workspace).class_name('Mdm::Workspace') }
6
- it { should belong_to(:service).class_name('Mdm::Service') }
7
- it { should belong_to(:host).class_name('Mdm::Host') }
8
- end
4
+ it_should_behave_like 'Metasploit::Concern.run'
9
5
 
10
- context 'database' do
6
+ context 'associations' do
7
+ it { should belong_to(:workspace).class_name('Mdm::Workspace') }
8
+ it { should belong_to(:service).class_name('Mdm::Service') }
9
+ it { should belong_to(:host).class_name('Mdm::Host') }
10
+ end
11
11
 
12
- context 'timestamps'do
13
- it { should have_db_column(:created_at).of_type(:datetime).with_options(:null => false) }
14
- it { should have_db_column(:updated_at).of_type(:datetime).with_options(:null => false) }
15
- end
12
+ context 'database' do
16
13
 
17
- context 'columns' do
18
- it { should have_db_column(:workspace_id).of_type(:integer).with_options(:null => false, :default =>1) }
19
- it { should have_db_column(:host_id).of_type(:integer) }
20
- it { should have_db_column(:service_id).of_type(:integer) }
21
- it { should have_db_column(:ltype).of_type(:string) }
22
- it { should have_db_column(:path).of_type(:string) }
23
- it { should have_db_column(:data).of_type(:text) }
24
- it { should have_db_column(:content_type).of_type(:string) }
25
- it { should have_db_column(:name).of_type(:text) }
26
- it { should have_db_column(:info).of_type(:text) }
27
- end
28
- end
14
+ context 'timestamps'do
15
+ it { should have_db_column(:created_at).of_type(:datetime).with_options(:null => false) }
16
+ it { should have_db_column(:updated_at).of_type(:datetime).with_options(:null => false) }
17
+ end
29
18
 
30
- context 'factory' do
31
- it 'should be valid' do
32
- loot = FactoryGirl.build(:mdm_loot)
33
- loot.should be_valid
34
- end
35
- end
19
+ context 'columns' do
20
+ it { should have_db_column(:workspace_id).of_type(:integer).with_options(:null => false, :default =>1) }
21
+ it { should have_db_column(:host_id).of_type(:integer) }
22
+ it { should have_db_column(:service_id).of_type(:integer) }
23
+ it { should have_db_column(:ltype).of_type(:string) }
24
+ it { should have_db_column(:path).of_type(:string) }
25
+ it { should have_db_column(:data).of_type(:text) }
26
+ it { should have_db_column(:content_type).of_type(:string) }
27
+ it { should have_db_column(:name).of_type(:text) }
28
+ it { should have_db_column(:info).of_type(:text) }
29
+ end
30
+ end
36
31
 
37
- context '#destroy' do
38
- it 'should successfully destroy the object' do
39
- loot = FactoryGirl.create(:mdm_loot)
40
- expect {
41
- loot.destroy
42
- }.to_not raise_error
43
- expect {
44
- loot.reload
45
- }.to raise_error(ActiveRecord::RecordNotFound)
46
- end
47
- end
32
+ context 'factory' do
33
+ it 'should be valid' do
34
+ loot = FactoryGirl.build(:mdm_loot)
35
+ loot.should be_valid
36
+ end
37
+ end
48
38
 
49
- context 'scopes' do
50
- context 'search' do
51
- it 'should match on ltype' do
52
- myloot = FactoryGirl.create(:mdm_loot, :ltype => 'find.this.ltype')
53
- Mdm::Loot.search('find.this.ltype').should include(myloot)
54
- end
39
+ context '#destroy' do
40
+ it 'should successfully destroy the object' do
41
+ loot = FactoryGirl.create(:mdm_loot)
42
+ expect {
43
+ loot.destroy
44
+ }.to_not raise_error
45
+ expect {
46
+ loot.reload
47
+ }.to raise_error(ActiveRecord::RecordNotFound)
48
+ end
49
+ end
55
50
 
56
- it 'should match on name' do
57
- myloot = FactoryGirl.create(:mdm_loot, :name => 'Find This')
58
- Mdm::Loot.search('Find This').should include(myloot)
59
- end
51
+ context 'scopes' do
52
+ context 'search' do
53
+ it 'should match on ltype' do
54
+ myloot = FactoryGirl.create(:mdm_loot, :ltype => 'find.this.ltype')
55
+ Mdm::Loot.search('find.this.ltype').should include(myloot)
56
+ end
60
57
 
61
- it 'should match on info' do
62
- myloot = FactoryGirl.create(:mdm_loot, :info => 'Find This')
63
- Mdm::Loot.search('Find This').should include(myloot)
64
- end
65
- end
66
- end
58
+ it 'should match on name' do
59
+ myloot = FactoryGirl.create(:mdm_loot, :name => 'Find This')
60
+ Mdm::Loot.search('Find This').should include(myloot)
61
+ end
67
62
 
68
- context 'callbacks' do
69
- context 'before_destroy' do
70
- it 'should call #delete_file' do
71
- myloot = FactoryGirl.create(:mdm_loot)
72
- myloot.should_receive(:delete_file)
73
- myloot.destroy
74
- end
75
- end
76
- end
63
+ it 'should match on info' do
64
+ myloot = FactoryGirl.create(:mdm_loot, :info => 'Find This')
65
+ Mdm::Loot.search('Find This').should include(myloot)
66
+ end
67
+ end
68
+ end
69
+
70
+ context 'callbacks' do
71
+ context 'before_destroy' do
72
+ it 'should call #delete_file' do
73
+ myloot = FactoryGirl.create(:mdm_loot)
74
+ myloot.should_receive(:delete_file)
75
+ myloot.destroy
76
+ end
77
+ end
78
+ end
77
79
  end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mdm::Macro do
4
+ it_should_behave_like 'Metasploit::Concern.run'
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mdm::ModRef do
4
+ it_should_behave_like 'Metasploit::Concern.run'
5
+ end
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::Module::Action do
4
+
5
+ it_should_behave_like 'Metasploit::Concern.run'
6
+
4
7
  context 'associations' do
5
8
  it { should belong_to(:detail).class_name('Mdm::Module::Detail') }
6
9
  end
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::Module::Arch do
4
+
5
+ it_should_behave_like 'Metasploit::Concern.run'
6
+
4
7
  context 'associations' do
5
8
  it { should belong_to(:detail).class_name('Mdm::Module::Detail') }
6
9
  end
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::Module::Author do
4
+
5
+ it_should_behave_like 'Metasploit::Concern.run'
6
+
4
7
  context 'associations' do
5
8
  it { should belong_to(:detail).class_name('Mdm::Module::Detail') }
6
9
  end
@@ -47,6 +47,8 @@ describe Mdm::Module::Detail do
47
47
  ]
48
48
  end
49
49
 
50
+ it_should_behave_like 'Metasploit::Concern.run'
51
+
50
52
  context 'associations' do
51
53
  it { should have_many(:actions).class_name('Mdm::Module::Action').dependent(:destroy) }
52
54
  it { should have_many(:archs).class_name('Mdm::Module::Arch').dependent(:destroy) }
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::Module::Mixin do
4
+
5
+ it_should_behave_like 'Metasploit::Concern.run'
6
+
4
7
  context 'associations' do
5
8
  it { should belong_to(:detail).class_name('Mdm::Module::Detail') }
6
9
  end
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mdm::Module::Platform do
4
+
5
+ it_should_behave_like 'Metasploit::Concern.run'
6
+
4
7
  context 'associations' do
5
8
  it { should belong_to(:detail).class_name('Mdm::Module::Detail') }
6
9
  end