govuk_content_models 41.1.1 → 42.0.0
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 +4 -4
- data/CHANGELOG.md +5 -0
- data/app/models/artefact.rb +0 -85
- data/app/models/edition.rb +1 -12
- data/app/validators/slug_validator.rb +0 -16
- data/lib/govuk_content_models/test_helpers/factories.rb +0 -18
- data/lib/govuk_content_models/version.rb +1 -1
- data/test/models/artefact_action_test.rb +0 -3
- data/test/models/artefact_test.rb +0 -205
- data/test/models/edition_test.rb +1 -82
- data/test/validators/slug_validator_test.rb +0 -18
- metadata +2 -24
- data/app/models/curated_list.rb +0 -28
- data/app/models/tag.rb +0 -113
- data/app/traits/taggable.rb +0 -99
- data/app/validators/browse_page_validator.rb +0 -9
- data/app/validators/tag_id_validator.rb +0 -37
- data/app/validators/topic_validator.rb +0 -14
- data/test/fixtures/contactotron_api_response.json +0 -1
- data/test/models/artefact_tag_test.rb +0 -50
- data/test/models/curated_list_test.rb +0 -32
- data/test/models/tag_test.rb +0 -188
- data/test/traits/taggable_test.rb +0 -132
- data/test/validators/browse_page_validator_test.rb +0 -34
- data/test/validators/tag_id_validator_test.rb +0 -66
- data/test/validators/topic_validator_test.rb +0 -48
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8bacf08397308954506f1db7f3367eff5bb87825
|
|
4
|
+
data.tar.gz: d87f23b5972b468378aeb9085dc3241ffe2de61f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 74dcfde7b33e6dfd7b17af36967cfe065fe299a79c74e6d1d4024e0d100eacfbcaa4504b8f3a3d1bbf107b9bcfae117050da7181c6fa5a1a975ed97c44cca180
|
|
7
|
+
data.tar.gz: d0df800cf739c23c95372ce124df316b08d0a5feac079a4d90ce1e5cb167c235bb6c17ac11dc91fe182c346851923ed1d72cc909bcb52ae755012605b532876b
|
data/CHANGELOG.md
CHANGED
data/app/models/artefact.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
require "plek"
|
|
2
|
-
require "traits/taggable"
|
|
3
2
|
require "artefact_action" # Require this when running outside Rails
|
|
4
3
|
require_dependency "safe_html"
|
|
5
4
|
|
|
@@ -15,11 +14,6 @@ class Artefact
|
|
|
15
14
|
include Mongoid::Document
|
|
16
15
|
include Mongoid::Timestamps
|
|
17
16
|
|
|
18
|
-
include Taggable
|
|
19
|
-
stores_tags_for :sections, :writing_teams, :propositions,
|
|
20
|
-
:keywords, :specialist_sectors, :organisations
|
|
21
|
-
has_primary_tag_for :section
|
|
22
|
-
|
|
23
17
|
field "name", type: String
|
|
24
18
|
field "slug", type: String
|
|
25
19
|
field "paths", type: Array, default: []
|
|
@@ -60,8 +54,6 @@ class Artefact
|
|
|
60
54
|
|
|
61
55
|
scope :not_archived, lambda { where(:state.nin => ["archived"]) }
|
|
62
56
|
|
|
63
|
-
MAXIMUM_RELATED_ITEMS = 8
|
|
64
|
-
|
|
65
57
|
FORMATS_BY_DEFAULT_OWNING_APP = {
|
|
66
58
|
"publisher" => ["answer",
|
|
67
59
|
"business_support",
|
|
@@ -124,7 +116,6 @@ class Artefact
|
|
|
124
116
|
"world_location_news_article",
|
|
125
117
|
"worldwide_priority",
|
|
126
118
|
"written_statement"],
|
|
127
|
-
"panopticon" => ["specialist_sector"],
|
|
128
119
|
}.freeze
|
|
129
120
|
|
|
130
121
|
FORMATS = FORMATS_BY_DEFAULT_OWNING_APP.values.flatten
|
|
@@ -141,7 +132,6 @@ class Artefact
|
|
|
141
132
|
"find my nearest" => "place",
|
|
142
133
|
}.tap { |h| h.default_proc = -> _, k { k } }.freeze
|
|
143
134
|
|
|
144
|
-
has_and_belongs_to_many :related_artefacts, class_name: "Artefact"
|
|
145
135
|
embeds_many :actions, class_name: "ArtefactAction", order: { created_at: :asc }
|
|
146
136
|
|
|
147
137
|
embeds_many :external_links, class_name: "ArtefactExternalLink"
|
|
@@ -165,11 +155,6 @@ class Artefact
|
|
|
165
155
|
validate :format_of_new_need_ids, if: :need_ids_changed?
|
|
166
156
|
validate :validate_redirect_url
|
|
167
157
|
|
|
168
|
-
scope :relatable_items, proc {
|
|
169
|
-
where(:kind.ne => "completed_transaction", :state.ne => "archived")
|
|
170
|
-
.order_by(name: :asc)
|
|
171
|
-
}
|
|
172
|
-
|
|
173
158
|
def self.in_alphabetical_order
|
|
174
159
|
order_by(name: :asc)
|
|
175
160
|
end
|
|
@@ -178,16 +163,6 @@ class Artefact
|
|
|
178
163
|
where(slug: s).first
|
|
179
164
|
end
|
|
180
165
|
|
|
181
|
-
# The old-style section string identifier, of the form 'Crime:Prisons'
|
|
182
|
-
def section
|
|
183
|
-
return '' unless self.primary_section
|
|
184
|
-
if primary_section.parent
|
|
185
|
-
[primary_section.parent.title, primary_section.title].join ':'
|
|
186
|
-
else
|
|
187
|
-
primary_section.title
|
|
188
|
-
end
|
|
189
|
-
end
|
|
190
|
-
|
|
191
166
|
# Fallback to english if no language is present
|
|
192
167
|
def language
|
|
193
168
|
attributes['language'] || "en"
|
|
@@ -204,69 +179,12 @@ class Artefact
|
|
|
204
179
|
].reject(&:blank?).join("?")
|
|
205
180
|
end
|
|
206
181
|
|
|
207
|
-
# TODO: Replace this nonsense with a proper API layer.
|
|
208
182
|
def as_json(options={})
|
|
209
183
|
super.tap { |hash|
|
|
210
|
-
if hash["tag_ids"]
|
|
211
|
-
hash["tags"] = Tag.by_tag_ids(hash["tag_ids"]).map(&:as_json)
|
|
212
|
-
else
|
|
213
|
-
hash["tag_ids"] = []
|
|
214
|
-
hash["tags"] = []
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
if self.primary_section
|
|
218
|
-
hash['primary_section'] = self.primary_section.tag_id
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
unless options[:ignore_related_artefacts]
|
|
222
|
-
hash["related_items"] = published_related_artefacts.map do |a|
|
|
223
|
-
{"artefact" => a.as_json(ignore_related_artefacts: true)}
|
|
224
|
-
end
|
|
225
|
-
end
|
|
226
|
-
hash.delete("related_artefacts")
|
|
227
|
-
hash.delete("related_artefact_ids")
|
|
228
184
|
hash["id"] = hash.delete("_id")
|
|
229
|
-
|
|
230
|
-
# Add a section identifier if needed
|
|
231
|
-
hash["section"] ||= section
|
|
232
185
|
}
|
|
233
186
|
end
|
|
234
187
|
|
|
235
|
-
def published_related_artefacts
|
|
236
|
-
related_artefacts.select do |related_artefact|
|
|
237
|
-
if related_artefact.owning_app == "publisher"
|
|
238
|
-
related_artefact.any_editions_published?
|
|
239
|
-
else
|
|
240
|
-
true
|
|
241
|
-
end
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
# Pass in the desired scope, eg self.related_artefacts.live,
|
|
246
|
-
# get back the items in the order they were set in, rather than natural order
|
|
247
|
-
def ordered_related_artefacts(scope_or_array = self.related_artefacts)
|
|
248
|
-
scope_or_array.sort_by { |artefact| related_artefact_ids.index(artefact.id) }
|
|
249
|
-
end
|
|
250
|
-
|
|
251
|
-
def related_artefacts_grouped_by_distance(scope_or_array = self.related_artefacts)
|
|
252
|
-
groups = { "subsection" => [], "section" => [], "other" => [] }
|
|
253
|
-
scoped_artefacts = ordered_related_artefacts(scope_or_array)
|
|
254
|
-
|
|
255
|
-
if primary_tag = self.primary_section
|
|
256
|
-
groups['subsection'] = scoped_artefacts.select {|a| a.tag_ids.include?(primary_tag.tag_id) }
|
|
257
|
-
|
|
258
|
-
if primary_tag.parent_id.present?
|
|
259
|
-
pattern = Regexp.new "^#{Regexp.quote(primary_tag.parent_id)}\/.+"
|
|
260
|
-
groups['section'] = scoped_artefacts.reject {|a| groups['subsection'].include?(a) }.select {|a|
|
|
261
|
-
a.tag_ids.grep(pattern).count > 0
|
|
262
|
-
}
|
|
263
|
-
end
|
|
264
|
-
end
|
|
265
|
-
groups['other'] = scoped_artefacts.reject {|a| (groups['subsection'] + groups['section']).include?(a) }
|
|
266
|
-
|
|
267
|
-
groups
|
|
268
|
-
end
|
|
269
|
-
|
|
270
188
|
def any_editions_published?
|
|
271
189
|
Edition.where(panopticon_id: self.id, state: 'published').any?
|
|
272
190
|
end
|
|
@@ -370,9 +288,6 @@ class Artefact
|
|
|
370
288
|
def snapshot
|
|
371
289
|
attributes
|
|
372
290
|
.except("_id", "created_at", "updated_at", "actions")
|
|
373
|
-
.merge(
|
|
374
|
-
"related_artefact_ids" => self.related_artefact_ids
|
|
375
|
-
)
|
|
376
291
|
end
|
|
377
292
|
|
|
378
293
|
def need_id=(new_need_id)
|
data/app/models/edition.rb
CHANGED
|
@@ -18,10 +18,6 @@ class Edition
|
|
|
18
18
|
field :slug, type: String
|
|
19
19
|
field :rejected_count, type: Integer, default: 0
|
|
20
20
|
|
|
21
|
-
field :browse_pages, type: Array, default: []
|
|
22
|
-
field :primary_topic, type: String
|
|
23
|
-
field :additional_topics, type: Array, default: []
|
|
24
|
-
|
|
25
21
|
field :assignee, type: String
|
|
26
22
|
field :reviewer, type: String
|
|
27
23
|
field :creator, type: String
|
|
@@ -53,7 +49,7 @@ class Edition
|
|
|
53
49
|
validates :panopticon_id, presence: true
|
|
54
50
|
validates_with SafeHtml
|
|
55
51
|
validates_with LinkValidator, on: :update, unless: :archived?
|
|
56
|
-
validates_with
|
|
52
|
+
validates_with ReviewerValidator
|
|
57
53
|
validates_presence_of :change_note, if: :major_change
|
|
58
54
|
|
|
59
55
|
before_save :check_for_archived_artefact
|
|
@@ -252,10 +248,6 @@ class Edition
|
|
|
252
248
|
end
|
|
253
249
|
end
|
|
254
250
|
|
|
255
|
-
def panopticon_uri
|
|
256
|
-
Plek.current.find("panopticon") + "/artefacts/" + (panopticon_id || slug).to_s
|
|
257
|
-
end
|
|
258
|
-
|
|
259
251
|
def format
|
|
260
252
|
self.class.to_s.gsub("Edition", "")
|
|
261
253
|
end
|
|
@@ -332,9 +324,6 @@ private
|
|
|
332
324
|
:panopticon_id,
|
|
333
325
|
:overview,
|
|
334
326
|
:slug,
|
|
335
|
-
:browse_pages,
|
|
336
|
-
:primary_topic,
|
|
337
|
-
:additional_topics,
|
|
338
327
|
]
|
|
339
328
|
end
|
|
340
329
|
|
|
@@ -8,7 +8,6 @@ class SlugValidator < ActiveModel::EachValidator
|
|
|
8
8
|
FinderEmailSignupValidator,
|
|
9
9
|
GovernmentPageValidator,
|
|
10
10
|
ManualPageValidator,
|
|
11
|
-
BrowsePageValidator,
|
|
12
11
|
DetailedGuideValidator,
|
|
13
12
|
DefaultValidator
|
|
14
13
|
].map { |klass| klass.new(record, attribute, value) }
|
|
@@ -147,21 +146,6 @@ protected
|
|
|
147
146
|
end
|
|
148
147
|
end
|
|
149
148
|
|
|
150
|
-
class BrowsePageValidator < InstanceValidator
|
|
151
|
-
def applicable?
|
|
152
|
-
of_kind?('specialist_sector')
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
def validate!
|
|
156
|
-
unless [1, 2].include?(url_parts.size)
|
|
157
|
-
record.errors[attribute] << "must contains one or two path parts"
|
|
158
|
-
end
|
|
159
|
-
unless url_parts.all? { |url_part| valid_slug?(url_part) }
|
|
160
|
-
record.errors[attribute] << "must be usable in a URL"
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
|
|
165
149
|
class DetailedGuideValidator < InstanceValidator
|
|
166
150
|
def applicable?
|
|
167
151
|
of_kind?('detailed_guide')
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require "factory_girl"
|
|
2
2
|
require "answer_edition"
|
|
3
3
|
require "artefact"
|
|
4
|
-
require "tag"
|
|
5
4
|
require "user"
|
|
6
5
|
|
|
7
6
|
FactoryGirl.define do
|
|
@@ -26,23 +25,6 @@ FactoryGirl.define do
|
|
|
26
25
|
artefact
|
|
27
26
|
end
|
|
28
27
|
|
|
29
|
-
factory :tag do
|
|
30
|
-
sequence(:tag_id) { |n| "crime-and-justice-#{n}" }
|
|
31
|
-
sequence(:title) { |n| "The title #{n}" }
|
|
32
|
-
tag_type "section"
|
|
33
|
-
|
|
34
|
-
trait :draft do
|
|
35
|
-
state "draft"
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
trait :live do
|
|
39
|
-
state "live"
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
factory :draft_tag, traits: [:draft]
|
|
43
|
-
factory :live_tag, traits: [:live]
|
|
44
|
-
end
|
|
45
|
-
|
|
46
28
|
factory :artefact do
|
|
47
29
|
sequence(:name) { |n| "Artefact #{n}" }
|
|
48
30
|
sequence(:slug) { |n| "slug-#{n}" }
|
|
@@ -19,11 +19,8 @@ class ArtefactActionTest < ActiveSupport::TestCase
|
|
|
19
19
|
|
|
20
20
|
DEFAULTS = {
|
|
21
21
|
"active" => false,
|
|
22
|
-
"tag_ids" => [],
|
|
23
|
-
"tags" => [],
|
|
24
22
|
"need_ids" => [],
|
|
25
23
|
"state" => "draft",
|
|
26
|
-
"related_artefact_ids" => [],
|
|
27
24
|
"paths" => [],
|
|
28
25
|
"prefixes" => [],
|
|
29
26
|
"language" => "en",
|
|
@@ -272,63 +272,6 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
272
272
|
assert_equal "other", a.kind
|
|
273
273
|
end
|
|
274
274
|
|
|
275
|
-
test "should store and return related artefacts in order" do
|
|
276
|
-
a = Artefact.create!(slug: "a", name: "a", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
277
|
-
b = Artefact.create!(slug: "b", name: "b", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
278
|
-
c = Artefact.create!(slug: "c", name: "c", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
279
|
-
|
|
280
|
-
a.related_artefacts = [b, c]
|
|
281
|
-
a.save!
|
|
282
|
-
a.reload
|
|
283
|
-
|
|
284
|
-
assert_equal [b, c], a.ordered_related_artefacts
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
test "should store and return related artefacts in order, even when not in natural order" do
|
|
288
|
-
a = Artefact.create!(slug: "a", name: "a", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
289
|
-
b = Artefact.create!(slug: "b", name: "b", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
290
|
-
c = Artefact.create!(slug: "c", name: "c", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
291
|
-
|
|
292
|
-
a.related_artefacts = [c, b]
|
|
293
|
-
a.save!
|
|
294
|
-
a.reload
|
|
295
|
-
|
|
296
|
-
assert_equal [c, b], a.ordered_related_artefacts
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
test "should store and return related artefacts in order, with a scope" do
|
|
300
|
-
a = Artefact.create!(slug: "a", name: "a", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
301
|
-
b = Artefact.create!(state: "live", slug: "b", name: "b", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
302
|
-
c = Artefact.create!(slug: "c", name: "c", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
303
|
-
d = Artefact.create!(state: "live", slug: "d", name: "d", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
304
|
-
|
|
305
|
-
a.related_artefacts = [d, c, b]
|
|
306
|
-
a.save!
|
|
307
|
-
a.reload
|
|
308
|
-
|
|
309
|
-
assert_equal [d, b], a.ordered_related_artefacts(a.related_artefacts.where(state: "live"))
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
test "published_related_artefacts should return all non-publisher artefacts, but only published publisher artefacts" do
|
|
313
|
-
# because currently only publisher has an idea of "published"
|
|
314
|
-
|
|
315
|
-
parent = Artefact.create!(slug: "parent", name: "Parent", kind: "guide", owning_app: "x")
|
|
316
|
-
|
|
317
|
-
a = Artefact.create!(slug: "a", name: "has no published editions", kind: "guide", owning_app: "publisher")
|
|
318
|
-
GuideEdition.create!(panopticon_id: a.id, title: "Unpublished", state: "draft")
|
|
319
|
-
parent.related_artefacts << a
|
|
320
|
-
|
|
321
|
-
b = Artefact.create!(slug: "b", name: "has a published edition", kind: "guide", owning_app: "publisher")
|
|
322
|
-
GuideEdition.create!(panopticon_id: b.id, title: "Published", state: "published")
|
|
323
|
-
parent.related_artefacts << b
|
|
324
|
-
|
|
325
|
-
c = Artefact.create!(slug: "c", name: "not a publisher artefact", kind: "place", owning_app: "x")
|
|
326
|
-
parent.related_artefacts << c
|
|
327
|
-
parent.save!
|
|
328
|
-
|
|
329
|
-
assert_equal [b.slug, c.slug], parent.published_related_artefacts.map(&:slug)
|
|
330
|
-
end
|
|
331
|
-
|
|
332
275
|
test "should raise a not found exception if the slug doesn't match" do
|
|
333
276
|
assert_raise Mongoid::Errors::DocumentNotFound do
|
|
334
277
|
Artefact.from_param("something-fake")
|
|
@@ -398,13 +341,10 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
398
341
|
# should continue to work in the way it has been:
|
|
399
342
|
# i.e. you can edit everything but the name/title for published content in panop
|
|
400
343
|
test "on save title should not be applied to already published content" do
|
|
401
|
-
FactoryGirl.create(:live_tag, tag_id: "test-section", title: "Test section", tag_type: "section")
|
|
402
344
|
artefact = FactoryGirl.create(:artefact,
|
|
403
345
|
slug: "foo-bar",
|
|
404
346
|
kind: "answer",
|
|
405
347
|
name: "Foo bar",
|
|
406
|
-
primary_section: "test-section",
|
|
407
|
-
sections: ["test-section"],
|
|
408
348
|
owning_app: "publisher",
|
|
409
349
|
)
|
|
410
350
|
|
|
@@ -532,72 +472,6 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
532
472
|
end
|
|
533
473
|
end
|
|
534
474
|
|
|
535
|
-
context "returning json representation" do
|
|
536
|
-
context "returning tags" do
|
|
537
|
-
setup do
|
|
538
|
-
FactoryGirl.create(:live_tag, :tag_type => 'section', :tag_id => 'crime', :title => 'Crime')
|
|
539
|
-
FactoryGirl.create(:live_tag, :tag_type => 'section', :tag_id => 'justice', :title => 'Justice', :description => "All about justice")
|
|
540
|
-
@a = FactoryGirl.create(:artefact, :slug => 'fooey')
|
|
541
|
-
end
|
|
542
|
-
|
|
543
|
-
should "return empty array of tags and tag_ids" do
|
|
544
|
-
hash = @a.as_json
|
|
545
|
-
|
|
546
|
-
assert_equal [], hash['tag_ids']
|
|
547
|
-
assert_equal [], hash['tags']
|
|
548
|
-
end
|
|
549
|
-
|
|
550
|
-
context "for an artefact with tags" do
|
|
551
|
-
setup do
|
|
552
|
-
@a.sections = ['justice']
|
|
553
|
-
@a.save!
|
|
554
|
-
end
|
|
555
|
-
|
|
556
|
-
should "return an array of tag_id strings in tag_ids" do
|
|
557
|
-
hash = @a.as_json
|
|
558
|
-
|
|
559
|
-
assert_equal ['justice'], hash['tag_ids']
|
|
560
|
-
end
|
|
561
|
-
|
|
562
|
-
should "return an array of tag objects in tags" do
|
|
563
|
-
hash = @a.as_json
|
|
564
|
-
|
|
565
|
-
expected = [
|
|
566
|
-
{
|
|
567
|
-
:id => 'justice',
|
|
568
|
-
:title => 'Justice',
|
|
569
|
-
:type => 'section',
|
|
570
|
-
:description => 'All about justice',
|
|
571
|
-
:short_description => nil
|
|
572
|
-
},
|
|
573
|
-
]
|
|
574
|
-
assert_equal expected, hash['tags']
|
|
575
|
-
end
|
|
576
|
-
|
|
577
|
-
should "omit non-existent tags referenced from the tag_ids array" do
|
|
578
|
-
@a.tag_ids << 'batman'
|
|
579
|
-
hash = @a.as_json
|
|
580
|
-
|
|
581
|
-
assert_equal %w(justice), hash['tags'].map {|t| t[:id] }
|
|
582
|
-
end
|
|
583
|
-
end
|
|
584
|
-
end
|
|
585
|
-
end
|
|
586
|
-
|
|
587
|
-
context "artefact related external links" do
|
|
588
|
-
should "have none by default" do
|
|
589
|
-
artefact = FactoryGirl.create(:artefact)
|
|
590
|
-
assert_equal 0, artefact.external_links.length
|
|
591
|
-
end
|
|
592
|
-
|
|
593
|
-
should "contain the title and URL of the link" do
|
|
594
|
-
artefact = FactoryGirl.create(:artefact)
|
|
595
|
-
artefact.external_links << ArtefactExternalLink.new(:title => "Foo", :url => "http://bar.com")
|
|
596
|
-
assert_equal 1, artefact.external_links.length
|
|
597
|
-
assert_equal "Foo", artefact.external_links.first.title
|
|
598
|
-
end
|
|
599
|
-
end
|
|
600
|
-
|
|
601
475
|
should "have an archived? helper method" do
|
|
602
476
|
published_artefact = FactoryGirl.create(:artefact, :slug => "scooby", :state => "live")
|
|
603
477
|
archived_artefact = FactoryGirl.create(:artefact, :slug => "doo", :state => "archived")
|
|
@@ -605,83 +479,4 @@ class ArtefactTest < ActiveSupport::TestCase
|
|
|
605
479
|
refute published_artefact.archived?
|
|
606
480
|
assert archived_artefact.archived?
|
|
607
481
|
end
|
|
608
|
-
|
|
609
|
-
should "have a related_items method which discards artefacts that are archived or completed transactions" do
|
|
610
|
-
generic = FactoryGirl.create(:artefact, slug: "generic")
|
|
611
|
-
archived = FactoryGirl.create(:artefact, :slug => "archived", :state => "archived")
|
|
612
|
-
completed = FactoryGirl.create(:artefact, slug: "completed-transaction", kind: "completed_transaction")
|
|
613
|
-
|
|
614
|
-
assert_equal [generic], Artefact.relatable_items
|
|
615
|
-
end
|
|
616
|
-
|
|
617
|
-
context "related artefacts grouped by section tags" do
|
|
618
|
-
setup do
|
|
619
|
-
FactoryGirl.create(:live_tag, :tag_id => "fruit", :tag_type => 'section', :title => "Fruit")
|
|
620
|
-
FactoryGirl.create(:live_tag, :tag_id => "fruit/simple", :tag_type => 'section', :title => "Simple fruits", :parent_id => "fruit")
|
|
621
|
-
FactoryGirl.create(:live_tag, :tag_id => "fruit/aggregate", :tag_type => 'section', :title => "Aggregrate fruits", :parent_id => "fruit")
|
|
622
|
-
FactoryGirl.create(:live_tag, :tag_id => "vegetables", :tag_type => 'section', :title => "Vegetables")
|
|
623
|
-
|
|
624
|
-
@artefact = Artefact.create!(slug: "apple", name: "Apple", sections: [], kind: "guide", need_ids: ["100001"], owning_app: "x")
|
|
625
|
-
end
|
|
626
|
-
|
|
627
|
-
context "when related items are present in all groups" do
|
|
628
|
-
setup do
|
|
629
|
-
@artefact.sections = ["fruit/simple"]
|
|
630
|
-
|
|
631
|
-
@artefact.related_artefacts = [
|
|
632
|
-
Artefact.create!(slug: "pear", name: "Pear", kind: "guide", sections: ["fruit/simple"], need_ids: ["100001"], owning_app: "x"),
|
|
633
|
-
Artefact.create!(slug: "pineapple", name: "Pineapple", kind: "guide", sections: ["fruit/aggregate"], need_ids: ["100001"], owning_app: "x"),
|
|
634
|
-
Artefact.create!(slug: "broccoli", name: "Broccoli", kind: "guide", sections: ["vegetables"], need_ids: ["100001"], owning_app: "x")
|
|
635
|
-
]
|
|
636
|
-
@artefact.save!
|
|
637
|
-
@artefact.reload
|
|
638
|
-
end
|
|
639
|
-
|
|
640
|
-
should "return a hash of artefacts in the same subsection" do
|
|
641
|
-
artefacts = @artefact.related_artefacts_grouped_by_distance
|
|
642
|
-
assert_equal ["pear"], artefacts['subsection'].map(&:slug)
|
|
643
|
-
end
|
|
644
|
-
|
|
645
|
-
should "return a hash of other artefacts in the same parent section" do
|
|
646
|
-
artefacts = @artefact.related_artefacts_grouped_by_distance
|
|
647
|
-
assert_equal ["pineapple"], artefacts['section'].map(&:slug)
|
|
648
|
-
end
|
|
649
|
-
|
|
650
|
-
should "return a hash of artefacts in other sections" do
|
|
651
|
-
artefacts = @artefact.related_artefacts_grouped_by_distance
|
|
652
|
-
assert_equal ["broccoli"], artefacts['other'].map(&:slug)
|
|
653
|
-
end
|
|
654
|
-
|
|
655
|
-
should "return related artefacts in order, with a scope" do
|
|
656
|
-
a = Artefact.create!(state: "live", slug: "a", name: "a", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
657
|
-
b = Artefact.create!(slug: "b", name: "b", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
658
|
-
c = Artefact.create!(state: "live", slug: "c", name: "c", kind: "place", need_ids: ["100001"], owning_app: "x")
|
|
659
|
-
|
|
660
|
-
@artefact.related_artefacts = [c,b,a]
|
|
661
|
-
@artefact.save!
|
|
662
|
-
@artefact.reload
|
|
663
|
-
|
|
664
|
-
assert_equal [c, a], @artefact.related_artefacts_grouped_by_distance(@artefact.related_artefacts.where(state: "live"))["other"]
|
|
665
|
-
end
|
|
666
|
-
end
|
|
667
|
-
|
|
668
|
-
should "return an empty array for a group with no related artefacts" do
|
|
669
|
-
# @artefact with no related items created in setup block
|
|
670
|
-
|
|
671
|
-
assert_equal [], @artefact.related_artefacts_grouped_by_distance["subsection"]
|
|
672
|
-
assert_equal [], @artefact.related_artefacts_grouped_by_distance["section"]
|
|
673
|
-
assert_equal [], @artefact.related_artefacts_grouped_by_distance["other"]
|
|
674
|
-
end
|
|
675
|
-
|
|
676
|
-
should "return all related artefacts in 'other' when an artefact has no sections" do
|
|
677
|
-
@artefact.related_artefacts = [
|
|
678
|
-
Artefact.create!(slug: "pear", name: "Pear", kind: "guide", sections: ["fruit/simple"], need_ids: ["100001"], owning_app: "x"),
|
|
679
|
-
Artefact.create!(slug: "banana", name: "Banana", kind: "guide", sections: ["fruit/simple"], need_ids: ["100001"], owning_app: "x")
|
|
680
|
-
]
|
|
681
|
-
|
|
682
|
-
assert_equal [], @artefact.related_artefacts_grouped_by_distance["subsection"]
|
|
683
|
-
assert_equal [], @artefact.related_artefacts_grouped_by_distance["section"]
|
|
684
|
-
assert_equal ["pear", "banana"], @artefact.related_artefacts_grouped_by_distance["other"].map(&:slug)
|
|
685
|
-
end
|
|
686
|
-
end
|
|
687
482
|
end
|
data/test/models/edition_test.rb
CHANGED
|
@@ -14,8 +14,6 @@ class EditionTest < ActiveSupport::TestCase
|
|
|
14
14
|
artefact = FactoryGirl.create(:artefact,
|
|
15
15
|
kind: "answer",
|
|
16
16
|
name: "Foo bar",
|
|
17
|
-
# primary_section: "test-section",
|
|
18
|
-
# sections: ["test-section"],
|
|
19
17
|
owning_app: "publisher")
|
|
20
18
|
|
|
21
19
|
AnswerEdition.create(state: "ready", slug: "childcare", panopticon_id: artefact.id,
|
|
@@ -490,13 +488,10 @@ class EditionTest < ActiveSupport::TestCase
|
|
|
490
488
|
end
|
|
491
489
|
|
|
492
490
|
test "should not change edition metadata if archived" do
|
|
493
|
-
FactoryGirl.create(:live_tag, tag_id: "test-section", title: "Test section", tag_type: "section")
|
|
494
491
|
artefact = FactoryGirl.create(:artefact,
|
|
495
492
|
slug: "foo-bar",
|
|
496
493
|
kind: "answer",
|
|
497
494
|
name: "Foo bar",
|
|
498
|
-
primary_section: "test-section",
|
|
499
|
-
sections: ["test-section"],
|
|
500
495
|
owning_app: "publisher",
|
|
501
496
|
)
|
|
502
497
|
|
|
@@ -588,9 +583,6 @@ class EditionTest < ActiveSupport::TestCase
|
|
|
588
583
|
end
|
|
589
584
|
|
|
590
585
|
test "should also delete associated artefact" do
|
|
591
|
-
|
|
592
|
-
FactoryGirl.create(:live_tag, tag_id: "test-section", title: "Test section", tag_type: "section")
|
|
593
|
-
|
|
594
586
|
user1 = FactoryGirl.create(:user)
|
|
595
587
|
edition = AnswerEdition.find_or_create_from_panopticon_data(@artefact.id, user1)
|
|
596
588
|
|
|
@@ -600,8 +592,6 @@ class EditionTest < ActiveSupport::TestCase
|
|
|
600
592
|
end
|
|
601
593
|
|
|
602
594
|
test "should not delete associated artefact if there are other editions of this publication" do
|
|
603
|
-
|
|
604
|
-
FactoryGirl.create(:live_tag, tag_id: "test-section", title: "Test section", tag_type: "section")
|
|
605
595
|
user1 = FactoryGirl.create(:user)
|
|
606
596
|
edition = AnswerEdition.find_or_create_from_panopticon_data(@artefact.id, user1)
|
|
607
597
|
edition.update_attribute(:state, "published")
|
|
@@ -924,13 +914,10 @@ class EditionTest < ActiveSupport::TestCase
|
|
|
924
914
|
|
|
925
915
|
test "should denormalise a creator's name when an edition is created" do
|
|
926
916
|
user = FactoryGirl.create(:user)
|
|
927
|
-
FactoryGirl.create(:live_tag, tag_id: "test-section", title: "Test section", tag_type: "section")
|
|
928
917
|
artefact = FactoryGirl.create(:artefact,
|
|
929
918
|
slug: "foo-bar",
|
|
930
919
|
kind: "answer",
|
|
931
920
|
name: "Foo bar",
|
|
932
|
-
primary_section: "test-section",
|
|
933
|
-
sections: ["test-section"],
|
|
934
921
|
owning_app: "publisher",
|
|
935
922
|
)
|
|
936
923
|
|
|
@@ -1020,7 +1007,7 @@ class EditionTest < ActiveSupport::TestCase
|
|
|
1020
1007
|
end
|
|
1021
1008
|
end
|
|
1022
1009
|
|
|
1023
|
-
test "should return
|
|
1010
|
+
test "should return the artefact" do
|
|
1024
1011
|
assert_equal "Foo bar", template_published_answer.artefact.name
|
|
1025
1012
|
end
|
|
1026
1013
|
|
|
@@ -1093,74 +1080,6 @@ class EditionTest < ActiveSupport::TestCase
|
|
|
1093
1080
|
end
|
|
1094
1081
|
end
|
|
1095
1082
|
|
|
1096
|
-
context "Tagging to collections" do
|
|
1097
|
-
setup do
|
|
1098
|
-
@edition = FactoryGirl.create(:guide_edition)
|
|
1099
|
-
end
|
|
1100
|
-
|
|
1101
|
-
should "allow tagging to browse pages" do
|
|
1102
|
-
sample_browse_pages = [
|
|
1103
|
-
'education/school-admissions-transport',
|
|
1104
|
-
'driving/drivers-lorries-buses'
|
|
1105
|
-
]
|
|
1106
|
-
|
|
1107
|
-
@edition.browse_pages = sample_browse_pages
|
|
1108
|
-
@edition.save!; @edition.reload
|
|
1109
|
-
|
|
1110
|
-
assert_equal sample_browse_pages, @edition.browse_pages
|
|
1111
|
-
end
|
|
1112
|
-
|
|
1113
|
-
should "allow tagging to a primary topic" do
|
|
1114
|
-
sample_primary_topic = 'oil-and-gas/carbon-capture-and-storage'
|
|
1115
|
-
|
|
1116
|
-
@edition.primary_topic = sample_primary_topic
|
|
1117
|
-
@edition.save!; @edition.reload
|
|
1118
|
-
|
|
1119
|
-
assert_equal sample_primary_topic, @edition.primary_topic
|
|
1120
|
-
end
|
|
1121
|
-
|
|
1122
|
-
should "allow tagging to multiple additional topics" do
|
|
1123
|
-
sample_additional_topics = [
|
|
1124
|
-
'oil-and-gas/fields-and-wells',
|
|
1125
|
-
'oil-and-gas/licensing'
|
|
1126
|
-
]
|
|
1127
|
-
|
|
1128
|
-
@edition.additional_topics = sample_additional_topics
|
|
1129
|
-
@edition.save!; @edition.reload
|
|
1130
|
-
|
|
1131
|
-
assert_equal sample_additional_topics, @edition.additional_topics
|
|
1132
|
-
end
|
|
1133
|
-
|
|
1134
|
-
should "validates topics" do
|
|
1135
|
-
assert_includes Edition.validators.map(&:class), TopicValidator
|
|
1136
|
-
end
|
|
1137
|
-
|
|
1138
|
-
should "validates browse pages" do
|
|
1139
|
-
assert_includes Edition.validators.map(&:class), BrowsePageValidator
|
|
1140
|
-
end
|
|
1141
|
-
|
|
1142
|
-
should "retain collections across new editions" do
|
|
1143
|
-
edition = FactoryGirl.create(:guide_edition,
|
|
1144
|
-
panopticon_id: @artefact.id,
|
|
1145
|
-
state: "published",
|
|
1146
|
-
primary_topic: 'oil-and-gas/carbon-capture-and-storage',
|
|
1147
|
-
additional_topics: [
|
|
1148
|
-
'oil-and-gas/fields-and-wells',
|
|
1149
|
-
'oil-and-gas/licensing'
|
|
1150
|
-
],
|
|
1151
|
-
browse_pages: [
|
|
1152
|
-
'education/school-admissions-transport',
|
|
1153
|
-
'driving/drivers-lorries-buses'
|
|
1154
|
-
]
|
|
1155
|
-
)
|
|
1156
|
-
|
|
1157
|
-
new_edition = edition.build_clone
|
|
1158
|
-
assert_equal edition.primary_topic, new_edition.primary_topic
|
|
1159
|
-
assert_equal edition.additional_topics, new_edition.additional_topics
|
|
1160
|
-
assert_equal edition.browse_pages, new_edition.browse_pages
|
|
1161
|
-
end
|
|
1162
|
-
end
|
|
1163
|
-
|
|
1164
1083
|
context "#latest_major_update" do
|
|
1165
1084
|
should 'return the most recent published edition with a major change' do
|
|
1166
1085
|
edition1 = FactoryGirl.create(:answer_edition, major_change: true,
|