foreign_key_validation 0.0.5 → 0.0.6
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.
- checksums.yaml +8 -8
- data/README.md +1 -1
- data/lib/foreign_key_validation/model_extension.rb +4 -2
- data/lib/foreign_key_validation/version.rb +1 -1
- data/spec/models/model_spec.rb +44 -8
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
Zjg4OGRlMzQzMTJhZmQyOWFhOGQzNTI2NDhhYTE0YThlZWM0Y2NjMg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTRlZDQxNTUyMTdiZGRmYjQwNTlkMzkwOTUwMTMyMWNjZmUyYzBjZg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDAyZjI0YzcxYzQzOGVmMThkYzk5MmUyNDcyZmY4YjA3OWU2NTc1OTA2ODc2
|
10
|
+
ODVjOWEwZDhhYWVjYjk3MzAyNzZlNzI5NTBmZDNjYjQ2Zjk4MTBlZTRhZjgx
|
11
|
+
M2U2NzBjY2QzYzEyNmEyNzFhYTE1ZDA2ODAwNjYyMTQ0ZDFhNzY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NWM2OWNhNDVkMDdmNDgxNTRmNzEzMTU1NzNjYTI3M2Y2ZjA3ZWYzYWViYjll
|
14
|
+
NjdmOGE2MjI2NTE3MjE3ZWZmZWZjYTI0ZDk5YTg2N2FlMmQzNDM4YWE0ZmU2
|
15
|
+
NGNlMGM1YTFlNzZjMDEyNjY2OWU1ZjNiY2I5ZTk4Y2NlM2YwNTM=
|
data/README.md
CHANGED
@@ -23,7 +23,7 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
## Usage
|
25
25
|
|
26
|
-
Call `validate_foreign_keys` in your model. By default it assumes that it should check all foreign keys against the `user_id` column. So any relation (except `user`) will be checked for a matching `user_id` if the column exists.
|
26
|
+
Call `validate_foreign_keys` below the association definitions (`belongs_to`, ...) in your model. By default it assumes that it should check all foreign keys against the `user_id` column. So any relation (except `user`) will be checked for a matching `user_id` if the column exists.
|
27
27
|
|
28
28
|
Change behaviour by calling `validate_foreign_keys` with arguments hash.
|
29
29
|
|
@@ -5,6 +5,8 @@ module ForeignKeyValidation
|
|
5
5
|
included do
|
6
6
|
private
|
7
7
|
def validate_foreign_key(validate_against, relation)
|
8
|
+
return if send(relation).try("#{validate_against}_id").nil? or try("#{validate_against}_id").nil?
|
9
|
+
|
8
10
|
if send(relation).send("#{validate_against}_id") != send("#{validate_against}_id")
|
9
11
|
errors.add(validate_against, "#{validate_against} of #{relation} does not match #{self.class.table_name} #{validate_against}")
|
10
12
|
end
|
@@ -14,10 +16,10 @@ module ForeignKeyValidation
|
|
14
16
|
module ClassMethods
|
15
17
|
def validate_foreign_keys(opt={})
|
16
18
|
validate_against = (opt[:on] || :user).to_s
|
17
|
-
reflections =
|
19
|
+
reflections = reflect_on_all_associations(:belongs_to).map(&:name).map(&:to_s)
|
18
20
|
validate_with = ((Array(opt[:with]).map(&:to_s) if opt[:with]) || reflections).reject {|n| n == validate_against}
|
19
21
|
|
20
|
-
raise ArgumentError, "No foreign key #{validate_against} on #{
|
22
|
+
raise ArgumentError, "No foreign key #{validate_against} on #{table_name} table!" unless reflections.include?(validate_against)
|
21
23
|
raise ArgumentError, "Unknown relation in #{validate_with}!" unless validate_with.all? {|k| reflections.include?(k) }
|
22
24
|
|
23
25
|
define_method "validate_foreign_keys_on_#{validate_against}" do
|
data/spec/models/model_spec.rb
CHANGED
@@ -2,10 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe ForeignKeyValidation::ModelExtension do
|
4
4
|
|
5
|
+
# NOTE: it's important to not create the objects through relation (user.projects.create...)
|
6
|
+
# it looks like active_record is caching the classes - but we need to test different class configs
|
7
|
+
|
5
8
|
context "Without calling validation" do
|
6
9
|
|
7
|
-
# NOTE: it's important here to not create the object through relation (user.projects.create...)
|
8
|
-
# it looks like active_record is caching the classes - but we need to test different class configs
|
9
10
|
let(:user) { User.create }
|
10
11
|
let(:project) { Project.create user: user }
|
11
12
|
let(:idea) { Idea.create user: user, project: project }
|
@@ -55,8 +56,6 @@ describe ForeignKeyValidation::ModelExtension do
|
|
55
56
|
Comment.send :validate_foreign_keys
|
56
57
|
end
|
57
58
|
|
58
|
-
# NOTE: it's important here to not create the object through relation (user.projects.create...)
|
59
|
-
# it looks like active_record is caching the classes - but we need to test different class configs
|
60
59
|
let(:user) { User.create }
|
61
60
|
let(:project) { Project.create user: user }
|
62
61
|
let(:idea) { Idea.create user: user, project: project }
|
@@ -113,8 +112,6 @@ describe ForeignKeyValidation::ModelExtension do
|
|
113
112
|
end
|
114
113
|
end
|
115
114
|
|
116
|
-
# NOTE: it's important here to not create the object through relation (user.projects.create...)
|
117
|
-
# it looks like active_record is caching the classes - but we need to test different class configs
|
118
115
|
let(:user) { User.create }
|
119
116
|
let(:project) { Project.create user: user }
|
120
117
|
let(:idea) { Idea.create user: user, project: project }
|
@@ -158,8 +155,6 @@ describe ForeignKeyValidation::ModelExtension do
|
|
158
155
|
|
159
156
|
context "With calling validation with wrong attributes hash" do
|
160
157
|
|
161
|
-
# NOTE: it's important here to not create the object through relation (user.projects.create...)
|
162
|
-
# it looks like active_record is caching the classes - but we need to test different class configs
|
163
158
|
let(:user) { User.create }
|
164
159
|
let(:project) { Project.create user: user }
|
165
160
|
let(:issue) { Issue.create user: user, project: project }
|
@@ -175,5 +170,46 @@ describe ForeignKeyValidation::ModelExtension do
|
|
175
170
|
|
176
171
|
end
|
177
172
|
|
173
|
+
context "With calling validation and missing foreign key on self" do
|
174
|
+
|
175
|
+
before do
|
176
|
+
Issue.class_eval do
|
177
|
+
validate_foreign_keys
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
let(:user) { User.create }
|
182
|
+
let(:project) { Project.create user: user }
|
183
|
+
let(:issue) { Issue.create project: project }
|
184
|
+
|
185
|
+
it "does not allow to rewrite user id of issue" do
|
186
|
+
issue.user_id = 42
|
187
|
+
issue.save
|
188
|
+
expect(issue.errors.messages.values.flatten).to include("user of project does not match issues user")
|
189
|
+
expect(issue.reload.user_id).to_not eq(42)
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
|
194
|
+
context "With calling validation and missing foreign key on relation" do
|
195
|
+
|
196
|
+
before do
|
197
|
+
Issue.class_eval do
|
198
|
+
validate_foreign_keys
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
let(:user) { User.create }
|
203
|
+
let(:project) { Project.create }
|
204
|
+
let(:issue) { Issue.create project: project, user: user }
|
205
|
+
|
206
|
+
it "allow to rewrite user id of issue" do
|
207
|
+
issue.user_id = 42
|
208
|
+
issue.save
|
209
|
+
issue.reload
|
210
|
+
expect(issue.user_id).to eq(42)
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
178
214
|
|
179
215
|
end
|