govuk_content_models 9.0.1 → 10.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +4 -0
- data/app/models/tag.rb +3 -0
- data/app/validators/tag_id_validator.rb +17 -0
- data/lib/govuk_content_models/version.rb +1 -1
- data/test/models/tag_test.rb +14 -0
- data/test/validators/tag_id_validator_test.rb +60 -0
- metadata +7 -4
data/CHANGELOG.md
CHANGED
data/app/models/tag.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "safe_html"
|
2
|
+
require 'tag_id_validator'
|
2
3
|
|
3
4
|
class Tag
|
4
5
|
include Mongoid::Document
|
@@ -17,6 +18,8 @@ class Tag
|
|
17
18
|
index :tag_type
|
18
19
|
|
19
20
|
validates_presence_of :tag_id, :title, :tag_type
|
21
|
+
validates_uniqueness_of :tag_id, scope: :tag_type
|
22
|
+
validates_with TagIdValidator
|
20
23
|
validates_with SafeHtml
|
21
24
|
|
22
25
|
class MissingTags < RuntimeError
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class TagIdValidator < ActiveModel::Validator
|
2
|
+
|
3
|
+
def validate(record)
|
4
|
+
unless valid_tag_id?(record.tag_id)
|
5
|
+
record.errors[:tag_id] << "ID must be valid in a URL and have no more than one slash"
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
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?('/')
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/test/models/tag_test.rb
CHANGED
@@ -101,4 +101,18 @@ class TagTest < ActiveSupport::TestCase
|
|
101
101
|
|
102
102
|
assert_equal %w{Business Chips Crime Pie}, tags.map(&:title).sort
|
103
103
|
end
|
104
|
+
|
105
|
+
test "should be invalid when tag id already exists for the tag type" do
|
106
|
+
Tag.create!(tag_id: "cars", tag_type: "vehicles", title: "Cars")
|
107
|
+
Tag.create!(tag_id: "cars", tag_type: "gary-numan-songs", title: "Cars")
|
108
|
+
|
109
|
+
tag = Tag.new(tag_id: "cars", tag_type: "vehicles")
|
110
|
+
|
111
|
+
refute tag.valid?
|
112
|
+
assert tag.errors.has_key?(:tag_id)
|
113
|
+
end
|
114
|
+
|
115
|
+
test "should validate with TagIdValidator" do
|
116
|
+
assert_includes Tag.validators.map(&:class), TagIdValidator
|
117
|
+
end
|
104
118
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'tag_id_validator'
|
3
|
+
|
4
|
+
class TagIdValidatorTest < ActiveSupport::TestCase
|
5
|
+
class Dummy
|
6
|
+
include Mongoid::Document
|
7
|
+
|
8
|
+
field :tag_id, type: String
|
9
|
+
field :parent_id, type: String
|
10
|
+
|
11
|
+
validates_with TagIdValidator
|
12
|
+
end
|
13
|
+
|
14
|
+
should "permit a lower-case alphanumeric tag id" do
|
15
|
+
dummy = Dummy.new(tag_id: "a-good-tag-id")
|
16
|
+
assert dummy.valid?
|
17
|
+
end
|
18
|
+
|
19
|
+
should "not permit a tag id with spaces" do
|
20
|
+
dummy = Dummy.new(tag_id: "this tag has spaces")
|
21
|
+
refute dummy.valid?
|
22
|
+
assert dummy.errors.has_key?(:tag_id)
|
23
|
+
end
|
24
|
+
|
25
|
+
should "not permit a tag id with uppercase characters" do
|
26
|
+
dummy = Dummy.new(tag_id: "CLEAN-ALL-THE-THINGS")
|
27
|
+
refute dummy.valid?
|
28
|
+
assert dummy.errors.has_key?(:tag_id)
|
29
|
+
end
|
30
|
+
|
31
|
+
should "not permit a tag id with non-alphanumeric characters" do
|
32
|
+
dummy = Dummy.new(tag_id: "a-t@g-!d")
|
33
|
+
refute dummy.valid?
|
34
|
+
assert dummy.errors.has_key?(:tag_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
should "not permit a tag id with underscores" do
|
38
|
+
dummy = Dummy.new(tag_id: "tag_id_with_underscores")
|
39
|
+
refute dummy.valid?
|
40
|
+
assert dummy.errors.has_key?(:tag_id)
|
41
|
+
end
|
42
|
+
|
43
|
+
should "permit a tag id containing a slash" do
|
44
|
+
dummy = Dummy.new(tag_id: "parent-tag-id/child-tag-id")
|
45
|
+
assert dummy.valid?
|
46
|
+
end
|
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")
|
50
|
+
refute dummy.valid?
|
51
|
+
assert dummy.errors.has_key?(:tag_id)
|
52
|
+
end
|
53
|
+
|
54
|
+
should "not permit a slash at the end of a tag id" do
|
55
|
+
dummy = Dummy.new(tag_id: "parent-tag-id/")
|
56
|
+
refute dummy.valid?
|
57
|
+
assert dummy.errors.has_key?(:tag_id)
|
58
|
+
end
|
59
|
+
|
60
|
+
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:
|
4
|
+
version: 10.0.0
|
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-03
|
12
|
+
date: 2014-04-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bson_ext
|
@@ -392,6 +392,7 @@ files:
|
|
392
392
|
- app/traits/taggable.rb
|
393
393
|
- app/validators/safe_html.rb
|
394
394
|
- app/validators/slug_validator.rb
|
395
|
+
- app/validators/tag_id_validator.rb
|
395
396
|
- config/mongoid.yml
|
396
397
|
- govuk_content_models.gemspec
|
397
398
|
- jenkins.sh
|
@@ -448,6 +449,7 @@ files:
|
|
448
449
|
- test/traits/taggable_test.rb
|
449
450
|
- test/validators/safe_html_validator_test.rb
|
450
451
|
- test/validators/slug_validator_test.rb
|
452
|
+
- test/validators/tag_id_validator_test.rb
|
451
453
|
homepage: https://github.com/alphagov/govuk_content_models
|
452
454
|
licenses: []
|
453
455
|
post_install_message:
|
@@ -463,7 +465,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
463
465
|
version: '0'
|
464
466
|
segments:
|
465
467
|
- 0
|
466
|
-
hash:
|
468
|
+
hash: -283248144793344771
|
467
469
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
468
470
|
none: false
|
469
471
|
requirements:
|
@@ -472,7 +474,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
472
474
|
version: '0'
|
473
475
|
segments:
|
474
476
|
- 0
|
475
|
-
hash:
|
477
|
+
hash: -283248144793344771
|
476
478
|
requirements: []
|
477
479
|
rubyforge_project:
|
478
480
|
rubygems_version: 1.8.23
|
@@ -525,3 +527,4 @@ test_files:
|
|
525
527
|
- test/traits/taggable_test.rb
|
526
528
|
- test/validators/safe_html_validator_test.rb
|
527
529
|
- test/validators/slug_validator_test.rb
|
530
|
+
- test/validators/tag_id_validator_test.rb
|