summaryrefslogtreecommitdiff
path: root/packages/frontend/src/components/MkChart.stories.impl.ts
diff options
context:
space:
mode:
authorzyoshoka <107108195+zyoshoka@users.noreply.github.com>2024-06-08 18:00:54 +0900
committerGitHub <noreply@github.com>2024-06-08 18:00:54 +0900
commit9849aab40283cbde2184e74d4795aec8ef8ccba3 (patch)
tree913efa935d00b01f9936794e74e410283ba1dbc5 /packages/frontend/src/components/MkChart.stories.impl.ts
parentfeat: 通報を受けた際にメールまたはWebhookで通知を送出出... (diff)
downloadmisskey-9849aab40283cbde2184e74d4795aec8ef8ccba3.tar.gz
misskey-9849aab40283cbde2184e74d4795aec8ef8ccba3.tar.bz2
misskey-9849aab40283cbde2184e74d4795aec8ef8ccba3.zip
test(#10336): add `components/MkC.*` stories (#13830)
* test(storybook): add `components/MkC.*` stories * test(storybook): add some tests * test: add sleep * test: comment-out flaky test * test(storybook): add test for `MkChannelFollowButton` * chore(storybook): tweak sleep duration in `MkChannelFollowButton` story test * fix(chromatic): add delay to `MkChannelList` * chore: replace `mswDecorator` with `mswLoader` * fix(storybook): tweak some parameters * chore: serve static files * fix(chromatic): add delay to `MkCwButton` * chore: delete logging for debug * fix: add right click in `MkContextMenu` play * refactor: remove unused imports
Diffstat (limited to 'packages/frontend/src/components/MkChart.stories.impl.ts')
-rw-r--r--packages/frontend/src/components/MkChart.stories.impl.ts117
1 files changed, 117 insertions, 0 deletions
diff --git a/packages/frontend/src/components/MkChart.stories.impl.ts b/packages/frontend/src/components/MkChart.stories.impl.ts
new file mode 100644
index 0000000000..6b0cc3b858
--- /dev/null
+++ b/packages/frontend/src/components/MkChart.stories.impl.ts
@@ -0,0 +1,117 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+/* eslint-disable @typescript-eslint/explicit-function-return-type */
+/* eslint-disable import/no-default-export */
+import { StoryObj } from '@storybook/vue3';
+import { DefaultBodyType, HttpResponse, HttpResponseResolver, JsonBodyType, PathParams, http } from 'msw';
+import seedrandom from 'seedrandom';
+import { action } from '@storybook/addon-actions';
+import { commonHandlers } from '../../.storybook/mocks.js';
+import MkChart from './MkChart.vue';
+
+function getChartArray(seed: string, limit: number, option?: { accumulate?: boolean, mul?: number }): number[] {
+ const rng = seedrandom(seed);
+ const max = Math.floor(option?.mul ?? 250 * rng());
+ let accumulation = 0;
+ const array: number[] = [];
+ for (let i = 0; i < limit; i++) {
+ const num = Math.floor((max + 1) * rng());
+ if (option?.accumulate) {
+ accumulation += num;
+ array.unshift(accumulation);
+ } else {
+ array.push(num);
+ }
+ }
+ return array;
+}
+
+function getChartResolver(fields: string[], option?: { accumulate?: boolean, mulMap?: Record<string, number> }): HttpResponseResolver<PathParams, DefaultBodyType, JsonBodyType> {
+ return ({ request }) => {
+ action(`GET ${request.url}`)();
+ const limitParam = new URL(request.url).searchParams.get('limit');
+ const limit = limitParam ? parseInt(limitParam) : 30;
+ const res = {};
+ for (const field of fields) {
+ const layers = field.split('.');
+ let current = res;
+ while (layers.length > 1) {
+ const currentKey = layers.shift()!;
+ if (current[currentKey] == null) current[currentKey] = {};
+ current = current[currentKey];
+ }
+ current[layers[0]] = getChartArray(field, limit, {
+ accumulate: option?.accumulate,
+ mul: option?.mulMap != null && field in option.mulMap ? option.mulMap[field] : undefined,
+ });
+ }
+ return HttpResponse.json(res);
+ };
+}
+
+const Base = {
+ render(args) {
+ return {
+ components: {
+ MkChart,
+ },
+ setup() {
+ return {
+ args,
+ };
+ },
+ computed: {
+ props() {
+ return {
+ ...this.args,
+ };
+ },
+ },
+ template: '<MkChart v-bind="props" />',
+ };
+ },
+ args: {
+ src: 'federation',
+ span: 'hour',
+ },
+ parameters: {
+ layout: 'centered',
+ msw: {
+ handlers: [
+ ...commonHandlers,
+ http.get('/api/charts/federation', getChartResolver(
+ ['deliveredInstances', 'inboxInstances', 'stalled', 'sub', 'pub', 'pubsub', 'subActive', 'pubActive'],
+ )),
+ http.get('/api/charts/notes', getChartResolver(
+ ['local.total', 'remote.total'],
+ { accumulate: true },
+ )),
+ http.get('/api/charts/drive', getChartResolver(
+ ['local.incSize', 'local.decSize', 'remote.incSize', 'remote.decSize'],
+ { mulMap: { 'local.incSize': 1e7, 'local.decSize': 5e6, 'remote.incSize': 1e6, 'remote.decSize': 5e5 } },
+ )),
+ ],
+ },
+ },
+} satisfies StoryObj<typeof MkChart>;
+export const FederationChart = {
+ ...Base,
+ args: {
+ src: 'federation',
+ },
+} satisfies StoryObj<typeof MkChart>;
+export const NotesTotalChart = {
+ ...Base,
+ args: {
+ src: 'notes-total',
+ },
+} satisfies StoryObj<typeof MkChart>;
+export const DriveChart = {
+ ...Base,
+ args: {
+ src: 'drive',
+ },
+} satisfies StoryObj<typeof MkChart>;