mastodon/app/javascript/testing/api.ts
2026-06-29 14:26:22 +00:00

80 lines
2.5 KiB
TypeScript

import type { CompactEmoji } from 'emojibase';
import { http, HttpResponse } from 'msw';
import { action } from 'storybook/actions';
import { toSupportedLocale } from '@/mastodon/features/emoji/locale';
import { customEmojiFactory, relationshipsFactoryAPI } from './factories';
export const mockHandlers = {
mute: http.post<{ id: string }>('/api/v1/accounts/:id/mute', ({ params }) => {
action('muting account')(params);
return HttpResponse.json(
relationshipsFactoryAPI({ id: params.id, muting: true }),
);
}),
unmute: http.post<{ id: string }>(
'/api/v1/accounts/:id/unmute',
({ params }) => {
action('unmuting account')(params);
return HttpResponse.json(
relationshipsFactoryAPI({ id: params.id, muting: false }),
);
},
),
block: http.post<{ id: string }>(
'/api/v1/accounts/:id/block',
({ params }) => {
action('blocking account')(params);
return HttpResponse.json(
relationshipsFactoryAPI({ id: params.id, blocking: true }),
);
},
),
unblock: http.post<{ id: string }>(
'/api/v1/accounts/:id/unblock',
({ params }) => {
action('unblocking account')(params);
return HttpResponse.json(
relationshipsFactoryAPI({
id: params.id,
blocking: false,
}),
);
},
),
emojiCustomData: http.get('/api/v1/custom_emojis', () => {
action('fetching custom emoji data')();
return HttpResponse.json([customEmojiFactory()]);
}),
emojiData: http.get<{ locale: string }>(
'/packs-dev/emoji/:locale.json',
async ({ params }) => {
const locale = toSupportedLocale(params.locale);
const key = `../../../../../node_modules/emojibase-data/${locale}/compact.json`;
const emojiModules = import.meta.glob<CompactEmoji[]>(
'../../../../../node_modules/emojibase-data/**/compact.json',
{ import: 'default' },
);
const path = emojiModules[key];
if (!path) {
throw new Error(`Unsupported locale: ${locale}`);
}
action('fetching emoji data')(locale);
const data = await path();
return HttpResponse.json([data]);
},
),
};
export const unhandledRequestHandler = ({ url }: Request) => {
const { pathname } = new URL(url);
if (pathname.startsWith('/api/v1/')) {
action(`unhandled request to ${pathname}`)(url);
console.warn(
`Unhandled request to ${pathname}. Please add a handler for this request in your storybook configuration.`,
);
}
};