friendly_id 5.4.0 → 5.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/FUNDING.yml +1 -0
  4. data/.github/dependabot.yml +6 -0
  5. data/.github/stale.yml +1 -1
  6. data/.github/workflows/test.yml +38 -36
  7. data/.yardopts +2 -0
  8. data/Changelog.md +19 -0
  9. data/Gemfile +9 -13
  10. data/README.md +31 -8
  11. data/Rakefile +24 -27
  12. data/bench.rb +30 -27
  13. data/certs/parndt.pem +25 -23
  14. data/friendly_id.gemspec +26 -29
  15. data/gemfiles/Gemfile.rails-5.2.rb +11 -16
  16. data/gemfiles/Gemfile.rails-6.0.rb +11 -16
  17. data/gemfiles/Gemfile.rails-6.1.rb +22 -0
  18. data/gemfiles/Gemfile.rails-7.0.rb +22 -0
  19. data/guide.rb +13 -6
  20. data/lib/friendly_id/base.rb +59 -60
  21. data/lib/friendly_id/candidates.rb +9 -11
  22. data/lib/friendly_id/configuration.rb +6 -7
  23. data/lib/friendly_id/finder_methods.rb +63 -15
  24. data/lib/friendly_id/finders.rb +66 -66
  25. data/lib/friendly_id/history.rb +62 -63
  26. data/lib/friendly_id/initializer.rb +4 -4
  27. data/lib/friendly_id/migration.rb +6 -6
  28. data/lib/friendly_id/object_utils.rb +2 -2
  29. data/lib/friendly_id/reserved.rb +30 -32
  30. data/lib/friendly_id/scoped.rb +99 -102
  31. data/lib/friendly_id/sequentially_slugged/calculator.rb +69 -0
  32. data/lib/friendly_id/sequentially_slugged.rb +17 -64
  33. data/lib/friendly_id/simple_i18n.rb +78 -69
  34. data/lib/friendly_id/slug.rb +1 -2
  35. data/lib/friendly_id/slug_generator.rb +1 -3
  36. data/lib/friendly_id/slugged.rb +238 -239
  37. data/lib/friendly_id/version.rb +1 -1
  38. data/lib/friendly_id.rb +47 -49
  39. data/lib/generators/friendly_id_generator.rb +9 -9
  40. data/test/base_test.rb +10 -13
  41. data/test/benchmarks/finders.rb +28 -26
  42. data/test/benchmarks/object_utils.rb +13 -13
  43. data/test/candidates_test.rb +17 -18
  44. data/test/configuration_test.rb +7 -11
  45. data/test/core_test.rb +1 -2
  46. data/test/databases.yml +4 -3
  47. data/test/finders_test.rb +36 -13
  48. data/test/generator_test.rb +16 -26
  49. data/test/helper.rb +31 -24
  50. data/test/history_test.rb +70 -74
  51. data/test/numeric_slug_test.rb +4 -4
  52. data/test/object_utils_test.rb +0 -2
  53. data/test/reserved_test.rb +9 -11
  54. data/test/schema.rb +5 -4
  55. data/test/scoped_test.rb +18 -20
  56. data/test/sequentially_slugged_test.rb +65 -50
  57. data/test/shared.rb +15 -16
  58. data/test/simple_i18n_test.rb +22 -12
  59. data/test/slugged_test.rb +125 -113
  60. data/test/sti_test.rb +19 -21
  61. data.tar.gz.sig +0 -0
  62. metadata +38 -34
  63. metadata.gz.sig +0 -0
  64. data/gemfiles/Gemfile.rails-5.0.rb +0 -28
  65. data/gemfiles/Gemfile.rails-5.1.rb +0 -27
@@ -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,53 +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
29
28
 
30
- test 'should find capitalized records with finders as class methods' do
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
31
54
  with_instance_of(model_class) do |record|
32
- assert model_class.find(record.friendly_id.capitalize)
55
+ assert_nil model_class.find("0", allow_nil: true)
33
56
  end
34
57
  end
35
58
 
36
- test 'should find capitalized records with finders on relations' do
59
+ test "allows nil on relations with a bad potential primary key ID and allow_nil: true" do
37
60
  with_instance_of(model_class) do |record|
38
- assert model_class.existing.find(record.friendly_id.capitalize)
61
+ assert_nil model_class.existing.find("0", allow_nil: true)
39
62
  end
40
63
  end
41
64
 
42
- test 'should find upcased records with finders as class methods' do
65
+ test "allows nil with nil ID and allow_nil: true" do
43
66
  with_instance_of(model_class) do |record|
44
- assert model_class.find(record.friendly_id.upcase)
67
+ assert_nil model_class.find(nil, allow_nil: true)
45
68
  end
46
69
  end
47
70
 
48
- test 'should find upcased records with finders on relations' do
71
+ test "allows nil on relations with nil ID and allow_nil: true" do
49
72
  with_instance_of(model_class) do |record|
50
- assert model_class.existing.find(record.friendly_id.upcase)
73
+ assert_nil model_class.existing.find(nil, allow_nil: true)
51
74
  end
52
75
  end
53
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