govuk_navigation_helpers 6.3.0 → 7.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 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