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
55 changes: 25 additions & 30 deletions src/components/__tests__/LayoutEditor.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,23 @@ import { render, screen, fireEvent } from "@testing-library/react";
import { describe, it, expect, vi, beforeEach } from "vitest";
import LayoutEditor from "../LayoutEditor";
import { CardLayout } from "@/lib/types";
import "@testing-library/jest-dom";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The import of @testing-library/jest-dom was removed, but the tests still use custom matchers like toBeInTheDocument() (e.g., line 85). According to the repository's general rules, this import is the standard way to extend expect with these matchers in this project.

Suggested change
import "@testing-library/jest-dom";
References
  1. In this repository, importing @testing-library/jest-dom in a Vitest test file is sufficient to extend expect with its matchers; expect.extend is not required.


type WindowWithMock = Window & typeof globalThis & {
triggerDragEnd?: (event: { active: { id: string }, over: { id: string } | null }) => void;
mockIsOverId?: string;
};

// Mock dnd-kit components
vi.mock("@dnd-kit/core", async (importOriginal) => {
const actual = await importOriginal<typeof import("@dnd-kit/core")>();
return {
...actual,
DndContext: ({ children, onDragEnd }: { children: React.ReactNode; onDragEnd: (event: unknown) => void }) => (
DndContext: ({ children, onDragEnd }: { children: React.ReactNode; onDragEnd: (event: { active: { id: string }, over: { id: string } | null }) => void }) => (
<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 WindowWithMock).triggerDragEnd = onDragEnd;
}}>
{children}
</div>
Expand All @@ -22,8 +27,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 WindowWithMock).mockIsOverId === id,
}),
PointerSensor: vi.fn(),
KeyboardSensor: vi.fn(),
Expand Down Expand Up @@ -64,10 +68,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 WindowWithMock).triggerDragEnd = undefined;
(window as WindowWithMock).mockIsOverId = undefined;
});

it("renders blocks in their respective columns", () => {
Expand Down Expand Up @@ -119,12 +121,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 WindowWithMock).triggerDragEnd;
expect(triggerDragEnd).toBeDefined();

// Drag 'avatar' to 'right' column
triggerDragEnd({
triggerDragEnd?.({
Comment on lines +124 to +128
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 expect(triggerDragEnd).toBeDefined() でその場で定義済みであることを確認済みにもかかわらず、直後で ?. のオプショナルチェーンを使っています。定義済みが保証された変数に対して不要な ?. を使うと、将来的に expect ガードが削除された場合でも ?. が残り、呼び出しがサイレントにスキップされるリスクがあります。

Suggested change
const triggerDragEnd = (window as WindowWithMock).triggerDragEnd;
expect(triggerDragEnd).toBeDefined();
// Drag 'avatar' to 'right' column
triggerDragEnd({
triggerDragEnd?.({
const triggerDragEnd = (window as WindowWithMock).triggerDragEnd;
expect(triggerDragEnd).toBeDefined();
// Drag 'avatar' to 'right' column
triggerDragEnd!({
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/components/__tests__/LayoutEditor.test.tsx
Line: 124-128

Comment:
`expect(triggerDragEnd).toBeDefined()` でその場で定義済みであることを確認済みにもかかわらず、直後で `?.` のオプショナルチェーンを使っています。定義済みが保証された変数に対して不要な `?.` を使うと、将来的に `expect` ガードが削除された場合でも `?.` が残り、呼び出しがサイレントにスキップされるリスクがあります。

```suggestion
    const triggerDragEnd = (window as WindowWithMock).triggerDragEnd;
    expect(triggerDragEnd).toBeDefined();

    // Drag 'avatar' to 'right' column
    triggerDragEnd!({
```

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

active: { id: "avatar" },
over: { id: "right" },
});
Expand All @@ -149,11 +150,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 WindowWithMock).triggerDragEnd;

// Drag 'avatar' over 'topLanguages'
triggerDragEnd({
triggerDragEnd?.({
active: { id: "avatar" },
over: { id: "topLanguages" },
});
Expand All @@ -178,9 +178,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 WindowWithMock).triggerDragEnd;
triggerDragEnd?.({
active: { id: "avatar" },
over: null,
});
Expand All @@ -200,9 +199,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 WindowWithMock).triggerDragEnd;
triggerDragEnd?.({
active: { id: "avatar" },
over: { id: "avatar" },
});
Expand All @@ -222,9 +220,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 WindowWithMock).triggerDragEnd;
triggerDragEnd?.({
active: { id: "avatar" },
over: { id: "non-existent-block" },
});
Expand All @@ -250,11 +247,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 WindowWithMock).triggerDragEnd;

// Drag 'avatar' over 'stats' (downwards)
triggerDragEnd({
triggerDragEnd?.({
active: { id: "avatar" },
over: { id: "stats" },
});
Expand All @@ -278,11 +274,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 WindowWithMock).triggerDragEnd;

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