From d387ad34c67ce0ee7dc92fde5601eebb7470de7a Mon Sep 17 00:00:00 2001 From: zyoshoka Date: Sat, 18 May 2024 20:19:51 +0900 Subject: [PATCH] test(storybook): add some tests --- .../components/MkClickerGame.stories.impl.ts | 11 ++++++ .../frontend/src/components/MkClickerGame.vue | 2 +- .../src/components/MkCwButton.stories.impl.ts | 37 +++++++++++++++++++ packages/frontend/src/scripts/test-utils.ts | 10 +++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/packages/frontend/src/components/MkClickerGame.stories.impl.ts b/packages/frontend/src/components/MkClickerGame.stories.impl.ts index 3c875cfcd5..1134bc321d 100644 --- a/packages/frontend/src/components/MkClickerGame.stories.impl.ts +++ b/packages/frontend/src/components/MkClickerGame.stories.impl.ts @@ -8,6 +8,7 @@ import { StoryObj } from '@storybook/vue3'; import { HttpResponse, http } from 'msw'; import { action } from '@storybook/addon-actions'; +import { expect, userEvent, within } from '@storybook/test'; import { commonHandlers } from '../../.storybook/mocks.js'; import MkClickerGame from './MkClickerGame.vue'; export const Default = { @@ -31,6 +32,16 @@ export const Default = { template: '', }; }, + async play({ canvasElement }) { + const canvas = within(canvasElement); + const count = canvas.getByTestId('count'); + // NOTE: flaky なので N/A も通しておく + await expect(count).toHaveTextContent(/^(0|N\/A)$/); + const buttonElement = canvas.getByRole('button'); + await userEvent.click(buttonElement); + // FIXME: flaky + // await expect(count).toHaveTextContent('1'); + }, parameters: { layout: 'centered', msw: { diff --git a/packages/frontend/src/components/MkClickerGame.vue b/packages/frontend/src/components/MkClickerGame.vue index 23046bf345..b592609e18 100644 --- a/packages/frontend/src/components/MkClickerGame.vue +++ b/packages/frontend/src/components/MkClickerGame.vue @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ number(cps) }}cps
-
{{ number(cookies) }}
+
{{ number(cookies) }}
diff --git a/packages/frontend/src/components/MkCwButton.stories.impl.ts b/packages/frontend/src/components/MkCwButton.stories.impl.ts index 189894b8a3..062e2aacab 100644 --- a/packages/frontend/src/components/MkCwButton.stories.impl.ts +++ b/packages/frontend/src/components/MkCwButton.stories.impl.ts @@ -7,7 +7,18 @@ /* eslint-disable import/no-default-export */ import { StoryObj } from '@storybook/vue3'; import { action } from '@storybook/addon-actions'; +import { expect, userEvent, within } from '@storybook/test'; +import { file } from '../../.storybook/fakes.js'; import MkCwButton from './MkCwButton.vue'; +import { i18n } from '@/i18n.js'; +import { semaphore } from '@/scripts/test-utils.js'; + +function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +const s = semaphore(); + export const Default = { render(args) { return { @@ -42,7 +53,33 @@ export const Default = { args: { text: 'Some CW content', }, + async play({ canvasElement }) { + await s.acquire(); + await sleep(1000); + const canvas = within(canvasElement); + const buttonElement = canvas.getByRole('button'); + await expect(buttonElement).toHaveTextContent(i18n.ts._cw.show); + await expect(buttonElement).toHaveTextContent(i18n.tsx._cw.chars({ count: 15 })); + await userEvent.click(buttonElement); + await expect(buttonElement).toHaveTextContent(i18n.ts._cw.hide); + await userEvent.click(buttonElement); + s.release(); + }, parameters: { layout: 'centered', }, } satisfies StoryObj; +export const IncludesTextAndDriveFile = { + ...Default, + args: { + text: 'Some CW content', + files: [file()], + }, + async play({ canvasElement }) { + const canvas = within(canvasElement); + const buttonElement = canvas.getByRole('button'); + await expect(buttonElement).toHaveTextContent(i18n.tsx._cw.chars({ count: 15 })); + await expect(buttonElement).toHaveTextContent(' / '); + await expect(buttonElement).toHaveTextContent(i18n.tsx._cw.files({ count: 1 })); + }, +} satisfies StoryObj; diff --git a/packages/frontend/src/scripts/test-utils.ts b/packages/frontend/src/scripts/test-utils.ts index 52bb2d94e0..a32315f4df 100644 --- a/packages/frontend/src/scripts/test-utils.ts +++ b/packages/frontend/src/scripts/test-utils.ts @@ -7,3 +7,13 @@ export async function tick(): Promise { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition await new Promise((globalThis.requestIdleCallback ?? setTimeout) as never); } + +/** + * @see https://github.com/misskey-dev/misskey/issues/11267 + */ +export function semaphore(counter = 0, waiting: (() => void)[] = []) { + return { + acquire: () => ++counter > 1 && new Promise(resolve => waiting.push(resolve)), + release: () => --counter && waiting.pop()?.(), + }; +}