Skip to content

Commit 7ba3183

Browse files
committed
feat(lib): Migrated from test-runner to vitest
1 parent 5a88744 commit 7ba3183

File tree

94 files changed

+3964
-3938
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+3964
-3938
lines changed

package-lock.json

Lines changed: 1707 additions & 2161 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"url": "https://github.com/IgniteUI/igniteui-webcomponents/issues"
1919
},
2020
"scripts": {
21+
"vitest:debug": "vitest --no-file-parallelism --isolate false",
2122
"start": "npm run storybook",
2223
"build:publish": "npm run cem && node scripts/build.mjs",
2324
"cem": "cem analyze --config cem.config.mjs",
@@ -40,8 +41,9 @@
4041
"lint:styles": "stylelint \"src/**/*.scss\"",
4142
"format": "biome check --fix && prettier \"**/*.ts\" --write --ignore-path .gitignore",
4243
"release": "node scripts/gen-changelog.mjs",
43-
"test": "npm run build:styles && wtr --coverage",
44-
"test:watch": "npm run build:styles && concurrently -k -r \"npm:watch-scss\" \"wtr --watch\"",
44+
"test": "npm run build:styles && vitest --watch false --coverage",
45+
"test:watch": "npm run build:styles && concurrently -k -r \"npm:watch-scss\" \"vitest\"",
46+
"test:debug": "npm run build:styles && concurrently -k -r \"npm:watch-scss\" \"npm:vitest:debug\"",
4547
"storybook": "npm run build:styles && concurrently -k -r \"npm run cem:watch\" \"npm:watch-scss\" \"npm:watch-meta\" \"storybook dev -p 8000\"",
4648
"storybook:build": "npm run build:styles && storybook build -o ./storybook-static",
4749
"build:typedoc:export": "node scripts/build-typedoc.js export",
@@ -63,18 +65,19 @@
6365
"@biomejs/biome": "~2.3.8",
6466
"@custom-elements-manifest/analyzer": "^0.11.0",
6567
"@igniteui/material-icons-extended": "^3.1.0",
66-
"@open-wc/testing": "^4.0.0",
68+
"@open-wc/semantic-dom-diff": "^0.20.1",
6769
"@storybook/addon-a11y": "^10.1.2",
6870
"@storybook/addon-docs": "^10.1.2",
6971
"@storybook/addon-links": "^10.1.2",
7072
"@storybook/web-components-vite": "^10.1.2",
71-
"@types/mocha": "^10.0.10",
72-
"@web/dev-server-esbuild": "^1.0.4",
73-
"@web/test-runner": "^0.20.2",
74-
"@web/test-runner-playwright": "^0.11.1",
73+
"@types/chai-dom": "^1.11.3",
74+
"@vitest/browser-playwright": "^4.0.14",
75+
"@vitest/coverage-v8": "^4.0.15",
7576
"autoprefixer": "^10.4.22",
7677
"browser-sync": "^3.0.4",
7778
"cem-plugin-expanded-types": "^1.4.0",
79+
"chai-a11y-axe": "^1.5.0",
80+
"chai-dom": "^1.12.1",
7881
"concurrently": "^9.2.1",
7982
"custom-element-jet-brains-integration": "^1.7.0",
8083
"custom-element-vs-code-integration": "^1.5.0",
@@ -93,7 +96,6 @@
9396
"prettier": "^3.7.3",
9497
"rimraf": "^6.1.2",
9598
"sass-embedded": "~1.93.3",
96-
"sinon": "^21.0.0",
9799
"storybook": "^10.1.2",
98100
"stylelint": "^16.26.1",
99101
"stylelint-config-standard-scss": "^16.0.0",

scripts/build.mjs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
import customElements from '../custom-elements.json' with { type: 'json' };
1212
import report from './report.mjs';
1313
import { buildComponents, buildThemes } from './sass.mjs';
14-
import { globby } from 'globby';
1514

1615
const exec = promisify(_exec);
1716

@@ -51,20 +50,9 @@ async function runTask(tag, cmd) {
5150
);
5251

5352
await runTask('Copying release files', async () => {
54-
const pngFiles = await globby('src/components/**/*.png');
55-
pngFiles.forEach(
56-
async (dest) =>
57-
await mkdir(path.dirname(DEST_DIR(dest.replace('src', ''))), {
58-
recursive: true,
59-
})
60-
);
61-
6253
Promise.all([
6354
copyFile('scripts/_package.json', DEST_DIR('package.json')),
6455
...RELEASE_FILES.map((file) => copyFile(file, DEST_DIR(file))),
65-
...pngFiles.map((file) =>
66-
copyFile(file, DEST_DIR(file.replace('src', '')))
67-
),
6856
]);
6957
});
7058

scripts/tsconfig.prod.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"extends": "../tsconfig.json",
33
"exclude": [
44
"../vite.config.ts",
5+
"../vitest.setup.ts",
56
"../**/*.spec.ts",
67
"../stories"
78
],
@@ -12,7 +13,5 @@
1213
"declarationMap": false,
1314
"removeComments": true
1415
},
15-
"include": [
16-
"../**/*.ts"
17-
]
16+
"include": ["../**/*.ts"]
1817
}

src/animations/player.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1+
import { css, LitElement } from 'lit';
2+
import { beforeAll, beforeEach, describe, expect, it } from 'vitest';
13
import {
24
defineCE,
3-
expect,
45
fixture,
56
html,
67
unsafeStatic,
7-
} from '@open-wc/testing';
8-
import { css, LitElement } from 'lit';
8+
} from '../components/common/helpers.spec.js';
99

1010
import { EaseOut } from './easings.js';
1111
import { addAnimationController } from './player.js';
@@ -27,7 +27,7 @@ describe('Animations Player', () => {
2727
let tag: string;
2828
let el: HTMLElement & { player: ReturnType<typeof addAnimationController> };
2929

30-
before(() => {
30+
beforeAll(() => {
3131
tag = defineCE(
3232
class extends LitElement {
3333
public static override styles = css`

src/components/accordion/accordion.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
2-
1+
import { beforeAll, beforeEach, describe, expect, it } from 'vitest';
32
import {
43
altKey,
54
arrowDown,
@@ -9,12 +8,13 @@ import {
98
shiftKey,
109
} from '../common/controllers/key-bindings.js';
1110
import { defineComponents } from '../common/definitions/defineComponents.js';
11+
import { elementUpdated, fixture, html } from '../common/helpers.spec.js';
1212
import { simulateClick, simulateKeyboard } from '../common/utils.spec.js';
1313
import IgcExpansionPanelComponent from '../expansion-panel/expansion-panel.js';
1414
import IgcAccordionComponent from './accordion.js';
1515

1616
describe('Accordion', () => {
17-
before(() => {
17+
beforeAll(() => {
1818
defineComponents(IgcAccordionComponent);
1919
});
2020

src/components/avatar/avatar.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
2-
1+
import { beforeAll, describe, expect, it } from 'vitest';
32
import { defineComponents } from '../common/definitions/defineComponents.js';
3+
import { elementUpdated, fixture, html } from '../common/helpers.spec.js';
44
import IgcAvatarComponent from './avatar.js';
55

66
describe('Avatar', () => {
77
const DIFF_OPTIONS = {
88
ignoreAttributes: ['style'],
99
};
1010

11-
before(() => {
11+
beforeAll(() => {
1212
defineComponents(IgcAvatarComponent);
1313
});
1414

src/components/badge/badge.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
2-
1+
import { beforeAll, describe, expect, it } from 'vitest';
32
import { defineComponents } from '../common/definitions/defineComponents.js';
3+
import { elementUpdated, fixture, html } from '../common/helpers.spec.js';
44
import IgcBadgeComponent from './badge.js';
55

66
describe('Badge', () => {
7-
before(() => {
7+
beforeAll(() => {
88
defineComponents(IgcBadgeComponent);
99
});
1010

src/components/badge/badge.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { html, LitElement, type PropertyValues } from 'lit';
2-
import { property } from 'lit/decorators.js';
2+
import { property, state } from 'lit/decorators.js';
33
import { addThemingController } from '../../theming/theming-controller.js';
44
import { addInternalsController } from '../common/controllers/internals.js';
5-
import { addSlotController } from '../common/controllers/slot.js';
5+
import { addSlotController, setSlots } from '../common/controllers/slot.js';
66
import { registerComponent } from '../common/definitions/register.js';
77
import { partMap } from '../common/part-map.js';
88
import type { BadgeShape, StyleVariant } from '../types.js';
@@ -29,24 +29,18 @@ export default class IgcBadgeComponent extends LitElement {
2929
registerComponent(IgcBadgeComponent);
3030
}
3131

32-
private _iconPart = false;
32+
private readonly _internals = addInternalsController(this, {
33+
initialARIA: { role: 'status' },
34+
});
3335

3436
private readonly _slots = addSlotController(this, {
37+
slots: setSlots(),
3538
onChange: this._handleSlotChange,
39+
initial: true,
3640
});
3741

38-
protected _handleSlotChange(): void {
39-
const assignedNodes = this._slots.getAssignedNodes('[default]', true);
40-
this._iconPart = assignedNodes.some(
41-
(node) =>
42-
node.nodeType === Node.ELEMENT_NODE &&
43-
(node as Element).tagName.toLowerCase() === 'igc-icon'
44-
);
45-
}
46-
47-
private readonly _internals = addInternalsController(this, {
48-
initialARIA: { role: 'status' },
49-
});
42+
@state()
43+
private _iconPart = false;
5044

5145
/**
5246
* The type of badge.
@@ -87,6 +81,13 @@ export default class IgcBadgeComponent extends LitElement {
8781
}
8882
}
8983

84+
protected _handleSlotChange(): void {
85+
this._iconPart = this._slots.hasAssignedElements('[default]', {
86+
flatten: true,
87+
selector: 'igc-icon',
88+
});
89+
}
90+
9091
protected override render() {
9192
return html`
9293
<span part=${partMap({ base: true, icon: this._iconPart })}>

src/components/banner/banner.spec.ts

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
1+
import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
2+
import { defineComponents } from '../common/definitions/defineComponents.js';
13
import {
24
elementUpdated,
3-
expect,
45
fixture,
56
html,
67
nextFrame,
7-
} from '@open-wc/testing';
8-
import { spy } from 'sinon';
9-
10-
import { defineComponents } from '../common/definitions/defineComponents.js';
8+
} from '../common/helpers.spec.js';
119
import { finishAnimationsFor, simulateClick } from '../common/utils.spec.js';
1210
import IgcIconComponent from '../icon/icon.js';
1311
import IgcBannerComponent from './banner.js';
1412

1513
describe('Banner', () => {
16-
before(() => {
14+
beforeAll(() => {
1715
defineComponents(IgcBannerComponent, IgcIconComponent);
1816
});
1917

@@ -246,7 +244,7 @@ describe('Banner', () => {
246244
});
247245

248246
it('should emit correct event sequence for the default action button', async () => {
249-
const eventSpy = spy(banner, 'emitEvent');
247+
const spy = vi.spyOn(banner, 'emitEvent');
250248
const button = banner.renderRoot.querySelector('igc-button')!;
251249

252250
expect(banner.open).to.be.false;
@@ -256,19 +254,19 @@ describe('Banner', () => {
256254

257255
simulateClick(button);
258256

259-
expect(eventSpy.callCount).to.equal(1);
260-
expect(eventSpy).calledWith('igcClosing', { cancelable: true });
257+
expect(spy).toHaveBeenCalledTimes(1);
258+
expect(spy).toHaveBeenCalledWith('igcClosing', { cancelable: true });
261259

262-
eventSpy.resetHistory();
260+
spy.mockClear();
263261
await elementUpdated(banner);
264262
await clickHideComplete();
265263

266-
expect(eventSpy).calledWith('igcClosed');
264+
expect(spy).toHaveBeenCalledWith('igcClosed');
267265
expect(banner.open).to.be.false;
268266
});
269267

270268
it('can cancel `igcClosing` event', async () => {
271-
const eventSpy = spy(banner, 'emitEvent');
269+
const spy = vi.spyOn(banner, 'emitEvent');
272270
const button = banner.renderRoot.querySelector('igc-button')!;
273271

274272
banner.addEventListener('igcClosing', (event) => {
@@ -282,8 +280,8 @@ describe('Banner', () => {
282280
await elementUpdated(banner);
283281
await clickHideComplete();
284282

285-
expect(eventSpy).calledWith('igcClosing');
286-
expect(eventSpy).not.calledWith('igcClosed');
283+
expect(spy).toHaveBeenCalledWith('igcClosing', { cancelable: true });
284+
expect(spy).not.toHaveBeenCalledWith('igcClosed');
287285
expect(banner.open).to.be.true;
288286
});
289287
});

0 commit comments

Comments
 (0)