diff --git a/.env.defaults b/.env.defaults index fbdaddd563..6df298f019 100644 --- a/.env.defaults +++ b/.env.defaults @@ -78,5 +78,6 @@ STRAPI_WRITE_API_KEY="api_key_with_write_access" STRAPI_IMAGE_URL="http://strapi.teachcomputing.rpfdev.com" STRAPI_GRAPHQL_URL="http://strapi.teachcomputing.rpfdev.com/graphql" STRAPI_CONNECTION_TYPE="graphql" +STRAPI_TEST_SCHEMA_PATH="spec/support/cms/providers/strapi/schema.json" NODE_OPTIONS=--openssl-legacy-provider \ No newline at end of file diff --git a/app/components/cms/header_menu_component.rb b/app/components/cms/header_menu_component.rb new file mode 100644 index 0000000000..b07872e577 --- /dev/null +++ b/app/components/cms/header_menu_component.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class Cms::HeaderMenuComponent < ViewComponent::Base + def initialize(menu_items:) + @menu_items = menu_items + end +end diff --git a/app/components/cms/header_menu_component/header_menu_component.html.erb b/app/components/cms/header_menu_component/header_menu_component.html.erb new file mode 100644 index 0000000000..9dcc976976 --- /dev/null +++ b/app/components/cms/header_menu_component/header_menu_component.html.erb @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/app/components/cms/header_menu_component/header_menu_component.scss b/app/components/cms/header_menu_component/header_menu_component.scss new file mode 100644 index 0000000000..d6ea5a80f8 --- /dev/null +++ b/app/components/cms/header_menu_component/header_menu_component.scss @@ -0,0 +1,170 @@ +.cms-header-menu { + list-style: none; + margin: 0; + padding: 0; + + li { + @include govuk-media-query($from: desktop) { + position: relative; + } + } + + ul li ul li { + clear: both; + width: 100%; + } + + @include govuk-media-query($from: desktop) { + display: flex; + flex-direction: row; + margin: 0; + padding-top: 25px 0 0 0; + } + + .govuk-body { + margin-bottom: 0 !important; + + @include govuk-media-query($from: desktop) { + margin-bottom: unset; + } + } + + @media (any-hover: hover) { + .cms-header-menu__item:hover .dropdown__expander-content, .cms-header-menu__item.dropdown__expander { + display: block; + opacity: 1; + visibility: visible; + } + } + + &__wrap { + display: flex; + padding: 5px 0; + + @include govuk-media-query($from: tablet) { + padding: 7px 0; + } + + @include govuk-media-query($from: desktop) { + padding: 0; + } + } + + &__item { + border-bottom: 1px solid #ced0d2; + clear: both; + flex-grow: 1; + font-weight: 700; + margin-bottom: 0; + padding-top: 0.5rem; + position: static; + z-index: 2; + + &:first-child { + background-image: none; + border-top: 1px solid #ced0d2; + } + + &:hover { + background-image: none; + } + + @include govuk-media-query($until: desktop) { + outline: none; + } + + @include govuk-media-query($from: desktop) { + background-image: url('../images/icons/line.svg'); + background-position: left center; + background-repeat: no-repeat; + background-size: 2px 20px; + border: none; + min-width: 7rem; + padding: 1rem 0 1rem 0.9rem; + + &:first-child { + border-top: none; + } + } + + .govuk-header__link { + @include govuk-media-query($from: desktop) { + font-size: 19px; + font-weight: bold !important; + } + } + + &[aria-expanded='true'] .cms-header-menu__item-icon { + background-image: url('../images/icons/arrow-down-purple.svg'); + @include govuk-media-query($from: desktop) { + background-position: center 9px; + } + } + + &-text, + &-text:hover, &-text:focus { + color: $white; + display: inline-block; + font-size: 1.125rem; + width: 100%; + padding-bottom: 0.5rem; + padding-left: 2px; + + @include govuk-media-query($from: desktop) { + font-size: 1.1875rem; + width: auto; + padding-bottom: 0; + padding-left: unset; + } + } + + + &-icon { + background-image: url('../images/icons/tick-white-no-border.svg'); + background-position: 0 10px; + background-repeat: no-repeat; + background-size: 0.7rem; + display: block; + width: 24px; + + @include govuk-media-query($from: desktop) { + background-position: center 10px; + padding-left: 10px; + } + } + } + + @media (any-hover: hover) { + .cms-header-menu__item:hover { + background-color: $white; + color: $purple-dark; + border: none; + margin: 0; + + @include govuk-media-query($from: desktop) { + filter: drop-shadow(0px 3px 10px rgba(0, 0, 0, 0.3)); + background-image: none; + } + } + + .cms-header-menu__item:hover .cms-header-menu__item-text { + color: $purple-dark; + padding-bottom: 0.5rem; + padding-left: 2px; + + @include govuk-media-query($from: desktop) { + padding-bottom: 0; + padding-left: unset; + } + } + } + + @media (any-hover: hover) { + .cms-header-menu__item:hover .cms-header-menu__item-icon { + background-image: url('../images/icons/arrow-down-purple.svg'); + @include govuk-media-query($from: desktop) { + background-position: center 9px; + } + } + } +} \ No newline at end of file diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 8635c9d735..356f68f652 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -4,6 +4,7 @@ class ApplicationController < ActionController::Base include Pagy::Backend before_action :authenticate + before_action :access_cms_header def authenticate return unless ENV["BASIC_AUTH_PASSWORD"] @@ -13,6 +14,12 @@ def authenticate end end + def access_cms_header + @cms_header = Cms::Singles::Header.get + rescue ActiveRecord::RecordNotFound + @cms_header = nil + end + def authenticate_user! redirect_to(helpers.create_account_url) unless current_user end diff --git a/app/helpers/navigation_helper.rb b/app/helpers/navigation_helper.rb deleted file mode 100644 index 8619140fd7..0000000000 --- a/app/helpers/navigation_helper.rb +++ /dev/null @@ -1,52 +0,0 @@ -module NavigationHelper - def header_navigation - [ - {text: "Primary", - children: [ - {text: "Subject lead toolkit", link: primary_teachers_path, label: "Subject lead toolkit"}, - {text: "Teacher certificate", link: cms_page_path("primary-certificate"), label: "Primary teacher certificate"}, - {text: "Enrichment", link: primary_enrichment_path, label: "Enrichment"}, - {text: "Early career teachers", link: cms_page_path("primary-early-careers"), label: "Primary ECT"}, - {text: "Trainee teachers", link: cms_page_path("primary-trainees"), label: "Primary Trainees"}, - {text: "Senior leaders", link: primary_senior_leaders_path, label: "Primary SLT"} - ]}, - {text: "Secondary", - children: [ - {text: "Teacher toolkit", link: secondary_teachers_path, label: "Secondary teachers"}, - {text: "Teacher certification", link: secondary_certification_path, label: "Secondary teachers certification"}, - {text: "Enrichment", link: secondary_enrichment_path, label: "Enrichment"}, - {text: "Early career teachers", link: cms_page_path("secondary-early-careers"), label: "Secondary ECT"}, - {text: "Trainee teachers", link: cms_page_path("secondary-trainees"), label: "Secondary Trainees"}, - {text: "Senior leaders", link: secondary_senior_leaders_path, label: "Secondary SLT"} - ].compact}, - {text: "Training and support", - children: [ - {text: "Courses", link: courses_path, label: "Courses"}, - {text: "Funding", link: cms_page_path("funding"), label: "Bursaries"}, - {text: "Computing Hubs", link: hubs_path, label: "Computing hubs"}, - {text: "I Belong programme", link: about_i_belong_path, label: "i-belong"}, - {text: "GCSE Computer Science support", link: cms_page_path("gcse-cs-support"), label: "GCSE support"}, - {text: "Computing Clusters", link: cms_page_path("computing-clusters"), label: "Computing clusters"}, - {text: "School Trusts", link: cms_page_path("school-trusts"), label: "School trusts"} - ]}, - {text: "Teaching resources", - children: [ - {text: "Teaching resources", link: curriculum_key_stages_path, label: "Teaching resources"}, - {text: "Isaac Computer Science", link: about_isaac_computer_science_path, label: "Isaac Computer Science"}, - {text: "Careers support", link: careers_support_path, label: "Careers support"}, - {text: "Secondary question banks", link: secondary_question_banks_path, label: "Teaching resources"}, - {text: "Artificial Intelligence", link: cms_page_path(page_slug: "artificial-intelligence"), label: "Artificial Intelligence"}, - {text: "Pedagogy", link: cms_page_path(page_slug: "pedagogy"), label: "Pedagogy"}, - {text: "Primary computing glossary", link: cms_page_path(page_slug: "primary-computing-glossary"), label: "Resources primary glossary"}, - {text: "Physical computing kits", link: cms_page_path("physical-computing-kit"), label: "Physical computing kits"} - ]}, - {text: "About us", - children: [ - {text: "About the NCCE", link: about_path, label: "About the NCCE"}, - {text: "News", link: cms_posts_path, label: "News"}, - {text: "Impact and evaluation", link: impact_path, label: "Impact"}, - {text: "Get involved", link: get_involved_path, label: "Get involved"} - ]} - ] - end -end diff --git a/app/services/cms/collections/programme.rb b/app/services/cms/collections/programme.rb index 6f570a8b83..19972c723b 100644 --- a/app/services/cms/collections/programme.rb +++ b/app/services/cms/collections/programme.rb @@ -1,10 +1,6 @@ module Cms module Collections class Programme < Resource - def to_search_record(index_time) - raise NotImplementedError - end - def self.is_collection = true def self.collection_attribute_mappings diff --git a/app/services/cms/models/header_menu.rb b/app/services/cms/models/header_menu.rb new file mode 100644 index 0000000000..2fffdb422a --- /dev/null +++ b/app/services/cms/models/header_menu.rb @@ -0,0 +1,13 @@ +module Cms + module Models + class HeaderMenu + def initialize(menus) + @menus = menus + end + + def render + Cms::HeaderMenuComponent.new(menu_items: @menus) + 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 80ba488b76..daac7fe47c 100644 --- a/app/services/cms/providers/strapi/factories/model_factory.rb +++ b/app/services/cms/providers/strapi/factories/model_factory.rb @@ -57,9 +57,22 @@ def self.process_model(mapping, all_data) model_class.new(cms_models: strapi_data.map { ComponentFactory.process_component(_1) }.compact) elsif model_class == Models::EnrichmentList to_enrichment_list(all_data, strapi_data) + elsif model_class == Models::HeaderMenu + to_menu(strapi_data) end end + def self.to_menu(strapi_data) + Models::HeaderMenu.new( + strapi_data.map do |menu_item| + { + label: menu_item[:label], + menu_items: menu_item[:menuItems].map { {label: _1[:label], url: _1[:url]} } + } + end + ) + end + def self.to_seo(strapi_data) Models::Seo.new( title: strapi_data[:title], diff --git a/app/services/cms/providers/strapi/graphql_client.rb b/app/services/cms/providers/strapi/graphql_client.rb index 2ca55c3ae4..b044e9392f 100644 --- a/app/services/cms/providers/strapi/graphql_client.rb +++ b/app/services/cms/providers/strapi/graphql_client.rb @@ -34,10 +34,15 @@ def one(resource_class, resource_id = nil, preview: false, preview_key: nil) data = clean_aliases(response.original_hash) results = data[:data][resource_class.graphql_key.to_sym][:data] - raise ActiveRecord::RecordNotFound if results.empty? - map_resource(resource_class, results.first, preview, preview_key) + record = if resource_class.is_collection + results.first + else + results + end + + map_resource(resource_class, record, preview, preview_key) end # This has been created to allow for alias to be alias_name__field_name diff --git a/app/services/cms/providers/strapi/graphql_connection.rb b/app/services/cms/providers/strapi/graphql_connection.rb index 320d985526..6b900730b9 100644 --- a/app/services/cms/providers/strapi/graphql_connection.rb +++ b/app/services/cms/providers/strapi/graphql_connection.rb @@ -17,7 +17,8 @@ def api(schema_path: nil) ) end - def dump_schema + def dump_schema(schema_path: nil) + api(schema_path:) # initialize client GraphQL::Client.dump_schema(@client.schema)&.to_json end end diff --git a/app/services/cms/providers/strapi/mocks/header.rb b/app/services/cms/providers/strapi/mocks/header.rb new file mode 100644 index 0000000000..28b6afecf4 --- /dev/null +++ b/app/services/cms/providers/strapi/mocks/header.rb @@ -0,0 +1,23 @@ +module Cms + module Providers + module Strapi + module Mocks + class Header < StrapiMock + attribute(:dropDowns) { Array.new(3) { DropDownMenu.generate_raw_data } } + end + + class DropDownMenu < StrapiMock + strapi_component "content-blocks.drop-down-menu" + attribute(:label) { Faker::Lorem.word } + attribute(:menuItems) { Array.new(5) { MenuItem.generate_raw_data } } + end + + class MenuItem < StrapiMock + strapi_component "content-blocks.menu-item" + attribute(:label) { Faker::Lorem.word } + attribute(:url) { "/primary-certificate" } + end + end + end + end +end diff --git a/app/services/cms/providers/strapi/queries/base_query.rb b/app/services/cms/providers/strapi/queries/base_query.rb index 6e5dd5cc1f..29dba61999 100644 --- a/app/services/cms/providers/strapi/queries/base_query.rb +++ b/app/services/cms/providers/strapi/queries/base_query.rb @@ -12,6 +12,7 @@ class BaseQuery Models::EnrichmentDynamicZone => EnrichmentDynamicZone, Models::EnrichmentList => EnrichmentList, Models::FeaturedImage => FeaturedImage, + Models::HeaderMenu => HeaderMenu, Models::PageTitle => PageTitle, Models::Seo => Seo, Models::SimpleTitle => SimpleField, @@ -78,14 +79,20 @@ def all_query(page, page_size, params = {}) GRAPHQL end - def single_query(id) + def single_query(id = nil) filters = {} - filters[resource_filter] = {eq: id} + if @collection_class.is_collection + raise StandardError if id.nil? + filters[resource_filter] = {eq: id} + end + filter_string = if filters.any? + "(#{query_string(:filters, filters)})" + end <<~GRAPHQL.freeze query { - #{resource_name}( #{query_string(:filters, filters)} ) { + #{resource_name} #{filter_string} { data { - id + #{"id" if @collection_class.is_collection} attributes { updatedAt createdAt diff --git a/app/services/cms/providers/strapi/queries/header_menu.rb b/app/services/cms/providers/strapi/queries/header_menu.rb new file mode 100644 index 0000000000..b8e9c721a4 --- /dev/null +++ b/app/services/cms/providers/strapi/queries/header_menu.rb @@ -0,0 +1,21 @@ +module Cms + module Providers + module Strapi + module Queries + class HeaderMenu + def self.embed(name) + <<~GRAPHQL.freeze + #{name} { + label + menuItems { + label + url + } + } + GRAPHQL + end + end + end + end + end +end diff --git a/app/services/cms/singles/header.rb b/app/services/cms/singles/header.rb new file mode 100644 index 0000000000..1d0d13009f --- /dev/null +++ b/app/services/cms/singles/header.rb @@ -0,0 +1,19 @@ +module Cms + module Singles + class Header < Resource + def self.resource_attribute_mappings + [ + {model: Models::HeaderMenu, key: :dropDowns} + ] + end + + def self.cache_expiry + 15.minutes + end + + def self.resource_key = "header" + + def self.graphql_key = "header" + end + end +end diff --git a/app/views/components/_header.html.erb b/app/views/components/_header.html.erb index a943a64516..3694445c09 100644 --- a/app/views/components/_header.html.erb +++ b/app/views/components/_header.html.erb @@ -53,21 +53,12 @@ - + <% end %> + diff --git a/app/views/layouts/view_component_preview.html.erb b/app/views/layouts/view_component_preview.html.erb new file mode 100644 index 0000000000..a87c96f1f0 --- /dev/null +++ b/app/views/layouts/view_component_preview.html.erb @@ -0,0 +1,12 @@ +<% content_for :content do -%> +
+
+ <%= render 'components/flash' %> + <%= yield %> +
+
+<% end -%> + +<% @cms_header = Cms::Singles::Header.get() %> + +<%= render 'layouts/base' %> diff --git a/app/webpacker/stylesheets/components/_header.scss b/app/webpacker/stylesheets/components/_header.scss index 09ebb74ee1..0cac73218f 100644 --- a/app/webpacker/stylesheets/components/_header.scss +++ b/app/webpacker/stylesheets/components/_header.scss @@ -96,13 +96,6 @@ } } -.ncce-header__certification, -.ncce-header__user { - list-style: none; - margin: 0; - padding: 0; -} - .ncce-header__site-search { width: 100%; margin-bottom: 1rem; @@ -117,9 +110,12 @@ } } - ///user navigation .ncce-header__user { + list-style: none; + margin: 0; + padding: 0; + @include govuk-media-query($from: desktop) { margin-bottom: 12px; position: absolute; @@ -129,191 +125,6 @@ } } -///certification navigation -.ncce-header__certification { - li { - @include govuk-media-query($from: desktop) { - position: relative; - } - } - - ul li ul li { - clear: both; - width: 100%; - } - - @include govuk-media-query($from: desktop) { - display: flex; - flex-direction: row; - margin: 0; - padding-top: 25px 0 0 0; - } - - .govuk-body { - margin-bottom: 0 !important; - - @include govuk-media-query($from: desktop) { - margin-bottom: unset; - } - } -} - -@media (any-hover: hover) { - .ncce-header__certification-item:hover .dropdown__expander-content, .ncce-header__certification-item.dropdown__expander { - display: block; - opacity: 1; - visibility: visible; - } -} - -.ncce-header__wrap { - display: flex; - padding: 5px 0; - - @include govuk-media-query($from: tablet) { - padding: 7px 0; - } - - @include govuk-media-query($from: desktop) { - padding: 0; - } -} - -.ncce-header__certification-item { - border-bottom: 1px solid #ced0d2; - clear: both; - flex-grow: 1; - font-weight: 700; - margin-bottom: 0; - padding-top: 0.5rem; - position: static; - z-index: 2; - - &:first-child { - background-image: none; - border-top: 1px solid #ced0d2; - } - - &:hover { - background-image: none; - } - - @include govuk-media-query($until: desktop) { - outline: none; - } - - @include govuk-media-query($from: desktop) { - background-image: url('../images/icons/line.svg'); - background-position: left center; - background-repeat: no-repeat; - background-size: 2px 20px; - border: none; - min-width: 7rem; - padding: 1rem 0 1rem 0.9rem; - - &:first-child { - border-top: none; - } - } - - .govuk-header__link { - @include govuk-media-query($from: desktop) { - font-size: 19px; - font-weight: bold !important; - } - } -} - -@media (any-hover: hover) { - .ncce-header__certification-item:hover { - background-color: $white; - color: $purple-dark; - border: none; - margin: 0; - - @include govuk-media-query($from: desktop) { - filter: drop-shadow(0px 3px 10px rgba(0, 0, 0, 0.3)); - background-image: none; - } - } - - .ncce-header__certification-item:hover .ncce-header__certification-item--text { - color: $purple-dark; - padding-bottom: 0.5rem; - padding-left: 2px; - - @include govuk-media-query($from: desktop) { - padding-bottom: 0; - padding-left: unset; - } - } -} - - -.ncce-header__certification-item--text, -.ncce-header__certification-item--text:hover { - color: $white; - display: inline-block; - font-size: 1.125rem; - width: 100%; - - @include govuk-media-query($from: desktop) { - font-size: 1.1875rem; - width: auto; - } -} - -.ncce-header__certification-item--text:focus { - color: $white; -} - -.ncce-header__certification-item .ncce-header__certification-item--text { - color: $white; - padding-bottom: 0.5rem; - padding-left: 2px; - - @include govuk-media-query($from: desktop) { - padding-bottom: 0; - padding-left: unset; - } -} - -.ncce-header__certification-item--icon { - background-image: url('../images/icons/tick-white-no-border.svg'); - background-position: 0 10px; - background-repeat: no-repeat; - background-size: 0.7rem; - display: block; - width: 24px; - - @include govuk-media-query($from: desktop) { - background-position: center 10px; - padding-left: 10px; - } -} - -.ncce-header__certification-item .ncce-header__certification-item--icon { - background-image: url('../images/icons/tick-white-no-border.svg'); - @include govuk-media-query($from: desktop) { - } -} - -@media (any-hover: hover) { - .ncce-header__certification-item:hover .ncce-header__certification-item--icon { - background-image: url('../images/icons/arrow-down-purple.svg'); - @include govuk-media-query($from: desktop) { - background-position: center 9px; - } - } -} - -.ncce-header__certification-item[aria-expanded='true'] .ncce-header__certification-item--icon { - background-image: url('../images/icons/arrow-down-purple.svg'); - @include govuk-media-query($from: desktop) { - background-position: center 9px; - } -} - /// links .govuk-header__link { color: $white; diff --git a/config/application.rb b/config/application.rb index f05d98344c..b664729b81 100644 --- a/config/application.rb +++ b/config/application.rb @@ -32,6 +32,8 @@ class Application < Rails::Application g.orm :active_record, primary_key_type: :uuid end + config.view_component.default_preview_layout = "view_component_preview" + config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**/*.{rb,yml}").to_s] config.mylearning_dashboard_url = ENV["MYLEARNING_DASHBOARD_URL"] diff --git a/lib/tasks/update_strapi_test_schema.rake b/lib/tasks/update_strapi_test_schema.rake new file mode 100644 index 0000000000..78729942aa --- /dev/null +++ b/lib/tasks/update_strapi_test_schema.rake @@ -0,0 +1,8 @@ +namespace :strapi do + task update_graphql_schema: :environment do + raise "You should not run this in production" if Rails.env.production? + + schema = Cms::Providers::Strapi::GraphqlConnection.dump_schema + File.write(ENV["STRAPI_TEST_SCHEMA_PATH"], schema) + end +end diff --git a/previews/components/cms/header_menu_component_preview.rb b/previews/components/cms/header_menu_component_preview.rb new file mode 100644 index 0000000000..559eb857be --- /dev/null +++ b/previews/components/cms/header_menu_component_preview.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class Cms::HeaderMenuComponentPreview < ViewComponent::Preview + layout "view_component_preview" + + def default + render(Cms::RichTextBlockComponent.new(blocks: + [ + { + type: "heading", + level: 1, + children: [ + {type: "text", text: "Menu Preview"} + ] + }, + { + type: "paragraph", + children: [ + {type: "text", text: "This heading, and all headings in previews are loaded from Strapi"} + ] + } + ])) + end +end diff --git a/spec/components/cms/header_menu_component_spec.rb b/spec/components/cms/header_menu_component_spec.rb new file mode 100644 index 0000000000..11ed9f5212 --- /dev/null +++ b/spec/components/cms/header_menu_component_spec.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe Cms::HeaderMenuComponent, type: :component do + before do + render_inline(described_class.new(menu_items: [ + { + label: "Drop down 1", + menu_items: [ + {label: "Menu 1 Item 1", url: "/primary-certificate"}, + {label: "Menu 1 Item 2", url: "/primary-enrichment"} + ] + }, + { + label: "Drop down 2", + menu_items: [ + {label: "Menu 2 Item 1", url: "/secondary-certificate"}, + {label: "Menu 2 Item 2", url: "/secondary-enrichment"} + ] + } + ])) + end + + it "should render the drop downs" do + expect(page).to have_css(".cms-header-menu__item.dropdown__expander", count: 2) + end + + it "should render all links" do + expect(page).to have_css(".dropdown__expander-content-item", count: 4) + end +end diff --git a/spec/lib/tasks/update_strapi_test_schema_spec.rb b/spec/lib/tasks/update_strapi_test_schema_spec.rb new file mode 100644 index 0000000000..cae19ca6af --- /dev/null +++ b/spec/lib/tasks/update_strapi_test_schema_spec.rb @@ -0,0 +1,13 @@ +require "rails_helper" + +RSpec.describe "rake strapi:update_graphql_schema", type: :task do + before do + @schema = File.new("spec/support/cms/providers/strapi/schema.json").read.freeze + stub_strapi_schema + end + + it "should write the schema to the file defined by STRAPI_TEST_SCHEMA_PATH" do + expect(File).to receive(:write).with(ENV["STRAPI_TEST_SCHEMA_PATH"], @schema) + task.execute + end +end diff --git a/spec/mailers/i_belong_mailer_spec.rb b/spec/mailers/i_belong_mailer_spec.rb index 8c6b807535..a938fbd6c6 100644 --- a/spec/mailers/i_belong_mailer_spec.rb +++ b/spec/mailers/i_belong_mailer_spec.rb @@ -3,7 +3,6 @@ RSpec.describe IBelongMailer, type: :mailer do include ApplicationHelper include ExternalLinkHelper - include NavigationHelper let(:user) { create(:user, first_name: "Tobias", last_name: "Doe") } let(:programme) { create(:i_belong) } diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index d27741e6c7..ddfbde3ab9 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -99,6 +99,11 @@ def page config.before(:each, type: :system) do driven_by selenium_driver + stub_strapi_header + end + + config.before(:each, type: :request) do + stub_strapi_header end config.after(:each, js: true, type: :system) do |_spec| diff --git a/spec/services/cms/providers/strapi/graphql_connection_spec.rb b/spec/services/cms/providers/strapi/graphql_connection_spec.rb index 1f123d015e..4fe3b89ac6 100644 --- a/spec/services/cms/providers/strapi/graphql_connection_spec.rb +++ b/spec/services/cms/providers/strapi/graphql_connection_spec.rb @@ -3,9 +3,8 @@ RSpec.describe Cms::Providers::Strapi::GraphqlConnection do describe "#dump_schema" do it "should call GraphQL::Client.dump_schema" do - described_class.api(schema_path: ENV["STRAPI_TEST_SCHEMA_PATH"]) expect(GraphQL::Client).to receive(:dump_schema) - described_class.dump_schema + described_class.dump_schema(schema_path: ENV["STRAPI_TEST_SCHEMA_PATH"]) end end end diff --git a/spec/services/cms/providers/strapi/queries/header_spec.rb b/spec/services/cms/providers/strapi/queries/header_spec.rb new file mode 100644 index 0000000000..02b9e18870 --- /dev/null +++ b/spec/services/cms/providers/strapi/queries/header_spec.rb @@ -0,0 +1,9 @@ +require "rails_helper" + +RSpec.describe Cms::Providers::Strapi::Queries::HeaderMenu do + it_should_behave_like "a strapi graphql embed", {key: "header", + required_fields: %w[ + label + menuItems + ]} +end diff --git a/spec/support/cms/providers/strapi/strapi_stubs.rb b/spec/support/cms/providers/strapi/strapi_stubs.rb index 143d3329b1..7ca1380f84 100644 --- a/spec/support/cms/providers/strapi/strapi_stubs.rb +++ b/spec/support/cms/providers/strapi/strapi_stubs.rb @@ -170,16 +170,26 @@ def stub_strapi_programme(key, programme: Cms::Mocks::Programme.generate_raw_dat end end + def stub_strapi_header(header: Cms::Mocks::Header.generate_raw_data) + if as_graphql + stub_strapi_graphql_query("header", header, singular: true) + end + end + def stub_strapi_schema stub_request(:post, /^https:\/\/strapi.teachcomputing.org\/graphql/) .with(body: /IntrospectionQuery/) .to_return_json(body: GRAPH_SCHEMA) end - def stub_strapi_graphql_query(resource_name, record, unique_key: nil) + def stub_strapi_graphql_query(resource_name, record, unique_key: nil, singular: false) stub_strapi_schema response = {} - response[resource_name] = {data: Array.wrap(record)} + response[resource_name] = if singular + {data: record} + else + {data: Array.wrap(record)} + end stub = stub_request(:post, /^https:\/\/strapi.teachcomputing.org\/graphql/) .with(body: /#{resource_name}/) .to_return_json(body: {data: response}) diff --git a/spec/views/cms/collection.html_spec.rb b/spec/views/cms/collection.html_spec.rb index ea49acfa7c..6f99f837d6 100644 --- a/spec/views/cms/collection.html_spec.rb +++ b/spec/views/cms/collection.html_spec.rb @@ -2,6 +2,7 @@ RSpec.describe("cms/blog", type: :view) do before do + stub_strapi_header stub_strapi_blog_collection assign(:collection, Cms::Collections::Blog.all(1, 50)) assign(:title, "Page title") diff --git a/spec/views/cms/resource.html_spec.rb b/spec/views/cms/resource.html_spec.rb index 676ad4f350..9731d59fe4 100644 --- a/spec/views/cms/resource.html_spec.rb +++ b/spec/views/cms/resource.html_spec.rb @@ -2,6 +2,7 @@ RSpec.describe("cms/resource", type: :view) do before do + stub_strapi_header stub_strapi_get_single_blog_post("blogs/test-blog", seo: { title: "some SEO content", diff --git a/spec/views/components/_header_spec.rb b/spec/views/components/_header_spec.rb index cd68d23f4a..06fa709b62 100644 --- a/spec/views/components/_header_spec.rb +++ b/spec/views/components/_header_spec.rb @@ -8,19 +8,19 @@ programme: create(:cs_accelerator)) end - it "has a link to the home page " do - render - expect(rendered).to have_xpath('//a[@href = "/"][contains(@class, "govuk-header__link")]', count: 1) + before do + stub_strapi_header + assign(:cms_header, Cms::Singles::Header.get) end - it "shows a link to Primary teachers" do + it "has a link to the home page " do render - expect(rendered).to have_link("Subject lead toolkit", href: "/primary-teachers") + expect(rendered).to have_xpath('//a[@href = "/"][contains(@class, "govuk-header__link")]', count: 1) end - it "shows a link to Secondary teachers" do + it "should render the header menu" do render - expect(rendered).to have_link("Teacher certification", href: "/secondary-certification") + expect(rendered).to have_css(".cms-header-menu") end context "when a user is signed in" do diff --git a/spec/views/layouts/application.html_spec.rb b/spec/views/layouts/application.html_spec.rb index 3a296cd9c1..92d98beb84 100644 --- a/spec/views/layouts/application.html_spec.rb +++ b/spec/views/layouts/application.html_spec.rb @@ -2,6 +2,7 @@ RSpec.describe("layouts/application", type: :view) do before do + stub_strapi_header render end