From 87de45bc9a99ab14ce52ce6aec8641bdf0ba8149 Mon Sep 17 00:00:00 2001 From: Adam Wheatley Date: Fri, 16 May 2025 07:23:41 +0000 Subject: [PATCH 1/8] Initial work setting up Footer in Strapi with queries, models and created a new view component Basic styling and layout on the component completed --- app/components/cms/footer_component.rb | 19 ++++ .../footer_component.html.erb | 24 ++++++ .../footer_component/footer_component.scss | 35 ++++++++ app/controllers/application_controller.rb | 7 ++ app/services/cms/models/meta/footer.rb | 17 ++++ .../cms/models/meta/footer_link_block.rb | 23 +++++ .../strapi/factories/model_factory.rb | 25 ++++++ .../providers/strapi/queries/base_query.rb | 2 + .../strapi/queries/footer_link_block.rb | 21 +++++ .../cms/providers/strapi/queries/image.rb | 15 ++++ app/services/cms/singles/footer.rb | 21 +++++ app/views/components/_footer.html.erb | 86 +------------------ app/views/components/_header.html.erb | 1 - 13 files changed, 212 insertions(+), 84 deletions(-) create mode 100644 app/components/cms/footer_component.rb create mode 100644 app/components/cms/footer_component/footer_component.html.erb create mode 100644 app/components/cms/footer_component/footer_component.scss create mode 100644 app/services/cms/models/meta/footer.rb create mode 100644 app/services/cms/models/meta/footer_link_block.rb create mode 100644 app/services/cms/providers/strapi/queries/footer_link_block.rb create mode 100644 app/services/cms/providers/strapi/queries/image.rb create mode 100644 app/services/cms/singles/footer.rb diff --git a/app/components/cms/footer_component.rb b/app/components/cms/footer_component.rb new file mode 100644 index 0000000000..c5e8509d7a --- /dev/null +++ b/app/components/cms/footer_component.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class Cms::FooterComponent < ViewComponent::Base + def initialize(data:) + @data = data + end + + def company_logo + @data.data_models.first + end + + def funding_logo + @data.data_models.second + end + + def link_blocks + @data.data_models.last.link_block + end +end diff --git a/app/components/cms/footer_component/footer_component.html.erb b/app/components/cms/footer_component/footer_component.html.erb new file mode 100644 index 0000000000..29ea6ad34d --- /dev/null +++ b/app/components/cms/footer_component/footer_component.html.erb @@ -0,0 +1,24 @@ +<%= render GovGridRowComponent.new(additional_classes: "cms-footer-component", padding: {top: 0, bottom: 0}) do |row| %> + <%= row.with_column("full") do %> + + <% end %> +<% end %> diff --git a/app/components/cms/footer_component/footer_component.scss b/app/components/cms/footer_component/footer_component.scss new file mode 100644 index 0000000000..037e116c5d --- /dev/null +++ b/app/components/cms/footer_component/footer_component.scss @@ -0,0 +1,35 @@ +.cms-footer-component { + color: $white; + height: 100%; + + img { + width: 125px; + + @include govuk-media-query($until: desktop) { + width: 80px; + } + } + + &--funding-text { + color: $white; + font-size: 14px; + margin: 10px 0; + } + + &-wrapper { + display: flex; + justify-content: space-between; + + @include govuk-media-query($until: desktop) { + flex-wrap: wrap; + justify-content: flex-start; + gap: 2rem; + } + } + + &__link-block { + display: flex; + flex-direction: column; + gap: 12px; + } +} diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 356f68f652..f2dbcbfa3f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,6 +5,7 @@ class ApplicationController < ActionController::Base before_action :authenticate before_action :access_cms_header + before_action :access_cms_footer def authenticate return unless ENV["BASIC_AUTH_PASSWORD"] @@ -20,6 +21,12 @@ def access_cms_header @cms_header = nil end + def access_cms_footer + @cms_footer = Cms::Singles::Footer.get + rescue ActiveRecord::RecordNotFound + @cms_footer = nil + end + def authenticate_user! redirect_to(helpers.create_account_url) unless current_user end diff --git a/app/services/cms/models/meta/footer.rb b/app/services/cms/models/meta/footer.rb new file mode 100644 index 0000000000..c13206831d --- /dev/null +++ b/app/services/cms/models/meta/footer.rb @@ -0,0 +1,17 @@ +module Cms + module Models + module Meta + class Footer + attr_accessor :image + + def initialize(image:) + @image = image + end + + def render + Cms::FooterComponent.new(link_block:) + end + end + end + end +end diff --git a/app/services/cms/models/meta/footer_link_block.rb b/app/services/cms/models/meta/footer_link_block.rb new file mode 100644 index 0000000000..dacd6a64ae --- /dev/null +++ b/app/services/cms/models/meta/footer_link_block.rb @@ -0,0 +1,23 @@ +module Cms + module Models + module Meta + class FooterLinkBlock + attr_accessor :link_block + + def initialize(link_block:) + @link_block = link_block + end + + def process_blocks + @link_block.each do |block| + block + end + end + + def render + Cms::FooterComponent.new(link_block:) + end + end + end + end +end diff --git a/app/services/cms/providers/strapi/factories/model_factory.rb b/app/services/cms/providers/strapi/factories/model_factory.rb index 11f474c9f2..303ff6365d 100644 --- a/app/services/cms/providers/strapi/factories/model_factory.rb +++ b/app/services/cms/providers/strapi/factories/model_factory.rb @@ -14,7 +14,9 @@ module ModelFactory Models::DynamicZones::EnrichmentDynamicZone => :to_dynamic_zone, Models::Collections::EnrichmentList => :to_enrichment_list, Models::Images::FeaturedImage => :to_featured_image, + Models::Images::Image => :to_image, Models::Meta::HeaderMenu => :to_menu, + Models::Meta::FooterLinkBlock => :to_footer, Models::DynamicZones::HomepageDynamicZone => :to_dynamic_zone, Models::Meta::PageTitle => :to_page_title, Models::Meta::Seo => :to_seo, @@ -131,6 +133,19 @@ def self.to_featured_image(strapi_data, _all_data, size = :large) } end + def self.to_image(strapi_data, _all_data, default_size = :medium) + return nil unless strapi_data.dig(:data, :attributes) + + image_data = strapi_data[:data][:attributes] + { + url: image_data[:url], + alt: image_data[:alternativeText], + caption: image_data[:caption], + formats: image_data[:formats], + default_size: + } + end + def self.to_menu(strapi_data, _all_data) { menu_items: strapi_data.map do |menu_item| @@ -142,6 +157,16 @@ def self.to_menu(strapi_data, _all_data) } end + def self.to_footer(strapi_data, _all_data) + { + link_block: strapi_data.map do |link| + { + links: link[:link].map { |l| {link_text: l[:linkText], url: l[:url], icon: l[:icon]} } + } + end + } + end + def self.to_page_title(strapi_data, _all_data) { title: strapi_data[:title], diff --git a/app/services/cms/providers/strapi/queries/base_query.rb b/app/services/cms/providers/strapi/queries/base_query.rb index 9d405f5aa2..2b82d6b563 100644 --- a/app/services/cms/providers/strapi/queries/base_query.rb +++ b/app/services/cms/providers/strapi/queries/base_query.rb @@ -18,6 +18,8 @@ class BaseQuery Models::DynamicZones::EnrichmentDynamicZone => EnrichmentDynamicZone, Models::DynamicZones::HomepageDynamicZone => HomepageDynamicZone, Models::Images::FeaturedImage => FeaturedImage, + Models::Images::Image => Image, + Models::Meta::FooterLinkBlock => FooterLinkBlock, Models::Meta::HeaderMenu => HeaderMenu, Models::Meta::PageTitle => PageTitle, Models::Meta::Seo => Seo, diff --git a/app/services/cms/providers/strapi/queries/footer_link_block.rb b/app/services/cms/providers/strapi/queries/footer_link_block.rb new file mode 100644 index 0000000000..77d5c9785b --- /dev/null +++ b/app/services/cms/providers/strapi/queries/footer_link_block.rb @@ -0,0 +1,21 @@ +module Cms + module Providers + module Strapi + module Queries + class FooterLinkBlock + def self.embed(name) + <<~GRAPHQL.freeze + #{name} { + link { + linkText + url + #{SharedFields.image_fields("icon")} + } + } + GRAPHQL + end + end + end + end + end +end diff --git a/app/services/cms/providers/strapi/queries/image.rb b/app/services/cms/providers/strapi/queries/image.rb new file mode 100644 index 0000000000..2d6dcc2b8a --- /dev/null +++ b/app/services/cms/providers/strapi/queries/image.rb @@ -0,0 +1,15 @@ +module Cms + module Providers + module Strapi + module Queries + class Image + def self.embed(name) + <<~GRAPHQL.freeze + #{SharedFields.image_fields(name)} + GRAPHQL + end + end + end + end + end +end diff --git a/app/services/cms/singles/footer.rb b/app/services/cms/singles/footer.rb new file mode 100644 index 0000000000..9820402b99 --- /dev/null +++ b/app/services/cms/singles/footer.rb @@ -0,0 +1,21 @@ +module Cms + module Singles + class Footer < Resource + def self.resource_attribute_mappings + [ + {model: Models::Images::Image, key: :companyLogo}, + {model: Models::Images::Image, key: :funderLogo}, + {model: Models::Meta::FooterLinkBlock, key: :linkBlock } + ] + end + + def self.cache_expiry + 15.minutes + end + + def self.resource_key = "footer" + + def self.graphql_key = "footer" + end + end +end diff --git a/app/views/components/_footer.html.erb b/app/views/components/_footer.html.erb index 594d3ea774..3e5d54732c 100644 --- a/app/views/components/_footer.html.erb +++ b/app/views/components/_footer.html.erb @@ -1,85 +1,5 @@ diff --git a/app/views/components/_header.html.erb b/app/views/components/_header.html.erb index 3694445c09..98502b7046 100644 --- a/app/views/components/_header.html.erb +++ b/app/views/components/_header.html.erb @@ -58,7 +58,6 @@ <%= render model.render %> <% end %> <% end %> - From 499bdf7a05fdabcc26eb209e549a8b7d4e719289 Mon Sep 17 00:00:00 2001 From: Adam Wheatley Date: Fri, 16 May 2025 13:36:33 +0000 Subject: [PATCH 2/8] Updating model and view component Initial setup of mocks and testing --- app/components/cms/footer_component.rb | 26 ++++++++++++++++--- .../footer_component.html.erb | 16 +++++------- .../footer_component/footer_component.scss | 13 +++++++--- .../cms/link_with_icon_component.rb | 9 ++++--- .../content_blocks/link_with_icon.rb | 7 ++--- app/services/cms/models/meta/footer.rb | 17 ------------ .../cms/models/meta/footer_link_block.rb | 12 ++++----- .../strapi/factories/model_factory.rb | 15 ++++++++++- .../content_blocks/link_with_icon.rb | 1 + .../strapi/mocks/meta/footer_link_block.rb | 13 ++++++++++ .../providers/strapi/mocks/singles/footer.rb | 17 ++++++++++++ app/services/cms/singles/footer.rb | 4 ++- spec/support/cms/providers/strapi/schema.json | 2 +- .../cms/providers/strapi/strapi_stubs.rb | 6 +++++ spec/views/components/_footer_spec.rb | 3 ++- 15 files changed, 112 insertions(+), 49 deletions(-) delete mode 100644 app/services/cms/models/meta/footer.rb create mode 100644 app/services/cms/providers/strapi/mocks/meta/footer_link_block.rb create mode 100644 app/services/cms/providers/strapi/mocks/singles/footer.rb diff --git a/app/components/cms/footer_component.rb b/app/components/cms/footer_component.rb index c5e8509d7a..4b9ecd7192 100644 --- a/app/components/cms/footer_component.rb +++ b/app/components/cms/footer_component.rb @@ -1,19 +1,39 @@ # frozen_string_literal: true class Cms::FooterComponent < ViewComponent::Base + attr_reader :data + def initialize(data:) @data = data end def company_logo - @data.data_models.first + data_models_by_type(Cms::Models::Images::Image).first end def funding_logo - @data.data_models.second + data_models_by_type(Cms::Models::Images::Image).second + end + + def company_url + find_text_field(0)&.value + end + + def funding_url + find_text_field(1)&.value end def link_blocks - @data.data_models.last.link_block + data_models_by_type(Cms::Models::Meta::FooterLinkBlock).first&.process_blocks + end + + private + + def data_models_by_type(type) + data.data_models.select { |model| model.is_a?(type) } + end + + def find_text_field(index) + data_models_by_type(Cms::Models::Data::TextField)[index] end end diff --git a/app/components/cms/footer_component/footer_component.html.erb b/app/components/cms/footer_component/footer_component.html.erb index 29ea6ad34d..d4bcb941c2 100644 --- a/app/components/cms/footer_component/footer_component.html.erb +++ b/app/components/cms/footer_component/footer_component.html.erb @@ -2,20 +2,18 @@ <%= row.with_column("full") do %> <% link_blocks.each do |block| %> <% end %> diff --git a/app/services/cms/models/dynamic_components/content_blocks/link_with_icon.rb b/app/services/cms/models/dynamic_components/content_blocks/link_with_icon.rb index dd4d260974..b58a61e8fe 100644 --- a/app/services/cms/models/dynamic_components/content_blocks/link_with_icon.rb +++ b/app/services/cms/models/dynamic_components/content_blocks/link_with_icon.rb @@ -3,17 +3,21 @@ module Models module DynamicComponents module ContentBlocks class LinkWithIcon - attr_accessor :link_text, :url, :icon, :additional_classes + attr_accessor :link_text, :url, :icon - def initialize(link_text:, url:, icon:, additional_classes:) + def initialize(link_text:, url:, icon:) @link_text = link_text @url = url @icon = icon - @additional_classes = additional_classes end - def render - Cms::LinkWithIconComponent.new(link_text:, url:, icon:, additional_classes:) + def render(additional_classes: nil) + Cms::LinkWithIconComponent.new( + link_text: @link_text, + url: @url, + icon: @icon, + additional_classes: additional_classes + ) end end end diff --git a/app/services/cms/models/meta/footer_link_block.rb b/app/services/cms/models/meta/footer_link_block.rb index c987acb531..06476f60b6 100644 --- a/app/services/cms/models/meta/footer_link_block.rb +++ b/app/services/cms/models/meta/footer_link_block.rb @@ -2,19 +2,15 @@ module Cms module Models module Meta class FooterLinkBlock - attr_accessor :link_block + attr_accessor :link_blocks - def initialize(link_block:) - @link_block = link_block + def initialize(link_blocks:) + @link_blocks = link_blocks end def process_blocks - @link_block.map do |block| - { - links: block[:links].map do |link| - link - end - } + @link_blocks.map do |block| + block end end end diff --git a/app/services/cms/providers/strapi/factories/model_factory.rb b/app/services/cms/providers/strapi/factories/model_factory.rb index 8dae4101aa..3f16b99ca1 100644 --- a/app/services/cms/providers/strapi/factories/model_factory.rb +++ b/app/services/cms/providers/strapi/factories/model_factory.rb @@ -159,22 +159,20 @@ def self.to_menu(strapi_data, _all_data) def self.to_footer(strapi_data, _all_data) { - link_block: strapi_data.map do |link| - { - links: link[:link].map { - Models::DynamicComponents::ContentBlocks::LinkWithIcon.new( - link_text: _1[:linkText], - url: _1[:url], - icon: _1[:icon].dig(:data).nil? ? nil : Models::Images::Image.new( - url: _1[:icon][:data][:attributes][:url], - alt: _1[:icon][:data][:attributes][:alternativeText], - caption: _1[:icon][:data][:attributes][:caption], - default_size: :small, - formats: _1[:icon][:data][:attributes][:formats] - ), - additional_classes: ["govuk-footer__link", "ncce-link", "ncce-link--on-dark"] - ) - } + link_blocks: strapi_data.map do |link| + byebug + link[:link].map { + Models::DynamicComponents::ContentBlocks::LinkWithIcon.new( + link_text: _1[:linkText], + url: _1[:url], + icon: _1[:icon].dig(:data).nil? ? nil : Models::Images::Image.new( + url: _1[:icon][:data][:attributes][:url], + alt: _1[:icon][:data][:attributes][:alternativeText], + caption: _1[:icon][:data][:attributes][:caption], + default_size: :small, + formats: _1[:icon][:data][:attributes][:formats] + ), + ) } end } From f92922c50f200f0832cf1e71f22441c772ddb600 Mon Sep 17 00:00:00 2001 From: Adam Wheatley Date: Fri, 30 May 2025 13:42:57 +0000 Subject: [PATCH 4/8] Some refactoring in the component Updating the mock Adding stub into system and request tests Updating footer testing --- app/components/cms/footer_component.rb | 2 +- .../strapi/factories/model_factory.rb | 3 +- .../strapi/mocks/meta/footer_link_block.rb | 13 ---- .../providers/strapi/mocks/singles/footer.rb | 10 ++- app/views/components/_footer.html.erb | 2 +- spec/components/cms/footer_component_spec.rb | 31 +++++++++ spec/rails_helper.rb | 2 + .../strapi/queries/footer_link_block_spec.rb | 8 +++ spec/views/components/_footer_spec.rb | 68 +------------------ 9 files changed, 54 insertions(+), 85 deletions(-) delete mode 100644 app/services/cms/providers/strapi/mocks/meta/footer_link_block.rb create mode 100644 spec/components/cms/footer_component_spec.rb create mode 100644 spec/services/cms/providers/strapi/queries/footer_link_block_spec.rb diff --git a/app/components/cms/footer_component.rb b/app/components/cms/footer_component.rb index 4b9ecd7192..b9d6ac6e8d 100644 --- a/app/components/cms/footer_component.rb +++ b/app/components/cms/footer_component.rb @@ -30,7 +30,7 @@ def link_blocks private def data_models_by_type(type) - data.data_models.select { |model| model.is_a?(type) } + data.select { |model| model.is_a?(type) } end def find_text_field(index) diff --git a/app/services/cms/providers/strapi/factories/model_factory.rb b/app/services/cms/providers/strapi/factories/model_factory.rb index 3f16b99ca1..aaaceb0863 100644 --- a/app/services/cms/providers/strapi/factories/model_factory.rb +++ b/app/services/cms/providers/strapi/factories/model_factory.rb @@ -160,7 +160,6 @@ def self.to_menu(strapi_data, _all_data) def self.to_footer(strapi_data, _all_data) { link_blocks: strapi_data.map do |link| - byebug link[:link].map { Models::DynamicComponents::ContentBlocks::LinkWithIcon.new( link_text: _1[:linkText], @@ -171,7 +170,7 @@ def self.to_footer(strapi_data, _all_data) caption: _1[:icon][:data][:attributes][:caption], default_size: :small, formats: _1[:icon][:data][:attributes][:formats] - ), + ) ) } end diff --git a/app/services/cms/providers/strapi/mocks/meta/footer_link_block.rb b/app/services/cms/providers/strapi/mocks/meta/footer_link_block.rb deleted file mode 100644 index c7a10fb0a5..0000000000 --- a/app/services/cms/providers/strapi/mocks/meta/footer_link_block.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Cms - module Providers - module Strapi - module Mocks - module Meta - class FooterLinkBlock < StrapiMock - attribute(:link_block) { Array.new(3) { DynamicComponents::ContentBlocks::LinkWithIcon.as_model } } - end - end - end - end - end -end diff --git a/app/services/cms/providers/strapi/mocks/singles/footer.rb b/app/services/cms/providers/strapi/mocks/singles/footer.rb index 7d8cfa96b3..bf5fd4f064 100644 --- a/app/services/cms/providers/strapi/mocks/singles/footer.rb +++ b/app/services/cms/providers/strapi/mocks/singles/footer.rb @@ -4,11 +4,15 @@ module Strapi module Mocks module Singles class Footer < StrapiMock - attribute(:companyLogo) { Mocks::Images::Image.as_model } - attribute(:funderLogo) { Mocks::Images::Image.as_model } + attribute(:companyLogo) { {data: Mocks::Images::Image.generate_raw_data} } + attribute(:funderLogo) { {data: Mocks::Images::Image.generate_raw_data} } attribute(:companyLogoLink) { Faker::Internet.url } attribute(:funderLogoLink) { Faker::Internet.url } - attribute(:linkBlock) { Meta::FooterLinkBlock.generate_data } + attribute(:linkBlock) { Array.new(4) { FooterLinkBlock.generate_data } } + end + + class FooterLinkBlock < StrapiMock + attribute(:link) { Array.new(4) { DynamicComponents::ContentBlocks::LinkWithIcon.generate_data } } end end end diff --git a/app/views/components/_footer.html.erb b/app/views/components/_footer.html.erb index 3e5d54732c..40613f3229 100644 --- a/app/views/components/_footer.html.erb +++ b/app/views/components/_footer.html.erb @@ -1,5 +1,5 @@
<% if @cms_footer %> - <%= render Cms::FooterComponent.new(data: @cms_footer) %> + <%= render Cms::FooterComponent.new(data: @cms_footer.data_models) %> <% end %>
diff --git a/spec/components/cms/footer_component_spec.rb b/spec/components/cms/footer_component_spec.rb new file mode 100644 index 0000000000..27b5df2a13 --- /dev/null +++ b/spec/components/cms/footer_component_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe Cms::FooterComponent, type: :component do + before do + render_inline(described_class.new(data: [ + Cms::Models::Data::TextField.new(value: Faker::Lorem.word), + Cms::Models::Data::TextField.new(value: Faker::Lorem.word), + Cms::Mocks::Images::Image.as_model, + Cms::Mocks::Images::Image.as_model, + Cms::Models::Meta::FooterLinkBlock.new( + link_blocks: Array.new(4) do + Array.new(5) { Cms::Mocks::DynamicComponents::ContentBlocks::LinkWithIcon.as_model } + end + ) + ])) + end + + it "renders the component" do + expect(page).to have_css(".cms-footer-component") + end + + it "renders company and funder logo images" do + expect(page).to have_css("img", count: 2) + end + + it "renders the link blocks" do + expect(page).to have_css(".cms-footer-component__link-block", count: 4) + end +end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index ddfbde3ab9..44793ca829 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -100,10 +100,12 @@ def page config.before(:each, type: :system) do driven_by selenium_driver stub_strapi_header + stub_strapi_footer end config.before(:each, type: :request) do stub_strapi_header + stub_strapi_footer end config.after(:each, js: true, type: :system) do |_spec| diff --git a/spec/services/cms/providers/strapi/queries/footer_link_block_spec.rb b/spec/services/cms/providers/strapi/queries/footer_link_block_spec.rb new file mode 100644 index 0000000000..8f6fd6403c --- /dev/null +++ b/spec/services/cms/providers/strapi/queries/footer_link_block_spec.rb @@ -0,0 +1,8 @@ +require "rails_helper" + +RSpec.describe Cms::Providers::Strapi::Queries::FooterLinkBlock do + it_should_behave_like "a strapi graphql embed", {key: "footer", + required_fields: %w[ + link + ]} +end diff --git a/spec/views/components/_footer_spec.rb b/spec/views/components/_footer_spec.rb index 6c5902a9ef..bcaeac1170 100644 --- a/spec/views/components/_footer_spec.rb +++ b/spec/views/components/_footer_spec.rb @@ -6,70 +6,8 @@ assign(:cms_footer, Cms::Singles::Footer.get) end - it "has a contact link" do - expect(rendered).to have_link("Email", href: "mailto:info@teachcomputing.org") - end - - it "has a courses link" do - expect(rendered).to have_link("Courses", href: "/courses") - end - - it "has a resources link" do - expect(rendered).to have_link("Teaching resources", href: "/curriculum") - end - - it "has a news link" do - expect(rendered).to have_link("News", href: cms_posts_path) - end - - it "has a privacy link" do - expect(rendered).to have_link("Privacy", href: "/privacy") - end - - it "has a terms and conditions link" do - expect(rendered).to have_link("Terms and Conditions", href: "/terms-conditions") - end - it "has an accessibility statement link" do - expect(rendered).to have_link("Accessibility", href: "/accessibility-statement") - end - - it "has an about link" do - expect(rendered).to have_link("About us", href: "/about") - end - - it "has a get involved link" do - expect(rendered).to have_link("Get involved", href: "/get-involved") - end - - it "has a pedagogy link" do - expect(rendered).to have_link("Pedagogy", href: "/pedagogy") - end - - it "has a ITE providers link" do - expect(rendered).to have_link("ITE providers", href: "/support-for-ite-providers") - end - - it "has a LinkedIn link" do - expect(rendered).to have_link("LinkedIn", href: %r{linkedin.com/company/national-centre-for-computing-education}) - end - - it "has an X link" do - expect(rendered).to have_link("X", href: %r{twitter.com/WeAreComputing}) - end - - it "has a facebook link" do - expect(rendered).to have_link("Facebook", href: %r{facebook.com/WeAreComputing}) - end - - it "has a LinkedIn icon" do - expect(rendered).to have_xpath('//img[contains(@class, "ncce-link__icon--footer")][contains(@alt, "LinkedIn logo")]') - end - - it "has an X icon" do - expect(rendered).to have_xpath('//img[contains(@class, "ncce-link__icon--footer")][contains(@alt, "X logo")]') - end - - it "has a facebook icon" do - expect(rendered).to have_xpath('//img[contains(@class, "ncce-link__icon--footer")][contains(@alt, "Facebook logo")]') + it "renders the footer component" do + render + expect(rendered).to have_css(".cms-footer-component") end end From f1e2591b3ee6564bc65598c33bbcda928f25bb97 Mon Sep 17 00:00:00 2001 From: Adam Wheatley Date: Wed, 4 Jun 2025 13:50:09 +0000 Subject: [PATCH 5/8] Added a get_model method into cms resource to pull out specific models by key Refactored footer component Updated and added additional tests --- app/components/cms/footer_component.rb | 28 ++----------------- .../footer_component.html.erb | 10 +++---- app/services/cms/resource.rb | 7 +++++ app/views/components/_footer.html.erb | 2 +- spec/components/cms/footer_component_spec.rb | 23 +++++++-------- 5 files changed, 27 insertions(+), 43 deletions(-) diff --git a/app/components/cms/footer_component.rb b/app/components/cms/footer_component.rb index b9d6ac6e8d..4c94a3868e 100644 --- a/app/components/cms/footer_component.rb +++ b/app/components/cms/footer_component.rb @@ -7,33 +7,9 @@ def initialize(data:) @data = data end - def company_logo - data_models_by_type(Cms::Models::Images::Image).first - end - - def funding_logo - data_models_by_type(Cms::Models::Images::Image).second - end - - def company_url - find_text_field(0)&.value - end - - def funding_url - find_text_field(1)&.value - end - - def link_blocks - data_models_by_type(Cms::Models::Meta::FooterLinkBlock).first&.process_blocks - end - private - def data_models_by_type(type) - data.select { |model| model.is_a?(type) } - end - - def find_text_field(index) - data_models_by_type(Cms::Models::Data::TextField)[index] + def get_model(key) + @data.get_model(key) end end diff --git a/app/components/cms/footer_component/footer_component.html.erb b/app/components/cms/footer_component/footer_component.html.erb index 11c544845a..cd9e00c9a3 100644 --- a/app/components/cms/footer_component/footer_component.html.erb +++ b/app/components/cms/footer_component/footer_component.html.erb @@ -2,15 +2,15 @@ <%= row.with_column("full") do %>