test(frontend): migrate MSW in Storybook to v2 (#13195)
This commit is contained in:
		@@ -3,7 +3,7 @@
 | 
			
		||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { type SharedOptions, rest } from 'msw';
 | 
			
		||||
import { type SharedOptions, http, HttpResponse } from 'msw';
 | 
			
		||||
 | 
			
		||||
export const onUnhandledRequest = ((req, print) => {
 | 
			
		||||
	if (req.url.hostname !== 'localhost' || /^\/(?:client-assets\/|fluent-emojis?\/|iframe.html$|node_modules\/|src\/|sb-|static-assets\/|vite\/)/.test(req.url.pathname)) {
 | 
			
		||||
@@ -13,19 +13,31 @@ export const onUnhandledRequest = ((req, print) => {
 | 
			
		||||
}) satisfies SharedOptions['onUnhandledRequest'];
 | 
			
		||||
 | 
			
		||||
export const commonHandlers = [
 | 
			
		||||
	rest.get('/fluent-emoji/:codepoints.png', async (req, res, ctx) => {
 | 
			
		||||
		const { codepoints } = req.params;
 | 
			
		||||
	http.get('/fluent-emoji/:codepoints.png', async ({ params }) => {
 | 
			
		||||
		const { codepoints } = params;
 | 
			
		||||
		const value = await fetch(`https://raw.githubusercontent.com/misskey-dev/emojis/main/dist/${codepoints}.png`).then((response) => response.blob());
 | 
			
		||||
		return res(ctx.set('Content-Type', 'image/png'), ctx.body(value));
 | 
			
		||||
		return new HttpResponse(value, {
 | 
			
		||||
			headers: {
 | 
			
		||||
				'Content-Type': 'image/png',
 | 
			
		||||
			},
 | 
			
		||||
		});
 | 
			
		||||
	}),
 | 
			
		||||
	rest.get('/fluent-emojis/:codepoints.png', async (req, res, ctx) => {
 | 
			
		||||
		const { codepoints } = req.params;
 | 
			
		||||
	http.get('/fluent-emojis/:codepoints.png', async ({ params }) => {
 | 
			
		||||
		const { codepoints } = params;
 | 
			
		||||
		const value = await fetch(`https://raw.githubusercontent.com/misskey-dev/emojis/main/dist/${codepoints}.png`).then((response) => response.blob());
 | 
			
		||||
		return res(ctx.set('Content-Type', 'image/png'), ctx.body(value));
 | 
			
		||||
		return new HttpResponse(value, {
 | 
			
		||||
			headers: {
 | 
			
		||||
				'Content-Type': 'image/png',
 | 
			
		||||
			},
 | 
			
		||||
		});
 | 
			
		||||
	}),
 | 
			
		||||
	rest.get('/twemoji/:codepoints.svg', async (req, res, ctx) => {
 | 
			
		||||
		const { codepoints } = req.params;
 | 
			
		||||
	http.get('/twemoji/:codepoints.svg', async ({ params }) => {
 | 
			
		||||
		const { codepoints } = params;
 | 
			
		||||
		const value = await fetch(`https://unpkg.com/@discordapp/twemoji@15.0.2/dist/svg/${codepoints}.svg`).then((response) => response.blob());
 | 
			
		||||
		return res(ctx.set('Content-Type', 'image/svg+xml'), ctx.body(value));
 | 
			
		||||
		return new HttpResponse(value, {
 | 
			
		||||
			headers: {
 | 
			
		||||
				'Content-Type': 'image/svg+xml',
 | 
			
		||||
			},
 | 
			
		||||
		});
 | 
			
		||||
	}),
 | 
			
		||||
];
 | 
			
		||||
 
 | 
			
		||||
@@ -122,8 +122,8 @@
 | 
			
		||||
		"happy-dom": "10.0.3",
 | 
			
		||||
		"intersection-observer": "0.12.2",
 | 
			
		||||
		"micromatch": "4.0.5",
 | 
			
		||||
		"msw": "2.1.2",
 | 
			
		||||
		"msw-storybook-addon": "1.10.0",
 | 
			
		||||
		"msw": "2.1.7",
 | 
			
		||||
		"msw-storybook-addon": "2.0.0-beta.1",
 | 
			
		||||
		"nodemon": "3.0.3",
 | 
			
		||||
		"prettier": "3.2.4",
 | 
			
		||||
		"react": "18.2.0",
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
 | 
			
		||||
import { action } from '@storybook/addon-actions';
 | 
			
		||||
import { StoryObj } from '@storybook/vue3';
 | 
			
		||||
import { rest } from 'msw';
 | 
			
		||||
import { HttpResponse, http } from 'msw';
 | 
			
		||||
import { abuseUserReport } from '../../.storybook/fakes.js';
 | 
			
		||||
import { commonHandlers } from '../../.storybook/mocks.js';
 | 
			
		||||
import MkAbuseReport from './MkAbuseReport.vue';
 | 
			
		||||
@@ -44,9 +44,9 @@ export const Default = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/admin/resolve-abuse-user-report', async (req, res, ctx) => {
 | 
			
		||||
					action('POST /api/admin/resolve-abuse-user-report')(await req.json());
 | 
			
		||||
					return res(ctx.json({}));
 | 
			
		||||
				http.post('/api/admin/resolve-abuse-user-report', async ({ request }) => {
 | 
			
		||||
					action('POST /api/admin/resolve-abuse-user-report')(await request.json());
 | 
			
		||||
					return HttpResponse.json({});
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
 | 
			
		||||
import { action } from '@storybook/addon-actions';
 | 
			
		||||
import { StoryObj } from '@storybook/vue3';
 | 
			
		||||
import { rest } from 'msw';
 | 
			
		||||
import { HttpResponse, http } from 'msw';
 | 
			
		||||
import { userDetailed } from '../../.storybook/fakes.js';
 | 
			
		||||
import { commonHandlers } from '../../.storybook/mocks.js';
 | 
			
		||||
import MkAbuseReportWindow from './MkAbuseReportWindow.vue';
 | 
			
		||||
@@ -44,9 +44,9 @@ export const Default = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/users/report-abuse', async (req, res, ctx) => {
 | 
			
		||||
					action('POST /api/users/report-abuse')(await req.json());
 | 
			
		||||
					return res(ctx.json({}));
 | 
			
		||||
				http.post('/api/users/report-abuse', async ({ request }) => {
 | 
			
		||||
					action('POST /api/users/report-abuse')(await request.json());
 | 
			
		||||
					return HttpResponse.json({});
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
 | 
			
		||||
import { StoryObj } from '@storybook/vue3';
 | 
			
		||||
import { rest } from 'msw';
 | 
			
		||||
import { HttpResponse, http } from 'msw';
 | 
			
		||||
import { userDetailed } from '../../.storybook/fakes.js';
 | 
			
		||||
import { commonHandlers } from '../../.storybook/mocks.js';
 | 
			
		||||
import MkAchievements from './MkAchievements.vue';
 | 
			
		||||
@@ -39,8 +39,8 @@ export const Empty = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/users/achievements', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json([]));
 | 
			
		||||
				http.post('/api/users/achievements', () => {
 | 
			
		||||
					return HttpResponse.json([]);
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
@@ -52,8 +52,8 @@ export const All = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/users/achievements', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json(ACHIEVEMENT_TYPES.map((name) => ({ name, unlockedAt: 0 }))));
 | 
			
		||||
				http.post('/api/users/achievements', () => {
 | 
			
		||||
					return HttpResponse.json(ACHIEVEMENT_TYPES.map((name) => ({ name, unlockedAt: 0 })));
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ import { action } from '@storybook/addon-actions';
 | 
			
		||||
import { expect } from '@storybook/jest';
 | 
			
		||||
import { userEvent, waitFor, within } from '@storybook/testing-library';
 | 
			
		||||
import { StoryObj } from '@storybook/vue3';
 | 
			
		||||
import { rest } from 'msw';
 | 
			
		||||
import { HttpResponse, http } from 'msw';
 | 
			
		||||
import { userDetailed } from '../../.storybook/fakes.js';
 | 
			
		||||
import { commonHandlers } from '../../.storybook/mocks.js';
 | 
			
		||||
import MkAutocomplete from './MkAutocomplete.vue';
 | 
			
		||||
@@ -99,11 +99,11 @@ export const User = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/users/search-by-username-and-host', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json([
 | 
			
		||||
				http.post('/api/users/search-by-username-and-host', () => {
 | 
			
		||||
					return HttpResponse.json([
 | 
			
		||||
						userDetailed('44', 'mizuki', 'misskey-hub.net', 'Mizuki'),
 | 
			
		||||
						userDetailed('49', 'momoko', 'misskey-hub.net', 'Momoko'),
 | 
			
		||||
					]));
 | 
			
		||||
					]);
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
@@ -132,12 +132,12 @@ export const Hashtag = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/hashtags/search', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json([
 | 
			
		||||
				http.post('/api/hashtags/search', () => {
 | 
			
		||||
					return HttpResponse.json([
 | 
			
		||||
						'気象警報注意報',
 | 
			
		||||
						'気象警報',
 | 
			
		||||
						'気象情報',
 | 
			
		||||
					]));
 | 
			
		||||
					]);
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
 | 
			
		||||
import { StoryObj } from '@storybook/vue3';
 | 
			
		||||
import { rest } from 'msw';
 | 
			
		||||
import { HttpResponse, http } from 'msw';
 | 
			
		||||
import { userDetailed } from '../../.storybook/fakes.js';
 | 
			
		||||
import { commonHandlers } from '../../.storybook/mocks.js';
 | 
			
		||||
import MkAvatars from './MkAvatars.vue';
 | 
			
		||||
@@ -38,12 +38,12 @@ export const Default = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/users/show', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json([
 | 
			
		||||
				http.post('/api/users/show', () => {
 | 
			
		||||
					return HttpResponse.json([
 | 
			
		||||
						userDetailed('17'),
 | 
			
		||||
						userDetailed('20'),
 | 
			
		||||
						userDetailed('18'),
 | 
			
		||||
					]));
 | 
			
		||||
					]);
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
 | 
			
		||||
import { StoryObj } from '@storybook/vue3';
 | 
			
		||||
import { rest } from 'msw';
 | 
			
		||||
import { HttpResponse, http } from 'msw';
 | 
			
		||||
import { userDetailed, inviteCode } from '../../.storybook/fakes.js';
 | 
			
		||||
import { commonHandlers } from '../../.storybook/mocks.js';
 | 
			
		||||
import MkInviteCode from './MkInviteCode.vue';
 | 
			
		||||
@@ -39,8 +39,8 @@ export const Default = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/users/show', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json(userDetailed(req.params.userId as string)));
 | 
			
		||||
				http.post('/api/users/show', ({ params }) => {
 | 
			
		||||
					return HttpResponse.json(userDetailed(params.userId as string));
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
 | 
			
		||||
import { StoryObj } from '@storybook/vue3';
 | 
			
		||||
import { rest } from 'msw';
 | 
			
		||||
import { HttpResponse, http } from 'msw';
 | 
			
		||||
import { commonHandlers } from '../../.storybook/mocks.js';
 | 
			
		||||
import { userDetailed } from '../../.storybook/fakes.js';
 | 
			
		||||
import MkUserSetupDialog_Follow from './MkUserSetupDialog.Follow.vue';
 | 
			
		||||
@@ -38,17 +38,17 @@ export const Default = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/users', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json([
 | 
			
		||||
				http.post('/api/users', () => {
 | 
			
		||||
					return HttpResponse.json([
 | 
			
		||||
						userDetailed('44'),
 | 
			
		||||
						userDetailed('49'),
 | 
			
		||||
					]));
 | 
			
		||||
					]);
 | 
			
		||||
				}),
 | 
			
		||||
				rest.post('/api/pinned-users', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json([
 | 
			
		||||
				http.post('/api/pinned-users', () => {
 | 
			
		||||
					return HttpResponse.json([
 | 
			
		||||
						userDetailed('44'),
 | 
			
		||||
						userDetailed('49'),
 | 
			
		||||
					]));
 | 
			
		||||
					]);
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
 | 
			
		||||
import { StoryObj } from '@storybook/vue3';
 | 
			
		||||
import { rest } from 'msw';
 | 
			
		||||
import { HttpResponse, http } from 'msw';
 | 
			
		||||
import { commonHandlers } from '../../.storybook/mocks.js';
 | 
			
		||||
import { userDetailed } from '../../.storybook/fakes.js';
 | 
			
		||||
import MkUserSetupDialog from './MkUserSetupDialog.vue';
 | 
			
		||||
@@ -38,17 +38,17 @@ export const Default = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/users', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json([
 | 
			
		||||
				http.post('/api/users', () => {
 | 
			
		||||
					return HttpResponse.json([
 | 
			
		||||
						userDetailed('44'),
 | 
			
		||||
						userDetailed('49'),
 | 
			
		||||
					]));
 | 
			
		||||
					]);
 | 
			
		||||
				}),
 | 
			
		||||
				rest.post('/api/pinned-users', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json([
 | 
			
		||||
				http.post('/api/pinned-users', () => {
 | 
			
		||||
					return HttpResponse.json([
 | 
			
		||||
						userDetailed('44'),
 | 
			
		||||
						userDetailed('49'),
 | 
			
		||||
					]));
 | 
			
		||||
					]);
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
import { expect } from '@storybook/jest';
 | 
			
		||||
import { userEvent, waitFor, within } from '@storybook/testing-library';
 | 
			
		||||
import { StoryObj } from '@storybook/vue3';
 | 
			
		||||
import { rest } from 'msw';
 | 
			
		||||
import { HttpResponse, http } from 'msw';
 | 
			
		||||
import { commonHandlers } from '../../../.storybook/mocks.js';
 | 
			
		||||
import MkUrl from './MkUrl.vue';
 | 
			
		||||
export const Default = {
 | 
			
		||||
@@ -59,8 +59,8 @@ export const Default = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.get('/url', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json({
 | 
			
		||||
				http.get('/url', () => {
 | 
			
		||||
					return HttpResponse.json({
 | 
			
		||||
						title: 'Misskey Hub',
 | 
			
		||||
						icon: 'https://misskey-hub.net/favicon.ico',
 | 
			
		||||
						description: 'Misskeyはオープンソースの分散型ソーシャルネットワーキングプラットフォームです。',
 | 
			
		||||
@@ -74,7 +74,7 @@ export const Default = {
 | 
			
		||||
						sitename: 'misskey-hub.net',
 | 
			
		||||
						sensitive: false,
 | 
			
		||||
						url: 'https://misskey-hub.net/',
 | 
			
		||||
					}));
 | 
			
		||||
					});
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
 | 
			
		||||
import { StoryObj } from '@storybook/vue3';
 | 
			
		||||
import { rest } from 'msw';
 | 
			
		||||
import { HttpResponse, http } from 'msw';
 | 
			
		||||
import { userDetailed } from '../../../.storybook/fakes.js';
 | 
			
		||||
import { commonHandlers } from '../../../.storybook/mocks.js';
 | 
			
		||||
import home_ from './home.vue';
 | 
			
		||||
@@ -39,12 +39,13 @@ export const Default = {
 | 
			
		||||
		msw: {
 | 
			
		||||
			handlers: [
 | 
			
		||||
				...commonHandlers,
 | 
			
		||||
				rest.post('/api/users/notes', (req, res, ctx) => {
 | 
			
		||||
					return res(ctx.json([]));
 | 
			
		||||
				http.post('/api/users/notes', () => {
 | 
			
		||||
					return HttpResponse.json([]);
 | 
			
		||||
				}),
 | 
			
		||||
				rest.get('/api/charts/user/notes', (req, res, ctx) => {
 | 
			
		||||
					const length = Math.max(Math.min(parseInt(req.url.searchParams.get('limit') ?? '30', 10), 1), 300);
 | 
			
		||||
					return res(ctx.json({
 | 
			
		||||
				http.get('/api/charts/user/notes', ({ request }) => {
 | 
			
		||||
					const url = new URL(request.url);
 | 
			
		||||
					const length = Math.max(Math.min(parseInt(url.searchParams.get('limit') ?? '30', 10), 1), 300);
 | 
			
		||||
					return HttpResponse.json({
 | 
			
		||||
						total: Array.from({ length }, () => 0),
 | 
			
		||||
						inc: Array.from({ length }, () => 0),
 | 
			
		||||
						dec: Array.from({ length }, () => 0),
 | 
			
		||||
@@ -54,11 +55,12 @@ export const Default = {
 | 
			
		||||
							renote: Array.from({ length }, () => 0),
 | 
			
		||||
							withFile: Array.from({ length }, () => 0),
 | 
			
		||||
						},
 | 
			
		||||
					}));
 | 
			
		||||
					});
 | 
			
		||||
				}),
 | 
			
		||||
				rest.get('/api/charts/user/pv', (req, res, ctx) => {
 | 
			
		||||
					const length = Math.max(Math.min(parseInt(req.url.searchParams.get('limit') ?? '30', 10), 1), 300);
 | 
			
		||||
					return res(ctx.json({
 | 
			
		||||
				http.get('/api/charts/user/pv', ({ request }) => {
 | 
			
		||||
					const url = new URL(request.url);
 | 
			
		||||
					const length = Math.max(Math.min(parseInt(url.searchParams.get('limit') ?? '30', 10), 1), 300);
 | 
			
		||||
					return HttpResponse.json({
 | 
			
		||||
						upv: {
 | 
			
		||||
							user: Array.from({ length }, () => 0),
 | 
			
		||||
							visitor: Array.from({ length }, () => 0),
 | 
			
		||||
@@ -67,7 +69,7 @@ export const Default = {
 | 
			
		||||
							user: Array.from({ length }, () => 0),
 | 
			
		||||
							visitor: Array.from({ length }, () => 0),
 | 
			
		||||
						},
 | 
			
		||||
					}));
 | 
			
		||||
					});
 | 
			
		||||
				}),
 | 
			
		||||
			],
 | 
			
		||||
		},
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user