govuk_content_models 10.1.0 → 10.1.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.
- data/CHANGELOG.md +4 -0
- data/app/models/artefact.rb +24 -0
- data/lib/govuk_content_models/version.rb +1 -1
- data/test/models/artefact_action_test.rb +1 -0
- data/test/models/artefact_test.rb +91 -21
- metadata +4 -4
data/CHANGELOG.md
CHANGED
data/app/models/artefact.rb
CHANGED
|
@@ -33,7 +33,12 @@ class Artefact
|
|
|
33
33
|
field "owning_app", type: String
|
|
34
34
|
field "rendering_app", type: String
|
|
35
35
|
field "active", type: Boolean, default: false
|
|
36
|
+
|
|
37
|
+
# will be removed once multiple need_ids
|
|
38
|
+
# gets deployed and tested.
|
|
36
39
|
field "need_id", type: String
|
|
40
|
+
|
|
41
|
+
field "need_ids", type: Array, default: []
|
|
37
42
|
field "fact_checkers", type: String
|
|
38
43
|
field "publication_id", type: String
|
|
39
44
|
field "description", type: String
|
|
@@ -142,6 +147,7 @@ class Artefact
|
|
|
142
147
|
reject_if: proc { |attrs| attrs["title"].blank? && attrs["url"].blank? }
|
|
143
148
|
|
|
144
149
|
before_validation :normalise, on: :create
|
|
150
|
+
before_validation :filter_out_empty_need_ids, if: :need_ids_changed?
|
|
145
151
|
before_create :record_create_action
|
|
146
152
|
before_update :record_update_action
|
|
147
153
|
after_update :update_editions
|
|
@@ -154,6 +160,7 @@ class Artefact
|
|
|
154
160
|
validates :language, inclusion: { in: ["en", "cy"] }
|
|
155
161
|
validates_with CannotEditSlugIfEverPublished
|
|
156
162
|
validate :validate_prefixes_and_paths
|
|
163
|
+
validate :format_of_new_need_ids, if: :need_ids_changed?
|
|
157
164
|
|
|
158
165
|
def self.in_alphabetical_order
|
|
159
166
|
order_by([[:name, :asc]])
|
|
@@ -347,6 +354,13 @@ class Artefact
|
|
|
347
354
|
attributes.except "_id", "created_at", "updated_at", "actions"
|
|
348
355
|
end
|
|
349
356
|
|
|
357
|
+
def need_id=(new_need_id)
|
|
358
|
+
super
|
|
359
|
+
|
|
360
|
+
need_ids << new_need_id if new_need_id.present? && ! need_ids.include?(new_need_id)
|
|
361
|
+
new_need_id
|
|
362
|
+
end
|
|
363
|
+
|
|
350
364
|
private
|
|
351
365
|
|
|
352
366
|
def validate_prefixes_and_paths
|
|
@@ -362,6 +376,16 @@ class Artefact
|
|
|
362
376
|
end
|
|
363
377
|
end
|
|
364
378
|
|
|
379
|
+
def filter_out_empty_need_ids
|
|
380
|
+
need_ids.reject!(&:blank?)
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
def format_of_new_need_ids
|
|
384
|
+
# http://api.rubyonrails.org/classes/ActiveModel/Dirty.html
|
|
385
|
+
new_need_ids = need_ids_was.blank? ? need_ids : need_ids - need_ids_was
|
|
386
|
+
errors.add(:need_ids, "must be six-digit integers") if new_need_ids.any? {|need_id| need_id !~ /^\d{6}$/ }
|
|
387
|
+
end
|
|
388
|
+
|
|
365
389
|
def valid_url_path?(path)
|
|
366
390
|
return false unless path.starts_with?("/")
|
|
367
391
|
uri = URI.parse(path)
|
|
@@ -92,6 +92,76 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
92
92
|
end
|
|
93
93
|
end
|
|
94
94
|
|
|
95
|
+
context "#need_ids" do
|
|
96
|
+
should "be empty by default" do
|
|
97
|
+
assert_empty FactoryGirl.build(:artefact).need_ids
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
should "filter out empty strings" do
|
|
101
|
+
artefact = FactoryGirl.create(:artefact, need_ids: ["", "100002"])
|
|
102
|
+
assert_equal ["100002"], artefact.reload.need_ids
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
should "store multiple needs related to an artefact" do
|
|
106
|
+
artefact = FactoryGirl.create(:artefact, need_ids: ["100001", "100002"])
|
|
107
|
+
assert_equal ["100001", "100002"], artefact.reload.need_ids
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
should "be six-digit integers" do
|
|
111
|
+
artefact = FactoryGirl.build(:artefact, need_ids: ["B1231"])
|
|
112
|
+
|
|
113
|
+
refute artefact.valid?
|
|
114
|
+
assert_includes artefact.errors[:need_ids], "must be six-digit integers"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
should "not validate need ids that were migrated from the singular need_id field" do
|
|
118
|
+
artefact = FactoryGirl.create(:artefact)
|
|
119
|
+
# simulate what happened during migration
|
|
120
|
+
artefact.set(:need_ids, ['As an employer
|
|
121
|
+
I need to know which type of DBS check an employee needs
|
|
122
|
+
so that I can apply for the correct one'])
|
|
123
|
+
|
|
124
|
+
artefact.need_ids << "100045"
|
|
125
|
+
|
|
126
|
+
assert artefact.valid?
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
context "for backwards compatibility" do
|
|
130
|
+
setup do
|
|
131
|
+
@artefact = FactoryGirl.create(:artefact)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
should "append to need_ids when need_id is assigned" do
|
|
135
|
+
@artefact.need_id = "100045"
|
|
136
|
+
|
|
137
|
+
assert_equal "100045", @artefact.need_id
|
|
138
|
+
assert_includes @artefact.need_ids, "100045"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
should "append to existing need_ids when need_id is assigned" do
|
|
142
|
+
@artefact.set(:need_ids, ["100044"])
|
|
143
|
+
@artefact.set(:need_id, "100044")
|
|
144
|
+
|
|
145
|
+
@artefact.need_id = "100045"
|
|
146
|
+
|
|
147
|
+
assert_equal "100045", @artefact.need_id
|
|
148
|
+
assert_equal ["100044", "100045"], @artefact.need_ids
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# this should only matter till the time we have both fields
|
|
152
|
+
# need_id and need_ids. can delete this test once we unset need_id.
|
|
153
|
+
should "keep need_ids unchanged when need_id is removed" do
|
|
154
|
+
@artefact.set(:need_ids, ["100044", "100045"])
|
|
155
|
+
@artefact.set(:need_id, "100044")
|
|
156
|
+
|
|
157
|
+
@artefact.need_id = nil
|
|
158
|
+
|
|
159
|
+
assert_equal nil, @artefact.need_id
|
|
160
|
+
assert_equal ["100044", "100045"], @artefact.need_ids
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
95
165
|
context "validating paths and prefixes" do
|
|
96
166
|
setup do
|
|
97
167
|
@a = FactoryGirl.build(:artefact)
|
|
@@ -167,9 +237,9 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
167
237
|
end
|
|
168
238
|
|
|
169
239
|
test "should store and return related artefacts in order" do
|
|
170
|
-
a = Artefact.create!(slug: "a", name: "a", kind: "place",
|
|
171
|
-
b = Artefact.create!(slug: "b", name: "b", kind: "place",
|
|
172
|
-
c = Artefact.create!(slug: "c", name: "c", kind: "place",
|
|
240
|
+
a = Artefact.create!(slug: "a", name: "a", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
241
|
+
b = Artefact.create!(slug: "b", name: "b", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
242
|
+
c = Artefact.create!(slug: "c", name: "c", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
173
243
|
|
|
174
244
|
a.related_artefacts = [b, c]
|
|
175
245
|
a.save!
|
|
@@ -179,9 +249,9 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
179
249
|
end
|
|
180
250
|
|
|
181
251
|
test "should store and return related artefacts in order, even when not in natural order" do
|
|
182
|
-
a = Artefact.create!(slug: "a", name: "a", kind: "place",
|
|
183
|
-
b = Artefact.create!(slug: "b", name: "b", kind: "place",
|
|
184
|
-
c = Artefact.create!(slug: "c", name: "c", kind: "place",
|
|
252
|
+
a = Artefact.create!(slug: "a", name: "a", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
253
|
+
b = Artefact.create!(slug: "b", name: "b", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
254
|
+
c = Artefact.create!(slug: "c", name: "c", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
185
255
|
|
|
186
256
|
a.related_artefacts = [c, b]
|
|
187
257
|
a.save!
|
|
@@ -191,10 +261,10 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
191
261
|
end
|
|
192
262
|
|
|
193
263
|
test "should store and return related artefacts in order, with a scope" do
|
|
194
|
-
a = Artefact.create!(slug: "a", name: "a", kind: "place",
|
|
195
|
-
b = Artefact.create!(state: "live", slug: "b", name: "b", kind: "place",
|
|
196
|
-
c = Artefact.create!(slug: "c", name: "c", kind: "place",
|
|
197
|
-
d = Artefact.create!(state: "live", slug: "d", name: "d", kind: "place",
|
|
264
|
+
a = Artefact.create!(slug: "a", name: "a", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
265
|
+
b = Artefact.create!(state: "live", slug: "b", name: "b", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
266
|
+
c = Artefact.create!(slug: "c", name: "c", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
267
|
+
d = Artefact.create!(state: "live", slug: "d", name: "d", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
198
268
|
|
|
199
269
|
a.related_artefacts = [d, c, b]
|
|
200
270
|
a.save!
|
|
@@ -509,7 +579,7 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
509
579
|
FactoryGirl.create(:tag, :tag_id => "fruit/aggregate", :tag_type => 'section', :title => "Aggregrate fruits", :parent_id => "fruit")
|
|
510
580
|
FactoryGirl.create(:tag, :tag_id => "vegetables", :tag_type => 'section', :title => "Vegetables")
|
|
511
581
|
|
|
512
|
-
@artefact = Artefact.create!(slug: "apple", name: "Apple", sections: [], kind: "guide",
|
|
582
|
+
@artefact = Artefact.create!(slug: "apple", name: "Apple", sections: [], kind: "guide", need_ids: ["100001"], owning_app: "x")
|
|
513
583
|
end
|
|
514
584
|
|
|
515
585
|
context "when related items are present in all groups" do
|
|
@@ -517,9 +587,9 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
517
587
|
@artefact.sections = ["fruit/simple"]
|
|
518
588
|
|
|
519
589
|
@artefact.related_artefacts = [
|
|
520
|
-
Artefact.create!(slug: "pear", name: "Pear", kind: "guide", sections: ["fruit/simple"],
|
|
521
|
-
Artefact.create!(slug: "pineapple", name: "Pineapple", kind: "guide", sections: ["fruit/aggregate"],
|
|
522
|
-
Artefact.create!(slug: "broccoli", name: "Broccoli", kind: "guide", sections: ["vegetables"],
|
|
590
|
+
Artefact.create!(slug: "pear", name: "Pear", kind: "guide", sections: ["fruit/simple"], need_ids: ["100001"], owning_app: "x"),
|
|
591
|
+
Artefact.create!(slug: "pineapple", name: "Pineapple", kind: "guide", sections: ["fruit/aggregate"], need_ids: ["100001"], owning_app: "x"),
|
|
592
|
+
Artefact.create!(slug: "broccoli", name: "Broccoli", kind: "guide", sections: ["vegetables"], need_ids: ["100001"], owning_app: "x")
|
|
523
593
|
]
|
|
524
594
|
@artefact.save!
|
|
525
595
|
@artefact.reload
|
|
@@ -541,9 +611,9 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
541
611
|
end
|
|
542
612
|
|
|
543
613
|
should "return related artefacts in order, with a scope" do
|
|
544
|
-
a = Artefact.create!(state: "live", slug: "a", name: "a", kind: "place",
|
|
545
|
-
b = Artefact.create!(slug: "b", name: "b", kind: "place",
|
|
546
|
-
c = Artefact.create!(state: "live", slug: "c", name: "c", kind: "place",
|
|
614
|
+
a = Artefact.create!(state: "live", slug: "a", name: "a", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
615
|
+
b = Artefact.create!(slug: "b", name: "b", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
616
|
+
c = Artefact.create!(state: "live", slug: "c", name: "c", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
547
617
|
|
|
548
618
|
@artefact.related_artefacts = [c,b,a]
|
|
549
619
|
@artefact.save!
|
|
@@ -563,8 +633,8 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
563
633
|
|
|
564
634
|
should "return all related artefacts in 'other' when an artefact has no sections" do
|
|
565
635
|
@artefact.related_artefacts = [
|
|
566
|
-
Artefact.create!(slug: "pear", name: "Pear", kind: "guide", sections: ["fruit/simple"],
|
|
567
|
-
Artefact.create!(slug: "banana", name: "Banana", kind: "guide", sections: ["fruit/simple"],
|
|
636
|
+
Artefact.create!(slug: "pear", name: "Pear", kind: "guide", sections: ["fruit/simple"], need_ids: ["100001"], owning_app: "x"),
|
|
637
|
+
Artefact.create!(slug: "banana", name: "Banana", kind: "guide", sections: ["fruit/simple"], need_ids: ["100001"], owning_app: "x")
|
|
568
638
|
]
|
|
569
639
|
|
|
570
640
|
assert_equal [], @artefact.related_artefacts_grouped_by_distance["subsection"]
|
|
@@ -577,8 +647,8 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
577
647
|
|
|
578
648
|
@artefact.primary_section = "fruit/multiple"
|
|
579
649
|
@artefact.related_artefacts = [
|
|
580
|
-
Artefact.create!(slug: "fig", name: "Fig", kind: "guide", sections: ["fruit/multiple"],
|
|
581
|
-
Artefact.create!(slug: "strawberry", name: "Strawberry", kind: "guide", sections: ["fruit/simple"],
|
|
650
|
+
Artefact.create!(slug: "fig", name: "Fig", kind: "guide", sections: ["fruit/multiple"], need_ids: ["100001"], owning_app: "x"),
|
|
651
|
+
Artefact.create!(slug: "strawberry", name: "Strawberry", kind: "guide", sections: ["fruit/simple"], need_ids: ["100001"], owning_app: "x")
|
|
582
652
|
]
|
|
583
653
|
@artefact.save!
|
|
584
654
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: govuk_content_models
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 10.1.
|
|
4
|
+
version: 10.1.1
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2014-04-
|
|
12
|
+
date: 2014-04-08 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: bson_ext
|
|
@@ -465,7 +465,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
465
465
|
version: '0'
|
|
466
466
|
segments:
|
|
467
467
|
- 0
|
|
468
|
-
hash: -
|
|
468
|
+
hash: -3442913868239428672
|
|
469
469
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
470
470
|
none: false
|
|
471
471
|
requirements:
|
|
@@ -474,7 +474,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
474
474
|
version: '0'
|
|
475
475
|
segments:
|
|
476
476
|
- 0
|
|
477
|
-
hash: -
|
|
477
|
+
hash: -3442913868239428672
|
|
478
478
|
requirements: []
|
|
479
479
|
rubyforge_project:
|
|
480
480
|
rubygems_version: 1.8.23
|