validators 2.5.3 → 2.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +8 -4
  4. data/Rakefile +9 -4
  5. data/data/disposable.json +1412 -23
  6. data/data/tld.json +391 -5
  7. data/lib/validators/version.rb +1 -1
  8. data/{spec → test}/schema.rb +0 -0
  9. data/{spec → test}/support/dates.rb +0 -0
  10. data/{spec → test}/support/emails.rb +0 -0
  11. data/{spec → test}/support/hostnames.rb +0 -0
  12. data/{spec → test}/support/ips.rb +0 -0
  13. data/{spec → test}/support/models.rb +0 -0
  14. data/{spec → test}/support/translations.yml +0 -0
  15. data/{spec → test}/support/urls.rb +0 -0
  16. data/test/test_helper.rb +41 -0
  17. data/test/validators/disposable_email_test.rb +23 -0
  18. data/test/validators/ip_test.rb +21 -0
  19. data/{spec/validators/validates_cnpj_format_of_spec.rb → test/validators/validates_cnpj_format_of_test.rb} +10 -10
  20. data/{spec/validators/validates_cpf_format_of_spec.rb → test/validators/validates_cpf_format_of_test.rb} +10 -10
  21. data/test/validators/validates_datetime/after_option_test.rb +75 -0
  22. data/test/validators/validates_datetime/before_option_test.rb +20 -0
  23. data/test/validators/validates_datetime/defaults_test.rb +37 -0
  24. data/test/validators/validates_email_format_of_test.rb +76 -0
  25. data/test/validators/validates_hostname_format_of/with_tld_validation_test.rb +25 -0
  26. data/test/validators/validates_hostname_format_of/without_tld_validation_test.rb +27 -0
  27. data/test/validators/validates_ip_address/ipv4_test.rb +20 -0
  28. data/test/validators/validates_ip_address/ipv6_test.rb +20 -0
  29. data/test/validators/validates_ip_address_test.rb +33 -0
  30. data/test/validators/validates_ownership_of_test.rb +65 -0
  31. data/test/validators/validates_ssh_private_key/bits_test.rb +44 -0
  32. data/test/validators/validates_ssh_private_key/common_test.rb +37 -0
  33. data/test/validators/validates_ssh_private_key/dsa_test.rb +36 -0
  34. data/test/validators/validates_ssh_private_key/rsa_test.rb +36 -0
  35. data/test/validators/validates_ssh_public_key_test.rb +37 -0
  36. data/test/validators/validates_url_format_of/with_tld_validation_test.rb +15 -0
  37. data/test/validators/validates_url_format_of/without_tld_validation_test.rb +48 -0
  38. data/validators.gemspec +2 -2
  39. metadata +65 -49
  40. data/.rspec +0 -1
  41. data/spec/spec_helper.rb +0 -38
  42. data/spec/validators/disposable_email_spec.rb +0 -31
  43. data/spec/validators/ip_spec.rb +0 -25
  44. data/spec/validators/validates_datetime_spec.rb +0 -125
  45. data/spec/validators/validates_email_format_of_spec.rb +0 -70
  46. data/spec/validators/validates_hostname_format_of_spec.rb +0 -53
  47. data/spec/validators/validates_ip_address_spec.rb +0 -59
  48. data/spec/validators/validates_ownership_of_spec.rb +0 -69
  49. data/spec/validators/validates_ssh_private_key_spec.rb +0 -152
  50. data/spec/validators/validates_ssh_public_key_spec.rb +0 -39
  51. data/spec/validators/validates_url_format_of_spec.rb +0 -65
@@ -2,7 +2,7 @@ module Validators
2
2
  module Version
3
3
  MAJOR = 2
4
4
  MINOR = 5
5
- PATCH = 3
5
+ PATCH = 4
6
6
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
7
  end
8
8
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,41 @@
1
+ require "simplecov"
2
+ SimpleCov.start
3
+
4
+ require "bundler/setup"
5
+ require "active_record"
6
+ require "validators"
7
+ require "active_support/all"
8
+
9
+ require "minitest/utils"
10
+ require "minitest/autorun"
11
+
12
+ Time.zone = "America/Sao_Paulo"
13
+ TLDs = Validators::TLD.all.sample(50)
14
+ DISPOSABLE_EMAILS = Validators::DisposableHostnames.all.sample(50)
15
+
16
+ Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f }
17
+
18
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
19
+ load "schema.rb"
20
+
21
+ I18n.enforce_available_locales = false
22
+ I18n.load_path << File.dirname(__FILE__) + "/support/translations.yml"
23
+
24
+ module Minitest
25
+ class Test
26
+ setup do
27
+ I18n.locale = :en
28
+ Time.zone = "America/Sao_Paulo"
29
+
30
+ ActiveRecord::Base.descendants.each do |model|
31
+ next if %w[ActiveRecord::InternalMetadata ActiveRecord::SchemaMigration].include?(model.name)
32
+
33
+ model.delete_all
34
+
35
+ Object.class_eval { remove_const model.name if const_defined?(model.name) }
36
+ end
37
+
38
+ load File.dirname(__FILE__) + "/support/models.rb"
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,23 @@
1
+ require "test_helper"
2
+
3
+ class DisposableEmailTest < Minitest::Test
4
+ DISPOSABLE_EMAILS.each do |domain|
5
+ test "rejects disposable e-mail (#{domain})" do
6
+ User.validates_email_format_of :email
7
+
8
+ user = User.new(email: "user@#{domain}")
9
+ user.valid?
10
+
11
+ assert_includes user.errors[:email], I18n.t("activerecord.errors.messages.disposable_email")
12
+ end
13
+ end
14
+
15
+ test "accepts disposable e-mail" do
16
+ User.validates_email_format_of :email, disposable: true
17
+
18
+ user = User.new(email: "user@mailinator.com")
19
+ user.valid?
20
+
21
+ assert user.errors[:email].empty?
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ require "test_helper"
2
+
3
+ class IpTest < Minitest::Test
4
+ VALID_IPV4.each do |ip|
5
+ test "accepts #{ip.inspect} as ip address (v4)" do
6
+ assert Validators::Ip.v4?(ip)
7
+ end
8
+ end
9
+
10
+ VALID_IPV6.each do |ip|
11
+ test "accepts #{ip.inspect} as ip address (v6)" do
12
+ assert Validators::Ip.v6?(ip)
13
+ end
14
+ end
15
+
16
+ (VALID_IPV4 + VALID_IPV6).each do |ip|
17
+ test "accepts #{ip.inspect} as ip address" do
18
+ assert Validators::Ip.valid?(ip)
19
+ end
20
+ end
21
+ end
@@ -1,6 +1,6 @@
1
- require "spec_helper"
1
+ require "test_helper"
2
2
 
3
- describe ".validates_cnpj_format_of" do
3
+ class ValidatesCnpjFormatOfTest < Minitest::Test
4
4
  let(:model) { Class.new {
5
5
  def self.name
6
6
  "User"
@@ -11,33 +11,33 @@ describe ".validates_cnpj_format_of" do
11
11
  attr_accessor :document
12
12
  } }
13
13
 
14
- it "requires valid CNPJ" do
14
+ test "requires valid CNPJ" do
15
15
  record = model.new(document: "invalid")
16
16
  record.valid?
17
17
 
18
- expect(record.errors[:document]).not_to be_empty
18
+ refute record.errors[:document].empty?
19
19
  end
20
20
 
21
- it "accepts formatted CNPJ" do
21
+ test "accepts formatted CNPJ" do
22
22
  record = model.new(document: CNPJ.generate(true))
23
23
  record.valid?
24
24
 
25
- expect(record.errors[:document]).to be_empty
25
+ assert record.errors[:document].empty?
26
26
  end
27
27
 
28
- it "accepts stripped CNPJ" do
28
+ test "accepts stripped CNPJ" do
29
29
  record = model.new(document: CNPJ.generate)
30
30
  record.valid?
31
31
 
32
- expect(record.errors[:document]).to be_empty
32
+ assert record.errors[:document].empty?
33
33
  end
34
34
 
35
- it "sets translated error message" do
35
+ test "sets translated error message" do
36
36
  I18n.locale = "pt-BR"
37
37
 
38
38
  record = model.new
39
39
  record.valid?
40
40
 
41
- expect(record.errors[:document]).to include("não é um CNPJ válido")
41
+ assert_includes record.errors[:document], "não é um CNPJ válido"
42
42
  end
43
43
  end
@@ -1,6 +1,6 @@
1
- require "spec_helper"
1
+ require "test_helper"
2
2
 
3
- describe ".validates_cpf_format_of" do
3
+ class ValidatesCpfFormatOfTest < Minitest::Test
4
4
  let(:model) { Class.new {
5
5
  def self.name
6
6
  "User"
@@ -11,33 +11,33 @@ describe ".validates_cpf_format_of" do
11
11
  attr_accessor :document
12
12
  } }
13
13
 
14
- it "requires valid CPF" do
14
+ test "requires valid CPF" do
15
15
  record = model.new(document: "invalid")
16
16
  record.valid?
17
17
 
18
- expect(record.errors[:document]).not_to be_empty
18
+ refute record.errors[:document].empty?
19
19
  end
20
20
 
21
- it "accepts formatted CPF" do
21
+ test "accepts formatted CPF" do
22
22
  record = model.new(document: CPF.generate(true))
23
23
  record.valid?
24
24
 
25
- expect(record.errors[:document]).to be_empty
25
+ assert record.errors[:document].empty?
26
26
  end
27
27
 
28
- it "accepts stripped CPF" do
28
+ test "accepts stripped CPF" do
29
29
  record = model.new(document: CPF.generate)
30
30
  record.valid?
31
31
 
32
- expect(record.errors[:document]).to be_empty
32
+ assert record.errors[:document].empty?
33
33
  end
34
34
 
35
- it "sets translated error message" do
35
+ test "sets translated error message" do
36
36
  I18n.locale = "pt-BR"
37
37
 
38
38
  record = model.new
39
39
  record.valid?
40
40
 
41
- expect(record.errors[:document]).to include("não é um CPF válido")
41
+ assert_includes record.errors[:document], "não é um CPF válido"
42
42
  end
43
43
  end
@@ -0,0 +1,75 @@
1
+ require "test_helper"
2
+
3
+ class ValidatesDatetimeAfterOptionTest < Minitest::Test
4
+ let(:user) { User.new }
5
+
6
+ test "rejects when date is set to before :after option" do
7
+ future_date = 1.week.from_now
8
+ User.validates_datetime :registered_at, :after => future_date
9
+ user.registered_at = Time.now
10
+
11
+ refute user.valid?
12
+ assert_includes user.errors[:registered_at], "needs to be after #{I18n.l(future_date)}"
13
+ end
14
+
15
+ test "accepts when date is set accordingly to the :after option" do
16
+ User.validates_datetime :registered_at, :after => 1.week.from_now
17
+ user.registered_at = 2.weeks.from_now
18
+
19
+ assert user.valid?
20
+ end
21
+
22
+ test "validates using today as date" do
23
+ User.validates_datetime :registered_at, :after => :today
24
+
25
+ user.registered_at = Time.now
26
+ refute user.valid?
27
+
28
+ user.registered_at = Date.today
29
+ refute user.valid?
30
+
31
+ user.registered_at = Date.tomorrow
32
+ assert user.valid?
33
+
34
+ user.registered_at = 1.day.from_now
35
+ assert user.valid?
36
+ end
37
+
38
+ test "validates using now as date" do
39
+ User.validates_datetime :registered_at, :after => :now
40
+
41
+ user.registered_at = Time.now
42
+ refute user.valid?
43
+
44
+ user.registered_at = Date.today
45
+ refute user.valid?
46
+
47
+ user.registered_at = Date.tomorrow
48
+ assert user.valid?
49
+
50
+ user.registered_at = 1.day.from_now
51
+ assert user.valid?
52
+ end
53
+
54
+ test "validates using method as date" do
55
+ User.validates_datetime :starts_at
56
+ User.validates_datetime :ends_at, :after => :starts_at, :if => :starts_at?
57
+
58
+ user.starts_at = nil
59
+ user.ends_at = Time.now
60
+
61
+ refute user.valid?
62
+ assert user.errors[:ends_at].empty?
63
+
64
+ user.starts_at = Time.parse("Apr 26 2010")
65
+ user.ends_at = Time.parse("Apr 25 2010")
66
+
67
+ refute user.valid?
68
+ assert_includes user.errors[:ends_at], "needs to be after #{I18n.l(Time.parse("Apr 26 2010"))}"
69
+
70
+ user.starts_at = Time.now
71
+ user.ends_at = 1.hour.from_now
72
+
73
+ assert user.valid?
74
+ end
75
+ end
@@ -0,0 +1,20 @@
1
+ require "test_helper"
2
+
3
+ class ValidatesDatetimeBeforeOptionTest < Minitest::Test
4
+ let(:user) { User.new }
5
+
6
+ test "rejects when date is set to after :before option" do
7
+ User.validates_datetime :registered_at, :before => 1.week.ago
8
+ user.registered_at = Time.now
9
+
10
+ refute user.valid?
11
+ assert_includes user.errors[:registered_at], "needs to be before #{I18n.l(1.week.ago)}"
12
+ end
13
+
14
+ test "accepts when date is set accordingly to the :before option" do
15
+ User.validates_datetime :registered_at, :before => 1.week.ago
16
+ user.registered_at = 2.weeks.ago
17
+
18
+ assert user.valid?
19
+ end
20
+ end
@@ -0,0 +1,37 @@
1
+ require "test_helper"
2
+
3
+ class ValidatesDatetimeDefaultsTest < Minitest::Test
4
+ let(:user) { User.new }
5
+
6
+ setup do
7
+ User.validates_datetime :registered_at
8
+ User.validates :birthday, :datetime => true
9
+ end
10
+
11
+ VALID_DATES.each do |date|
12
+ test "accepts #{date.inspect} as valid date" do
13
+ user.registered_at = date
14
+ user.birthday = date
15
+
16
+ assert user.valid?
17
+ end
18
+ end
19
+
20
+ INVALID_DATES.each do |date|
21
+ test "rejects #{date.inspect} as valid date" do
22
+ user.registered_at = date
23
+ user.birthday = date
24
+
25
+ refute user.valid?
26
+ refute user.errors[:registered_at].empty?
27
+ refute user.errors[:birthday].empty?
28
+ end
29
+ end
30
+
31
+ test "includes default error message" do
32
+ user.registered_at = nil
33
+
34
+ refute user.valid?
35
+ assert_includes user.errors[:registered_at], "is not a valid date"
36
+ end
37
+ end
@@ -0,0 +1,76 @@
1
+ require "test_helper"
2
+
3
+ class ValidatesEmailFormatOfTest < Minitest::Test
4
+ setup do
5
+ User.validates_email_format_of :email, :corporate_email, :allow_blank => false
6
+ Buyer.validates_email_format_of :email, :message => "is not a valid e-mail"
7
+ Person.validates :email, :email => true
8
+ end
9
+
10
+ VALID_EMAILS.each do |email|
11
+ test "accepts #{email.inspect} as a valid email" do
12
+ user = User.new(:email => email, :corporate_email => email)
13
+ assert user.valid?
14
+
15
+ user = Person.new(:email => email)
16
+ assert user.valid?
17
+ end
18
+ end
19
+
20
+ INVALID_EMAILS.each do |email|
21
+ test "rejects #{email.inspect} as a valid email" do
22
+ user = User.new(:email => "invalid", :corporate_email => "invalid")
23
+ refute user.valid?
24
+
25
+ user = Person.new(:email => "invalid")
26
+ refute user.valid?
27
+ end
28
+ end
29
+
30
+ test "uses default error message" do
31
+ user = User.new(:email => "invalid")
32
+
33
+ refute user.valid?
34
+ assert_includes user.errors[:email], "is not a valid address"
35
+ end
36
+
37
+ test "rejects nil value" do
38
+ user = User.new(:email => nil)
39
+
40
+ refute user.valid?
41
+ refute user.errors[:email].empty?
42
+ end
43
+
44
+ test "rejects empty value" do
45
+ user = User.new(:email => "")
46
+
47
+ refute user.valid?
48
+ refute user.errors[:email].empty?
49
+ end
50
+
51
+ test "validates multiple attributes" do
52
+ user = User.new(:corporate_email => "invalid")
53
+
54
+ refute user.valid?
55
+ assert_includes user.errors[:corporate_email], "is not a valid address"
56
+ end
57
+
58
+ test "uses custom error message as :message options" do
59
+ buyer = Buyer.new(:email => "invalid")
60
+
61
+ refute buyer.valid?
62
+ assert_includes buyer.errors[:email], "is not a valid e-mail"
63
+ end
64
+
65
+ test "uses I18n string as error message [pt-BR]" do
66
+ I18n.locale = :'pt-BR'
67
+ user = User.new(:email => "invalid")
68
+
69
+ refute user.valid?
70
+ assert_includes user.errors[:email], "não parece ser um e-mail válido"
71
+ end
72
+
73
+ test "defines alias method" do
74
+ assert User.respond_to?(:validates_email)
75
+ end
76
+ end
@@ -0,0 +1,25 @@
1
+ require "test_helper"
2
+
3
+ class WithTldValidationTest < Minitest::Test
4
+ test "rejects invalid TLD" do
5
+ server = ServerWithTLD.new("example.xy")
6
+ refute server.valid?
7
+ end
8
+
9
+ test "rejects only host label" do
10
+ server = ServerWithTLD.new("com")
11
+ refute server.valid?
12
+ end
13
+
14
+ TLDs.each do |tld|
15
+ test "accepts #{tld} as TLD" do
16
+ server = ServerWithTLD.new("example.#{tld}")
17
+ assert server.valid?
18
+ end
19
+ end
20
+
21
+ test "accepts example.com.br" do
22
+ server = ServerWithTLD.new("example.com.br")
23
+ assert server.valid?
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ require "test_helper"
2
+
3
+ class WithoutTldValidationTest < Minitest::Test
4
+ VALID_HOSTNAMES.each do |host|
5
+ test "accepts #{host}" do
6
+ server = ServerWithoutTLD.new(host)
7
+ assert server.valid?
8
+ end
9
+ end
10
+
11
+ INVALID_HOSTNAMES.each do |host|
12
+ test "rejects #{host}" do
13
+ server = ServerWithoutTLD.new(host)
14
+ refute server.valid?
15
+ end
16
+ end
17
+
18
+ test "rejects nil hostname" do
19
+ server = ServerWithoutTLD.new(nil)
20
+ refute server.valid?
21
+ end
22
+
23
+ test "rejects blank hostname" do
24
+ server = ServerWithoutTLD.new("")
25
+ refute server.valid?
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ require "test_helper"
2
+
3
+ class Ipv4Test < Minitest::Test
4
+ let(:user) { User.new }
5
+
6
+ test "is valid" do
7
+ User.validates_ip_address :url, :only => :v4
8
+ user.url = "192.168.1.2"
9
+
10
+ assert user.valid?
11
+ end
12
+
13
+ test "is invalid" do
14
+ User.validates_ip_address :url, :only => :v4
15
+ user.url = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329"
16
+
17
+ refute user.valid?
18
+ assert_includes user.errors[:url], "is not a valid IPv4 address"
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require "test_helper"
2
+
3
+ class Ipv6Test < Minitest::Test
4
+ let(:user) { User.new }
5
+
6
+ test "is valid" do
7
+ User.validates_ip_address :url, :only => :v6
8
+ user.url = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329"
9
+
10
+ assert user.valid?
11
+ end
12
+
13
+ test "is invalid" do
14
+ User.validates_ip_address :url, :only => :v6
15
+ user.url = "192.168.1.2"
16
+
17
+ refute user.valid?
18
+ assert_includes user.errors[:url], "is not a valid IPv6 address"
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ require "test_helper"
2
+
3
+ class ValidatesIpAddressTest < Minitest::Test
4
+ let(:user) { User.new }
5
+
6
+ test "is valid with IPv4" do
7
+ User.validates_ip_address :url
8
+ user.url = "192.168.1.2"
9
+
10
+ assert user.valid?
11
+ end
12
+
13
+ test "is valid with IPv6" do
14
+ User.validates_ip_address :url
15
+ user.url = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329"
16
+
17
+ assert user.valid?
18
+ end
19
+
20
+ test "allows blank values" do
21
+ User.validates_ip_address :url, :allow_blank => true
22
+ user.url = ""
23
+
24
+ assert user.valid?
25
+ end
26
+
27
+ test "allows nil values" do
28
+ User.validates_ip_address :url, :allow_nil => true
29
+ user.url = nil
30
+
31
+ assert user.valid?
32
+ end
33
+ end
@@ -0,0 +1,65 @@
1
+ require "test_helper"
2
+
3
+ class ValidatesOwnershipOfTest < Minitest::Test
4
+ let(:user) { User.create! }
5
+ let(:another_user) { User.create! }
6
+ let(:category) { Category.create!(:user => user) }
7
+ let(:another_category) { Category.create!(:user => another_user) }
8
+ let(:task) { Task.new(:user => user, :category => category) }
9
+
10
+ setup do
11
+ user
12
+ another_user
13
+ category
14
+ another_category
15
+ task
16
+
17
+ Task.validates_ownership_of :category, :with => :user
18
+ end
19
+
20
+ test "is valid when record is owned by the correct user" do
21
+ assert task.valid?
22
+ end
23
+
24
+ test "is invalid when record is owned by a different user" do
25
+ task.category = another_category
26
+ refute task.valid?
27
+ end
28
+
29
+ test "raises error without :with option" do
30
+ assert_raises(ArgumentError) { Task.validates_ownership_of :category }
31
+ end
32
+
33
+ test "raises error when :with options is not a valid type" do
34
+ assert_raises(ArgumentError) { Task.validates_ownership_of :category, :with => user }
35
+ end
36
+
37
+ test "is invalid when owner is not present" do
38
+ task.user = nil
39
+ refute task.valid?
40
+ end
41
+
42
+ test "is invalid when attribute owner is not present" do
43
+ task.category.user = nil
44
+ refute task.valid?
45
+ end
46
+
47
+ test "is valid when both owners are nil" do
48
+ task.category.user = nil
49
+ task.user = nil
50
+
51
+ assert task.valid?
52
+ end
53
+
54
+ test "is valid when attribute is nil" do
55
+ task.category = nil
56
+ assert task.valid?
57
+ end
58
+
59
+ test "sets error message" do
60
+ task.user = nil
61
+
62
+ refute task.valid?
63
+ assert_includes task.errors[:category], "is not associated with your user"
64
+ end
65
+ end
@@ -0,0 +1,44 @@
1
+ require "test_helper"
2
+
3
+ class BitsTest < Minitest::Test
4
+ let(:model) { Class.new {
5
+ def self.name
6
+ "User"
7
+ end
8
+
9
+ include ActiveModel::Model
10
+ validates_ssh_private_key :key, bits: 2048
11
+ attr_accessor :key
12
+ } }
13
+
14
+ test "accepts bits equals to required" do
15
+ record = model.new(key: SSHKey.generate(bits: 2048).private_key)
16
+ record.valid?
17
+
18
+ assert record.errors[:key].empty?
19
+ end
20
+
21
+ test "accepts bits greater than required" do
22
+ record = model.new(key: SSHKey.generate(bits: 4096).private_key)
23
+ record.valid?
24
+
25
+ assert record.errors[:key].empty?
26
+ end
27
+
28
+ test "rejects invalid bits" do
29
+ record = model.new(key: SSHKey.generate(bits: 1024).private_key)
30
+ record.valid?
31
+
32
+ refute record.errors[:key].empty?
33
+ end
34
+
35
+ test "sets translated error message" do
36
+ I18n.locale = "pt-BR"
37
+ message = "precisa ter pelo menos 2048 bits; a sua chave tem 1024 bits"
38
+
39
+ record = model.new(key: SSHKey.generate(bits: 1024).private_key)
40
+ record.valid?
41
+
42
+ assert_includes record.errors[:key], message
43
+ end
44
+ end