diff --git a/libs/components/project.json b/libs/components/project.json
index f5cdc32d86..9d69007479 100644
--- a/libs/components/project.json
+++ b/libs/components/project.json
@@ -59,10 +59,9 @@
}
},
"test": {
- "executor": "@nrwl/jest:jest",
+ "executor": "@nx/vite:test",
"outputs": ["{workspaceRoot}/coverage/libs/components"],
"options": {
- "jestConfig": "libs/components/jest.config.cjs",
"passWithNoTests": true
}
},
diff --git a/libs/components/src/lib/alert/alert.spec.ts b/libs/components/src/lib/alert/alert.spec.ts
index 845941b61e..8f42e433b9 100644
--- a/libs/components/src/lib/alert/alert.spec.ts
+++ b/libs/components/src/lib/alert/alert.spec.ts
@@ -97,7 +97,7 @@ describe('vwc-alert', () => {
describe('focus', () => {
it('should focus when opened', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
const alertText: HTMLElement = element.shadowRoot?.querySelector(
'.alert-text'
) as HTMLElement;
@@ -145,17 +145,17 @@ describe('vwc-alert', () => {
describe('timeoutms', function () {
it('should fire close event after timeoutms milliseconds', async function () {
- jest.useFakeTimers();
- const spy = jest.fn();
+ vi.useFakeTimers();
+ const spy = vi.fn();
element.timeoutms = 100;
element.open = true;
element.addEventListener('close', spy);
- jest.advanceTimersByTime(100);
+ vi.advanceTimersByTime(100);
expect(spy).toHaveBeenCalled();
- jest.useRealTimers();
+ vi.useRealTimers();
});
});
@@ -312,7 +312,7 @@ describe('vwc-alert', () => {
beforeEach(() => (element.open = true));
it('should remove the alert when esc and removable is true', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.removable = true;
element.addEventListener('close', spy);
@@ -324,7 +324,7 @@ describe('vwc-alert', () => {
});
it('should remove the alert only on escape key', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.removable = true;
element.addEventListener('close', spy);
@@ -336,7 +336,7 @@ describe('vwc-alert', () => {
});
it('should remove keydown listener after disconnection', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.removable = true;
element.addEventListener('close', spy);
@@ -348,7 +348,7 @@ describe('vwc-alert', () => {
});
it('should not fire close event when removable is false', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.removable = false;
element.addEventListener('close', spy);
@@ -359,7 +359,7 @@ describe('vwc-alert', () => {
});
it('should stop propgation on escape key', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.parentElement!.addEventListener('keydown', spy);
getBaseElement(element).dispatchEvent(
new KeyboardEvent('keydown', { key: 'Escape' })
@@ -370,7 +370,7 @@ describe('vwc-alert', () => {
it('should enable default if Escape was pressed', async () => {
const event = new KeyboardEvent('keydown', { key: 'Escape' });
- jest.spyOn(event, 'preventDefault');
+ vi.spyOn(event, 'preventDefault');
getBaseElement(element).dispatchEvent(event);
await elementUpdated(element);
expect(event.preventDefault).toBeCalledTimes(0);
@@ -378,7 +378,7 @@ describe('vwc-alert', () => {
it('should enable default if key is not Escape', async () => {
const event = new KeyboardEvent('keydown', { key: ' ' });
- jest.spyOn(event, 'preventDefault');
+ vi.spyOn(event, 'preventDefault');
getBaseElement(element).dispatchEvent(event);
await elementUpdated(element);
expect(event.preventDefault).toBeCalledTimes(0);
diff --git a/libs/components/src/lib/audio-player/audio-player.spec.ts b/libs/components/src/lib/audio-player/audio-player.spec.ts
index 2611d19e41..3851dc04e0 100644
--- a/libs/components/src/lib/audio-player/audio-player.spec.ts
+++ b/libs/components/src/lib/audio-player/audio-player.spec.ts
@@ -27,7 +27,7 @@ describe('vwc-audio-player', () => {
}
function setAudioElementDuration(duration: number) {
- jest.spyOn(nativeAudioElement, 'duration', 'get').mockReturnValue(duration);
+ vi.spyOn(nativeAudioElement, 'duration', 'get').mockReturnValue(duration);
}
function setAudioElementCurrentTime(time: number) {
@@ -101,14 +101,14 @@ describe('vwc-audio-player', () => {
`<${COMPONENT_TAG} timestamp src="${SOURCE}">${COMPONENT_TAG}>`
)) as AudioPlayer;
- jest.spyOn(nativeAudioElement, 'play').mockImplementation(() => {
+ vi.spyOn(nativeAudioElement, 'play').mockImplementation(() => {
return new Promise((res) => {
- jest.spyOn(nativeAudioElement, 'paused', 'get').mockReturnValue(false);
+ vi.spyOn(nativeAudioElement, 'paused', 'get').mockReturnValue(false);
res();
});
});
- jest.spyOn(nativeAudioElement, 'pause').mockImplementation(async () => {
- jest.spyOn(nativeAudioElement, 'paused', 'get').mockReturnValue(true);
+ vi.spyOn(nativeAudioElement, 'pause').mockImplementation(async () => {
+ vi.spyOn(nativeAudioElement, 'paused', 'get').mockReturnValue(true);
});
pauseButton = getPauseButtonElement();
@@ -365,7 +365,7 @@ describe('vwc-audio-player', () => {
dragSliderTo(25);
await elementUpdated(element);
- const playSpy = jest.spyOn(element, 'play');
+ const playSpy = vi.spyOn(element, 'play');
stopSliderDrag();
getSliderElement().value = '20';
await elementUpdated(element);
@@ -410,7 +410,7 @@ describe('vwc-audio-player', () => {
setCurrentTimeAndDuration(10, duration);
await elementUpdated(element);
- const pauseSpy = jest.spyOn(element, 'pause');
+ const pauseSpy = vi.spyOn(element, 'pause');
dragSliderTo(20);
await elementUpdated(element);
diff --git a/libs/components/src/lib/banner/banner.spec.ts b/libs/components/src/lib/banner/banner.spec.ts
index 6b1c414a51..61066c508f 100644
--- a/libs/components/src/lib/banner/banner.spec.ts
+++ b/libs/components/src/lib/banner/banner.spec.ts
@@ -93,14 +93,14 @@ describe('vwc-banner', () => {
describe('remove', function () {
it('should fire removing event', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('removing', spy);
element.remove();
expect(spy).toHaveBeenCalled();
});
it('should fire removed after animation end', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('removed', spy);
element.remove();
@@ -111,7 +111,7 @@ describe('vwc-banner', () => {
});
it('should disable removed and removing events after disconnected callback', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('removed', spy);
element.addEventListener('removing', spy);
element.disconnectedCallback();
@@ -280,7 +280,7 @@ describe('vwc-banner', () => {
it('should remove the button on escape key', async function () {
element.removable = true;
element.focus();
- jest.spyOn(element, 'remove');
+ vi.spyOn(element, 'remove');
element.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
expect(element.remove).toHaveBeenCalled();
});
@@ -288,7 +288,7 @@ describe('vwc-banner', () => {
it('should remove the banner only on escape key', async function () {
element.removable = true;
element.focus();
- const spy = jest.spyOn(element, 'remove');
+ const spy = vi.spyOn(element, 'remove');
element.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));
expect((spy as any).mock.calls.length).toEqual(0);
});
@@ -297,7 +297,7 @@ describe('vwc-banner', () => {
element.removable = true;
element.focus();
element.disconnectedCallback();
- const spy = jest.spyOn(element, 'remove');
+ const spy = vi.spyOn(element, 'remove');
element.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
expect((spy as any).mock.calls.length).toEqual(0);
});
@@ -305,7 +305,7 @@ describe('vwc-banner', () => {
it('should remove the banner only if "removable" is true', async function () {
element.removable = false;
element.focus();
- const spy = jest.spyOn(element, 'remove');
+ const spy = vi.spyOn(element, 'remove');
element.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
expect((spy as any).mock.calls.length).toEqual(0);
});
diff --git a/libs/components/src/lib/calendar/calendar.spec.ts b/libs/components/src/lib/calendar/calendar.spec.ts
index 2155038818..d39ae6c06e 100644
--- a/libs/components/src/lib/calendar/calendar.spec.ts
+++ b/libs/components/src/lib/calendar/calendar.spec.ts
@@ -121,8 +121,8 @@ describe('vwc-calendar', () => {
it('should return correct day and hour from mouse clicking inside one of the columns cells', async () => {
const e = new MouseEvent('click', { composed: true, clientY: 54 });
- e.composedPath = jest.fn().mockReturnValue([gridCell]);
- gridCell.getBoundingClientRect = jest
+ e.composedPath = vi.fn().mockReturnValue([gridCell]);
+ gridCell.getBoundingClientRect = vi
.fn()
.mockReturnValue({ height: 1175, y: 28 });
@@ -136,7 +136,7 @@ describe('vwc-calendar', () => {
const rowHeader = element.shadowRoot?.querySelector(
'[role="rowheader"]:nth-child(3)'
) as HTMLElement;
- rowHeader.getBoundingClientRect = jest
+ rowHeader.getBoundingClientRect = vi
.fn()
.mockReturnValue({ height: 49, y: 85 });
@@ -149,7 +149,7 @@ describe('vwc-calendar', () => {
clientX: 25,
clientY: 174,
});
- e.composedPath = jest.fn().mockReturnValue([rowHeaderTimeElement]);
+ e.composedPath = vi.fn().mockReturnValue([rowHeaderTimeElement]);
context = element.getEventContext(e);
@@ -167,7 +167,7 @@ describe('vwc-calendar', () => {
clientX: 0,
clientY: 0,
});
- e.composedPath = jest.fn().mockReturnValue([grid]);
+ e.composedPath = vi.fn().mockReturnValue([grid]);
context = element.getEventContext(e);
@@ -176,7 +176,7 @@ describe('vwc-calendar', () => {
it('should throw if unsupported event passed', async () => {
const e = new FocusEvent('focus');
- e.composedPath = jest.fn().mockReturnValue([gridCell]);
+ e.composedPath = vi.fn().mockReturnValue([gridCell]);
const getEventContext = () => element.getEventContext(e as MouseEvent);
@@ -187,7 +187,7 @@ describe('vwc-calendar', () => {
it('should throw if event is missing a target', async () => {
const e = new MouseEvent('click', { composed: true, clientY: 54 });
- gridCell.getBoundingClientRect = jest
+ gridCell.getBoundingClientRect = vi
.fn()
.mockReturnValue({ height: 1175, y: 28 });
@@ -364,7 +364,7 @@ describe('vwc-calendar', () => {
/* skipped because "Certain ARIA roles must contain particular children (aria-required-children)" */
describe('a11y', () => {
- xit('should pass html a11y test', async () => {
+ it.skip('should pass html a11y test', async () => {
expect(await axe(element)).toHaveNoViolations();
});
});
diff --git a/libs/components/src/lib/checkbox/checkbox.spec.ts b/libs/components/src/lib/checkbox/checkbox.spec.ts
index 4dfdaef210..38b2478755 100644
--- a/libs/components/src/lib/checkbox/checkbox.spec.ts
+++ b/libs/components/src/lib/checkbox/checkbox.spec.ts
@@ -287,7 +287,7 @@ describe('vwc-checkbox', () => {
describe.each(['input', 'change'])('%s event', (eventName) => {
it('should be fired when a user toggles the checkbox', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
getBaseElement(element).click();
diff --git a/libs/components/src/lib/combobox/combobox.spec.ts b/libs/components/src/lib/combobox/combobox.spec.ts
index 0f047562d4..f10512881e 100644
--- a/libs/components/src/lib/combobox/combobox.spec.ts
+++ b/libs/components/src/lib/combobox/combobox.spec.ts
@@ -44,7 +44,7 @@ describe('vwc-combobox', () => {
};
beforeAll(() => {
- HTMLElement.prototype.scrollIntoView = jest.fn();
+ HTMLElement.prototype.scrollIntoView = vi.fn();
});
beforeEach(async () => {
@@ -146,7 +146,7 @@ describe('vwc-combobox', () => {
});
it('should allow propgation on escape key if not open', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.parentElement!.addEventListener('keydown', spy);
element.dispatchEvent(
@@ -162,7 +162,7 @@ describe('vwc-combobox', () => {
it('should stop propgation on escape key if open', async () => {
element.open = true;
- const spy = jest.fn();
+ const spy = vi.fn();
element.parentElement!.addEventListener('keydown', spy);
element.dispatchEvent(
@@ -547,7 +547,7 @@ describe('vwc-combobox', () => {
it('should close and select the first matching option when pressing Enter when autocomplete is %s', async () => {
element.open = true;
await elementUpdated(element);
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('change', spy);
typeInput('ana');
@@ -628,7 +628,7 @@ describe('vwc-combobox', () => {
});
describe('when an option is selected', () => {
- let changeSpy: jest.Mock;
+ let changeSpy: vi.Mock;
beforeEach(async () => {
element.innerHTML = `
@@ -636,7 +636,7 @@ describe('vwc-combobox', () => {
`;
element.open = true;
await elementUpdated(element);
- changeSpy = jest.fn();
+ changeSpy = vi.fn();
element.addEventListener('change', changeSpy);
getOption('Apple').click();
});
diff --git a/libs/components/src/lib/data-grid/data-grid-cell.spec.ts b/libs/components/src/lib/data-grid/data-grid-cell.spec.ts
index b40770ffe6..de198f301d 100644
--- a/libs/components/src/lib/data-grid/data-grid-cell.spec.ts
+++ b/libs/components/src/lib/data-grid/data-grid-cell.spec.ts
@@ -175,7 +175,7 @@ describe('vwc-data-grid-cell', () => {
});
it('should fire "cell-focused" event', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('cell-focused', spy);
element.focus();
expect(spy).toHaveBeenCalledTimes(1);
@@ -191,7 +191,7 @@ describe('vwc-data-grid-cell', () => {
});
it('should ignore additional focusin events', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('cell-focused', spy);
element.dispatchEvent(new Event('focusin'));
@@ -369,12 +369,12 @@ describe('vwc-data-grid-cell', () => {
});
describe('sort event', () => {
- let onSortSpy: jest.Mock;
+ let onSortSpy: vi.Mock;
beforeEach(async () => {
element.cellType = 'columnheader';
element.innerHTML = 'Name';
await elementUpdated(element);
- onSortSpy = jest.fn();
+ onSortSpy = vi.fn();
element.addEventListener('sort', onSortSpy);
});
@@ -445,13 +445,13 @@ describe('vwc-data-grid-cell', () => {
});
describe('cell-click event', () => {
- let onCellClickSpy: jest.Mock;
+ let onCellClickSpy: vi.Mock;
let expectedDetail: object;
beforeEach(async () => {
element.cellType = 'default';
element.innerHTML = 'Name';
await elementUpdated(element);
- onCellClickSpy = jest.fn();
+ onCellClickSpy = vi.fn();
element.addEventListener('cell-click', onCellClickSpy);
expectedDetail = {
cell: element,
diff --git a/libs/components/src/lib/data-grid/data-grid-row.spec.ts b/libs/components/src/lib/data-grid/data-grid-row.spec.ts
index 8c29db836f..ad7485adb2 100644
--- a/libs/components/src/lib/data-grid/data-grid-row.spec.ts
+++ b/libs/components/src/lib/data-grid/data-grid-row.spec.ts
@@ -138,7 +138,7 @@ describe('vwc-data-grid-row', () => {
describe('row-focused event', () => {
it('should fire the focused event when one of the cells is focused', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('row-focused', spy);
element.dispatchEvent(new FocusEvent('cell-focused'));
expect(spy).toHaveBeenCalled();
@@ -267,15 +267,17 @@ describe('vwc-data-grid-row', () => {
describe('a11y', () => {
it('should pass html a11y test', async () => {
- element = (await fixture(`
+ const element = (await fixture(`
<${COMPONENT_TAG}>
${COMPONENT_TAG}>
- `)) as DataGridRow;
- element.ariaSelected = 'true';
- await elementUpdated(element);
+ `)) as HTMLDivElement;
+ const row = element.querySelector('vwc-data-grid-row') as DataGridRow;
+ row.ariaSelected = 'true';
+
+ await elementUpdated(row);
expect(await axe(element)).toHaveNoViolations();
});
diff --git a/libs/components/src/lib/data-grid/data-grid.spec.ts b/libs/components/src/lib/data-grid/data-grid.spec.ts
index dad615376c..b7a7ab6629 100644
--- a/libs/components/src/lib/data-grid/data-grid.spec.ts
+++ b/libs/components/src/lib/data-grid/data-grid.spec.ts
@@ -6,7 +6,7 @@ import { DataGridRow } from './data-grid-row.ts';
const COMPONENT_TAG = 'vwc-data-grid';
-Element.prototype.scrollIntoView = jest.fn();
+Element.prototype.scrollIntoView = vi.fn();
function setMockRows(element: DataGrid) {
element.rowElementTag = 'div';
@@ -23,6 +23,8 @@ describe('vwc-data-grid', () => {
element = (await fixture(
`<${COMPONENT_TAG}>${COMPONENT_TAG}>`
)) as DataGrid;
+
+ await elementUpdated(element);
});
describe('basic', () => {
diff --git a/libs/components/src/lib/data-grid/data-grid.ts b/libs/components/src/lib/data-grid/data-grid.ts
index c3f63c3366..43bc962912 100644
--- a/libs/components/src/lib/data-grid/data-grid.ts
+++ b/libs/components/src/lib/data-grid/data-grid.ts
@@ -643,12 +643,9 @@ export class DataGrid extends VividElement {
this.generateHeader === GenerateHeaderOptions.sticky
? DataGridRowTypes.stickyHeader
: DataGridRowTypes.header;
- /* istanbul ignore next */
- if (this.firstChild !== null || this.rowsPlaceholder !== null) {
- this.insertBefore(
- generatedHeaderElement,
- this.firstChild !== null ? this.firstChild : this.rowsPlaceholder
- );
+
+ if (this.firstChild !== null) {
+ this.insertBefore(generatedHeaderElement, this.firstChild);
}
return;
}
diff --git a/libs/components/src/lib/data-grid/index.spec.ts b/libs/components/src/lib/data-grid/index.spec.ts
index bd4390158d..e118ca3578 100644
--- a/libs/components/src/lib/data-grid/index.spec.ts
+++ b/libs/components/src/lib/data-grid/index.spec.ts
@@ -90,7 +90,7 @@ describe('data grid integration tests', () => {
describe('events', function () {
it('should fire cell-focused event', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('cell-focused', spy);
element.rowsData = [
@@ -103,7 +103,7 @@ describe('data grid integration tests', () => {
});
it('should fire row-focused event', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('row-focused', spy);
element.rowsData = [
@@ -131,7 +131,7 @@ describe('data grid integration tests', () => {
}
it('should fire sort event', async function () {
await addSortableHeader();
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('sort', spy);
(element.rowElements[0].children[1] as HTMLElement).click();
@@ -145,8 +145,8 @@ describe('data grid integration tests', () => {
it('should stop sort event propagation', async function () {
await addSortableHeader();
- const elementSpy = jest.fn();
- const parentSpy = jest.fn();
+ const elementSpy = vi.fn();
+ const parentSpy = vi.fn();
element.addEventListener('sort', elementSpy);
element.parentElement!.addEventListener('sort', parentSpy);
diff --git a/libs/components/src/lib/date-picker/date-picker.a11y.spec.ts b/libs/components/src/lib/date-picker/date-picker.a11y.spec.ts
new file mode 100644
index 0000000000..2d2a6581a2
--- /dev/null
+++ b/libs/components/src/lib/date-picker/date-picker.a11y.spec.ts
@@ -0,0 +1,31 @@
+import {
+ axe,
+ elementUpdated,
+ fixture,
+ setupDelegatesFocusPolyfill,
+} from '@vivid-nx/shared';
+import { DatePicker } from './date-picker';
+import '.';
+
+const COMPONENT_TAG = 'vwc-date-picker';
+
+describe('vwc-date-picker', () => {
+ let element: DatePicker;
+
+ beforeEach(async () => {
+ element = (await fixture(
+ `<${COMPONENT_TAG}>${COMPONENT_TAG}>`
+ )) as DatePicker;
+
+ setupDelegatesFocusPolyfill(element);
+ });
+
+ describe('a11y', () => {
+ it('should pass html a11y test', async () => {
+ element.value = '2012-12-12';
+ await elementUpdated(element);
+
+ expect(await axe(element)).toHaveNoViolations();
+ }, 10000);
+ });
+});
diff --git a/libs/components/src/lib/date-picker/date-picker.spec.ts b/libs/components/src/lib/date-picker/date-picker.spec.ts
index d53325b2f5..eb7109605e 100644
--- a/libs/components/src/lib/date-picker/date-picker.spec.ts
+++ b/libs/components/src/lib/date-picker/date-picker.spec.ts
@@ -1,5 +1,4 @@
import {
- axe,
createFormHTML,
elementUpdated,
fixture,
@@ -17,14 +16,14 @@ const COMPONENT_TAG = 'vwc-date-picker';
// Mock current date to be 2023-08-10 for the tests
-jest.mock('../../shared/date-picker/calendar/month.ts', () => ({
- ...jest.requireActual('../../shared/date-picker/calendar/month.ts'),
- getCurrentMonth: jest.fn().mockReturnValue({ month: 7, year: 2023 }),
+vi.mock('../../shared/date-picker/calendar/month.ts', async () => ({
+ ...(await vi.importActual('../../shared/date-picker/calendar/month.ts')),
+ getCurrentMonth: vi.fn().mockReturnValue({ month: 7, year: 2023 }),
}));
-jest.mock('../../shared/date-picker/calendar/dateStr.ts', () => ({
- ...jest.requireActual('../../shared/date-picker/calendar/dateStr.ts'),
- currentDateStr: jest.fn().mockReturnValue('2023-08-10'),
+vi.mock('../../shared/date-picker/calendar/dateStr.ts', async () => ({
+ ...(await vi.importActual('../../shared/date-picker/calendar/dateStr.ts')),
+ currentDateStr: vi.fn().mockReturnValue('2023-08-10'),
}));
describe('vwc-date-picker', () => {
@@ -39,9 +38,8 @@ describe('vwc-date-picker', () => {
) as HTMLButtonElement;
const getButtonByLabel = (label: string) =>
- element.shadowRoot!.querySelector(
- `[aria-label="${label}"],[label="${label}"]`
- ) as Button;
+ (element.shadowRoot!.querySelector(`[aria-label="${label}"]`) ??
+ element.shadowRoot!.querySelector(`[label="${label}"]`)) as Button;
const getDialogTitle = () => titleAction.textContent!.trim();
@@ -151,7 +149,7 @@ describe('vwc-date-picker', () => {
describe.each(['input', 'change'])('%s event', (eventName) => {
it('should be fired when a user enters a valid date into the text field', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
typeIntoTextField('01/21/2021');
@@ -161,7 +159,7 @@ describe('vwc-date-picker', () => {
});
it('should be fired when a user clicks on a date in the calendar', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
await openPopup();
@@ -203,7 +201,7 @@ describe('vwc-date-picker', () => {
it('should keep default behaviour when pressing tab in the text-field without a tabbable date', async () => {
const event = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true });
- event.preventDefault = jest.fn();
+ event.preventDefault = vi.fn();
element.min = '2023-12-31';
element.value = '2023-01-01';
await openPopup();
@@ -215,7 +213,7 @@ describe('vwc-date-picker', () => {
it('should keep default behaviour when pressing tab in the text-field without a tabbable month', async () => {
const event = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true });
- event.preventDefault = jest.fn();
+ event.preventDefault = vi.fn();
element.min = '2024-01-01';
element.value = '2023-01-01';
await openPopup();
@@ -340,13 +338,4 @@ describe('vwc-date-picker', () => {
expect(textField.currentValue).toBe('21.01.2021');
});
});
-
- describe('a11y', () => {
- it('should pass html a11y test', async () => {
- element.value = '2012-12-12';
- await elementUpdated(element);
-
- expect(await axe(element)).toHaveNoViolations();
- });
- });
});
diff --git a/libs/components/src/lib/date-range-picker/date-range-picker.a11y.spec.ts b/libs/components/src/lib/date-range-picker/date-range-picker.a11y.spec.ts
new file mode 100644
index 0000000000..6f0278183d
--- /dev/null
+++ b/libs/components/src/lib/date-range-picker/date-range-picker.a11y.spec.ts
@@ -0,0 +1,31 @@
+import {
+ axe,
+ elementUpdated,
+ fixture,
+ setupDelegatesFocusPolyfill,
+} from '@vivid-nx/shared';
+import { DateRangePicker } from './date-range-picker';
+import '.';
+
+const COMPONENT_TAG = 'vwc-date-range-picker';
+
+describe('vwc-date-range-picker', () => {
+ let element: DateRangePicker;
+
+ beforeEach(async () => {
+ element = (await fixture(
+ `<${COMPONENT_TAG}>${COMPONENT_TAG}>`
+ )) as DateRangePicker;
+ setupDelegatesFocusPolyfill(element);
+ });
+
+ describe('a11y', () => {
+ it('should pass html a11y test', async () => {
+ element.start = '2012-12-12';
+ element.end = '2012-12-13';
+ await elementUpdated(element);
+
+ expect(await axe(element)).toHaveNoViolations();
+ }, 10000);
+ });
+});
diff --git a/libs/components/src/lib/date-range-picker/date-range-picker.spec.ts b/libs/components/src/lib/date-range-picker/date-range-picker.spec.ts
index 4a4551389e..c42bd5cdeb 100644
--- a/libs/components/src/lib/date-range-picker/date-range-picker.spec.ts
+++ b/libs/components/src/lib/date-range-picker/date-range-picker.spec.ts
@@ -1,5 +1,4 @@
import {
- axe,
elementUpdated,
fixture,
setupDelegatesFocusPolyfill,
@@ -17,14 +16,14 @@ const COMPONENT_TAG = 'vwc-date-range-picker';
// Mock current date to be 2023-08-10 for the tests
-jest.mock('../../shared/date-picker/calendar/month.ts', () => ({
- ...jest.requireActual('../../shared/date-picker/calendar/month.ts'),
- getCurrentMonth: jest.fn().mockReturnValue({ month: 7, year: 2023 }),
+vi.mock('../../shared/date-picker/calendar/month.ts', async () => ({
+ ...(await vi.importActual('../../shared/date-picker/calendar/month.ts')),
+ getCurrentMonth: vi.fn().mockReturnValue({ month: 7, year: 2023 }),
}));
-jest.mock('../../shared/date-picker/calendar/dateStr.ts', () => ({
- ...jest.requireActual('../../shared/date-picker/calendar/dateStr.ts'),
- currentDateStr: jest.fn().mockReturnValue('2023-08-10'),
+vi.mock('../../shared/date-picker/calendar/dateStr.ts', async () => ({
+ ...(await vi.importActual('../../shared/date-picker/calendar/dateStr.ts')),
+ currentDateStr: vi.fn().mockReturnValue('2023-08-10'),
}));
describe('vwc-date-range-picker', () => {
@@ -45,9 +44,8 @@ describe('vwc-date-range-picker', () => {
) as HTMLButtonElement[];
const getButtonByLabel = (label: string) =>
- element.shadowRoot!.querySelector(
- `[aria-label="${label}"],[label="${label}"]`
- ) as Button;
+ (element.shadowRoot!.querySelector(`[aria-label="${label}"]`) ??
+ element.shadowRoot!.querySelector(`[label="${label}"]`)) as Button;
const getDialogTitle = () => titleAction.textContent!.trim();
@@ -234,7 +232,7 @@ describe('vwc-date-range-picker', () => {
describe.each(['input', 'change'])('%s event', (eventName) => {
it('should be fired when a user enters a valid date range into the text field', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
typeIntoTextField('01/21/2021 – 01/22/2021');
@@ -244,7 +242,7 @@ describe('vwc-date-range-picker', () => {
});
it('should be fired when a user selects a start date in the calendar', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
await openPopup();
@@ -256,7 +254,7 @@ describe('vwc-date-range-picker', () => {
it('should be fired when a user selects an end date in the calendar', async () => {
await openPopup();
getDateButton('2023-08-01').click();
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
getDateButton('2023-08-10').click();
@@ -267,7 +265,7 @@ describe('vwc-date-range-picker', () => {
describe('input:start event', () => {
it('should be fired when a user enters a valid date range into the text field', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('input:start', spy);
typeIntoTextField('01/21/2021 – 01/22/2021');
@@ -277,7 +275,7 @@ describe('vwc-date-range-picker', () => {
});
it('should be fired when a user select a start date in the calendar', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('input:start', spy);
await openPopup();
@@ -289,7 +287,7 @@ describe('vwc-date-range-picker', () => {
describe('input:end event', () => {
it('should be fired when a user enters a valid date range into the text field', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('input:end', spy);
typeIntoTextField('01/21/2021 – 01/22/2021');
@@ -299,7 +297,7 @@ describe('vwc-date-range-picker', () => {
});
it('should be fired when a user select an end date in the calendar', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('input:end', spy);
await openPopup();
getDateButton('2023-08-01').click();
@@ -350,7 +348,7 @@ describe('vwc-date-range-picker', () => {
it('should keep default behaviour when pressing tab in the text-field without a tabbable date', async () => {
const event = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true });
- event.preventDefault = jest.fn();
+ event.preventDefault = vi.fn();
element.min = '2023-12-31';
element.start = '2023-01-01';
await openPopup();
@@ -362,7 +360,7 @@ describe('vwc-date-range-picker', () => {
it('should keep default behaviour when pressing tab in the text-field without a tabbable month', async () => {
const event = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true });
- event.preventDefault = jest.fn();
+ event.preventDefault = vi.fn();
element.min = '2024-01-01';
element.start = '2023-01-01';
await openPopup();
@@ -582,10 +580,10 @@ describe('vwc-date-range-picker', () => {
// Cannot properly end-to-end test form value because jsdom does not support ElementInternals
// Instead we mock the setFormValue method and test that it is called with the correct value
const getFormValue = () =>
- jest.mocked(element.setFormValue).mock.lastCall![0] as FormData;
+ vi.mocked(element.setFormValue).mock.lastCall![0] as FormData;
beforeEach(() => {
- element.setFormValue = jest.fn();
+ element.setFormValue = vi.fn();
});
it('should set the form value when name, start and end date are set', () => {
@@ -641,14 +639,4 @@ describe('vwc-date-range-picker', () => {
expect(textField.value).toBe('21.01.2021 – 22.01.2021');
});
});
-
- describe('a11y', () => {
- it('should pass html a11y test', async () => {
- element.start = '2012-12-12';
- element.end = '2012-12-13';
- await elementUpdated(element);
-
- expect(await axe(element)).toHaveNoViolations();
- });
- });
});
diff --git a/libs/components/src/lib/dial-pad/dial-pad.spec.ts b/libs/components/src/lib/dial-pad/dial-pad.spec.ts
index b57123fe07..5664f50c3a 100644
--- a/libs/components/src/lib/dial-pad/dial-pad.spec.ts
+++ b/libs/components/src/lib/dial-pad/dial-pad.spec.ts
@@ -82,15 +82,15 @@ describe('vwc-dial-pad', () => {
it('should activate number buttons when input event is fired a number for 200ms', async function () {
const digitButton = getDigitButtons()[3];
const activeStateBeforeTyping = digitButton.active;
- jest.useFakeTimers();
+ vi.useFakeTimers();
getTextField().dispatchEvent(
new KeyboardEvent('keydown', { key: digitButton.value })
);
const activeStateAfterTyping = digitButton.active;
- jest.advanceTimersByTime(200);
- jest.useRealTimers();
+ vi.advanceTimersByTime(200);
+ vi.useRealTimers();
expect(activeStateBeforeTyping).toBe(false);
expect(activeStateAfterTyping).toBe(true);
@@ -100,15 +100,15 @@ describe('vwc-dial-pad', () => {
it('should activate * buttons when input event is fired a * for 200ms', async function () {
const digitButton = getDigitButtons()[9];
const activeStateBeforeTyping = digitButton.active;
- jest.useFakeTimers();
+ vi.useFakeTimers();
getTextField().dispatchEvent(
new KeyboardEvent('keydown', { key: digitButton.value })
);
const activeStateAfterTyping = digitButton.active;
- jest.advanceTimersByTime(200);
- jest.useRealTimers();
+ vi.advanceTimersByTime(200);
+ vi.useRealTimers();
expect(activeStateBeforeTyping).toBe(false);
expect(activeStateAfterTyping).toBe(true);
@@ -118,15 +118,15 @@ describe('vwc-dial-pad', () => {
it('should activate # buttons when input event is fired a # for 200ms', async function () {
const digitButton = getDigitButtons()[11];
const activeStateBeforeTyping = digitButton.active;
- jest.useFakeTimers();
+ vi.useFakeTimers();
getTextField().dispatchEvent(
new KeyboardEvent('keydown', { key: digitButton.value })
);
const activeStateAfterTyping = digitButton.active;
- jest.advanceTimersByTime(200);
- jest.useRealTimers();
+ vi.advanceTimersByTime(200);
+ vi.useRealTimers();
expect(activeStateBeforeTyping).toBe(false);
expect(activeStateAfterTyping).toBe(true);
@@ -173,7 +173,7 @@ describe('vwc-dial-pad', () => {
});
it('should emit a change event', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('change', spy);
await setValue('123');
@@ -183,7 +183,7 @@ describe('vwc-dial-pad', () => {
});
it('should emit an input event', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('input', spy);
await setValue('123');
@@ -193,7 +193,7 @@ describe('vwc-dial-pad', () => {
});
it('should prevent blur event after deleting the last value', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('blur', spy);
await setValue('1');
@@ -213,7 +213,7 @@ describe('vwc-dial-pad', () => {
describe('dial', function () {
it('should fire dial event when clicked on call button', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('dial', spy);
await elementUpdated(element);
getCallButton().click();
@@ -221,7 +221,7 @@ describe('vwc-dial-pad', () => {
});
it('should not fire dial event when enter is pressed on text field and pending', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('dial', spy);
element.pending = true;
await elementUpdated(element);
@@ -232,7 +232,7 @@ describe('vwc-dial-pad', () => {
});
it('should not fire dial event when enter is pressed on text field and disabled', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('dial', spy);
element.disabled = true;
await elementUpdated(element);
@@ -243,7 +243,7 @@ describe('vwc-dial-pad', () => {
});
it('should not fire dial event when enter is pressed on text field and callActive', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('dial', spy);
element.callActive = true;
await elementUpdated(element);
@@ -254,7 +254,7 @@ describe('vwc-dial-pad', () => {
});
it('should not fire dial event when enter is pressed on text field and noCall', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('dial', spy);
element.noCall = true;
await elementUpdated(element);
@@ -265,7 +265,7 @@ describe('vwc-dial-pad', () => {
});
it('should not fire dial event when enter is pressed on text field and value is empty', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('dial', spy);
await elementUpdated(element);
getTextField().dispatchEvent(
@@ -275,7 +275,7 @@ describe('vwc-dial-pad', () => {
});
it('should fire dial event when enter is pressed on input', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('dial', spy);
await setValue('123');
const input: HTMLInputElement = getTextField().querySelector(
@@ -292,7 +292,7 @@ describe('vwc-dial-pad', () => {
});
it('should fire dial event with value when clicked on call button', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('dial', spy);
await setValue('123');
getCallButton().click();
@@ -300,7 +300,7 @@ describe('vwc-dial-pad', () => {
});
it('should prevent dial event when enter is pressed on delete button', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
await setValue('123');
element.addEventListener('dial', spy);
getDeleteButton().dispatchEvent(
@@ -310,7 +310,7 @@ describe('vwc-dial-pad', () => {
});
it('should fire end-call event when clicked on call button when active', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('end-call', spy);
element.callActive = true;
await elementUpdated(element);
@@ -328,7 +328,7 @@ describe('vwc-dial-pad', () => {
function shouldFireEventOnceFromTextField(eventName: string) {
it('should fire only once on the dial pad element', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
element.value = '123';
@@ -341,7 +341,7 @@ describe('vwc-dial-pad', () => {
function shouldFireOnDialPadButtonClick(eventName: string) {
it('should fire when user clicks the dial pad buttons', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
getDigitButtons().forEach((button) => {
button.click();
@@ -354,7 +354,7 @@ describe('vwc-dial-pad', () => {
function shouldSetElementValueAfterEvent(eventName: string) {
it('should set element value after event', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
element.value = '123';
@@ -368,7 +368,7 @@ describe('vwc-dial-pad', () => {
describe('keypad-click', function () {
it('should fire keypad-click event when a keypad button is clicked', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('keypad-click', spy);
await elementUpdated(element);
getDigitButtons().forEach((button) => {
@@ -378,7 +378,7 @@ describe('vwc-dial-pad', () => {
});
it('should fire keypad-click event with the button which was clicked', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('keypad-click', spy);
await elementUpdated(element);
getDigitButtons().forEach((button) => {
@@ -399,7 +399,7 @@ describe('vwc-dial-pad', () => {
});
it('should prevent focus and blur events on subsequent keypad buttons', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('focus', spy);
element.addEventListener('blur', spy);
getDigitButtons().forEach((button) => {
@@ -414,7 +414,7 @@ describe('vwc-dial-pad', () => {
describe('focus event', () => {
const eventName = 'focus';
it('should prevent propagation of focus event from textfield', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
element.value = '123';
@@ -428,7 +428,7 @@ describe('vwc-dial-pad', () => {
describe('blur event', () => {
const eventName = 'blur';
it('should prevent propagation of blur event from textfield', async () => {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener(eventName, spy);
element.value = '123';
diff --git a/libs/components/src/lib/dialog/dialog.spec.ts b/libs/components/src/lib/dialog/dialog.spec.ts
index 73fb71b8de..78a0938b86 100644
--- a/libs/components/src/lib/dialog/dialog.spec.ts
+++ b/libs/components/src/lib/dialog/dialog.spec.ts
@@ -199,7 +199,7 @@ describe('vwc-dialog', () => {
it('should fire the "close" event only when closing', async function () {
await closeDialog();
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('close', spy);
await closeDialog();
@@ -298,7 +298,7 @@ describe('vwc-dialog', () => {
const returnValue = 'returnValue';
element.returnValue = returnValue;
await showDialog();
- const spy = jest.fn().mockImplementation((e) => (detail = e.detail));
+ const spy = vi.fn().mockImplementation((e) => (detail = e.detail));
element.addEventListener('close', spy);
await closeDialog();
@@ -308,7 +308,7 @@ describe('vwc-dialog', () => {
it("should not bubble 'close' event", async () => {
await showDialog();
- const fn = jest.fn();
+ const fn = vi.fn();
element.parentElement!.addEventListener('close', fn);
await closeDialog();
@@ -319,7 +319,7 @@ describe('vwc-dialog', () => {
describe('open event', function () {
it("should fire 'open' event when opened", async function () {
- const onOpen = jest.fn();
+ const onOpen = vi.fn();
element.addEventListener('open', onOpen);
await showDialog();
@@ -328,7 +328,7 @@ describe('vwc-dialog', () => {
});
it('should not bubble', async () => {
- const onOpen = jest.fn();
+ const onOpen = vi.fn();
element.parentElement!.addEventListener('open', onOpen);
await showDialog();
@@ -355,7 +355,7 @@ describe('vwc-dialog', () => {
});
it('should emit a non-bubbling event', async () => {
- const onCancel = jest.fn();
+ const onCancel = vi.fn();
element.parentElement!.addEventListener('cancel', onCancel);
triggerCancelEvent();
@@ -410,9 +410,9 @@ describe('vwc-dialog', () => {
beforeEach(async function () {
element.headline = 'headline';
await showModalDialog();
- jest
- .spyOn(dialogEl, 'getBoundingClientRect')
- .mockImplementation(() => dialogClientRect);
+ vi.spyOn(dialogEl, 'getBoundingClientRect').mockImplementation(
+ () => dialogClientRect
+ );
});
it('should leave the dialog open when mouseup or click', async function () {
@@ -447,7 +447,7 @@ describe('vwc-dialog', () => {
});
it('should emit a cancel event when scrim is clicked', async function () {
- const cancelSpy = jest.fn();
+ const cancelSpy = vi.fn();
element.addEventListener('cancel', cancelSpy);
clickOnScrim();
await elementUpdated(element);
@@ -531,7 +531,7 @@ describe('vwc-dialog', () => {
});
it('should close the dialog when dismiss button is clicked', async function () {
- const spy = jest.fn();
+ const spy = vi.fn();
element.addEventListener('close', spy);
await showDialog();
@@ -542,7 +542,7 @@ describe('vwc-dialog', () => {
});
it('should emit a cancel event when dismiss button is clicked', async function () {
- const cancelSpy = jest.fn();
+ const cancelSpy = vi.fn();
element.addEventListener('cancel', cancelSpy);
await showDialog();
@@ -554,7 +554,7 @@ describe('vwc-dialog', () => {
it('should preventDefault of cancel events on the dialog', async () => {
const cancelEvent = new Event('cancel');
- cancelEvent.preventDefault = jest.fn();
+ cancelEvent.preventDefault = vi.fn();
await showDialog();
dialogEl.dispatchEvent(cancelEvent);
@@ -660,7 +660,7 @@ describe('vwc-dialog', () => {
});
it('should fire cancel event on escape key press', async function () {
- const cancelSpy = jest.fn();
+ const cancelSpy = vi.fn();
element.addEventListener('cancel', cancelSpy);
await showModalDialog();
await triggerEscapeKey();
@@ -675,7 +675,7 @@ describe('vwc-dialog', () => {
it('should stop propgation on escape key', async () => {
await showModalDialog();
- const spy = jest.fn();
+ const spy = vi.fn();
element.parentElement!.addEventListener('keydown', spy);
getBaseElement(element).dispatchEvent(
new KeyboardEvent('keydown', { key: 'Escape' })
@@ -687,7 +687,7 @@ describe('vwc-dialog', () => {
it('should preventDefaut if Escape was pressed', async () => {
await showModalDialog();
const event = new KeyboardEvent('keydown', { key: 'Escape' });
- jest.spyOn(event, 'preventDefault');
+ vi.spyOn(event, 'preventDefault');
getBaseElement(element).dispatchEvent(event);
await elementUpdated(element);
expect(event.preventDefault).toBeCalledTimes(1);
@@ -696,7 +696,7 @@ describe('vwc-dialog', () => {
it('should enable default if key is not Escape', async () => {
await showModalDialog();
const event = new KeyboardEvent('keydown', { key: ' ' });
- jest.spyOn(event, 'preventDefault');
+ vi.spyOn(event, 'preventDefault');
getBaseElement(element).dispatchEvent(event);
await elementUpdated(element);
expect(event.preventDefault).toBeCalledTimes(0);
diff --git a/libs/components/src/lib/file-picker/file-picker.spec.ts b/libs/components/src/lib/file-picker/file-picker.spec.ts
index ad5a32862f..5b71afd092 100644
--- a/libs/components/src/lib/file-picker/file-picker.spec.ts
+++ b/libs/components/src/lib/file-picker/file-picker.spec.ts
@@ -324,6 +324,7 @@ describe('vwc-file-picker', () => {
expect(element.files).toEqual([file2]);
});
});
+
describe('accept', function () {
it('should show an error message for files added that do not match the accept attribute', async function () {
element.accept = 'image/*, text/html, .zip';
@@ -341,6 +342,24 @@ describe('vwc-file-picker', () => {
expect(getErrorMessage(3)).toBe("You can't select files of this type.");
});
+ it('should display message from error property if error message is an object', async () => {
+ element.accept = 'image/*, text/html, .zip';
+ (element.invalidFileTypeError as any) = {
+ error: 'error from object',
+ };
+
+ await elementUpdated(element);
+
+ addFiles([
+ await generateFile('london.png', 1, 'image/png'),
+ await generateFile('london.html', 1, 'text/html'),
+ await generateFile('london.zip', 1, 'application/zip'),
+ await generateFile('london.txt', 1, 'text/plain'),
+ ]);
+
+ expect(getErrorMessage(3)).toBe('error from object');
+ });
+
it('should show an custom error message (when supplied) for files added that do not match the accept attribute', async function () {
element.accept = 'image/*, text/html, .zip';
element.invalidFileTypeError = 'File type not allowed.';
@@ -404,7 +423,7 @@ describe('vwc-file-picker', () => {
describe('change', function () {
it('should fire "change" event after a file is added', async () => {
let filesLengthInChangeHandler = -1;
- const onChange = jest.fn().mockImplementation(() => {
+ const onChange = vi.fn().mockImplementation(() => {
filesLengthInChangeHandler = element.files.length;
});
element.addEventListener('change', onChange);
@@ -418,7 +437,7 @@ describe('vwc-file-picker', () => {
it('should fire "change" event after a file is removed', async () => {
addFiles([await generateFile('london.png', 1)]);
let filesLengthInChangeHandler = -1;
- const onChange = jest.fn().mockImplementation(() => {
+ const onChange = vi.fn().mockImplementation(() => {
filesLengthInChangeHandler = element.files.length;
});
element.addEventListener('change', onChange);
@@ -472,7 +491,7 @@ describe('vwc-file-picker', () => {
])(
'should click on the hidden file input when pressing %s key',
async function (_, key) {
- const hiddenInputClick = jest.fn();
+ const hiddenInputClick = vi.fn();
const hiddenInput = getHiddenInput();
hiddenInput.click = hiddenInputClick;
diff --git a/libs/components/src/lib/file-picker/file-picker.ts b/libs/components/src/lib/file-picker/file-picker.ts
index 49424fbc7d..0ae22f4a3e 100644
--- a/libs/components/src/lib/file-picker/file-picker.ts
+++ b/libs/components/src/lib/file-picker/file-picker.ts
@@ -224,7 +224,7 @@ export class FilePicker extends FormAssociatedFilePicker {
#localizeErrorMessage = (file: DropzoneFile, message: string | any) => {
if (file.previewElement) {
file.previewElement.classList.add('dz-error');
- // istanbul ignore next
+
if (typeof message !== 'string' && message.error) {
message = message.error;
}
diff --git a/libs/components/src/lib/icon/__snapshots__/icon.spec.ts.snap b/libs/components/src/lib/icon/__snapshots__/icon.spec.ts.snap
index 40cce5113f..ceecf63c24 100644
--- a/libs/components/src/lib/icon/__snapshots__/icon.spec.ts.snap
+++ b/libs/components/src/lib/icon/__snapshots__/icon.spec.ts.snap
@@ -1,14 +1,14 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-exports[`icon name should set the icon as loading after 500ms 1`] = `
-"