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
|
require "helper"
class ReservedTest < TestCaseClass
include FriendlyId::Test
class Journalist < ActiveRecord::Base
extend FriendlyId
friendly_id :slug_candidates, use: [:slugged, :reserved], reserved_words: %w[new edit]
after_validation :move_friendly_id_error_to_name
def move_friendly_id_error_to_name
errors.add :name, *errors.delete(:friendly_id) if errors[:friendly_id].present?
end
def slug_candidates
name
end
end
def model_class
Journalist
end
test "should reserve words" do
%w[new edit NEW Edit].each do |word|
transaction do
assert_raises(ActiveRecord::RecordInvalid) { model_class.create! name: word }
end
end
end
test "should move friendly_id error to name" do
with_instance_of(model_class) do |record|
record.errors.add :name, "xxx"
record.errors.add :friendly_id, "yyy"
record.move_friendly_id_error_to_name
assert record.errors[:name].present? && record.errors[:friendly_id].blank?
assert_equal 2, record.errors.count
end
end
test "should reject reserved candidates" do
transaction do
record = model_class.new(name: "new")
def record.slug_candidates
[:name, "foo"]
end
record.save!
assert_equal "foo", record.friendly_id
end
end
test "should be invalid if all candidates are reserved" do
transaction do
record = model_class.new(name: "new")
def record.slug_candidates
["edit", "new"]
end
assert_raises(ActiveRecord::RecordInvalid) { record.save! }
end
end
test "should optionally treat reserved words as conflict" do
klass = Class.new(model_class) do
friendly_id :slug_candidates, use: [:slugged, :reserved], reserved_words: %w[new edit], treat_reserved_as_conflict: true
end
with_instance_of(klass, name: "new") do |record|
assert_match(/new-([0-9a-z]+-){4}[0-9a-z]+\z/, record.slug)
end
end
end
|