govuk_content_models 10.4.0 → 10.4.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 CHANGED
@@ -1,3 +1,7 @@
1
+ ## 10.4.1
2
+
3
+ * Fix tag validation; tags slugs may only contain `/` if they're a child tag.
4
+
1
5
  ## 10.4.0
2
6
 
3
7
  * Add support for updating existing attachments
@@ -1,17 +1,37 @@
1
1
  class TagIdValidator < ActiveModel::Validator
2
2
 
3
3
  def validate(record)
4
- unless valid_tag_id?(record.tag_id)
4
+ unless valid_tag_id?(record)
5
5
  record.errors[:tag_id] << "ID must be valid in a URL and have no more than one slash"
6
6
  end
7
7
  end
8
8
 
9
- private
9
+ private
10
10
 
11
- def valid_tag_id?(tag_id)
12
- tag_id.to_s.match(/\A[a-z0-9\-\/]+\Z/) &&
13
- tag_id.to_s.count('/') <= 1 &&
14
- ! tag_id.to_s.end_with?('/')
11
+ def valid_tag_id?(tag)
12
+ tag_contains_correct_characters(tag.tag_id) &&
13
+ tag_doesnt_end_with_slash(tag.tag_id) &&
14
+ tag_contains_correct_number_of_slashes(tag.tag_id, child?: tag_is_child_tag?(tag))
15
+ end
16
+
17
+ def tag_contains_correct_characters(tag_id)
18
+ tag_id =~ %r{^[a-z0-9/-]+$}
19
+ end
20
+
21
+ def tag_doesnt_end_with_slash(tag_id)
22
+ !tag_id.end_with?('/')
23
+ end
24
+
25
+ def tag_contains_correct_number_of_slashes(tag_id, options = {})
26
+ if options[:child?]
27
+ tag_id.count('/') <= 1
28
+ else
29
+ tag_id.count('/') == 0
30
+ end
31
+ end
32
+
33
+ def tag_is_child_tag?(tag)
34
+ tag.respond_to?(:parent_id) && tag.parent_id.present?
15
35
  end
16
36
 
17
37
  end
@@ -16,7 +16,7 @@ FactoryGirl.define do
16
16
  end
17
17
 
18
18
  factory :tag do
19
- sequence(:tag_id) { |n| "crime-and-justice/the-police-#{n}" }
19
+ sequence(:tag_id) { |n| "crime-and-justice-#{n}" }
20
20
  sequence(:title) { |n| "The title #{n}" }
21
21
  tag_type "section"
22
22
  end
@@ -1,4 +1,4 @@
1
1
  module GovukContentModels
2
2
  # Changing this causes Jenkins to tag and release the gem into the wild
3
- VERSION = "10.4.0"
3
+ VERSION = "10.4.1"
4
4
  end
@@ -2,18 +2,16 @@ require "test_helper"
2
2
 
3
3
  class ArtefactTagTest < ActiveSupport::TestCase
4
4
 
5
- TEST_SECTIONS = [
6
- ['crime', 'Crime'], ['crime/the-police', 'The Police'], ['crime/batman', 'Batman']
7
- ]
8
5
  TEST_KEYWORDS = [['cheese', 'Cheese'], ['bacon', 'Bacon']]
9
6
  TEST_LEGACY_SOURCES = [
10
7
  ['businesslink', 'Business Link'], ['directgov', 'Directgov'], ['dvla', 'DVLA']
11
8
  ]
12
9
 
13
10
  setup do
14
- TEST_SECTIONS.each do |tag_id, title|
15
- FactoryGirl.create(:tag, :tag_id => tag_id, :tag_type => 'section', :title => title)
16
- end
11
+ parent_section = FactoryGirl.create(:tag, :tag_id => 'crime', :tag_type => 'section', :title => 'Crime')
12
+ FactoryGirl.create(:tag, :tag_id => 'crime/the-police', :tag_type => 'section', :title => 'The Police', :parent_id => parent_section.id)
13
+ FactoryGirl.create(:tag, :tag_id => 'crime/batman', :tag_type => 'section', :title => 'Batman', :parent_id => parent_section.id)
14
+
17
15
  TEST_KEYWORDS.each do |tag_id, title|
18
16
  FactoryGirl.create(:tag, :tag_id => tag_id, :tag_type => 'keyword', :title => title)
19
17
  end
@@ -61,7 +61,7 @@ class ArtefactTest < ActiveSupport::TestCase
61
61
  a = FactoryGirl.build(:artefact, slug: "government/SomeThing/some.where/somehow/slug", kind: "case_study")
62
62
  refute a.valid?
63
63
  end
64
-
64
+
65
65
  should "require a government prefix for Inside Government artefacts" do
66
66
  a = FactoryGirl.build(:artefact, slug: "slug", kind: "case_study")
67
67
  refute a.valid?
@@ -648,20 +648,5 @@ class ArtefactTest < ActiveSupport::TestCase
648
648
  assert_equal [], @artefact.related_artefacts_grouped_by_distance["section"]
649
649
  assert_equal ["pear", "banana"], @artefact.related_artefacts_grouped_by_distance["other"].map(&:slug)
650
650
  end
651
-
652
- should "return no section level related artefacts if the primary section has no parent_id" do
653
- FactoryGirl.create(:tag, :tag_id => "fruit/multiple", :tag_type => 'section', :title => "Multiple fruits", :parent_id => nil)
654
-
655
- @artefact.primary_section = "fruit/multiple"
656
- @artefact.related_artefacts = [
657
- Artefact.create!(slug: "fig", name: "Fig", kind: "guide", sections: ["fruit/multiple"], need_ids: ["100001"], owning_app: "x"),
658
- Artefact.create!(slug: "strawberry", name: "Strawberry", kind: "guide", sections: ["fruit/simple"], need_ids: ["100001"], owning_app: "x")
659
- ]
660
- @artefact.save!
661
-
662
- assert_equal ["fig"], @artefact.related_artefacts_grouped_by_distance["subsection"].map(&:slug)
663
- assert_equal [], @artefact.related_artefacts_grouped_by_distance["section"]
664
- assert_equal ["strawberry"], @artefact.related_artefacts_grouped_by_distance["other"].map(&:slug)
665
- end
666
651
  end
667
652
  end
@@ -3,14 +3,13 @@ require 'test_helper'
3
3
  # This test relies on the fact that artefact uses the taggable module
4
4
  class TaggableTest < ActiveSupport::TestCase
5
5
 
6
- TEST_SECTIONS = [['crime', 'Crime'], ['crime/the-police', 'The Police'],
7
- ['crime/batman', 'Batman']]
8
6
  TEST_KEYWORDS = [['cheese', 'Cheese'], ['bacon', 'Bacon']]
9
7
 
10
8
  setup do
11
- TEST_SECTIONS.each do |tag_id, title|
12
- FactoryGirl.create(:tag, :tag_id => tag_id, :tag_type => 'section', :title => title)
13
- end
9
+ parent_section = FactoryGirl.create(:tag, :tag_id => 'crime', :tag_type => 'section', :title => 'Crime')
10
+ FactoryGirl.create(:tag, :tag_id => 'crime/the-police', :tag_type => 'section', :title => 'The Police', :parent_id => parent_section.id)
11
+ FactoryGirl.create(:tag, :tag_id => 'crime/batman', :tag_type => 'section', :title => 'Batman', :parent_id => parent_section.id)
12
+
14
13
  TEST_KEYWORDS.each do |tag_id, title|
15
14
  FactoryGirl.create(:tag, :tag_id => tag_id, :tag_type => 'keyword', :title => title)
16
15
  end
@@ -40,13 +40,19 @@ class TagIdValidatorTest < ActiveSupport::TestCase
40
40
  assert dummy.errors.has_key?(:tag_id)
41
41
  end
42
42
 
43
- should "permit a tag id containing a slash" do
44
- dummy = Dummy.new(tag_id: "parent-tag-id/child-tag-id")
43
+ should "permit a child tag id containing a slash" do
44
+ dummy = Dummy.new(tag_id: "parent-tag-id/child-tag-id", parent_id: 1)
45
45
  assert dummy.valid?
46
46
  end
47
47
 
48
- should "not permit more than one slash in a tag id" do
49
- dummy = Dummy.new(tag_id: "parent-tag-id/more/than/one/slash")
48
+ should "not permit a parent tag id containing a slash" do
49
+ dummy = Dummy.new(tag_id: "an-invalid/parent-tag-id", parent_id: nil)
50
+ refute dummy.valid?
51
+ assert dummy.errors.has_key?(:tag_id)
52
+ end
53
+
54
+ should "not permit a child tag id with more than one slash" do
55
+ dummy = Dummy.new(tag_id: "parent-tag-id/two/slashes", parent_id: 1)
50
56
  refute dummy.valid?
51
57
  assert dummy.errors.has_key?(:tag_id)
52
58
  end
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.4.0
4
+ version: 10.4.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-23 00:00:00.000000000 Z
12
+ date: 2014-04-24 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: 2179825358001692589
468
+ hash: 1806516958570881698
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: 2179825358001692589
477
+ hash: 1806516958570881698
478
478
  requirements: []
479
479
  rubyforge_project:
480
480
  rubygems_version: 1.8.23