govuk_navigation_helpers 6.3.0 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c461bdaf7894d043e544c90c0a55847e2ef71aeb
4
- data.tar.gz: b6faea824ddea2a36d627eec6a1f2f60d05fc009
3
+ metadata.gz: ec1764a33f8094c760cd5a83e47ae8a51277b119
4
+ data.tar.gz: f28cae4e16260780344f7f77c5d0043f569d628e
5
5
  SHA512:
6
- metadata.gz: 729b456c6c589ea4cbed175c5fd5798a1e1c28f0be3c80f4a329235bf37af534cfa226b755ada6b4fd9a18462362ca1ae7ed65d58bc043290f1130f34f71f2e2
7
- data.tar.gz: f96e665046a7619631bc8c1295c21385067ce5de8dcf06d0e66250f103f1207ae143a7fa651026358298fddd68f7fdfc766413f329ffdbd3260d61ef1abe18be
6
+ metadata.gz: 91bade4008ffcbbaf9c51dbd2a86a93ab474b0b5fc8c9038113016e7ffc6d9de9b59e227629d000e1ded82944779534f58c3aefe72b6acd7c746fda3ce00e4d6
7
+ data.tar.gz: 865b85c47eeed422b1960e5874b391f8f298d8a01a686ddbb8699fec6ab35246ecfd89750a9534f9f227a13e9661ca6c4143d0483946406fd8093de665724592
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 7.0.0
2
+
3
+ * Root taxons are now whitelisted, so that only taxons descendant from one of
4
+ the three published root taxons (education, childcare-parenting and world)
5
+ will appear in breadcrumbs and the side bar. See the [PR](https://github.com/alphagov/govuk_navigation_helpers/pull/82) for more information
6
+
1
7
  ## 6.3.0
2
8
 
3
9
  * Allow curated related links to be shown on the new navigation sidebar. If the
@@ -5,6 +5,18 @@ module GovukNavigationHelpers
5
5
  #
6
6
  # @private
7
7
  class ContentItem
8
+ WORLD_TAXON_CONTENT_ID = "91b8ef20-74e7-4552-880c-50e6d73c2ff9".freeze
9
+ EDUCATION_TAXON_CONTENT_ID = "c58fdadd-7743-46d6-9629-90bb3ccc4ef0".freeze
10
+ CHILDCARE_PARENTING_TAXON_CONTENT_ID = "206b7f3a-49b5-476f-af0f-fd27e2a68473".freeze
11
+
12
+ def self.whitelisted_root_taxon_content_ids
13
+ [
14
+ WORLD_TAXON_CONTENT_ID,
15
+ EDUCATION_TAXON_CONTENT_ID,
16
+ CHILDCARE_PARENTING_TAXON_CONTENT_ID,
17
+ ]
18
+ end
19
+
8
20
  attr_reader :content_store_response
9
21
 
10
22
  def initialize(content_store_response)
@@ -24,14 +36,11 @@ module GovukNavigationHelpers
24
36
  end
25
37
 
26
38
  def parent_taxons
27
- # First handle the case for content items tagged to the taxonomy.
28
- taxons = Array(content_store_response.dig("links", "taxons"))
29
- return taxons.map { |taxon| ContentItem.new(taxon) }.sort_by(&:title) if taxons.any?
30
-
31
- # If that link isn't present, assume we're dealing with a taxon and check
32
- # for its parents in the taxonomy.
33
- parent_taxons = Array(content_store_response.dig("links", "parent_taxons"))
34
- parent_taxons.map { |taxon| ContentItem.new(taxon) }.sort_by(&:title)
39
+ @_parent_taxons ||= begin
40
+ taxon_links
41
+ .select { |t| descendent_from_whitelisted_root_taxon?(t) }
42
+ .map { |taxon| ContentItem.new(taxon) }.sort_by(&:title)
43
+ end
35
44
  end
36
45
 
37
46
  def mainstream_browse_pages
@@ -90,5 +99,29 @@ module GovukNavigationHelpers
90
99
  def eql?(other)
91
100
  self == other
92
101
  end
102
+
103
+ private
104
+
105
+ def taxon_links
106
+ # A normal content item's taxon links are stored in ["links"]["taxons"]
107
+ # whereas a Taxon content item's taxon links are stored in ["links"]["parent_taxons"]
108
+ # so here we cater for both possibilities
109
+ content_store_response.dig("links", "taxons") || content_store_response.dig("links", "parent_taxons") || []
110
+ end
111
+
112
+ def descendent_from_whitelisted_root_taxon?(taxon)
113
+ root_taxon = get_root_taxon(taxon)
114
+ ContentItem.whitelisted_root_taxon_content_ids.include?(root_taxon["content_id"])
115
+ end
116
+
117
+ def get_root_taxon(taxon)
118
+ parent_taxons = taxon.dig("links", "parent_taxons")
119
+
120
+ if parent_taxons.nil? || parent_taxons.empty?
121
+ taxon
122
+ else
123
+ get_root_taxon(parent_taxons.first)
124
+ end
125
+ end
93
126
  end
94
127
  end
@@ -1,3 +1,3 @@
1
1
  module GovukNavigationHelpers
2
- VERSION = "6.3.0".freeze
2
+ VERSION = "7.0.0".freeze
3
3
  end
@@ -0,0 +1,212 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe GovukNavigationHelpers::ContentItem do
4
+ describe ".whitelisted_root_taxon_content_ids" do
5
+ it "returns the whitelisted content_ids" do
6
+ expected_content_ids = [
7
+ "91b8ef20-74e7-4552-880c-50e6d73c2ff9",
8
+ "c58fdadd-7743-46d6-9629-90bb3ccc4ef0",
9
+ "206b7f3a-49b5-476f-af0f-fd27e2a68473",
10
+ ]
11
+
12
+ content_ids = described_class.whitelisted_root_taxon_content_ids
13
+ expect(content_ids).to eq(expected_content_ids)
14
+ end
15
+ end
16
+
17
+ describe "#parent_taxons" do
18
+ before do
19
+ allow(described_class)
20
+ .to receive(:whitelisted_root_taxon_content_ids)
21
+ .and_return(["aaaa-bbbb"])
22
+ end
23
+
24
+ context "for a content item with taxons links" do
25
+ context "with a whitelisted parent taxon" do
26
+ let(:taxon) do
27
+ {
28
+ "content_id" => "cccc-dddd",
29
+ "title" => "Taxon",
30
+ "links" => {
31
+ "parent_taxons" => [
32
+ {
33
+ "content_id" => "aaaa-bbbb",
34
+ "title" => "Taxon",
35
+ }
36
+ ]
37
+ }
38
+ }
39
+ end
40
+
41
+ let(:content_item_response) do
42
+ {
43
+ "title" => "Some Answer Content Item",
44
+ "document_type" => "answer",
45
+ "links" => {
46
+ "taxons" => [taxon],
47
+ }
48
+ }
49
+ end
50
+
51
+ it "returns the parent taxons" do
52
+ expected_parent_taxon = described_class.new(taxon)
53
+ expect(described_class.new(content_item_response).parent_taxons).to contain_exactly(expected_parent_taxon)
54
+ end
55
+ end
56
+
57
+ context "with a non-whitelisted parent taxon" do
58
+ let(:taxon) do
59
+ {
60
+ "content_id" => "cccc-dddd",
61
+ "title" => "Taxon",
62
+ "links" => {
63
+ "parent_taxons" => [
64
+ {
65
+ "content_id" => "xxxx-xxxx",
66
+ "title" => "Non Whitelisted Taxon",
67
+ }
68
+ ]
69
+ }
70
+ }
71
+ end
72
+
73
+ let(:content_item_response) do
74
+ {
75
+ "title" => "Some Answer Content Item",
76
+ "document_type" => "answer",
77
+ "links" => {
78
+ "taxons" => [taxon],
79
+ }
80
+ }
81
+ end
82
+
83
+ it "returns an empty array" do
84
+ expect(described_class.new(content_item_response).parent_taxons).to eq([])
85
+ end
86
+ end
87
+ end
88
+
89
+ context "for a content item with no taxons links" do
90
+ context "with missing links hash" do
91
+ let(:content_item_response) do
92
+ {
93
+ "title" => "Some Answer Content Item",
94
+ "document_type" => "answer",
95
+ }
96
+ end
97
+
98
+ it "returns an empty array" do
99
+ expect(described_class.new(content_item_response).parent_taxons).to eq([])
100
+ end
101
+ end
102
+
103
+ context "with missing taxons links hash" do
104
+ let(:content_item_response) do
105
+ {
106
+ "title" => "Some Answer Content Item",
107
+ "document_type" => "answer",
108
+ "links" => {},
109
+ }
110
+ end
111
+
112
+ it "returns an empty array" do
113
+ expect(described_class.new(content_item_response).parent_taxons).to eq([])
114
+ end
115
+ end
116
+ end
117
+
118
+ context "for a taxon content item with parent taxon links" do
119
+ context "with a whitelisted parent taxon" do
120
+ let(:taxon) do
121
+ {
122
+ "content_id" => "cccc-dddd",
123
+ "title" => "Taxon",
124
+ "links" => {
125
+ "parent_taxons" => [
126
+ {
127
+ "content_id" => "aaaa-bbbb",
128
+ "title" => "Taxon",
129
+ }
130
+ ]
131
+ }
132
+ }
133
+ end
134
+
135
+ let(:content_item_response) do
136
+ {
137
+ "title" => "Some Taxon Content Item",
138
+ "document_type" => "taxon",
139
+ "links" => {
140
+ "parent_taxons" => [taxon],
141
+ }
142
+ }
143
+ end
144
+
145
+ it "returns the parent taxons" do
146
+ expected_parent_taxon = described_class.new(taxon)
147
+ expect(described_class.new(content_item_response).parent_taxons).to contain_exactly(expected_parent_taxon)
148
+ end
149
+ end
150
+
151
+ context "with a non-whitelisted parent taxon" do
152
+ let(:taxon) do
153
+ {
154
+ "content_id" => "cccc-dddd",
155
+ "title" => "Taxon",
156
+ "links" => {
157
+ "parent_taxons" => [
158
+ {
159
+ "content_id" => "xxxx-xxxx",
160
+ "title" => "Non Whitelisted Taxon",
161
+ }
162
+ ]
163
+ }
164
+ }
165
+ end
166
+
167
+ let(:content_item_response) do
168
+ {
169
+ "title" => "Some Taxon Content Item",
170
+ "document_type" => "taxon",
171
+ "links" => {
172
+ "parent_taxons" => [taxon],
173
+ }
174
+ }
175
+ end
176
+
177
+ it "returns an empty array" do
178
+ expect(described_class.new(content_item_response).parent_taxons).to eq([])
179
+ end
180
+ end
181
+ end
182
+
183
+ context "for a taxon content item with no parent taxons links" do
184
+ context "with missing links hash" do
185
+ let(:content_item_response) do
186
+ {
187
+ "title" => "Some Taxon Content Item",
188
+ "document_type" => "taxon",
189
+ }
190
+ end
191
+
192
+ it "returns an empty array" do
193
+ expect(described_class.new(content_item_response).parent_taxons).to eq([])
194
+ end
195
+ end
196
+
197
+ context "with missing parent taxons links hash" do
198
+ let(:content_item_response) do
199
+ {
200
+ "title" => "Some Taxon Content Item",
201
+ "document_type" => "taxon",
202
+ "links" => {},
203
+ }
204
+ end
205
+
206
+ it "returns an empty array" do
207
+ expect(described_class.new(content_item_response).parent_taxons).to eq([])
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end
@@ -2,6 +2,12 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe GovukNavigationHelpers::TaxonBreadcrumbs do
4
4
  describe "Taxon breadcrumbs" do
5
+ before do
6
+ allow(GovukNavigationHelpers::ContentItem)
7
+ .to receive(:whitelisted_root_taxon_content_ids)
8
+ .and_return(['30c1b93d-2553-47c9-bc3c-fc5b513ecc32'])
9
+ end
10
+
5
11
  it "can handle any valid content item" do
6
12
  generator = GovukSchemas::RandomExample.for_schema(
7
13
  "taxon",
@@ -16,7 +22,11 @@ RSpec.describe GovukNavigationHelpers::TaxonBreadcrumbs do
16
22
  end
17
23
 
18
24
  it "returns the root when taxon is not specified" do
19
- content_item = { "title" => "Some Content", "links" => {} }
25
+ content_item = {
26
+ "title" => "Some Content",
27
+ "document_type" => "answer",
28
+ "links" => {},
29
+ }
20
30
  breadcrumbs = breadcrumbs_for(content_item)
21
31
 
22
32
  expect(breadcrumbs).to eq(
@@ -40,23 +50,23 @@ RSpec.describe GovukNavigationHelpers::TaxonBreadcrumbs do
40
50
  )
41
51
  end
42
52
 
43
- context 'with a taxon content item with taxon parents' do
53
+ context 'with a taxon with taxon parents' do
44
54
  it "includes parents and grandparents when available" do
45
55
  grandparent = {
46
- "title" => "Another-parent",
47
- "base_path" => "/another-parent",
48
- "content_id" => "30c1b93d-2553-47c9-bc3c-fc5b513ecc32",
49
- "locale" => "en",
56
+ "title" => "Another-parent",
57
+ "base_path" => "/another-parent",
58
+ "content_id" => "30c1b93d-2553-47c9-bc3c-fc5b513ecc32",
59
+ "locale" => "en",
50
60
  }
51
61
 
52
62
  parent = {
53
- "content_id" => "30c1b93d-2553-47c9-bc3c-fc5b513ecc32",
54
- "locale" => "en",
55
- "title" => "A-parent",
56
- "base_path" => "/a-parent",
57
- "links" => {
58
- "parent_taxons" => [grandparent]
59
- }
63
+ "content_id" => "30c1b93d-2553-47c9-bc3c-fc5b513ecc32",
64
+ "locale" => "en",
65
+ "title" => "A-parent",
66
+ "base_path" => "/a-parent",
67
+ "links" => {
68
+ "parent_taxons" => [grandparent]
69
+ }
60
70
  }
61
71
 
62
72
  content_item = content_item_tagged_to_taxon([parent])
@@ -74,16 +84,16 @@ RSpec.describe GovukNavigationHelpers::TaxonBreadcrumbs do
74
84
  end
75
85
  end
76
86
 
77
- context 'with a taxon with parent taxons' do
87
+ context 'with a taxon content item with parent taxons' do
78
88
  it "includes parents and grandparents when available" do
79
89
  parent = {
80
- "content_id" => "30c1b93d-2553-47c9-bc3c-fc5b513ecc32",
81
- "locale" => "en",
82
- "title" => "A-parent",
83
- "base_path" => "/a-parent",
84
- "links" => {
85
- "parent_taxons" => []
86
- }
90
+ "content_id" => "30c1b93d-2553-47c9-bc3c-fc5b513ecc32",
91
+ "locale" => "en",
92
+ "title" => "A-parent",
93
+ "base_path" => "/a-parent",
94
+ "links" => {
95
+ "parent_taxons" => []
96
+ }
87
97
  }
88
98
 
89
99
  content_item = taxon_with_parent_taxons([parent])
@@ -102,22 +112,22 @@ RSpec.describe GovukNavigationHelpers::TaxonBreadcrumbs do
102
112
  context 'with multiple parents' do
103
113
  it "selects the first parent taxon in alphabetical order by title" do
104
114
  parent_1 = {
105
- "content_id" => "30c1b93d-2553-47c9-bc3c-fc5b513ecc32",
106
- "locale" => "en",
107
- "title" => "Parent A",
108
- "base_path" => "/parent-a",
109
- "links" => {
110
- "parent_taxons" => []
111
- }
115
+ "content_id" => "30c1b93d-2553-47c9-bc3c-fc5b513ecc32",
116
+ "locale" => "en",
117
+ "title" => "Parent A",
118
+ "base_path" => "/parent-a",
119
+ "links" => {
120
+ "parent_taxons" => []
121
+ }
112
122
  }
113
123
  parent_2 = {
114
- "content_id" => "30c1b93d-2553-47c9-bc3c-fc5b513ecc32",
115
- "locale" => "en",
116
- "title" => "Parent B",
117
- "base_path" => "/parent-b",
118
- "links" => {
119
- "parent_taxons" => []
120
- }
124
+ "content_id" => "30c1b93d-2553-47c9-bc3c-fc5b513ecc32",
125
+ "locale" => "en",
126
+ "title" => "Parent B",
127
+ "base_path" => "/parent-b",
128
+ "links" => {
129
+ "parent_taxons" => []
130
+ }
121
131
  }
122
132
 
123
133
  content_item = taxon_with_parent_taxons([parent_2, parent_1])
@@ -135,7 +145,7 @@ RSpec.describe GovukNavigationHelpers::TaxonBreadcrumbs do
135
145
  end
136
146
 
137
147
  def breadcrumbs_for(content_item)
138
- generator = GovukSchemas::RandomExample.for_schema("taxon", schema_type: "frontend")
148
+ generator = GovukSchemas::RandomExample.for_schema(content_item["document_type"], schema_type: "frontend")
139
149
  fully_valid_content_item = generator.merge_and_validate(content_item)
140
150
 
141
151
  # Use the main class instead of GovukNavigationHelpers::Breadcrumbs, so that
@@ -156,7 +166,7 @@ RSpec.describe GovukNavigationHelpers::TaxonBreadcrumbs do
156
166
  def content_item_tagged_to_taxon(parents)
157
167
  {
158
168
  "title" => "Some Content",
159
- "document_type" => "guidance",
169
+ "document_type" => "answer",
160
170
  "links" => {
161
171
  "taxons" => [
162
172
  {
@@ -6,6 +6,12 @@ include GdsApi::TestHelpers::Rummager
6
6
 
7
7
  RSpec.describe GovukNavigationHelpers::TaxonomySidebar do
8
8
  describe '#sidebar' do
9
+ before do
10
+ allow(GovukNavigationHelpers::ContentItem)
11
+ .to receive(:whitelisted_root_taxon_content_ids)
12
+ .and_return(['taxon-a', 'taxon-b', 'taxon-c'])
13
+ end
14
+
9
15
  it 'can handle any valid content item' do
10
16
  stub_any_rummager_search_to_return_no_results
11
17
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_navigation_helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.3.0
4
+ version: 7.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-05 00:00:00.000000000 Z
11
+ date: 2017-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gds-api-adapters
@@ -182,6 +182,7 @@ files:
182
182
  - lib/govuk_navigation_helpers/taxonomy_sidebar.rb
183
183
  - lib/govuk_navigation_helpers/version.rb
184
184
  - spec/breadcrumbs_spec.rb
185
+ - spec/content_item_spec.rb
185
186
  - spec/related_items_spec.rb
186
187
  - spec/spec_helper.rb
187
188
  - spec/taxon_breadcrumbs_spec.rb
@@ -212,6 +213,7 @@ specification_version: 4
212
213
  summary: Gem to transform items from the content-store into payloads for GOV.UK components
213
214
  test_files:
214
215
  - spec/breadcrumbs_spec.rb
216
+ - spec/content_item_spec.rb
215
217
  - spec/related_items_spec.rb
216
218
  - spec/spec_helper.rb
217
219
  - spec/taxon_breadcrumbs_spec.rb