File: sequentially_slugged_test.rb

package info (click to toggle)
ruby-friendly-id 5.5.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 432 kB
  • sloc: ruby: 3,143; makefile: 3
file content (214 lines) | stat: -rw-r--r-- 6,336 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
require "helper"

class Article < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: :sequentially_slugged
end

class SequentiallySluggedTest < TestCaseClass
  include FriendlyId::Test
  include FriendlyId::Test::Shared::Core

  def model_class
    Article
  end

  test "should generate numerically sequential slugs" do
    transaction do
      records = 12.times.map { model_class.create! name: "Some news" }
      assert_equal "some-news", records[0].slug
      (1...12).each { |i| assert_equal "some-news-#{i + 1}", records[i].slug }
    end
  end

  test "should cope when slugs are missing from the sequence" do
    transaction do
      record_1 = model_class.create!(name: "A thing")
      record_2 = model_class.create!(name: "A thing")
      record_3 = model_class.create!(name: "A thing")

      assert_equal "a-thing", record_1.slug
      assert_equal "a-thing-2", record_2.slug
      assert_equal "a-thing-3", record_3.slug

      record_2.destroy

      record_4 = model_class.create!(name: "A thing")

      assert_equal "a-thing-4", record_4.slug
    end
  end

  test "should cope with strange column names" do
    model_class = Class.new(ActiveRecord::Base) do
      self.table_name = "journalists"
      extend FriendlyId
      friendly_id :name, use: :sequentially_slugged, slug_column: "strange name"
    end

    transaction do
      record_1 = model_class.create! name: "Lois Lane"
      record_2 = model_class.create! name: "Lois Lane"

      assert_equal "lois-lane", record_1.attributes["strange name"]
      assert_equal "lois-lane-2", record_2.attributes["strange name"]
    end
  end

  test "should correctly sequence slugs that end in a number" do
    transaction do
      record1 = model_class.create! name: "Peugeuot 206"
      assert_equal "peugeuot-206", record1.slug
      record2 = model_class.create! name: "Peugeuot 206"
      assert_equal "peugeuot-206-2", record2.slug
    end
  end

  test "should correctly sequence slugs that begin with a number" do
    transaction do
      record1 = model_class.create! name: "2010 to 2015 Records"
      assert_equal "2010-to-2015-records", record1.slug
      record2 = model_class.create! name: "2010 to 2015 Records"
      assert_equal "2010-to-2015-records-2", record2.slug
    end
  end

  test "should sequence with a custom sequence separator" do
    model_class = Class.new(ActiveRecord::Base) do
      self.table_name = "novelists"
      extend FriendlyId
      friendly_id :name, use: :sequentially_slugged, sequence_separator: ":"
    end

    transaction do
      record_1 = model_class.create! name: "Julian Barnes"
      record_2 = model_class.create! name: "Julian Barnes"

      assert_equal "julian-barnes", record_1.slug
      assert_equal "julian-barnes:2", record_2.slug
    end
  end

  test "should not generate a slug when canidates set is empty" do
    model_class = Class.new(ActiveRecord::Base) do
      self.table_name = "cities"
      extend FriendlyId
      friendly_id :slug_candidates, use: [:sequentially_slugged]

      def slug_candidates
        [name, [name, code]]
      end
    end
    transaction do
      record = model_class.create!(name: nil, code: nil)
      assert_nil record.slug
    end
  end

  test "should not generate a slug when the sluggable attribute is blank" do
    record = model_class.create!(name: "")
    assert_nil record.slug
  end
end

class SequentiallySluggedTestWithHistory < TestCaseClass
  include FriendlyId::Test
  include FriendlyId::Test::Shared::Core

  class Article < ActiveRecord::Base
    extend FriendlyId
    friendly_id :name, use: [:sequentially_slugged, :history]
  end

  Journalist = Class.new(ActiveRecord::Base) do
    extend FriendlyId
    friendly_id :name, use: [:sequentially_slugged, :history], slug_column: "strange name"
  end

  def model_class
    Article
  end

  test "should work with regeneration with history when slug already exists" do
    transaction do
      record1 = model_class.create! name: "Test name"
      record2 = model_class.create! name: "Another test name"
      assert_equal "test-name", record1.slug
      assert_equal "another-test-name", record2.slug

      record2.name = "Test name"
      record2.slug = nil
      record2.save!
      assert_equal "test-name-2", record2.slug
    end
  end

  test "should work with regeneration with history when 2 slugs already exists and the second is changed" do
    transaction do
      record1 = model_class.create! name: "Test name"
      record2 = model_class.create! name: "Test name"
      record3 = model_class.create! name: "Another test name"
      assert_equal "test-name", record1.slug
      assert_equal "test-name-2", record2.slug
      assert_equal "another-test-name", record3.slug

      record2.name = "One more test name"
      record2.slug = nil
      record2.save!
      assert_equal "one-more-test-name", record2.slug

      record3.name = "Test name"
      record3.slug = nil
      record3.save!
      assert_equal "test-name-3", record3.slug
    end
  end

  test "should cope with strange column names" do
    transaction do
      record_1 = Journalist.create! name: "Lois Lane"
      record_2 = Journalist.create! name: "Lois Lane"

      assert_equal "lois-lane", record_1.attributes["strange name"]
      assert_equal "lois-lane-2", record_2.attributes["strange name"]
    end
  end
end

class City < ActiveRecord::Base
  has_many :restaurants
end

class Restaurant < ActiveRecord::Base
  extend FriendlyId
  belongs_to :city
  friendly_id :name, use: [:sequentially_slugged, :scoped, :history], scope: :city
end

class SequentiallySluggedTestWithScopedHistory < TestCaseClass
  include FriendlyId::Test
  include FriendlyId::Test::Shared::Core

  def model_class
    Restaurant
  end

  test "should work with regeneration with scoped history" do
    transaction do
      city1 = City.create!
      City.create!
      record1 = model_class.create! name: "Test name", city: city1
      record2 = model_class.create! name: "Test name", city: city1

      assert_equal "test-name", record1.slug
      assert_equal "test-name-2", record2.slug

      record2.name = "Another test name"
      record2.slug = nil
      record2.save!

      record3 = model_class.create! name: "Test name", city: city1
      assert_equal "test-name-3", record3.slug
    end
  end
end