metasploit-credential 1.0.0.pre.rails.pre.4.0c → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +20 -41
- data/app/models/metasploit/credential/core.rb +1 -1
- data/app/models/metasploit/credential/login.rb +1 -1
- data/app/models/metasploit/credential/postgres_md5.rb +4 -0
- data/app/models/metasploit/credential/search/operator/type.rb +2 -2
- data/lib/metasploit/credential/creation.rb +1 -1
- data/lib/metasploit/credential/exporter/core.rb +5 -5
- data/lib/metasploit/credential/exporter/pwdump.rb +2 -2
- data/lib/metasploit/credential/importer/pwdump.rb +6 -5
- data/lib/metasploit/credential/migrator.rb +1 -1
- data/lib/metasploit/credential/version.rb +32 -7
- data/spec/lib/metasploit/credential/creation_spec.rb +6 -8
- data/spec/lib/metasploit/credential/exporter/core_spec.rb +99 -84
- data/spec/lib/metasploit/credential/exporter/pwdump_spec.rb +14 -16
- data/spec/lib/metasploit/credential/importer/core_spec.rb +10 -12
- data/spec/lib/metasploit/credential/importer/multi_spec.rb +4 -6
- data/spec/lib/metasploit/credential/importer/pwdump_spec.rb +11 -13
- data/spec/lib/metasploit/credential/importer/zip_spec.rb +5 -7
- data/spec/lib/metasploit/credential/migrator_spec.rb +8 -9
- data/spec/lib/metasploit/credential/version_spec.rb +3 -139
- data/spec/lib/metasploit/credential_spec.rb +4 -15
- data/spec/models/mdm/service_spec.rb +3 -5
- data/spec/models/mdm/session_spec.rb +2 -4
- data/spec/models/mdm/task_spec.rb +4 -6
- data/spec/models/mdm/user_spec.rb +2 -4
- data/spec/models/mdm/workspace_spec.rb +2 -4
- data/spec/models/metasploit/credential/blank_username_spec.rb +4 -7
- data/spec/models/metasploit/credential/core_spec.rb +43 -45
- data/spec/models/metasploit/credential/login/status_spec.rb +19 -21
- data/spec/models/metasploit/credential/login_spec.rb +33 -35
- data/spec/models/metasploit/credential/nonreplayable_hash_spec.rb +3 -5
- data/spec/models/metasploit/credential/ntlm_hash_spec.rb +13 -15
- data/spec/models/metasploit/credential/origin/cracked_password_spec.rb +5 -7
- data/spec/models/metasploit/credential/origin/import_spec.rb +7 -10
- data/spec/models/metasploit/credential/origin/manual_spec.rb +7 -9
- data/spec/models/metasploit/credential/origin/service_spec.rb +9 -11
- data/spec/models/metasploit/credential/origin/session_spec.rb +10 -12
- data/spec/models/metasploit/credential/password_hash_spec.rb +4 -6
- data/spec/models/metasploit/credential/password_spec.rb +3 -5
- data/spec/models/metasploit/credential/postgres_md5_spec.rb +4 -6
- data/spec/models/metasploit/credential/private_spec.rb +7 -9
- data/spec/models/metasploit/credential/public_spec.rb +4 -6
- data/spec/models/metasploit/credential/realm_spec.rb +12 -14
- data/spec/models/metasploit/credential/replayable_hash_spec.rb +3 -5
- data/spec/models/metasploit/credential/ssh_key_spec.rb +15 -17
- data/spec/models/metasploit/credential/username_spec.rb +5 -9
- data/spec/models/metasploit_data_models/search/visitor/relation_spec.rb +1 -3
- data/spec/spec_helper.rb +95 -25
- data/spec/support/shared/contexts/mdm/workspace.rb +1 -1
- data/spec/support/shared/examples/core_validations.rb +117 -42
- data/spec/support/shared/examples/single_table_inheritance_database_columns.rb +2 -2
- data/spec/support/shared/examples/timestamp_database_column.rb +2 -2
- metadata +30 -16
@@ -1,15 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
context 'VERSION' do
|
6
|
-
subject(:version) do
|
7
|
-
described_class::VERSION
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'is Metasploit::Credential::Version.full' do
|
11
|
-
expect(version).to eq(Metasploit::Credential::Version.full)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
1
|
+
RSpec.describe Metasploit::Credential do
|
2
|
+
it_should_behave_like 'Metasploit::Version GEM_VERSION constant'
|
3
|
+
it_should_behave_like 'Metasploit::Version VERSION constant'
|
4
|
+
end
|
@@ -1,8 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe Mdm::Service do
|
1
|
+
RSpec.describe Mdm::Service, type: :model do
|
4
2
|
context 'associations' do
|
5
|
-
it {
|
6
|
-
it {
|
3
|
+
it { is_expected.to have_many(:credential_origins).class_name('Metasploit::Credential::Origin::Service').dependent(:destroy) }
|
4
|
+
it { is_expected.to have_many(:logins).class_name('Metasploit::Credential::Login').dependent(:destroy) }
|
7
5
|
end
|
8
6
|
end
|
@@ -1,7 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe Mdm::Session do
|
1
|
+
RSpec.describe Mdm::Session, type: :model do
|
4
2
|
context 'associations' do
|
5
|
-
it {
|
3
|
+
it { is_expected.to have_many(:credential_origins).class_name('Metasploit::Credential::Origin::Session').dependent(:destroy) }
|
6
4
|
end
|
7
5
|
end
|
@@ -1,9 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe Mdm::Task do
|
1
|
+
RSpec.describe Mdm::Task, type: :model do
|
4
2
|
context 'associations' do
|
5
|
-
it {
|
6
|
-
it {
|
7
|
-
it {
|
3
|
+
it { is_expected.to have_many(:import_credential_origins).class_name('Metasploit::Credential::Origin::Import').dependent(:destroy) }
|
4
|
+
it { is_expected.to have_and_belong_to_many(:credential_cores).class_name('Metasploit::Credential::Core') }
|
5
|
+
it { is_expected.to have_and_belong_to_many(:credential_logins).class_name('Metasploit::Credential::Login') }
|
8
6
|
end
|
9
7
|
end
|
@@ -1,7 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe Mdm::User do
|
1
|
+
RSpec.describe Mdm::User, type: :model do
|
4
2
|
context 'associations' do
|
5
|
-
it {
|
3
|
+
it { is_expected.to have_many(:credential_origins).class_name('Metasploit::Credential::Origin::Manual').dependent(:destroy) }
|
6
4
|
end
|
7
5
|
end
|
@@ -1,7 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe Mdm::Workspace do
|
1
|
+
RSpec.describe Mdm::Workspace, type: :model do
|
4
2
|
context 'associations' do
|
5
|
-
it {
|
3
|
+
it { is_expected.to have_many(:core_credentials).class_name('Metasploit::Credential::Core').dependent(:destroy) }
|
6
4
|
end
|
7
5
|
end
|
@@ -1,19 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe Metasploit::Credential::BlankUsername do
|
1
|
+
RSpec.describe Metasploit::Credential::BlankUsername, type: :model do
|
4
2
|
it_should_behave_like 'Metasploit::Concern.run'
|
5
3
|
|
6
4
|
context 'database' do
|
7
5
|
context 'columns' do
|
8
6
|
it_should_behave_like 'timestamp database columns'
|
9
7
|
|
10
|
-
it {
|
11
|
-
it {
|
8
|
+
it { is_expected.to have_db_column(:username).of_type(:string).with_options(null: false) }
|
9
|
+
it { is_expected.to have_db_column(:type).of_type(:string).with_options(null: false) }
|
12
10
|
end
|
13
11
|
|
14
12
|
context 'indices' do
|
15
|
-
it {
|
13
|
+
it { is_expected.to have_db_index(:username).unique(true) }
|
16
14
|
end
|
17
15
|
end
|
18
|
-
|
19
16
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
1
|
# Test plan for unique indexes and uniqueness validators
|
4
2
|
#
|
5
3
|
# Index | First Metasploit::Credential::Core | | | | Second Metasploit::Credential::Core | | | | Collision |
|
@@ -54,7 +52,7 @@ require 'spec_helper'
|
|
54
52
|
# complete | non-nil | non-nil | non-nil | non-nil | different | different | different | same | FALSE |
|
55
53
|
# complete | non-nil | non-nil | non-nil | non-nil | different | different | different | different | FALSE |
|
56
54
|
#
|
57
|
-
describe Metasploit::Credential::Core do
|
55
|
+
RSpec.describe Metasploit::Credential::Core, type: :model do
|
58
56
|
include_context 'Mdm::Workspace'
|
59
57
|
|
60
58
|
subject(:core) do
|
@@ -71,27 +69,27 @@ describe Metasploit::Credential::Core do
|
|
71
69
|
it_should_behave_like 'Metasploit::Concern.run'
|
72
70
|
|
73
71
|
context 'associations' do
|
74
|
-
it {
|
75
|
-
it {
|
76
|
-
it {
|
77
|
-
it {
|
78
|
-
it {
|
79
|
-
it {
|
80
|
-
it {
|
72
|
+
it { is_expected.to have_and_belong_to_many(:tasks).class_name('Mdm::Task') }
|
73
|
+
it { is_expected.to have_many(:logins).class_name('Metasploit::Credential::Login').dependent(:destroy) }
|
74
|
+
it { is_expected.to belong_to(:origin) }
|
75
|
+
it { is_expected.to belong_to(:private).class_name('Metasploit::Credential::Private') }
|
76
|
+
it { is_expected.to belong_to(:public).class_name('Metasploit::Credential::Public') }
|
77
|
+
it { is_expected.to belong_to(:realm).class_name('Metasploit::Credential::Realm') }
|
78
|
+
it { is_expected.to belong_to(:workspace).class_name('Mdm::Workspace') }
|
81
79
|
end
|
82
80
|
|
83
81
|
context 'database' do
|
84
82
|
context 'columns' do
|
85
83
|
context 'foreign keys' do
|
86
84
|
context 'polymorphic origin' do
|
87
|
-
it {
|
88
|
-
it {
|
85
|
+
it { is_expected.to have_db_column(:origin_id).of_type(:integer).with_options(null: false) }
|
86
|
+
it { is_expected.to have_db_column(:origin_type).of_type(:string).with_options(null: false) }
|
89
87
|
end
|
90
88
|
|
91
|
-
it {
|
92
|
-
it {
|
93
|
-
it {
|
94
|
-
it {
|
89
|
+
it { is_expected.to have_db_column(:private_id).of_type(:integer).with_options(null: true) }
|
90
|
+
it { is_expected.to have_db_column(:public_id).of_type(:integer).with_options(null: true) }
|
91
|
+
it { is_expected.to have_db_column(:realm_id).of_type(:integer).with_options(null: true) }
|
92
|
+
it { is_expected.to have_db_column(:workspace_id).of_type(:integer).with_options(null: false) }
|
95
93
|
end
|
96
94
|
|
97
95
|
it_should_behave_like 'timestamp database columns'
|
@@ -100,11 +98,11 @@ describe Metasploit::Credential::Core do
|
|
100
98
|
context 'indices' do
|
101
99
|
context 'foreign keys' do
|
102
100
|
|
103
|
-
it {
|
104
|
-
it {
|
105
|
-
it {
|
106
|
-
it {
|
107
|
-
it {
|
101
|
+
it { is_expected.to have_db_index([:origin_type, :origin_id]) }
|
102
|
+
it { is_expected.to have_db_index(:private_id) }
|
103
|
+
it { is_expected.to have_db_index(:public_id) }
|
104
|
+
it { is_expected.to have_db_index(:realm_id) }
|
105
|
+
it { is_expected.to have_db_index(:workspace_id) }
|
108
106
|
|
109
107
|
|
110
108
|
end
|
@@ -295,7 +293,7 @@ describe Metasploit::Credential::Core do
|
|
295
293
|
metasploit_credential_core.origin
|
296
294
|
end
|
297
295
|
|
298
|
-
it {
|
296
|
+
it { is_expected.to be_valid }
|
299
297
|
|
300
298
|
context 'with origin_factory' do
|
301
299
|
subject(:metasploit_credential_core) do
|
@@ -310,7 +308,7 @@ describe Metasploit::Credential::Core do
|
|
310
308
|
:metasploit_credential_origin_import
|
311
309
|
end
|
312
310
|
|
313
|
-
it {
|
311
|
+
it { is_expected.to be_valid }
|
314
312
|
end
|
315
313
|
|
316
314
|
context ':metasploit_credential_origin_manual' do
|
@@ -318,14 +316,14 @@ describe Metasploit::Credential::Core do
|
|
318
316
|
:metasploit_credential_origin_manual
|
319
317
|
end
|
320
318
|
|
321
|
-
it {
|
319
|
+
it { is_expected.to be_valid }
|
322
320
|
|
323
321
|
context '#origin' do
|
324
322
|
subject(:origin) do
|
325
323
|
metasploit_credential_core.origin
|
326
324
|
end
|
327
325
|
|
328
|
-
it {
|
326
|
+
it { is_expected.to be_a Metasploit::Credential::Origin::Manual }
|
329
327
|
end
|
330
328
|
|
331
329
|
context '#workspace' do
|
@@ -342,7 +340,7 @@ describe Metasploit::Credential::Core do
|
|
342
340
|
:metasploit_credential_origin_service
|
343
341
|
end
|
344
342
|
|
345
|
-
it {
|
343
|
+
it { is_expected.to be_valid }
|
346
344
|
|
347
345
|
context '#workspace' do
|
348
346
|
subject(:workspace) do
|
@@ -361,7 +359,7 @@ describe Metasploit::Credential::Core do
|
|
361
359
|
:metasploit_credential_origin_session
|
362
360
|
end
|
363
361
|
|
364
|
-
it {
|
362
|
+
it { is_expected.to be_valid }
|
365
363
|
|
366
364
|
context '#workspace' do
|
367
365
|
subject(:workspace) do
|
@@ -382,7 +380,7 @@ describe Metasploit::Credential::Core do
|
|
382
380
|
FactoryGirl.build(:metasploit_credential_core_import)
|
383
381
|
end
|
384
382
|
|
385
|
-
it {
|
383
|
+
it { is_expected.to be_valid }
|
386
384
|
end
|
387
385
|
|
388
386
|
context 'metasploit_credential_core_manual' do
|
@@ -390,7 +388,7 @@ describe Metasploit::Credential::Core do
|
|
390
388
|
FactoryGirl.build(:metasploit_credential_core_manual)
|
391
389
|
end
|
392
390
|
|
393
|
-
it {
|
391
|
+
it { is_expected.to be_valid }
|
394
392
|
|
395
393
|
context '#workspace' do
|
396
394
|
subject(:workspace) do
|
@@ -406,7 +404,7 @@ describe Metasploit::Credential::Core do
|
|
406
404
|
FactoryGirl.build(:metasploit_credential_core_service)
|
407
405
|
end
|
408
406
|
|
409
|
-
it {
|
407
|
+
it { is_expected.to be_valid }
|
410
408
|
|
411
409
|
context '#workspace' do
|
412
410
|
subject(:workspace) do
|
@@ -429,7 +427,7 @@ describe Metasploit::Credential::Core do
|
|
429
427
|
FactoryGirl.build(:metasploit_credential_core_session)
|
430
428
|
end
|
431
429
|
|
432
|
-
it {
|
430
|
+
it { is_expected.to be_valid }
|
433
431
|
|
434
432
|
context '#workspace' do
|
435
433
|
subject(:workspace) do
|
@@ -449,7 +447,7 @@ describe Metasploit::Credential::Core do
|
|
449
447
|
end
|
450
448
|
|
451
449
|
context 'validations' do
|
452
|
-
it {
|
450
|
+
it { is_expected.to validate_presence_of :origin }
|
453
451
|
|
454
452
|
|
455
453
|
context '#consistent_workspaces' do
|
@@ -538,7 +536,7 @@ describe Metasploit::Credential::Core do
|
|
538
536
|
end
|
539
537
|
|
540
538
|
context 'without #workspace in Mdm::User#workspaces' do
|
541
|
-
it {
|
539
|
+
it { is_expected.to include error }
|
542
540
|
end
|
543
541
|
end
|
544
542
|
end
|
@@ -548,7 +546,7 @@ describe Metasploit::Credential::Core do
|
|
548
546
|
nil
|
549
547
|
end
|
550
548
|
|
551
|
-
it {
|
549
|
+
it { is_expected.to include error }
|
552
550
|
end
|
553
551
|
end
|
554
552
|
|
@@ -593,7 +591,7 @@ describe Metasploit::Credential::Core do
|
|
593
591
|
FactoryGirl.create(:mdm_workspace)
|
594
592
|
end
|
595
593
|
|
596
|
-
it {
|
594
|
+
it { is_expected.to include error }
|
597
595
|
end
|
598
596
|
end
|
599
597
|
|
@@ -602,7 +600,7 @@ describe Metasploit::Credential::Core do
|
|
602
600
|
nil
|
603
601
|
end
|
604
602
|
|
605
|
-
it {
|
603
|
+
it { is_expected.to include error }
|
606
604
|
end
|
607
605
|
end
|
608
606
|
|
@@ -611,7 +609,7 @@ describe Metasploit::Credential::Core do
|
|
611
609
|
nil
|
612
610
|
end
|
613
611
|
|
614
|
-
it {
|
612
|
+
it { is_expected.to include error }
|
615
613
|
end
|
616
614
|
end
|
617
615
|
|
@@ -657,7 +655,7 @@ describe Metasploit::Credential::Core do
|
|
657
655
|
FactoryGirl.create(:mdm_workspace)
|
658
656
|
end
|
659
657
|
|
660
|
-
it {
|
658
|
+
it { is_expected.to include error }
|
661
659
|
end
|
662
660
|
end
|
663
661
|
|
@@ -666,7 +664,7 @@ describe Metasploit::Credential::Core do
|
|
666
664
|
nil
|
667
665
|
end
|
668
666
|
|
669
|
-
it {
|
667
|
+
it { is_expected.to include error }
|
670
668
|
end
|
671
669
|
end
|
672
670
|
|
@@ -675,7 +673,7 @@ describe Metasploit::Credential::Core do
|
|
675
673
|
nil
|
676
674
|
end
|
677
675
|
|
678
|
-
it {
|
676
|
+
it { is_expected.to include error }
|
679
677
|
end
|
680
678
|
end
|
681
679
|
|
@@ -684,7 +682,7 @@ describe Metasploit::Credential::Core do
|
|
684
682
|
nil
|
685
683
|
end
|
686
684
|
|
687
|
-
it {
|
685
|
+
it { is_expected.to include error }
|
688
686
|
end
|
689
687
|
end
|
690
688
|
end
|
@@ -839,7 +837,7 @@ describe Metasploit::Credential::Core do
|
|
839
837
|
I18n.translate!('activerecord.errors.models.metasploit/credential/core.attributes.base.public_for_ssh_key')
|
840
838
|
end
|
841
839
|
|
842
|
-
|
840
|
+
subject(:core) do
|
843
841
|
FactoryGirl.build(
|
844
842
|
:metasploit_credential_core,
|
845
843
|
private: FactoryGirl.build(:metasploit_credential_ssh_key),
|
@@ -847,7 +845,7 @@ describe Metasploit::Credential::Core do
|
|
847
845
|
)
|
848
846
|
end
|
849
847
|
|
850
|
-
it {
|
848
|
+
it { is_expected.to be_valid }
|
851
849
|
|
852
850
|
context "when the Public is missing" do
|
853
851
|
before(:each) do
|
@@ -855,12 +853,12 @@ describe Metasploit::Credential::Core do
|
|
855
853
|
end
|
856
854
|
|
857
855
|
it 'should not be valid if Private is an SSHKey and Public is missing' do
|
858
|
-
core.
|
856
|
+
expect(core).not_to be_valid
|
859
857
|
end
|
860
858
|
|
861
859
|
it 'should show the proper error' do
|
862
860
|
core.valid?
|
863
|
-
core.errors[:base].
|
861
|
+
expect(core.errors[:base]).to include(error)
|
864
862
|
end
|
865
863
|
end
|
866
864
|
|
@@ -1,18 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe Metasploit::Model::Login::Status do
|
1
|
+
RSpec.describe Metasploit::Model::Login::Status, type: :model do
|
4
2
|
context 'CONSTANTS' do
|
5
3
|
context 'ALL' do
|
6
4
|
subject(:all) do
|
7
5
|
described_class::ALL
|
8
6
|
end
|
9
7
|
|
10
|
-
it {
|
11
|
-
it {
|
12
|
-
it {
|
13
|
-
it {
|
14
|
-
it {
|
15
|
-
it {
|
8
|
+
it { is_expected.to include described_class::DENIED_ACCESS }
|
9
|
+
it { is_expected.to include described_class::DISABLED }
|
10
|
+
it { is_expected.to include described_class::LOCKED_OUT }
|
11
|
+
it { is_expected.to include described_class::SUCCESSFUL }
|
12
|
+
it { is_expected.to include described_class::UNABLE_TO_CONNECT }
|
13
|
+
it { is_expected.to include described_class::UNTRIED }
|
16
14
|
end
|
17
15
|
|
18
16
|
context 'DENIED_ACCESS' do
|
@@ -20,8 +18,8 @@ describe Metasploit::Model::Login::Status do
|
|
20
18
|
described_class::DENIED_ACCESS
|
21
19
|
end
|
22
20
|
|
23
|
-
it {
|
24
|
-
it {
|
21
|
+
it { is_expected.to eq 'Denied Access' }
|
22
|
+
it { is_expected.to be_in described_class::ALL }
|
25
23
|
end
|
26
24
|
|
27
25
|
context 'DISABLED' do
|
@@ -29,8 +27,8 @@ describe Metasploit::Model::Login::Status do
|
|
29
27
|
described_class::DISABLED
|
30
28
|
end
|
31
29
|
|
32
|
-
it {
|
33
|
-
it {
|
30
|
+
it { is_expected.to eq 'Disabled' }
|
31
|
+
it { is_expected.to be_in described_class::ALL }
|
34
32
|
end
|
35
33
|
|
36
34
|
context 'LOCKED_OUT' do
|
@@ -38,8 +36,8 @@ describe Metasploit::Model::Login::Status do
|
|
38
36
|
described_class::LOCKED_OUT
|
39
37
|
end
|
40
38
|
|
41
|
-
it {
|
42
|
-
it {
|
39
|
+
it { is_expected.to eq 'Locked Out' }
|
40
|
+
it { is_expected.to be_in described_class::ALL }
|
43
41
|
end
|
44
42
|
|
45
43
|
context 'SUCCESSFUL' do
|
@@ -47,8 +45,8 @@ describe Metasploit::Model::Login::Status do
|
|
47
45
|
described_class::SUCCESSFUL
|
48
46
|
end
|
49
47
|
|
50
|
-
it {
|
51
|
-
it {
|
48
|
+
it { is_expected.to eq 'Successful' }
|
49
|
+
it { is_expected.to be_in described_class::ALL }
|
52
50
|
end
|
53
51
|
|
54
52
|
context 'UNABLE_TO_CONNECT' do
|
@@ -56,8 +54,8 @@ describe Metasploit::Model::Login::Status do
|
|
56
54
|
described_class::UNABLE_TO_CONNECT
|
57
55
|
end
|
58
56
|
|
59
|
-
it {
|
60
|
-
it {
|
57
|
+
it { is_expected.to eq 'Unable to Connect' }
|
58
|
+
it { is_expected.to be_in described_class::ALL }
|
61
59
|
end
|
62
60
|
|
63
61
|
context 'UNTRIED' do
|
@@ -65,8 +63,8 @@ describe Metasploit::Model::Login::Status do
|
|
65
63
|
described_class::UNTRIED
|
66
64
|
end
|
67
65
|
|
68
|
-
it {
|
69
|
-
it {
|
66
|
+
it { is_expected.to eq 'Untried' }
|
67
|
+
it { is_expected.to be_in described_class::ALL }
|
70
68
|
end
|
71
69
|
end
|
72
70
|
end
|