Skip to content

Commit 09523fd

Browse files
committed
chore: upgrade to vitest@4
1 parent e387036 commit 09523fd

File tree

8 files changed

+218
-406
lines changed

8 files changed

+218
-406
lines changed

package-lock.json

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

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@
8181
"@types/dom-view-transitions": "^1.0.6",
8282
"@types/react": "^19.2.2",
8383
"@types/react-dom": "^19.2.2",
84-
"@vitejs/plugin-react": "^4.7.0",
85-
"@vitest/coverage-v8": "^3.2.4",
86-
"@vitest/ui": "^3.0.5",
84+
"@vitejs/plugin-react": "^5.1.0",
85+
"@vitest/coverage-v8": "^4.0.7",
86+
"@vitest/ui": "^4",
8787
"autoprefixer": "^10.4.21",
8888
"cssnano": "^7.1.2",
8989
"eslint": "^9.39.1",
@@ -111,7 +111,7 @@
111111
"typescript": "^5.9.3",
112112
"typescript-eslint": "^8.46.3",
113113
"vite": "^7.2.0",
114-
"vitest": "^3.0.5"
114+
"vitest": "^4"
115115
},
116116
"keywords": [
117117
"react",

src/components/Controller.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export default function Controller({ setIndex, children }: ControllerProps) {
3535

3636
const close = () => {
3737
Promise.all(exitHooks.current.map((hook) => hook()))
38-
.catch(() => {})
38+
.catch(/* v8 ignore next - @preserve */ () => {})
3939
.then(() => {
4040
exitHooks.current = [];
4141
setIndex(-1);

src/components/useSensors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ export default function useSensors() {
9494
Array.from(
9595
carouselRef.current?.parentElement?.querySelectorAll(
9696
`.${cssClass("toolbar")}, .${cssClass("selectable")}`,
97-
) /* c8 ignore start */ || [] /* c8 ignore stop */,
97+
) || [],
9898
).find((element) => element.contains(event.target as Element)) !== undefined));
9999

100100
const onPointerDown = (event: PointerEvent) => {

test/Lightbox.spec.tsx

Lines changed: 74 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
clickButtonPrev,
1010
expectCurrentSlideToBe,
1111
expectLightboxToBeClosed,
12+
expectLightboxToBeOpen,
1213
expectToBeZoomedIn,
1314
expectToBeZoomedOut,
1415
getCloseButton,
@@ -19,7 +20,6 @@ import {
1920
getPreviousButton,
2021
getSlidesCount,
2122
pointerSwipe,
22-
pointerZoom,
2323
querySelector,
2424
querySelectorAll,
2525
renderLightbox,
@@ -110,6 +110,18 @@ describe("Lightbox", () => {
110110
});
111111
});
112112

113+
it("supports wheel navigation threshold", async () => {
114+
renderLightbox();
115+
116+
await withFakeTimers(async () => {
117+
wheelSwipe(10, 0, 0);
118+
wheelSwipe(10, 0, 100);
119+
wheelSwipe(10, 0, 200);
120+
});
121+
122+
expectCurrentSlideToBe(0);
123+
});
124+
113125
it("supports wheel cooldown", async () => {
114126
renderLightbox();
115127

@@ -126,6 +138,9 @@ describe("Lightbox", () => {
126138

127139
renderLightbox();
128140

141+
await pointerSwipe(user, getCurrentSlideImage(), 0, -10);
142+
await expectLightboxToBeOpen();
143+
129144
await pointerSwipe(user, getCurrentSlide(), 0, -120);
130145
await expectLightboxToBeClosed();
131146
});
@@ -151,16 +166,6 @@ describe("Lightbox", () => {
151166
await expectLightboxToBeClosed();
152167
});
153168

154-
it("cancels multi-touch gestures", async () => {
155-
const user = userEvent.setup();
156-
157-
renderLightbox();
158-
expectCurrentSlideToBe(0);
159-
160-
await pointerZoom(user, getCurrentSlide());
161-
expectCurrentSlideToBe(0);
162-
});
163-
164169
it("supports render functions", () => {
165170
renderLightbox({
166171
render: {
@@ -196,13 +201,25 @@ describe("Lightbox", () => {
196201
it("supports responsive images", () => {
197202
renderLightbox({
198203
slides: [
199-
{ ...slides[0], srcSet: [{ src: "srcset", width: 800, height: 1200 }] },
200-
{ ...slides[1], srcSet: [{ src: "srcset", width: 1200, height: 800 }] },
204+
{
205+
...slides[0],
206+
srcSet: [
207+
{ src: "src1", width: 800, height: 1200 },
208+
{ src: "src2", width: 1600, height: 2400 },
209+
],
210+
},
211+
{
212+
...slides[1],
213+
srcSet: [
214+
{ src: "src3", width: 1200, height: 800 },
215+
{ src: "src4", width: 600, height: 400 },
216+
],
217+
},
201218
],
202219
});
203220

204-
expect(querySelector('img[srcset="srcset 800w"]')).toBeInTheDocument();
205-
expect(querySelector('img[srcset="srcset 1200w"]')).toBeInTheDocument();
221+
expect(querySelector('img[srcset="src1 800w, src2 1600w"]')).toBeInTheDocument();
222+
expect(querySelector('img[srcset="src4 600w, src3 1200w"]')).toBeInTheDocument();
206223
});
207224

208225
it("supports view transitions", () => {
@@ -396,6 +413,48 @@ describe("Lightbox", () => {
396413
expectToBeZoomedOut();
397414
});
398415

416+
it("ignores unsupported zoom gestures", async () => {
417+
const user = userEvent.setup();
418+
419+
renderLightbox();
420+
421+
const target = getCurrentSlide();
422+
423+
await user.pointer([
424+
{ keys: "[TouchA>]", target, coords: { x: 100, y: 100 } },
425+
{ keys: "[TouchB>]", target, coords: { x: 200, y: 200 } },
426+
{ keys: "[TouchC>]", target, coords: { x: 300, y: 300 } },
427+
{ pointerName: "TouchA", target, coords: { x: 50, y: 50 } },
428+
{ keys: "[/TouchA][/TouchB][/TouchC]", target },
429+
]);
430+
expectToBeZoomedOut();
431+
432+
await user.pointer([
433+
{ keys: "[TouchA>]", target, coords: { x: 100, y: 100 } },
434+
{ keys: "[TouchB>]", target, coords: { x: 200, y: 200 } },
435+
{ pointerName: "TouchA", target, coords: { x: 300, y: 300 } },
436+
{ keys: "[/TouchA][/TouchB]", target },
437+
]);
438+
expectToBeZoomedOut();
439+
440+
await user.pointer([
441+
{ keys: "[TouchA>]", target, coords: { x: 100, y: 100 } },
442+
{ keys: "[TouchB>]", target, coords: { x: 200, y: 200 } },
443+
{ pointerName: "TouchA", target, coords: { x: 50, y: 50 } },
444+
{ keys: "[/TouchA][/TouchB]", target },
445+
]);
446+
expectToBeZoomedIn();
447+
448+
await user.pointer([
449+
{ keys: "[TouchA>]", target, coords: { x: 50, y: 50 } },
450+
{ keys: "[TouchB>]", target, coords: { x: 200, y: 200 } },
451+
{ keys: "[TouchC>]", target, coords: { x: 300, y: 300 } },
452+
{ pointerName: "TouchA", target, coords: { x: 100, y: 100 } },
453+
{ keys: "[/TouchA][/TouchB][/TouchC]", target },
454+
]);
455+
expectToBeZoomedIn();
456+
});
457+
399458
it("supports double-click zoom", async () => {
400459
const user = userEvent.setup();
401460

test/test-utils.tsx

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,6 @@ export async function pointerSwipe(user: UserEvent, target: Element, deltaX: num
9090
]);
9191
}
9292

93-
export async function pointerZoom(user: UserEvent, target: Element) {
94-
await user.pointer([
95-
{ keys: "[TouchA>]", target, coords: { x: 0, y: 0 } },
96-
{ keys: "[TouchB>]", target, coords: { x: 0, y: 0 } },
97-
{ keys: "[/TouchB]", target, coords: { x: 100, y: 100 } },
98-
{ keys: "[/TouchA]", target, coords: { x: -100, y: -100 } },
99-
]);
100-
}
101-
10293
export function wheelSwipe(deltaX: number, deltaY: number, delay = 2_000) {
10394
act(() => {
10495
vi.setSystemTime(Date.now() + delay);
@@ -122,6 +113,10 @@ export function renderLightbox(props?: Omit<Partial<LightboxProps>, "index" | "s
122113
return render(<LightboxTest slides={slides} {...props} />);
123114
}
124115

116+
export async function expectLightboxToBeOpen() {
117+
expectCurrentSlideToBe(0);
118+
}
119+
125120
export async function expectLightboxToBeClosed() {
126121
await act(async () => {
127122
fireEvent.transitionEnd(getController());

test/vitest.setup.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,21 @@ afterEach(() => {
1818

1919
vi.stubGlobal(
2020
"ResizeObserver",
21-
vi.fn((callback) => ({
22-
observe: vi.fn(callback),
23-
unobserve: vi.fn(),
24-
disconnect: vi.fn(),
25-
})),
21+
class implements ResizeObserver {
22+
callback: ResizeObserverCallback;
23+
24+
constructor(callback: ResizeObserverCallback) {
25+
this.callback = callback;
26+
}
27+
28+
observe() {
29+
this.callback([], this);
30+
}
31+
32+
unobserve() {}
33+
34+
disconnect() {}
35+
},
2636
);
2737

2838
function isCarousel(target: unknown) {

vitest.config.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
1-
/// <reference types="vitest" />
1+
/// <reference types="vitest/config" />
22

33
import { defineConfig } from "vite";
44

55
export default defineConfig({
66
test: {
77
dir: "test",
88
environment: "jsdom",
9+
setupFiles: ["./test/vitest.setup.ts"],
910
coverage: {
10-
all: true,
1111
enabled: true,
12-
include: ["src"],
1312
thresholds: { "100": true },
14-
reporter: [
15-
["text", { skipEmpty: true }],
16-
["html", { skipEmpty: true }],
17-
],
13+
include: ["src/**/**.{ts,tsx}"],
14+
exclude: ["src/**/index.ts", "src/types.ts", "src/**/**.d.ts"],
1815
},
19-
setupFiles: ["./test/vitest.setup.ts"],
2016
},
2117
});

0 commit comments

Comments
 (0)