friendly_id 5.4.2 → 5.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/dependabot.yml +6 -0
  4. data/.github/workflows/test.yml +34 -25
  5. data/Changelog.md +6 -0
  6. data/Gemfile +9 -13
  7. data/README.md +21 -0
  8. data/Rakefile +24 -27
  9. data/bench.rb +30 -27
  10. data/certs/parndt.pem +25 -23
  11. data/friendly_id.gemspec +26 -29
  12. data/gemfiles/Gemfile.rails-5.2.rb +11 -16
  13. data/gemfiles/Gemfile.rails-6.0.rb +11 -16
  14. data/gemfiles/Gemfile.rails-6.1.rb +22 -0
  15. data/gemfiles/Gemfile.rails-7.0.rb +22 -0
  16. data/guide.rb +5 -5
  17. data/lib/friendly_id/base.rb +57 -60
  18. data/lib/friendly_id/candidates.rb +9 -11
  19. data/lib/friendly_id/configuration.rb +6 -7
  20. data/lib/friendly_id/finder_methods.rb +26 -11
  21. data/lib/friendly_id/finders.rb +63 -66
  22. data/lib/friendly_id/history.rb +59 -63
  23. data/lib/friendly_id/initializer.rb +4 -4
  24. data/lib/friendly_id/migration.rb +6 -6
  25. data/lib/friendly_id/object_utils.rb +2 -2
  26. data/lib/friendly_id/reserved.rb +28 -32
  27. data/lib/friendly_id/scoped.rb +97 -102
  28. data/lib/friendly_id/sequentially_slugged/calculator.rb +69 -0
  29. data/lib/friendly_id/sequentially_slugged.rb +17 -64
  30. data/lib/friendly_id/simple_i18n.rb +75 -69
  31. data/lib/friendly_id/slug.rb +1 -2
  32. data/lib/friendly_id/slug_generator.rb +1 -3
  33. data/lib/friendly_id/slugged.rb +234 -238
  34. data/lib/friendly_id/version.rb +1 -1
  35. data/lib/friendly_id.rb +41 -45
  36. data/lib/generators/friendly_id_generator.rb +9 -9
  37. data/test/base_test.rb +10 -13
  38. data/test/benchmarks/finders.rb +28 -26
  39. data/test/benchmarks/object_utils.rb +13 -13
  40. data/test/candidates_test.rb +17 -18
  41. data/test/configuration_test.rb +7 -11
  42. data/test/core_test.rb +1 -2
  43. data/test/databases.yml +4 -3
  44. data/test/finders_test.rb +52 -5
  45. data/test/generator_test.rb +16 -26
  46. data/test/helper.rb +29 -22
  47. data/test/history_test.rb +70 -74
  48. data/test/numeric_slug_test.rb +4 -4
  49. data/test/object_utils_test.rb +0 -2
  50. data/test/reserved_test.rb +9 -11
  51. data/test/schema.rb +5 -4
  52. data/test/scoped_test.rb +18 -20
  53. data/test/sequentially_slugged_test.rb +65 -50
  54. data/test/shared.rb +15 -16
  55. data/test/simple_i18n_test.rb +22 -12
  56. data/test/slugged_test.rb +102 -121
  57. data/test/sti_test.rb +19 -21
  58. data.tar.gz.sig +0 -0
  59. metadata +35 -30
  60. metadata.gz.sig +1 -1
@@ -1,4 +1,4 @@
1
- require 'rails/generators'
1
+ require "rails/generators"
2
2
  require "rails/generators/active_record"
3
3
 
4
4
  # This generator adds a migration for the {FriendlyId::History
@@ -6,21 +6,21 @@ require "rails/generators/active_record"
6
6
  class FriendlyIdGenerator < ActiveRecord::Generators::Base
7
7
  # ActiveRecord::Generators::Base inherits from Rails::Generators::NamedBase which requires a NAME parameter for the
8
8
  # new table name. Our generator always uses 'friendly_id_slugs', so we just set a random name here.
9
- argument :name, type: :string, default: 'random_name'
9
+ argument :name, type: :string, default: "random_name"
10
10
 
11
- class_option :'skip-migration', :type => :boolean, :desc => "Don't generate a migration for the slugs table"
12
- class_option :'skip-initializer', :type => :boolean, :desc => "Don't generate an initializer"
11
+ class_option :'skip-migration', type: :boolean, desc: "Don't generate a migration for the slugs table"
12
+ class_option :'skip-initializer', type: :boolean, desc: "Don't generate an initializer"
13
13
 
14
- source_root File.expand_path('../../friendly_id', __FILE__)
14
+ source_root File.expand_path("../../friendly_id", __FILE__)
15
15
 
16
16
  # Copies the migration template to db/migrate.
17
17
  def copy_files
18
- return if options['skip-migration']
19
- migration_template 'migration.rb', 'db/migrate/create_friendly_id_slugs.rb'
18
+ return if options["skip-migration"]
19
+ migration_template "migration.rb", "db/migrate/create_friendly_id_slugs.rb"
20
20
  end
21
21
 
22
22
  def create_initializer
23
- return if options['skip-initializer']
24
- copy_file 'initializer.rb', 'config/initializers/friendly_id.rb'
23
+ return if options["skip-initializer"]
24
+ copy_file "initializer.rb", "config/initializers/friendly_id.rb"
25
25
  end
26
26
  end
data/test/base_test.rb CHANGED
@@ -21,14 +21,13 @@ class CoreTest < TestCaseClass
21
21
  klass = Class.new(ActiveRecord::Base) do
22
22
  self.abstract_class = true
23
23
  extend FriendlyId
24
- friendly_id :foo, :use => :slugged, :slug_column => :bar
24
+ friendly_id :foo, use: :slugged, slug_column: :bar
25
25
  end
26
26
  assert klass < FriendlyId::Slugged
27
27
  assert_equal :foo, klass.friendly_id_config.base
28
28
  assert_equal :bar, klass.friendly_id_config.slug_column
29
29
  end
30
30
 
31
-
32
31
  test "friendly_id should accept a block" do
33
32
  klass = Class.new(ActiveRecord::Base) do
34
33
  self.abstract_class = true
@@ -56,17 +55,15 @@ class CoreTest < TestCaseClass
56
55
  end
57
56
 
58
57
  test "should allow defaults to be set via a block" do
59
- begin
60
- FriendlyId.defaults do |config|
61
- config.base = :foo
62
- end
63
- klass = Class.new(ActiveRecord::Base) do
64
- self.abstract_class = true
65
- extend FriendlyId
66
- end
67
- assert_equal :foo, klass.friendly_id_config.base
68
- ensure
69
- FriendlyId.instance_variable_set :@defaults, nil
58
+ FriendlyId.defaults do |config|
59
+ config.base = :foo
70
60
  end
61
+ klass = Class.new(ActiveRecord::Base) do
62
+ self.abstract_class = true
63
+ extend FriendlyId
64
+ end
65
+ assert_equal :foo, klass.friendly_id_config.base
66
+ ensure
67
+ FriendlyId.instance_variable_set :@defaults, nil
71
68
  end
72
69
  end
@@ -14,7 +14,11 @@ require "ffaker"
14
14
  N = 50000
15
15
 
16
16
  def transaction
17
- ActiveRecord::Base.transaction { yield ; raise ActiveRecord::Rollback }
17
+ ActiveRecord::Base.transaction do
18
+ yield
19
+
20
+ raise ActiveRecord::Rollback
21
+ end
18
22
  end
19
23
 
20
24
  class Array
@@ -27,62 +31,60 @@ Book = Class.new ActiveRecord::Base
27
31
 
28
32
  class Journalist < ActiveRecord::Base
29
33
  extend FriendlyId
30
- friendly_id :name, :use => :slugged
34
+ friendly_id :name, use: :slugged
31
35
  end
32
36
 
33
37
  class Manual < ActiveRecord::Base
34
38
  extend FriendlyId
35
- friendly_id :name, :use => :history
39
+ friendly_id :name, use: :history
36
40
  end
37
41
 
38
42
  class Restaurant < ActiveRecord::Base
39
43
  extend FriendlyId
40
- friendly_id :name, :use => :finders
44
+ friendly_id :name, use: :finders
41
45
  end
42
46
 
43
-
44
- BOOKS = []
47
+ BOOKS = []
45
48
  JOURNALISTS = []
46
- MANUALS = []
49
+ MANUALS = []
47
50
  RESTAURANTS = []
48
51
 
49
52
  100.times do
50
53
  name = FFaker::Name.name
51
- BOOKS << (Book.create! :name => name).id
52
- JOURNALISTS << (Journalist.create! :name => name).friendly_id
53
- MANUALS << (Manual.create! :name => name).friendly_id
54
- RESTAURANTS << (Restaurant.create! :name => name).friendly_id
54
+ BOOKS << (Book.create! name: name).id
55
+ JOURNALISTS << (Journalist.create! name: name).friendly_id
56
+ MANUALS << (Manual.create! name: name).friendly_id
57
+ RESTAURANTS << (Restaurant.create! name: name).friendly_id
55
58
  end
56
59
 
57
60
  ActiveRecord::Base.connection.execute "UPDATE manuals SET slug = NULL"
58
61
 
59
62
  Benchmark.bmbm do |x|
60
- x.report 'ActiveRecord: where.first' do
61
- N.times {Book.where(:id=>BOOKS.rand).first}
63
+ x.report "ActiveRecord: where.first" do
64
+ N.times { Book.where(id: BOOKS.rand).first }
62
65
  end
63
66
 
64
- x.report 'ActiveRecord: where.take' do
65
- N.times {Book.where(:id=>BOOKS.rand).take}
67
+ x.report "ActiveRecord: where.take" do
68
+ N.times { Book.where(id: BOOKS.rand).take }
66
69
  end
67
70
 
68
- x.report 'ActiveRecord: find' do
69
- N.times {Book.find BOOKS.rand}
71
+ x.report "ActiveRecord: find" do
72
+ N.times { Book.find BOOKS.rand }
70
73
  end
71
74
 
72
- x.report 'ActiveRecord: find_by(:id)' do
73
- N.times {Book.find_by(:id=>BOOKS.rand)}
75
+ x.report "ActiveRecord: find_by(:id)" do
76
+ N.times { Book.find_by(id: BOOKS.rand) }
74
77
  end
75
78
 
76
- x.report 'ActiveRecord: find_by(:slug)' do
77
- N.times {Restaurant.find_by(:slug=>RESTAURANTS.rand)}
79
+ x.report "ActiveRecord: find_by(:slug)" do
80
+ N.times { Restaurant.find_by(slug: RESTAURANTS.rand) }
78
81
  end
79
82
 
80
- x.report 'FriendlyId: find (in-table slug w/ finders)' do
81
- N.times {Restaurant.find RESTAURANTS.rand}
83
+ x.report "FriendlyId: find (in-table slug w/ finders)" do
84
+ N.times { Restaurant.find RESTAURANTS.rand }
82
85
  end
83
86
 
84
- x.report 'FriendlyId: friendly.find (in-table slug)' do
85
- N.times {Restaurant.friendly.find RESTAURANTS.rand}
87
+ x.report "FriendlyId: friendly.find (in-table slug)" do
88
+ N.times { Restaurant.friendly.find RESTAURANTS.rand }
86
89
  end
87
-
88
90
  end
@@ -28,7 +28,7 @@ Book = Class.new ActiveRecord::Base
28
28
 
29
29
  test_integer = 123
30
30
  test_active_record_object = Book.new
31
- test_hash = {:name=>'joe'}
31
+ test_hash = {name: "joe"}
32
32
  test_nil = nil
33
33
  test_numeric_string = "123"
34
34
  test_string = "abc123"
@@ -36,21 +36,21 @@ test_string = "abc123"
36
36
  N = 5_000_000
37
37
 
38
38
  Benchmark.bmbm do |x|
39
- x.report('integer friendly_id?') { N.times {test_integer.friendly_id?} }
40
- x.report('integer unfriendly_id?') { N.times {test_integer.unfriendly_id?} }
39
+ x.report("integer friendly_id?") { N.times { test_integer.friendly_id? } }
40
+ x.report("integer unfriendly_id?") { N.times { test_integer.unfriendly_id? } }
41
41
 
42
- x.report('AR::Base friendly_id?') { N.times {test_active_record_object.friendly_id?} }
43
- x.report('AR::Base unfriendly_id?') { N.times {test_active_record_object.unfriendly_id?} }
42
+ x.report("AR::Base friendly_id?") { N.times { test_active_record_object.friendly_id? } }
43
+ x.report("AR::Base unfriendly_id?") { N.times { test_active_record_object.unfriendly_id? } }
44
44
 
45
- x.report('hash friendly_id?') { N.times {test_hash.friendly_id?} }
46
- x.report('hash unfriendly_id?') { N.times {test_hash.unfriendly_id?} }
45
+ x.report("hash friendly_id?") { N.times { test_hash.friendly_id? } }
46
+ x.report("hash unfriendly_id?") { N.times { test_hash.unfriendly_id? } }
47
47
 
48
- x.report('nil friendly_id?') { N.times {test_nil.friendly_id?} }
49
- x.report('nil unfriendly_id?') { N.times {test_nil.unfriendly_id?} }
48
+ x.report("nil friendly_id?") { N.times { test_nil.friendly_id? } }
49
+ x.report("nil unfriendly_id?") { N.times { test_nil.unfriendly_id? } }
50
50
 
51
- x.report('numeric string friendly_id?') { N.times {test_numeric_string.friendly_id?} }
52
- x.report('numeric string unfriendly_id?') { N.times {test_numeric_string.unfriendly_id?} }
51
+ x.report("numeric string friendly_id?") { N.times { test_numeric_string.friendly_id? } }
52
+ x.report("numeric string unfriendly_id?") { N.times { test_numeric_string.unfriendly_id? } }
53
53
 
54
- x.report('test_string friendly_id?') { N.times {test_string.friendly_id?} }
55
- x.report('test_string unfriendly_id?') { N.times {test_string.unfriendly_id?} }
54
+ x.report("test_string friendly_id?") { N.times { test_string.friendly_id? } }
55
+ x.report("test_string unfriendly_id?") { N.times { test_string.unfriendly_id? } }
56
56
  end
@@ -1,9 +1,16 @@
1
1
  require "helper"
2
2
 
3
3
  class CandidatesTest < TestCaseClass
4
-
5
4
  include FriendlyId::Test
6
5
 
6
+ class Airport
7
+ def initialize(code)
8
+ @code = code
9
+ end
10
+ attr_reader :code
11
+ alias_method :to_s, :code
12
+ end
13
+
7
14
  class City < ActiveRecord::Base
8
15
  extend FriendlyId
9
16
  friendly_id :slug_candidates, use: :slugged
@@ -16,8 +23,8 @@ class CandidatesTest < TestCaseClass
16
23
 
17
24
  def with_instances_of(klass = model_class, &block)
18
25
  transaction do
19
- city1 = klass.create! :name => "New York", :code => "JFK"
20
- city2 = klass.create! :name => "New York", :code => "EWR"
26
+ city1 = klass.create! name: "New York", code: "JFK"
27
+ city2 = klass.create! name: "New York", code: "EWR"
21
28
  yield city1, city2
22
29
  end
23
30
  end
@@ -26,7 +33,7 @@ class CandidatesTest < TestCaseClass
26
33
  test "resolves conflict with candidate" do
27
34
  with_instances do |city1, city2|
28
35
  assert_equal "new-york", city1.slug
29
- assert_match(/\Anew-york-([a-z0-9]+\-){4}[a-z0-9]+\z/, city2.slug)
36
+ assert_match(/\Anew-york-([a-z0-9]+-){4}[a-z0-9]+\z/, city2.slug)
30
37
  end
31
38
  end
32
39
 
@@ -37,7 +44,7 @@ class CandidatesTest < TestCaseClass
37
44
  end
38
45
  end
39
46
  with_instances_of klass do |_, city|
40
- assert_match(/\Anew-york-([a-z0-9]+\-){4}[a-z0-9]+\z/, city.slug)
47
+ assert_match(/\Anew-york-([a-z0-9]+-){4}[a-z0-9]+\z/, city.slug)
41
48
  end
42
49
  end
43
50
 
@@ -59,7 +66,7 @@ class CandidatesTest < TestCaseClass
59
66
  end
60
67
  end
61
68
  with_instances_of klass do |_, city|
62
- assert_match(/\Anew-york-([a-z0-9]+\-){4}[a-z0-9]+\z/, city.slug)
69
+ assert_match(/\Anew-york-([a-z0-9]+-){4}[a-z0-9]+\z/, city.slug)
63
70
  end
64
71
  end
65
72
 
@@ -70,7 +77,7 @@ class CandidatesTest < TestCaseClass
70
77
  end
71
78
  end
72
79
  with_instances_of klass do |_, city|
73
- assert_match(/\Anew-york-([a-z0-9]+\-){4}[a-z0-9]+\z/, city.slug)
80
+ assert_match(/\Anew-york-([a-z0-9]+-){4}[a-z0-9]+\z/, city.slug)
74
81
  end
75
82
  end
76
83
 
@@ -88,7 +95,7 @@ class CandidatesTest < TestCaseClass
88
95
  test "accepts candidate with lambda" do
89
96
  klass = Class.new City do
90
97
  def slug_candidates
91
- [name, [name, ->{ rand 1000 }]]
98
+ [name, [name, -> { rand 1000 }]]
92
99
  end
93
100
  end
94
101
  with_instances_of klass do |_, city|
@@ -98,13 +105,6 @@ class CandidatesTest < TestCaseClass
98
105
 
99
106
  test "accepts candidate with object" do
100
107
  klass = Class.new City do
101
- class Airport
102
- def initialize(code)
103
- @code = code
104
- end
105
- attr_reader :code
106
- alias_method :to_s, :code
107
- end
108
108
  def slug_candidates
109
109
  [name, [name, Airport.new(code)]]
110
110
  end
@@ -122,7 +122,7 @@ class CandidatesTest < TestCaseClass
122
122
  end
123
123
  with_instances_of klass do |_, city|
124
124
  candidates = FriendlyId::Candidates.new(city, city.slug_candidates)
125
- assert_equal candidates.each, ['new-york']
125
+ assert_equal candidates.each, ["new-york"]
126
126
  end
127
127
  end
128
128
 
@@ -136,8 +136,7 @@ class CandidatesTest < TestCaseClass
136
136
  collected_candidates = []
137
137
  candidates = FriendlyId::Candidates.new(city, city.slug_candidates)
138
138
  candidates.each { |candidate| collected_candidates << candidate }
139
- assert_equal collected_candidates, ['new-york']
139
+ assert_equal collected_candidates, ["new-york"]
140
140
  end
141
141
  end
142
-
143
142
  end
@@ -1,7 +1,6 @@
1
1
  require "helper"
2
2
 
3
3
  class ConfigurationTest < TestCaseClass
4
-
5
4
  include FriendlyId::Test
6
5
 
7
6
  def setup
@@ -16,13 +15,13 @@ class ConfigurationTest < TestCaseClass
16
15
  end
17
16
 
18
17
  test "should set options on initialization if present" do
19
- config = FriendlyId::Configuration.new @model_class, :base => "hello"
18
+ config = FriendlyId::Configuration.new @model_class, base: "hello"
20
19
  assert_equal "hello", config.base
21
20
  end
22
21
 
23
22
  test "should raise error if passed unrecognized option" do
24
23
  assert_raises NoMethodError do
25
- FriendlyId::Configuration.new @model_class, :foo => "bar"
24
+ FriendlyId::Configuration.new @model_class, foo: "bar"
26
25
  end
27
26
  end
28
27
 
@@ -30,7 +29,7 @@ class ConfigurationTest < TestCaseClass
30
29
  refute @model_class < FriendlyId::Slugged
31
30
  @model_class.class_eval do
32
31
  extend FriendlyId
33
- friendly_id :hello, :use => :slugged
32
+ friendly_id :hello, use: :slugged
34
33
  end
35
34
  assert @model_class < FriendlyId::Slugged
36
35
  end
@@ -40,7 +39,7 @@ class ConfigurationTest < TestCaseClass
40
39
  refute @model_class < my_module
41
40
  @model_class.class_eval do
42
41
  extend FriendlyId
43
- friendly_id :hello, :use => my_module
42
+ friendly_id :hello, use: my_module
44
43
  end
45
44
  assert @model_class < my_module
46
45
  end
@@ -48,17 +47,14 @@ class ConfigurationTest < TestCaseClass
48
47
  test "#base should optionally set a value" do
49
48
  config = FriendlyId::Configuration.new @model_class
50
49
  assert_nil config.base
51
- config.base = 'foo'
52
- assert_equal 'foo', config.base
50
+ config.base = "foo"
51
+ assert_equal "foo", config.base
53
52
  end
54
53
 
55
54
  test "#base can set the value to nil" do
56
55
  config = FriendlyId::Configuration.new @model_class
57
- config.base 'foo'
56
+ config.base "foo"
58
57
  config.base nil
59
58
  assert_nil config.base
60
-
61
59
  end
62
-
63
-
64
60
  end
data/test/core_test.rb CHANGED
@@ -12,7 +12,6 @@ class Author < ActiveRecord::Base
12
12
  end
13
13
 
14
14
  class CoreTest < TestCaseClass
15
-
16
15
  include FriendlyId::Test
17
16
  include FriendlyId::Test::Shared::Core
18
17
 
@@ -31,6 +30,6 @@ class CoreTest < TestCaseClass
31
30
  end
32
31
 
33
32
  test "instances should have a friendly id" do
34
- with_instance_of(model_class) {|record| assert record.friendly_id}
33
+ with_instance_of(model_class) { |record| assert record.friendly_id }
35
34
  end
36
35
  end
data/test/databases.yml CHANGED
@@ -9,9 +9,10 @@ mysql:
9
9
 
10
10
  postgres:
11
11
  adapter: postgresql
12
- host: <%= ENV.fetch('PGHOST') { 'localhost' } %>
13
- port: <%= ENV.fetch('PGPORT') { '5432' } %>
14
- username: <%= ENV.fetch('PGUSER') { 'postgres' } %>
12
+ host: <%= ENV.fetch('PGHOST', 'localhost') %>
13
+ port: <%= ENV.fetch('PGPORT', '5432') %>
14
+ username: <%= ENV.fetch('PGUSER', 'postgres') %>
15
+ password: <%= ENV.fetch('PGPASSWORD', 'postgres') %>
15
16
  database: friendly_id_test
16
17
  encoding: utf8
17
18
 
data/test/finders_test.rb CHANGED
@@ -1,29 +1,76 @@
1
1
  require "helper"
2
2
 
3
3
  class JournalistWithFriendlyFinders < ActiveRecord::Base
4
- self.table_name = 'journalists'
4
+ self.table_name = "journalists"
5
5
  extend FriendlyId
6
- scope :existing, -> {where('1 = 1')}
6
+ scope :existing, -> { where("1 = 1") }
7
7
  friendly_id :name, use: [:slugged, :finders]
8
8
  end
9
9
 
10
10
  class Finders < TestCaseClass
11
-
12
11
  include FriendlyId::Test
13
12
 
14
13
  def model_class
15
14
  JournalistWithFriendlyFinders
16
15
  end
17
16
 
18
- test 'should find records with finders as class methods' do
17
+ test "should find records with finders as class methods" do
19
18
  with_instance_of(model_class) do |record|
20
19
  assert model_class.find(record.friendly_id)
21
20
  end
22
21
  end
23
22
 
24
- test 'should find records with finders on relations' do
23
+ test "should find records with finders on relations" do
25
24
  with_instance_of(model_class) do |record|
26
25
  assert model_class.existing.find(record.friendly_id)
27
26
  end
28
27
  end
28
+
29
+ test "allows nil with allow_nil: true" do
30
+ with_instance_of(model_class) do |record|
31
+ assert_nil model_class.find("foo", allow_nil: true)
32
+ end
33
+ end
34
+
35
+ test "allows nil on relations with allow_nil: true" do
36
+ with_instance_of(model_class) do |record|
37
+ assert_nil model_class.existing.find("foo", allow_nil: true)
38
+ end
39
+ end
40
+
41
+ test "allows nil with a bad primary key ID and allow_nil: true" do
42
+ with_instance_of(model_class) do |record|
43
+ assert_nil model_class.find(0, allow_nil: true)
44
+ end
45
+ end
46
+
47
+ test "allows nil on relations with a bad primary key ID and allow_nil: true" do
48
+ with_instance_of(model_class) do |record|
49
+ assert_nil model_class.existing.find(0, allow_nil: true)
50
+ end
51
+ end
52
+
53
+ test "allows nil with a bad potential primary key ID and allow_nil: true" do
54
+ with_instance_of(model_class) do |record|
55
+ assert_nil model_class.find("0", allow_nil: true)
56
+ end
57
+ end
58
+
59
+ test "allows nil on relations with a bad potential primary key ID and allow_nil: true" do
60
+ with_instance_of(model_class) do |record|
61
+ assert_nil model_class.existing.find("0", allow_nil: true)
62
+ end
63
+ end
64
+
65
+ test "allows nil with nil ID and allow_nil: true" do
66
+ with_instance_of(model_class) do |record|
67
+ assert_nil model_class.find(nil, allow_nil: true)
68
+ end
69
+ end
70
+
71
+ test "allows nil on relations with nil ID and allow_nil: true" do
72
+ with_instance_of(model_class) do |record|
73
+ assert_nil model_class.existing.find(nil, allow_nil: true)
74
+ end
75
+ end
29
76
  end
@@ -3,46 +3,36 @@ require "rails/generators"
3
3
  require "generators/friendly_id_generator"
4
4
 
5
5
  class FriendlyIdGeneratorTest < Rails::Generators::TestCase
6
-
7
6
  tests FriendlyIdGenerator
8
7
  destination File.expand_path("../../tmp", __FILE__)
9
8
 
10
9
  setup :prepare_destination
11
10
 
12
11
  test "should generate a migration" do
13
- begin
14
- run_generator
15
- assert_migration "db/migrate/create_friendly_id_slugs"
16
- ensure
17
- FileUtils.rm_rf self.destination_root
18
- end
12
+ run_generator
13
+ assert_migration "db/migrate/create_friendly_id_slugs"
14
+ ensure
15
+ FileUtils.rm_rf destination_root
19
16
  end
20
17
 
21
18
  test "should skip the migration when told to do so" do
22
- begin
23
- run_generator ['--skip-migration']
24
- assert_no_migration "db/migrate/create_friendly_id_slugs"
25
- ensure
26
- FileUtils.rm_rf self.destination_root
27
- end
19
+ run_generator ["--skip-migration"]
20
+ assert_no_migration "db/migrate/create_friendly_id_slugs"
21
+ ensure
22
+ FileUtils.rm_rf destination_root
28
23
  end
29
24
 
30
25
  test "should generate an initializer" do
31
- begin
32
- run_generator
33
- assert_file "config/initializers/friendly_id.rb"
34
- ensure
35
- FileUtils.rm_rf self.destination_root
36
- end
26
+ run_generator
27
+ assert_file "config/initializers/friendly_id.rb"
28
+ ensure
29
+ FileUtils.rm_rf destination_root
37
30
  end
38
31
 
39
32
  test "should skip the initializer when told to do so" do
40
- begin
41
- run_generator ['--skip-initializer']
42
- assert_no_file "config/initializers/friendly_id.rb"
43
- ensure
44
- FileUtils.rm_rf self.destination_root
45
- end
33
+ run_generator ["--skip-initializer"]
34
+ assert_no_file "config/initializers/friendly_id.rb"
35
+ ensure
36
+ FileUtils.rm_rf destination_root
46
37
  end
47
-
48
38
  end