{{ 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()?.(),
+ };
+}