Skip to content

Commit f15006f

Browse files
test: add basic dataLayer tests header and unity-react-core
1 parent 526f02b commit f15006f

File tree

6 files changed

+162
-2
lines changed

6 files changed

+162
-2
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<!-- FONTAWESOME loaded from CDN 'kit' URL -->
2+
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/js/all.min.js" integrity="sha512-uKQ39gEGiyUJl4AI6L+ekBdGKpGw4xJ55+xyJG7YFlJokPNYegn9KwQ3P8A7aFQAUtUsAQHep+d/lrGqrbPIDQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
3+
4+
<!-- Initialize dataLayer for GA. Implementing sites will need this above GTM snippet. More info: https://developers.google.com/tag-manager/devguide -->
5+
<script>
6+
window.global = window;
7+
dataLayer = [];
8+
</script>
9+
10+
<!-- Google Tag Manager ASU Universal-->
11+
<script>
12+
(function (w, d, s, l, i) {
13+
w[l] = w[l] || [];
14+
w[l].push({
15+
"gtm.start": new Date().getTime(),
16+
"event": "gtm.js",
17+
});
18+
var f = d.getElementsByTagName(s)[0],
19+
j = d.createElement(s),
20+
dl = l != "dataLayer" ? "&l=" + l : "";
21+
j.async = true;
22+
j.src = "//www.googletagmanager.com/gtm.js?id=" + i + dl;
23+
f.parentNode.insertBefore(j, f);
24+
})(window, document, "script", "dataLayer", "GTM-KDWN8Z");
25+
</script>
26+
<!-- Google Tag Manager (noscript) -->
27+
<!-- <noscript>
28+
<iframe src="//www.googletagmanager.com/ns.html?id=GTM-KDWN8Z" height="0" width="0"
29+
style="display: none; visibility: hidden"></iframe>
30+
</noscript> -->
31+
<!-- End Google Tag Manager ASU Universal -->
32+
33+
<style>
34+
div.sbdocs.sbdocs-wrapper {
35+
gap: 0rem!important;
36+
}
37+
</style>

packages/component-header-footer/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
},
3434
"scripts": {
3535
"lint": "eslint --fix 'src/**/*.{js,jsx}' --ignore-path ../../.eslintignore",
36-
"test": "jest --config=./jest.config.js --silent --coverage",
36+
"test": "jest --config=./jest.config.js --silent --coverage && yarn test-datalayer",
37+
"test-datalayer": "playwright test tests/dataLayer-header.spec.mjs",
3738
"test-update-snapshot": "yarn test -- -u",
3839
"build": "vite build && yarn postbuild",
3940
"build:stats": "webpack -c webpack/webpack.prod.js --profile --json=compilation-stats.json",
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { defineConfig } from '@playwright/test';
2+
import defaultConfig from "../unity-react-core/playwright.config.js";
3+
4+
export default defineConfig({
5+
...defaultConfig,
6+
use: {
7+
baseURL: 'http://localhost:9080',
8+
trace: 'on-firstt-retry',
9+
},
10+
});
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { test, expect } from '@playwright/test';
2+
3+
const STORYBOOK_URL = 'http://localhost:9080';
4+
const STORY_ID = 'uds-asu-header--default';
5+
6+
async function getLatestLinkEvent(page) {
7+
return await page.evaluate(() => {
8+
if (!window.dataLayer) return null;
9+
const events = window.dataLayer.filter(e => e && e.region === 'navbar');
10+
return events.length ? events[events.length - 1] : null;
11+
});
12+
}
13+
14+
test.describe('GTM dataLayer events for ASUHeader', () => {
15+
test('should push correct events when clicking navbar item', async ({ page }) => {
16+
await page.goto(`${STORYBOOK_URL}/iframe.html?id=${STORY_ID}&viewMode=story`);
17+
18+
await page.waitForSelector('[data-testid="navigation"]');
19+
20+
const navLinks = await page.$$('.nav-list a');
21+
expect(navLinks.length).toBeGreaterThan(0);
22+
23+
const dataLayerInit = await page.evaluate(() => Array.isArray(window.dataLayer));
24+
expect(dataLayerInit).toBe(true);
25+
const navText = await navLinks[1].textContent();
26+
27+
await navLinks[1].click();
28+
let event = await getLatestLinkEvent(page);
29+
expect(event).not.toBeNull();
30+
expect(event.event).toBe('collapse');
31+
expect(event.action).toBe('open');
32+
expect(event.region).toBe('navbar');
33+
expect(event.section).toBe('main navbar');
34+
expect(event.text?.toLowerCase()).toEqual(navText?.toLowerCase());
35+
});
36+
37+
test('should push correct events when clicking dropdown link', async ({ page }) => {
38+
await page.goto(`${STORYBOOK_URL}/iframe.html?id=${STORY_ID}&viewMode=story`);
39+
await page.waitForSelector('[data-testid="navigation"]');
40+
41+
await page.evaluate(() => {
42+
document.querySelectorAll('a').forEach(a => {
43+
a.addEventListener('click', e => e.preventDefault());
44+
});
45+
});
46+
47+
const navLinks = await page.$$('.nav-list a');
48+
expect(navLinks.length).toBeGreaterThan(1);
49+
await navLinks[1].click();
50+
51+
const dropdownLinks = await page.$$('.header-dropdown-1 a');
52+
53+
expect(dropdownLinks.length).toBeGreaterThan(0);
54+
const dropdownText = await dropdownLinks[0].textContent();
55+
56+
await dropdownLinks[0].click();
57+
let event = await getLatestLinkEvent(page);
58+
expect(event).not.toBeNull();
59+
expect(event.event).toBe('link');
60+
expect(event.action).toBe('click');
61+
expect(event.region).toBe('navbar');
62+
expect(event.section).toBe('main navbar');
63+
expect(event.text?.toLowerCase()).toEqual(dropdownText?.toLowerCase());
64+
});
65+
});

packages/unity-react-core/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
"create": "plop",
3232
"dev": "yarn storybook & yarn testui",
3333
"lint": "eslint --fix 'src/**/*.{js,jsx}' --ignore-path ../../.eslintignore",
34-
"test": "vitest --watch=false",
34+
"test": "vitest --watch=false && yarn test-datalayer",
35+
"test-datalayer": "playwright test tests/dataLayer.spec.mjs",
3536
"test:accessibility": "playwright test",
3637
"testui": "vitest --ui",
3738
"start:dev": "webpack-dashboard -- webpack serve -c webpack/webpack.dev.js",
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { test, expect } from '@playwright/test';
2+
3+
const STORYBOOK_BASE_URL = 'http://localhost:9200';
4+
const STORY_ID_PARAMS = 'iframe.html?id=components-accordion--color-combinations&viewMode=story';
5+
6+
const testUrls = [
7+
{
8+
name: 'Bootstrap Version',
9+
url: `${STORYBOOK_BASE_URL}/${STORY_ID_PARAMS}`,
10+
},
11+
{
12+
name: 'React Framework',
13+
url: `${STORYBOOK_BASE_URL}/${STORY_ID_PARAMS}&globals=framework:react`,
14+
},
15+
];
16+
17+
async function getLatestCollapseEvent(page) {
18+
return await page.evaluate(() => {
19+
if (!window.dataLayer) return null;
20+
21+
const events = window.dataLayer.filter(e => e && e.event === 'collapse');
22+
return events.length ? events[events.length - 1] : null;
23+
});
24+
}
25+
26+
for (const config of testUrls) {
27+
test.describe(`GTM dataLayer events for Accordion - ${config.name}`, () => {
28+
test('should push correct events when opening and closing accordion', async ({ page }) => {
29+
await page.goto(config.url);
30+
31+
await page.waitForSelector('[data-testid="accordion-opener"]');
32+
33+
const openers = await page.$$('[data-testid="accordion-opener"]');
34+
expect(openers.length).toBeGreaterThan(0);
35+
36+
const dataLayerInit = await page.evaluate(() => Array.isArray(window.dataLayer));
37+
expect(dataLayerInit).toBe(true);
38+
39+
await openers[0].click();
40+
let event = await getLatestCollapseEvent(page);
41+
expect(event).not.toBeNull();
42+
expect(event.action).toBe('close');
43+
expect(event.text).toBe('accordion card 1');
44+
});
45+
});
46+
}

0 commit comments

Comments
 (0)