Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions spec/components/CioPlpGrid/CioPlpGrid.server.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { DEMO_API_KEY } from '../../../src/constants';
import { transformSearchResponse } from '../../../src/utils/transformers';
import mockSearchResponse from '../../local_examples/apiSearchResponse.json';
import { RequestStatus } from '../../../src/components/CioPlpGrid/reducer';
import { cnstrcDataAttrs } from '../../../src/utils';

jest.mock('../../../src/styles.css', () => ({}));
jest.mock('../../../src/hooks/useSearchResults');
Expand Down Expand Up @@ -85,8 +86,10 @@ describe('Testing Component on the server: CioPlpGrid', () => {
</CioPlp>,
);

expect(html).toContain('data-cnstrc-search');
expect(html).toContain(`data-cnstrc-num-results="${mockSearchData.response.totalNumResults}"`);
expect(html).toContain(`data-cnstrc-result-id="${mockSearchData.resultId}"`);
expect(html).toContain(cnstrcDataAttrs.search.searchContainer);
expect(html).toContain(
`${cnstrcDataAttrs.common.numResults}="${mockSearchData.response.totalNumResults}"`,
);
expect(html).toContain(`${cnstrcDataAttrs.common.resultId}="${mockSearchData.resultId}"`);
});
});
62 changes: 33 additions & 29 deletions spec/components/CioPlpGrid/CioPlpGrid.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ import CioPlp from '../../../src/components/CioPlp';
import { DEMO_API_KEY } from '../../../src/constants';
import mockApiSearchResponse from '../../local_examples/apiSearchResponse.json';
import mockApiBrowseResponse from '../../local_examples/apiBrowseResponse.json';
import { transformBrowseResponse, transformSearchResponse } from '../../../src/utils';
import {
transformBrowseResponse,
transformSearchResponse,
cnstrcDataAttrs,
} from '../../../src/utils';
import useCioPlp from '../../../src/hooks/useCioPlp';
import useRequestConfigs from '../../../src/hooks/useRequestConfigs';
import { getAttribute } from '../../test-utils';
Expand Down Expand Up @@ -247,16 +251,18 @@ describe('Testing Component: CioPlpGrid', () => {

await waitFor(() => {
const getAttributeFromContainer = getAttribute(container);
const totalNumResults = getAttributeFromContainer('data-cnstrc-num-results');
const filterName = getAttributeFromContainer('data-cnstrc-filter-name');
const filterValue = getAttributeFromContainer('data-cnstrc-filter-value');
const resultId = getAttributeFromContainer('data-cnstrc-result-id');
const totalNumResults = getAttributeFromContainer(cnstrcDataAttrs.common.numResults);
const resultId = getAttributeFromContainer(cnstrcDataAttrs.common.resultId);
const filterName = getAttributeFromContainer(cnstrcDataAttrs.browse.filterName);
const filterValue = getAttributeFromContainer(cnstrcDataAttrs.browse.filterValue);

expect(container.querySelector('[data-cnstrc-browse]')).toBeInTheDocument();
expect(
container.querySelector(`[${cnstrcDataAttrs.browse.browseContainer}]`),
).toBeInTheDocument();
expect(totalNumResults).toEqual(String(mockBrowseData.response.totalNumResults));
expect(resultId).toEqual(String(mockBrowseData.resultId));
expect(filterName).toEqual(String(mockBrowseData.request.browse_filter_name));
expect(filterValue).toEqual(String(mockBrowseData.request.browse_filter_value));
expect(resultId).toEqual(String(mockBrowseData.resultId));
});
});

Expand Down Expand Up @@ -303,15 +309,17 @@ describe('Testing Component: CioPlpGrid', () => {
);

await waitFor(() => {
expect(container.querySelector('[data-cnstrc-search]')).toBeInTheDocument();
expect(
container
.querySelector('[data-cnstrc-num-results]')
.getAttribute('data-cnstrc-num-results'),
).toEqual(String(mockSearchData.response.totalNumResults));
const getAttributeFromContainer = getAttribute(container);
const totalNumResults = getAttributeFromContainer(cnstrcDataAttrs.common.numResults);
const resultId = getAttributeFromContainer(cnstrcDataAttrs.common.resultId);
const searchTerm = getAttributeFromContainer(cnstrcDataAttrs.search.searchTerm);

expect(
container.querySelector('[data-cnstrc-result-id]').getAttribute('data-cnstrc-result-id'),
).toEqual(String(mockSearchData.resultId));
container.querySelector(`[${cnstrcDataAttrs.search.searchContainer}]`),
).toBeInTheDocument();
expect(totalNumResults).toEqual(String(mockSearchData.response.totalNumResults));
expect(resultId).toEqual(mockSearchData.resultId);
expect(searchTerm).toEqual(mockSearchData.request.term);
});
});

Expand All @@ -328,22 +336,18 @@ describe('Testing Component: CioPlpGrid', () => {
);

await waitFor(() => {
const getAttributeFromContainer = getAttribute(container);
const totalNumResults = getAttributeFromContainer(cnstrcDataAttrs.common.numResults);
const resultId = getAttributeFromContainer(cnstrcDataAttrs.common.resultId);
const zeroResult = getAttributeFromContainer(cnstrcDataAttrs.common.zeroResults);

expect(container.querySelector('.cio-zero-results-header')).toBeInTheDocument();
expect(container.querySelector('[data-cnstrc-search]')).toBeInTheDocument();
expect(
container
.querySelector('[data-cnstrc-num-results]')
.getAttribute('data-cnstrc-num-results'),
).toEqual('0');
expect(
container.querySelector('[data-cnstrc-result-id]').getAttribute('data-cnstrc-result-id'),
).toEqual('test-zero-results');
expect(container.querySelector('[data-cnstrc-zero-result]')).toBeInTheDocument();
expect(
container
.querySelector('[data-cnstrc-zero-result]')
.getAttribute('data-cnstrc-zero-result'),
).toBe('true');
container.querySelector(`[${cnstrcDataAttrs.search.searchContainer}]`),
).toBeInTheDocument();
expect(totalNumResults).toEqual('0');
expect(resultId).toEqual('test-zero-results');
expect(zeroResult).toBe('true');
});
});
});
20 changes: 10 additions & 10 deletions spec/components/ProductCard/productCard.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { DEMO_API_KEY, EMITTED_EVENTS } from '../../../src/constants';
import testItem from '../../local_examples/item.json';
import testItemWithRolloverImages from '../../local_examples/itemWithRolloverImages.json';
import testItemWithSalePrice from '../../local_examples/itemWithSalePrice.json';
import { transformResultItem } from '../../../src/utils/transformers';
import { transformResultItem, cnstrcDataAttrs } from '../../../src/utils';
import { copyItemWithNewSalePrice } from '../../test-utils';
import mockApiSearchResponse from '../../local_examples/apiSearchResponse.json';

Expand Down Expand Up @@ -416,7 +416,7 @@ describe('Testing Component: ProductCard', () => {
expect(screen.queryByTestId('cio-sale-price')).toBeNull();
});

test('Should render data-cnstrc attributes on ProductCard', () => {
test('Should render cnstrc data attributes on ProductCard', () => {
const item = transformResultItem(testItem);
render(
<CioPlp apiKey={DEMO_API_KEY}>
Expand All @@ -425,13 +425,13 @@ describe('Testing Component: ProductCard', () => {
);

const productCard = screen.getByRole('link');
expect(productCard.getAttribute('data-cnstrc-item-id')).toBe(item.itemId);
expect(productCard.getAttribute('data-cnstrc-item-name')).toBe(item.itemName);
expect(productCard.getAttribute('data-cnstrc-item-price')).toBeTruthy();
expect(productCard.getAttribute('data-cnstrc-item-variation-id')).toBeTruthy();
expect(productCard.getAttribute(cnstrcDataAttrs.common.itemId)).toBe(item.itemId);
expect(productCard.getAttribute(cnstrcDataAttrs.common.itemName)).toBe(item.itemName);
expect(productCard.getAttribute(cnstrcDataAttrs.common.itemPrice)).toBeTruthy();
expect(productCard.getAttribute(cnstrcDataAttrs.common.variationId)).toBeTruthy();
});

test('Should render data-cnstrc-btn attribute on Add to Cart button', () => {
test('Should render conversion button attribute on Add to Cart button', () => {
const item = transformResultItem(testItem);
render(
<CioPlp apiKey={DEMO_API_KEY}>
Expand All @@ -440,7 +440,7 @@ describe('Testing Component: ProductCard', () => {
);

const addToCartButton = screen.getByText('Add to Cart');
expect(addToCartButton.getAttribute('data-cnstrc-btn')).toBe('add_to_cart');
expect(addToCartButton.getAttribute(cnstrcDataAttrs.common.conversionBtn)).toBe('add_to_cart');
});

test('Should include sponsored listing data attributes when present', () => {
Expand All @@ -460,7 +460,7 @@ describe('Testing Component: ProductCard', () => {
);

const productCard = screen.getByRole('link');
expect(productCard.getAttribute('data-cnstrc-sl-campaign-id')).toBe('test-campaign-123');
expect(productCard.getAttribute('data-cnstrc-sl-campaign-owner')).toBe('test-owner-456');
expect(productCard.getAttribute(cnstrcDataAttrs.common.slCampaignId)).toBe('test-campaign-123');
expect(productCard.getAttribute(cnstrcDataAttrs.common.slCampaignOwner)).toBe('test-owner-456');
});
});
17 changes: 7 additions & 10 deletions spec/components/ProductSwatch/ProductSwatch.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
/* eslint-disable @cspell/spellchecker */
/* eslint-disable react/jsx-filename-extension */
/* eslint-disable import/no-extraneous-dependencies */
import React from 'react';
import '@testing-library/jest-dom';
import { render, fireEvent, screen } from '@testing-library/react';
Expand All @@ -10,6 +8,7 @@ import { transformResultItem } from '../../../src/utils/transformers';
import SampleItem from '../../local_examples/item.json';
import CioPlp from '../../../src/components/CioPlp';
import { DEMO_API_KEY } from '../../../src/constants';
import { cnstrcDataAttrs } from '../../../src/utils';

describe('Product Swatch Component', () => {
const swatchObject = {
Expand Down Expand Up @@ -64,7 +63,8 @@ describe('Product Swatch Component', () => {
);

swatchObject.swatchList.forEach((swatch) => {
fireEvent.click(container?.querySelector(`[data-cnstrc-variation-id=${swatch.variationId}]`));
const swatchSelector = `[${cnstrcDataAttrs.common.variationId}=${swatch.variationId}]`;
fireEvent.click(container?.querySelector(swatchSelector));
expect(mockSelectVariation).toHaveBeenCalledWith(swatch);
});
});
Expand Down Expand Up @@ -94,18 +94,15 @@ describe('Test user interactions', () => {
// Selected variation should change properly when swatch is clicked
it('selected variation should change when swatch is clicked', () => {
const { container } = render(<UseProductSwatchExample {...props} />);
const secondSwatchSelector = `[${cnstrcDataAttrs.common.variationId}=${SampleItem.variations[1].data.variation_id}]`;

expect(container?.getElementsByClassName('cio-swatch-selected').length).toBe(1);
expect(
container?.getElementsByClassName('cio-swatch-selected')[0].dataset?.cnstrcVariationId,
container?.getElementsByClassName('cio-swatch-selected')[0].dataset?.cnstrcItemVariationId,
).toBe(SampleItem?.variations?.[0].data.variation_id);
fireEvent.click(
container?.querySelector(
`[data-cnstrc-variation-id=${SampleItem.variations[1].data.variation_id}]`,
),
);
fireEvent.click(container?.querySelector(secondSwatchSelector));
expect(
container?.getElementsByClassName('cio-swatch-selected')?.[0]?.dataset?.cnstrcVariationId,
container?.getElementsByClassName('cio-swatch-selected')?.[0]?.dataset?.cnstrcItemVariationId,
).toBe(SampleItem.variations[1].data.variation_id);
});
});
57 changes: 31 additions & 26 deletions spec/utils/dataAttributeHelpers.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
getProductCardCnstrcDataAttributes,
getPlpContainerCnstrcDataAttributes,
getConversionButtonCnstrcDataAttributes,
cnstrcDataAttrs,
} from '../../src/utils';
import useProductInfo from '../../src/hooks/useProduct';
import mockItem from '../local_examples/item.json';
Expand All @@ -21,16 +22,16 @@ describe('Testing Utils, getProductCardCnstrcDataAttributes', () => {
const { result } = renderHookWithCioPlp(() => useProductInfo({ item: transformedItem }));

await waitFor(() => {
const cnstrcDataAttrs = getProductCardCnstrcDataAttributes(result.current, {
const dataAttributes = getProductCardCnstrcDataAttributes(result.current, {
labels: transformedItem.labels,
});

expect(cnstrcDataAttrs['data-cnstrc-item-id']).toBe('KNITS00423-park bench dot');
expect(cnstrcDataAttrs['data-cnstrc-item-name']).toBe(
expect(dataAttributes[cnstrcDataAttrs.common.itemId]).toBe('KNITS00423-park bench dot');
expect(dataAttributes[cnstrcDataAttrs.common.itemName]).toBe(
'Jersey Riviera Shirt (Red Park Bench Dot)',
);
expect(cnstrcDataAttrs['data-cnstrc-item-price']).toBe(90);
expect(cnstrcDataAttrs['data-cnstrc-item-variation-id']).toBe('BKT00110DG1733LR');
expect(dataAttributes[cnstrcDataAttrs.common.itemPrice]).toBe(90);
expect(dataAttributes[cnstrcDataAttrs.common.variationId]).toBe('BKT00110DG1733LR');
});
});

Expand All @@ -42,15 +43,15 @@ describe('Testing Utils, getProductCardCnstrcDataAttributes', () => {
variationId: 'var-123',
};

const cnstrcDataAttrs = getProductCardCnstrcDataAttributes(mockProductInfo, {
const dataAttributes = getProductCardCnstrcDataAttributes(mockProductInfo, {
labels: {
sl_campaign_id: 'campaign-123',
sl_campaign_owner: 'owner-456',
},
});

expect(cnstrcDataAttrs['data-cnstrc-sl-campaign-id']).toBe('campaign-123');
expect(cnstrcDataAttrs['data-cnstrc-sl-campaign-owner']).toBe('owner-456');
expect(dataAttributes[cnstrcDataAttrs.common.slCampaignId]).toBe('campaign-123');
expect(dataAttributes[cnstrcDataAttrs.common.slCampaignOwner]).toBe('owner-456');
});

test('Should only include optional attributes when provided', () => {
Expand All @@ -63,8 +64,8 @@ describe('Testing Utils, getProductCardCnstrcDataAttributes', () => {
mockProductInfoWithoutOptionals,
);

expect(dataAttributesWithoutOptionals['data-cnstrc-item-price']).toBeUndefined();
expect(dataAttributesWithoutOptionals['data-cnstrc-item-variation-id']).toBeUndefined();
expect(dataAttributesWithoutOptionals[cnstrcDataAttrs.common.itemPrice]).toBeUndefined();
expect(dataAttributesWithoutOptionals[cnstrcDataAttrs.common.variationId]).toBeUndefined();

const mockProductInfoWithOptionals = {
itemId: 'test-id',
Expand All @@ -77,8 +78,8 @@ describe('Testing Utils, getProductCardCnstrcDataAttributes', () => {
mockProductInfoWithOptionals,
);

expect(dataAttributesWithOptionals['data-cnstrc-item-price']).toBe(50);
expect(dataAttributesWithOptionals['data-cnstrc-item-variation-id']).toBe('var-123');
expect(dataAttributesWithOptionals[cnstrcDataAttrs.common.itemPrice]).toBe(50);
expect(dataAttributesWithOptionals[cnstrcDataAttrs.common.variationId]).toBe('var-123');
});
});

Expand All @@ -99,10 +100,12 @@ describe('Testing Utils, getPlpContainerCnstrcDataAttributes', () => {
false,
);

expect(dataAttributes['data-cnstrc-search']).toBe(true);
expect(dataAttributes['data-cnstrc-result-id']).toBe(mockSearchData.resultId);
expect(dataAttributes['data-cnstrc-num-results']).toBe(mockSearchData.response.totalNumResults);
expect(dataAttributes['data-cnstrc-search-term']).toBe('shoes');
expect(dataAttributes[cnstrcDataAttrs.search.searchContainer]).toBe(true);
expect(dataAttributes[cnstrcDataAttrs.common.resultId]).toBe(mockSearchData.resultId);
expect(dataAttributes[cnstrcDataAttrs.common.numResults]).toBe(
mockSearchData.response.totalNumResults,
);
expect(dataAttributes[cnstrcDataAttrs.search.searchTerm]).toBe('shoes');
});

test('Should return browse data attributes', () => {
Expand All @@ -122,11 +125,13 @@ describe('Testing Utils, getPlpContainerCnstrcDataAttributes', () => {
false,
);

expect(dataAttributes['data-cnstrc-browse']).toBe(true);
expect(dataAttributes['data-cnstrc-result-id']).toBe(mockBrowseData.resultId);
expect(dataAttributes['data-cnstrc-num-results']).toBe(mockBrowseData.response.totalNumResults);
expect(dataAttributes['data-cnstrc-filter-name']).toBe('group_id');
expect(dataAttributes['data-cnstrc-filter-value']).toBe('All');
expect(dataAttributes[cnstrcDataAttrs.browse.browseContainer]).toBe(true);
expect(dataAttributes[cnstrcDataAttrs.common.resultId]).toBe(mockBrowseData.resultId);
expect(dataAttributes[cnstrcDataAttrs.common.numResults]).toBe(
mockBrowseData.response.totalNumResults,
);
expect(dataAttributes[cnstrcDataAttrs.browse.filterName]).toBe('group_id');
expect(dataAttributes[cnstrcDataAttrs.browse.filterValue]).toBe('All');
});

test('Should include zero-result attribute when no results and not loading', () => {
Expand All @@ -150,7 +155,7 @@ describe('Testing Utils, getPlpContainerCnstrcDataAttributes', () => {
false,
);

expect(dataAttributes['data-cnstrc-zero-result']).toBe(true);
expect(dataAttributes[cnstrcDataAttrs.common.zeroResults]).toBe(true);
});

test('Should not include zero-result attribute when loading', () => {
Expand All @@ -172,7 +177,7 @@ describe('Testing Utils, getPlpContainerCnstrcDataAttributes', () => {
true,
);

expect(dataAttributes['data-cnstrc-zero-result']).toBeUndefined();
expect(dataAttributes[cnstrcDataAttrs.common.zeroResults]).toBeUndefined();
});

test('Should include section attribute when section is not Products', () => {
Expand All @@ -195,7 +200,7 @@ describe('Testing Utils, getPlpContainerCnstrcDataAttributes', () => {
false,
);

expect(dataAttributes['data-cnstrc-section']).toBe('Search Suggestions');
expect(dataAttributes[cnstrcDataAttrs.common.section]).toBe('Search Suggestions');
});

test('Should not include section attribute when section is Products', () => {
Expand All @@ -211,13 +216,13 @@ describe('Testing Utils, getPlpContainerCnstrcDataAttributes', () => {
false,
);

expect(dataAttributes['data-cnstrc-section']).toBeUndefined();
expect(dataAttributes[cnstrcDataAttrs.common.section]).toBeUndefined();
});
});

describe('Testing Utils, getConversionButtonCnstrcDataAttributes', () => {
test('Should return add_to_cart conversion type', () => {
const dataAttributes = getConversionButtonCnstrcDataAttributes('add_to_cart');
expect(dataAttributes['data-cnstrc-btn']).toBe('add_to_cart');
expect(dataAttributes[cnstrcDataAttrs.common.conversionBtn]).toBe('add_to_cart');
});
});
Loading
Loading