From 80a89f28c502cc60dd410fc5b4b7ba63a1a90129 Mon Sep 17 00:00:00 2001 From: Christian Sutter Date: Fri, 18 Oct 2024 15:19:18 +0000 Subject: [PATCH] GA4: Fix ecommerce tracking of searches without query The GA4 ecommerce tracking for search results doesn't currently work if the user is searching for an empty query, as the check for whether the `ga4-search-query` data attribute is present uses loose Javascript boolean logic (i.e. returning false for an empty string). This amends it to strictly check for `null` instead (data attribute not present at all), and adds some tests for the search ecommerce data being properly set with the query present and absent. --- .../analytics-ga4/ga4-core.js | 2 +- .../analytics-ga4/ga4-core.spec.js | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.js b/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.js index f92e83b507..6265794f9d 100644 --- a/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.js +++ b/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.js @@ -333,7 +333,7 @@ window.GOVUK.analyticsGa4 = window.GOVUK.analyticsGa4 || {}; var element = data.element var resultsId = data.resultsId var isClickEvent = data.event !== undefined - var isSearchResult = element.getAttribute('data-ga4-search-query') + var isSearchResult = element.getAttribute('data-ga4-search-query') !== null var ecommerceSchema = new window.GOVUK.analyticsGa4.Schemas().ecommerceSchema() var DEFAULT_LIST_TITLE = 'Smart answer results' diff --git a/spec/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.spec.js b/spec/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.spec.js index e4eabd609a..c89c40ec04 100644 --- a/spec/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.spec.js +++ b/spec/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.spec.js @@ -629,6 +629,36 @@ describe('GA4 core', function () { expect(builtEcommerceObject).toEqual(expectedEcommerceObject) }) + it('tracks variant and term for search results', function () { + resultsParentEl.setAttribute('data-ga4-search-query', 'search term') + resultsParentEl.setAttribute('data-ga4-ecommerce-variant', 'upside-down') + + expectedEcommerceObject.search_results.term = 'search term' + expectedEcommerceObject.search_results.sort = 'upside-down' + + var builtEcommerceObject = GOVUK.analyticsGa4.core.ecommerceHelperFunctions.populateEcommerceSchema({ + element: resultsParentEl, + resultsId: 'result-count' + }) + + expect(builtEcommerceObject).toEqual(expectedEcommerceObject) + }) + + it('tracks variant and term for search results even when query is blank', function () { + resultsParentEl.setAttribute('data-ga4-search-query', '') + resultsParentEl.setAttribute('data-ga4-ecommerce-variant', 'upside-down') + + expectedEcommerceObject.search_results.term = undefined + expectedEcommerceObject.search_results.sort = 'upside-down' + + var builtEcommerceObject = GOVUK.analyticsGa4.core.ecommerceHelperFunctions.populateEcommerceSchema({ + element: resultsParentEl, + resultsId: 'result-count' + }) + + expect(builtEcommerceObject).toEqual(expectedEcommerceObject) + }) + it('the ecommerce items array is limited to a maximum of 15,000 UTF-16 code units', function () { var innerHTML = '' var ecommerceItems = []