forked from norman/friendly_id
-
Notifications
You must be signed in to change notification settings - Fork 0
/
shared.rb
156 lines (132 loc) · 5.56 KB
/
shared.rb
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
module FriendlyId
module Test
module Shared
module Slugged
test "configuration should have a sequence_separator" do
assert !model_class.friendly_id_config.sequence_separator.empty?
end
test "should make a new slug if the friendly_id method value has changed" do
with_instance_of model_class do |record|
record.name = "Changed Value"
record.save!
assert_equal "changed-value", record.slug
end
end
test "should increment the slug sequence for duplicate friendly ids" do
with_instance_of model_class do |record|
record2 = model_class.create! :name => record.name
assert record2.friendly_id.match(/2\z/)
end
end
test "should not add slug sequence on update after other conflicting slugs were added" do
with_instance_of model_class do |record|
old = record.friendly_id
model_class.create! :name => record.name
record.save!
record.reload
assert_equal old, record.to_param
end
end
test "should not increment sequence on save" do
with_instance_of model_class do |record|
record2 = model_class.create! :name => record.name
record2.active = !record2.active
record2.save!
assert record2.friendly_id.match(/2\z/)
end
end
test "should create slug on save if the slug is nil" do
with_instance_of model_class do |record|
record.slug = nil
record.save!
assert_nil record.slug
record.save!
refute_nil record.slug
end
end
test "when validations block save, to_param should return friendly_id rather than nil" do
my_model_class = Class.new(model_class)
self.class.const_set("Foo", my_model_class)
with_instance_of my_model_class do |record|
record.update_attribute(my_model_class.friendly_id_config.slug_column, nil)
record = my_model_class.find(record.id)
record.class.validate Proc.new {errors[:name] = "FAIL"}
record.save
assert_equal record.to_param, record.friendly_id
end
end
end
module Core
test "finds should respect conditions" do
with_instance_of(model_class) do |record|
assert_raises(ActiveRecord::RecordNotFound) do
model_class.where("1 = 2").find record.friendly_id
end
end
end
test "should be findable by friendly id" do
with_instance_of(model_class) {|record| assert model_class.find record.friendly_id}
end
test "should exist? by friendly id" do
with_instance_of(model_class) do |record|
assert model_class.exists? record.id
assert model_class.exists? record.friendly_id
assert model_class.exists?({:id => record.id})
assert model_class.exists?(['id = ?', record.id])
assert !model_class.exists?(record.friendly_id + "-hello")
assert !model_class.exists?(0)
end
end
test "should be findable by id as integer" do
with_instance_of(model_class) {|record| assert model_class.find record.id.to_i}
end
test "should be findable by id as string" do
with_instance_of(model_class) {|record| assert model_class.find record.id.to_s}
end
test "should be findable by numeric friendly_id" do
with_instance_of(model_class, :name => "206") {|record| assert model_class.find record.friendly_id}
end
test "to_param should return the friendly_id" do
with_instance_of(model_class) {|record| assert_equal record.friendly_id, record.to_param}
end
test "should be findable by themselves" do
with_instance_of(model_class) {|record| assert_equal record, model_class.find(record)}
end
test "updating record's other values should not change the friendly_id" do
with_instance_of model_class do |record|
old = record.friendly_id
record.update_attributes! :active => false
assert model_class.find old
end
end
test "instances found by a single id should not be read-only" do
with_instance_of(model_class) {|record| assert !model_class.find(record.friendly_id).readonly?}
end
test "failing finds with unfriendly_id should raise errors normally" do
assert_raises(ActiveRecord::RecordNotFound) {model_class.find 0}
end
test "should return numeric id if the friendly_id is nil" do
with_instance_of(model_class) do |record|
record.expects(:friendly_id).returns(nil)
assert_equal record.id.to_s, record.to_param
end
end
test "should return numeric id if the friendly_id is an empty string" do
with_instance_of(model_class) do |record|
record.expects(:friendly_id).returns("")
assert_equal record.id.to_s, record.to_param
end
end
test "should return numeric id if the friendly_id is blank" do
with_instance_of(model_class) do |record|
record.expects(:friendly_id).returns(" ")
assert_equal record.id.to_s, record.to_param
end
end
test "should return nil for to_param with a new record" do
assert_equal nil, model_class.new.to_param
end
end
end
end
end