diff --git a/app/controllers/ab_tests/elastic_search_aa_testable.rb b/app/controllers/ab_tests/elastic_search_aa_testable.rb new file mode 100644 index 000000000..4dda8e9c6 --- /dev/null +++ b/app/controllers/ab_tests/elastic_search_aa_testable.rb @@ -0,0 +1,19 @@ +module AbTests::ElasticSearchAaTestable + def elastic_search_aa_test + GovukAbTesting::AbTest.new( + "EsSixPointSeven", + dimension: 41, + allowed_variants: %w[A B Z], + control_variant: "Z", + ) + end + + def page_under_test? + request.path.include?("/search/all") + end + + def set_requested_variant + @requested_variant = elastic_search_aa_test.requested_variant(request.headers) + @requested_variant.configure_response(response) + end +end diff --git a/app/controllers/finders_controller.rb b/app/controllers/finders_controller.rb index 2aae040cf..bef8ceaa0 100644 --- a/app/controllers/finders_controller.rb +++ b/app/controllers/finders_controller.rb @@ -1,5 +1,6 @@ class FindersController < ApplicationController layout "finder_layout" + include AbTests::ElasticSearchAaTestable before_action do set_expiry(content_item) @@ -8,6 +9,10 @@ class FindersController < ApplicationController def show slimmer_template "gem_layout_full_width" if i_am_a_topic_page_finder + if page_under_test? + set_requested_variant + end + respond_to do |format| format.html do raise UnsupportedContentItem unless content_item.is_finder? @@ -58,7 +63,7 @@ class UnsupportedContentItem < StandardError; end attr_reader :search_query - helper_method :facet_tags, :i_am_a_topic_page_finder, :result_set_presenter, :content_item, :signup_links, :filter_params, :facets + helper_method :facet_tags, :i_am_a_topic_page_finder, :result_set_presenter, :content_item, :signup_links, :filter_params, :facets, :page_under_test? def redirect_to_destination @redirect = content_item.redirect diff --git a/app/views/finders/_show_header.html.erb b/app/views/finders/_show_header.html.erb index e7778e12a..62b36df0d 100644 --- a/app/views/finders/_show_header.html.erb +++ b/app/views/finders/_show_header.html.erb @@ -66,6 +66,12 @@ <% end %> + <% if page_under_test? %> + <% content_for :meta_tags do %> + <%= @requested_variant.analytics_meta_tag.html_safe %> + <% end %> + <% end %> + <% if content_item.summary %>
diff --git a/app/views/layouts/finder_layout.html.erb b/app/views/layouts/finder_layout.html.erb index cac21f394..c4fbc89ad 100644 --- a/app/views/layouts/finder_layout.html.erb +++ b/app/views/layouts/finder_layout.html.erb @@ -24,6 +24,7 @@ <% end %> + <%= yield :meta_tags %> diff --git a/spec/controllers/finders_controller_spec.rb b/spec/controllers/finders_controller_spec.rb index f11bdc006..7f253df22 100644 --- a/spec/controllers/finders_controller_spec.rb +++ b/spec/controllers/finders_controller_spec.rb @@ -40,6 +40,7 @@ after { Rails.cache.clear } describe "GET show" do + render_views describe "a finder content item exists" do before do stub_content_store_has_item( @@ -108,6 +109,52 @@ get :show, params: { slug: "lunch-finder" } expect(response.status).to eq(406) end + + context "with AA test" do + %w[A B Z].each do |variant| + it "renders the #{variant} variant for /search/all pages" do + stub_content_store_has_item( + "/search/all", + all_content_finder, + ) + + @request.headers["GOVUK-ABTest-EsSixPointSeven"] = variant + + get :show, params: { slug: "search/all" } + + expect(response.header["Vary"]).to eq("GOVUK-ABTest-EsSixPointSeven") + expect(response.body).to include("EsSixPointSeven:#{variant}") + end + + it "doesn't render the #{variant} for finders" do + stub_content_store_has_item( + "/lunch-finder", + lunch_finder, + ) + + @request.headers["GOVUK-ABTest-EsSixPointSeven"] = variant + + get :show, params: { slug: "lunch-finder" } + + expect(response.status).to eq(200) + expect(response.header["Vary"]).not_to eq("GOVUK-ABTest-EsSixPointSeven") + expect(response.body).not_to include("EsSixPointSeven:#{variant}") + end + end + + it "should render the page without an AB test variant for search" do + stub_content_store_has_item( + "/search/all", + all_content_finder, + ) + + get :show, params: { slug: "search/all" } + + expect(response.status).to eq(200) + expect(response.header["Vary"]).to eq("GOVUK-ABTest-EsSixPointSeven") + expect(response.body).not_to include("") + end + end end describe "a finder content item with a default order exists" do