Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 24 additions & 28 deletions src/components/__tests__/LayoutEditor.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ import LayoutEditor from "../LayoutEditor";
import { CardLayout } from "@/lib/types";
import "@testing-library/jest-dom";

interface WindowWithDragState extends Window {
triggerDragEnd?: (event: unknown) => void;
mockIsOverId?: string;
}
Comment on lines +7 to +10
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 triggerDragEnd がオプショナル(?)で宣言されているため、取得した変数の型は ((event: unknown) => void) | undefined になります。expect(...).toBeDefined() はランタイムチェックであり TypeScript の型を絞り込まないため、strictNullChecks が有効な環境では triggerDragEnd({...}) の呼び出しが型エラー(TS2722)になります。非オプショナルに変更するか、取得箇所で ! 非 null アサーションを使うと完全に型安全になります。

Suggested change
interface WindowWithDragState extends Window {
triggerDragEnd?: (event: unknown) => void;
mockIsOverId?: string;
}
interface WindowWithDragState extends Window {
triggerDragEnd: ((event: unknown) => void) | undefined;
mockIsOverId: string | undefined;
}
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/components/__tests__/LayoutEditor.test.tsx
Line: 7-10

Comment:
`triggerDragEnd` がオプショナル(`?`)で宣言されているため、取得した変数の型は `((event: unknown) => void) | undefined` になります。`expect(...).toBeDefined()` はランタイムチェックであり TypeScript の型を絞り込まないため、`strictNullChecks` が有効な環境では `triggerDragEnd({...})` の呼び出しが型エラー(`TS2722`)になります。非オプショナルに変更するか、取得箇所で `!` 非 null アサーションを使うと完全に型安全になります。

```suggestion
interface WindowWithDragState extends Window {
  triggerDragEnd: ((event: unknown) => void) | undefined;
  mockIsOverId: string | undefined;
}
```

How can I resolve this? If you propose a fix, please make it concise.



// Mock dnd-kit components
Comment on lines +10 to 13
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 インターフェース定義の直後に空行が 2 行連続しています。1 行に統一するとスタイルが統一されます。

Suggested change
}
// Mock dnd-kit components
}
// Mock dnd-kit components
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/components/__tests__/LayoutEditor.test.tsx
Line: 10-13

Comment:
インターフェース定義の直後に空行が 2 行連続しています。1 行に統一するとスタイルが統一されます。

```suggestion
}

// Mock dnd-kit components
```

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

vi.mock("@dnd-kit/core", async (importOriginal) => {
const actual = await importOriginal<typeof import("@dnd-kit/core")>();
Expand All @@ -13,7 +19,7 @@ vi.mock("@dnd-kit/core", async (importOriginal) => {
<div data-testid="dnd-context" onClick={() => {
// Expose a way to trigger onDragEnd via a synthetic event or global for testing
// We'll attach it to window for easy triggering
(window as unknown as { triggerDragEnd: (event: unknown) => void }).triggerDragEnd = onDragEnd;
(window as unknown as WindowWithDragState).triggerDragEnd = onDragEnd;
}}>
{children}
</div>
Expand All @@ -22,8 +28,7 @@ vi.mock("@dnd-kit/core", async (importOriginal) => {
useSensor: vi.fn(() => ({})),
useDroppable: ({ id }: { id: string }) => ({
setNodeRef: vi.fn(),
// eslint-disable-next-line @typescript-eslint/no-explicit-any
isOver: (window as any).mockIsOverId === id,
isOver: (window as unknown as WindowWithDragState).mockIsOverId === id,
}),
PointerSensor: vi.fn(),
KeyboardSensor: vi.fn(),
Expand Down Expand Up @@ -64,10 +69,8 @@ describe("LayoutEditor", () => {
beforeEach(() => {
mockOnLayoutChange = vi.fn();
mockOnToggleVisibility = vi.fn();
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(window as any).triggerDragEnd = undefined;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(window as any).mockIsOverId = undefined;
(window as unknown as WindowWithDragState).triggerDragEnd = undefined;
(window as unknown as WindowWithDragState).mockIsOverId = undefined;
});

it("renders blocks in their respective columns", () => {
Expand Down Expand Up @@ -119,12 +122,11 @@ describe("LayoutEditor", () => {
const dndContext = screen.getByTestId("dnd-context");
fireEvent.click(dndContext);

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const triggerDragEnd = (window as any).triggerDragEnd;
const triggerDragEnd = (window as unknown as WindowWithDragState).triggerDragEnd;
expect(triggerDragEnd).toBeDefined();

// Drag 'avatar' to 'right' column
triggerDragEnd({
triggerDragEnd!({
active: { id: "avatar" },
over: { id: "right" },
});
Expand All @@ -149,11 +151,10 @@ describe("LayoutEditor", () => {
const dndContext = screen.getByTestId("dnd-context");
fireEvent.click(dndContext);

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const triggerDragEnd = (window as any).triggerDragEnd;
const triggerDragEnd = (window as unknown as WindowWithDragState).triggerDragEnd;

// Drag 'avatar' over 'topLanguages'
triggerDragEnd({
triggerDragEnd!({
active: { id: "avatar" },
over: { id: "topLanguages" },
});
Expand All @@ -178,9 +179,8 @@ describe("LayoutEditor", () => {
const dndContext = screen.getByTestId("dnd-context");
fireEvent.click(dndContext);

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const triggerDragEnd = (window as any).triggerDragEnd;
triggerDragEnd({
const triggerDragEnd = (window as unknown as WindowWithDragState).triggerDragEnd;
triggerDragEnd!({
active: { id: "avatar" },
over: null,
});
Expand All @@ -200,9 +200,8 @@ describe("LayoutEditor", () => {
const dndContext = screen.getByTestId("dnd-context");
fireEvent.click(dndContext);

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const triggerDragEnd = (window as any).triggerDragEnd;
triggerDragEnd({
const triggerDragEnd = (window as unknown as WindowWithDragState).triggerDragEnd;
triggerDragEnd!({
active: { id: "avatar" },
over: { id: "avatar" },
});
Expand All @@ -222,9 +221,8 @@ describe("LayoutEditor", () => {
const dndContext = screen.getByTestId("dnd-context");
fireEvent.click(dndContext);

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const triggerDragEnd = (window as any).triggerDragEnd;
triggerDragEnd({
const triggerDragEnd = (window as unknown as WindowWithDragState).triggerDragEnd;
triggerDragEnd!({
active: { id: "avatar" },
over: { id: "non-existent-block" },
});
Expand All @@ -250,11 +248,10 @@ describe("LayoutEditor", () => {
const dndContext = screen.getByTestId("dnd-context");
fireEvent.click(dndContext);

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const triggerDragEnd = (window as any).triggerDragEnd;
const triggerDragEnd = (window as unknown as WindowWithDragState).triggerDragEnd;

// Drag 'avatar' over 'stats' (downwards)
triggerDragEnd({
triggerDragEnd!({
active: { id: "avatar" },
over: { id: "stats" },
});
Expand All @@ -278,11 +275,10 @@ describe("LayoutEditor", () => {
const dndContext = screen.getByTestId("dnd-context");
fireEvent.click(dndContext);

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const triggerDragEnd = (window as any).triggerDragEnd;
const triggerDragEnd = (window as unknown as WindowWithDragState).triggerDragEnd;

// Drag 'avatar' to empty column 'right'
triggerDragEnd({
triggerDragEnd!({
active: { id: "avatar" },
over: { id: "right" },
});
Expand Down
Loading