Skip to content

test(e2e): Playwright スイートを CI で全 spec 実行できる状態に復帰させる (#1036) - #1045

Merged
otomatty merged 10 commits into
developfrom
claude/e2e-test-implementation-y28ll4
Jun 11, 2026
Merged

test(e2e): Playwright スイートを CI で全 spec 実行できる状態に復帰させる (#1036)#1045
otomatty merged 10 commits into
developfrom
claude/e2e-test-implementation-y28ll4

Conversation

@otomatty

@otomatty otomatty commented Jun 11, 2026

Copy link
Copy Markdown
Owner

Closes #1036
Closes #977

概要

E2E スイート(7 spec)を CI で全 spec 実行できる状態に復帰させる。棚卸しの結果、問題は flaky ではなくスイート全体のアーキテクチャ乖離だった(ローカル実行で 22 failed / 7 passed / 12 skipped):

変更内容

E2E モック基盤の新設(e2e/support/

  • mockBackend.ts: REST API の in-memory モック(page.route、snake_case ワイヤ形式、未知パスは 404 で fail-loud)
  • mockRealtime.ts: Hocuspocus WS モック(page.routeWebSocket + 最小 Yjs sync ハンドシェイク)。バックエンド無しでエディタ系ジャーニーを決定化

spec の書き直し / 修復

発見した製品バグの修正

  • packages/ui ResizableHandle の aria-orientation 解釈が逆で、デスクトップの Wiki Compose 画面が全ユーザーで操作不能だった(separator が全幅化しパネルが幅 0 に潰れる)。TDD(red→green)で修正、orientation 契約の component test を追加

CI / 規約

  • e2e-web job: 全 spec 実行 + admin spec(ポート 30001)実行に更新、レポートを web / admin 別々にアップロード
  • CONTRIBUTING.md: page.waitForTimeout 新規使用禁止を明記(各 spec ヘッダにも日英併記)

検証

  • 全スイート 3 回連続 green(21 passed / 6 fixme、各 ~59 秒、--workers=1 --retries=0 の CI より厳しい条件)。実行時間 22.5 分 → 約 1 分
  • admin spec 3 回 green
  • アサーション強度レビュー(Stryker 対象外のため代替)を実施し、偽 green 構造(resume ボディ未検証・ネガティブアサーション偏重など)high 2 件 / medium 6 件を修正済み
  • tsc --noEmit クリーン、eslint 0 errors

残課題(Issue 化候補・本 PR では未対応)

  1. 共有検索行のマッチ種別が "content" ハードコードで、タイトル一致でも常に「本文」バッジになる
  2. 確定済み wiki-link マークが後続の通常テキストに伸長する(リンク装飾の波及)
  3. UX: 検索のロード中表示が無く空文言が一瞬出る / compose の draft 生成進捗が resume 経路で見えない / [[ 直後の Enter が候補 0 件時に飲み込まれる

https://claude.ai/code/session_01K9WBLzsePd6oip4JYcVJEp

Summary by CodeRabbit

  • Tests

    • Significantly expanded E2E test coverage with realistic backend and realtime synchronization mocking for search, linked pages, wiki compose, and wiki link completion features
    • Added comprehensive accessibility validation tests for resizable panel components
  • Documentation

    • Enhanced E2E testing guidelines with recommended practices for timing and synchronization
  • Bug Fixes

    • Corrected ARIA orientation attributes in resizable panel separators to improve accessibility compliance

claude added 8 commits June 11, 2026 07:07
…orTimeout

issue #1036 Phase 3 の CI 取り込み。spec 側の書き直しは後続コミットで入る。

- e2e-web job で全 web spec と admin/e2e/errors-page.spec.ts を実行
- CONTRIBUTING に waitForTimeout 新規使用禁止を明記

https://claude.ai/code/session_01K9WBLzsePd6oip4JYcVJEp
issue #1036。バックエンド無し環境で決定化するため、REST を page.route、
Hocuspocus を page.routeWebSocket(Yjs sync ハンドシェイク)でモックする
共有基盤 e2e/support/ を追加。

- linked-pages: 7 断片テストをクリティカルジャーニー 2 本に統合
- wiki-link-ghost-completion: issue #930 の受け入れ条件 8 件を維持しつつ
  waitForTimeout を全廃(refs #977)
- soft assertion / skip も全廃

https://claude.ai/code/session_01K9WBLzsePd6oip4JYcVJEp
issue #1036。検索ダイアログ廃止後のヘッダー検索バー + ドロップダウンに
合わせて search.spec.ts を全面再設計(旧 skip 6 件は存在しない UI のテスト
のため削除)。web-clipper は /notes/me 解決に必要な API モックを追加し、
networkidle 依存を状態ベース待機へ置換。

https://claude.ai/code/session_01K9WBLzsePd6oip4JYcVJEp
issue #1036。compose 画面到達に必要な notes/pages 系モックを追加。
brief-card 表示までは到達するが、resume 後の継続とレイアウトの 2 点で
実装側の乖離候補があり現状 red(トリアージ中。修正は後続コミット)。

https://claude.ai/code/session_01K9WBLzsePd6oip4JYcVJEp
react-resizable-panels v4 は ARIA window-splitter 規約どおり separator 自身の
見た目の向きを aria-orientation に設定する(左右分割 → vertical)。旧クラスは
これを「上下分割」と逆に解釈して w-full を適用しており、デスクトップの
左右分割(Wiki Compose 画面)で separator が全幅化 → 両パネルが幅 0 に潰れて
操作不能になっていた。issue #1036 の E2E 再整備で発見。

- aria-[orientation=vertical] 系の variant を horizontal に反転
- grip アイコンの rotate-90 条件も追随
- ResizablePanelGroup の dead class(Group は aria-orientation を持たない)を削除
- orientation 契約を固定する component test を追加(TDD: red→green 確認済み)

https://claude.ai/code/session_01K9WBLzsePd6oip4JYcVJEp
issue #1036。spec-extractor でサーバ実装まで確認した結果、フェーズ遷移は
resume(PATCH) の JSON 応答(output.__interrupt__[0].value.kind)駆動で、
SSE は初回 run の 1 回のみが正しい契約だった(旧 spec の run 再発行前提が誤り)。

- SSE を data:<JSON> 形式・初回 1 回に修正、2 回目以降の run / 4 回目以降の
  resume には実サーバ同様 409 を返し契約違反の検知器とする
- GET compose-sessions/:id を追加(/compose/:sessionId への replace 後の再マウント対応)
- 既存アサーション(brief→research→outline→completed→back)は全て維持
- 3 回連続 green 確認(workers=1, retries=0)

https://claude.ai/code/session_01K9WBLzsePd6oip4JYcVJEp
アサーション強度レビューの指摘対応。w-px の検証が生 className への部分一致
だったため after:w-px 等でも通る穴があった。トークン完全一致に統一。

https://claude.ai/code/session_01K9WBLzsePd6oip4JYcVJEp
issue #1036 Phase 4(アサーション強度レビュー)の指摘対応。

- wiki-compose: resume PATCH の送信ボディ(answers/approvedSourceIds/sections)
  を検証し自己充足構造を解消(high)
- ghost-completion: インラインコード/コードブロック抑止テストに正のシグナル
  (code 要素への反映確認)を先行させ偽 green を排除(high)
- search: 件数 exact 一致・mark のカードスコープ・Escape 後の入力値保持
- web-clipper: レガシーリダイレクトの最終 URL 固定、不在チェック前の描画確認
- linked-pages: 閉じた [[...]] テストにマーク存在の正のシグナル追加
- mockBackend: body.id フォールバック削除、未 seed ページの public-links を 404 に

https://claude.ai/code/session_01K9WBLzsePd6oip4JYcVJEp
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f539a1fa-073a-4c1e-b5b4-ecff6c113bb3

📥 Commits

Reviewing files that changed from the base of the PR and between d3134d9 and b241df0.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (4)
  • e2e/support/mockBackend.ts
  • e2e/support/mockRealtime.ts
  • package.json
  • packages/ui/src/components/resizable.test.tsx
🚧 Files skipped from review as they are similar to previous changes (3)
  • e2e/support/mockRealtime.ts
  • packages/ui/src/components/resizable.test.tsx
  • e2e/support/mockBackend.ts

📝 Walkthrough

Walkthrough

Adds Playwright REST and WebSocket mocks, rewrites multiple E2E specs to use deterministic state/network-driven waits (no new waitForTimeout), updates CI to run full web+admin suites, documents the E2E policy in CONTRIBUTING, and adds ResizableHandle ARIA tests and minor component adjustments.

Changes

Backend-less E2E Testing Infrastructure & Policy

Layer / File(s) Summary
Mock backend and realtime helpers
e2e/support/mockBackend.ts, e2e/support/mockRealtime.ts
installMockBackend provides in-memory /api/* handlers with seed/control (seedPage, setPublicLinks, unhandled); mockRealtime registers a localhost:1234 WebSocket mock handling auth and sync messages via lib0/y-protocols and per-connection Y.Doc.
E2E policy and CI workflow updates
CONTRIBUTING.md, .github/workflows/ci.yml
CONTRIBUTING.md forbids new page.waitForTimeout() uses and instructs state-based waits (with Japanese translation). CI job docs updated and Playwright steps changed to run the full web suite (bunx playwright test) and the admin suite (bunx playwright test --config admin/playwright.config.ts) with separate artifact uploads.
Search and linked-pages spec rewrites
e2e/search.spec.ts, e2e/linked-pages.spec.ts
search.spec.ts rewritten to test header combobox + dropdown and /search?q= with mocked GET /api/search and note/page endpoints. linked-pages.spec.ts refocused into end-to-end journeys for page creation/title-save/wiki-link suggestion and public-links render/create/navigation, using mocked REST/WebSocket and request/URL-driven waits.
Web-clipper and wiki-link-ghost-completion spec updates
e2e/web-clipper.spec.ts, e2e/wiki-link-ghost-completion.spec.ts
web-clipper.spec.ts now mocks /api/*, removes networkidle/time waits for state/URL predicates, and uses role-based textbox selection. wiki-link-ghost-completion.spec.ts seeds fixed IDs via mocks, adds openSourcePage helper, and rewrites tests for deterministic waits and various suppression/regression cases.
Wiki-compose spec rewrite
e2e/wiki-compose.spec.ts
Enforces SSE-only for initial POST run and PATCH resume JSON for phase transitions; adds SSE encoding helpers, precomputed run/resume payloads, installPageViewMocks, and installComposeMocks that capture resumeBodies and enforce run/resume ordering.

ResizableHandle ARIA Orientation Testing

Layer / File(s) Summary
ResizableHandle ARIA orientation tests and implementation
packages/ui/src/components/resizable.test.tsx, packages/ui/src/components/resizable.tsx
Adds Vitest suite that stubs ResizeObserver, renders panels and separator, asserts aria-orientation semantics and effective Tailwind classes via effectiveClasses(). ResizablePanelGroup simplifies className application; ResizableHandle switches Tailwind orientation variant rules.

Sequence Diagram(s)

sequenceDiagram
  participant TestSpec
  participant PlaywrightBrowser
  participant MockBackend
  participant MockRealtime
  TestSpec->>MockBackend: installMockBackend(page)
  TestSpec->>MockRealtime: mockRealtime(page)
  PlaywrightBrowser->>MockBackend: GET/POST /api/* (note/page/public-links)
  MockBackend->>PlaywrightBrowser: wire-format JSON responses
  PlaywrightBrowser->>MockRealtime: WebSocket auth/sync messages
  MockRealtime->>PlaywrightBrowser: AUTH_AUTHENTICATED / sync responses
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • otomatty/zedi#833: Overlaps changes to e2e/web-clipper.spec.ts and clipUrl flow assertions.
  • otomatty/zedi#940: Related rewrite of e2e/wiki-link-ghost-completion.spec.ts for backend-less deterministic tests.
  • otomatty/zedi#992: Related work on Wiki Compose run/resume/SSE contract that aligns with e2e/wiki-compose.spec.ts changes.

Suggested labels

enhancement

"I hop through mocks and tiny waits replaced,
No flaky naps, the runs are braced.
REST and sockets hum in play,
Tests now romp and never sway.
Aria lines and panels right — hooray!" 🐇

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title correctly and specifically summarizes the primary change: restoring the full Playwright E2E test suite to run in CI, with the issue reference #1036 embedded.
Linked Issues check ✅ Passed All key objectives from #1036 and #977 are addressed: mockBackend/mockRealtime mocks added, all E2E specs rewritten to use state-based waits, waitForTimeout replacements completed, CI job updated to run all specs, and CONTRIBUTING.md policy added to ban future waitForTimeout usage.
Out of Scope Changes check ✅ Passed All changes align with PR scope: E2E mock infrastructure and spec rewrites for #1036/#977, product bug fix (ResizableHandle aria-orientation) detected during testing, dependency addition for mockRealtime support. No unrelated refactoring detected.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/e2e-test-implementation-y28ll4

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Code Review

This pull request updates the E2E testing suite to enforce a strict policy against page.waitForTimeout(), replacing fixed sleeps with state-based assertions to prevent flaky test runs. To facilitate backend-less testing, new in-memory mocks for the REST API (mockBackend.ts) and the Hocuspocus WebSocket server (mockRealtime.ts) have been introduced, and several E2E test specs have been rewritten to use them. Additionally, a layout bug in the ResizableHandle component was fixed by correcting the aria-orientation class mappings to align with react-resizable-panels v4, accompanied by a new unit test suite. No review comments were provided, so there is no feedback to address.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d3134d94c9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

orientation={direction}
className={cn("flex h-full w-full aria-[orientation=vertical]:flex-col", className)}
/>
<Group {...props} orientation={direction} className={cn("flex h-full w-full", className)} />

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Restore vertical panel stacking

When a caller uses direction="vertical" (for example WikiComposePage does this on mobile), the group now still renders only flex/row layout because this line removed the conditional flex-col class and does not replace it with any direction-based class. The handle may switch to a horizontal separator, but the two panels remain side-by-side instead of stacking top/bottom, so the mobile compose layout is broken; keep a vertical-direction class on the group (using the attribute v4 actually emits, or an explicit direction === "vertical" && "flex-col").

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

検証の結果、この指摘は当たらないと判断しました。react-resizable-panels v4 の Group は flex 方向をインライン style で直接設定します(dist 実装: flexDirection: orientation === "horizontal" ? "row" : "column")。そのため direction="vertical" の縦積みはライブラリ側で担保されており、削除した aria-[orientation=vertical]:flex-col はそもそも発火しない dead class でした(v4 の Group 要素は aria-orientation 属性を持ちません)。仮にクラスが効いてもインライン style が優先されます。

退行防止として、resizable.test.tsx に「horizontal → flex-direction: row / vertical → flex-direction: column(インライン style)」を固定するアサーションを追加しました(b241df0)。


Generated by Claude Code

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/ui/src/components/resizable.tsx (1)

11-13: 🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Add TSDoc documentation for exported components.

Both ResizablePanelGroup and ResizableHandle are exported components but have empty JSDoc comments. As per coding guidelines, exported functions, types, and interfaces must include TSDoc/JSDoc documentation in both Japanese and English.

📝 Proposed fix to add bilingual TSDoc
 /**
+ * リサイズ可能なパネルグループ(左右分割または上下分割)。
+ *
+ * Resizable panel group (horizontal or vertical split).
+ *
+ * `@param` direction - 分割方向: "horizontal"(左右)または "vertical"(上下) / Split direction: "horizontal" (left/right) or "vertical" (top/bottom)
+ * `@param` className - 追加の CSS クラス名 / Additional CSS class names
  */
 const ResizablePanelGroup = ({
 /**
+ * リサイズ可能なパネル間のセパレーター(ドラッグハンドル)。
+ *
+ * Resizable separator (drag handle) between panels.
+ *
+ * `@param` withHandle - ハンドルアイコンを表示するか / Whether to display the handle icon
+ * `@param` className - 追加の CSS クラス名 / Additional CSS class names
  */
 const ResizableHandle = ({ withHandle, className, ...props }: ResizableHandleProps) => (

Also applies to: 28-30

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/ui/src/components/resizable.tsx` around lines 11 - 13, Add proper
bilingual (Japanese and English) TSDoc comments for the exported components
ResizablePanelGroup and ResizableHandle: replace the empty JSDoc block with
TSDoc for each exported symbol that includes an English summary, a Japanese
summary, descriptions of props/parameters (with types/meanings), and a brief
usage example or note about behavior/side-effects; ensure the TSDoc tags
(`@param`, `@returns/`@remarks) are present and written in both languages to satisfy
the project's documentation guidelines.

Source: Coding guidelines

🧹 Nitpick comments (1)
e2e/web-clipper.spec.ts (1)

145-149: 💤 Low value

Consider string-based URL assertion for clarity.

The current RegExp construction from NOTE_ID is flagged by static analysis (CWE-1333), though it's safe here since NOTE_ID is a hardcoded constant. For simpler test code, consider using a string-based URL predicate:

-    await expect(page).toHaveURL(new RegExp(`/notes/${NOTE_ID}(\\?|$)`));
+    await expect(page).toHaveURL((url) => url.pathname === `/notes/${NOTE_ID}` || url.pathname.startsWith(`/notes/${NOTE_ID}?`));

or if only checking the pathname without query:

-    await expect(page).toHaveURL(new RegExp(`/notes/${NOTE_ID}(\\?|$)`));
+    await page.waitForURL((url) => url.pathname === `/notes/${NOTE_ID}`);
+    await expect(page).toHaveURL((url) => url.pathname === `/notes/${NOTE_ID}`);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@e2e/web-clipper.spec.ts` around lines 145 - 149, Replace the RegExp-based
assertion with a string- or pathname-based check to avoid dynamic regex
construction: in the test using NOTE_ID and page.toHaveURL, change the line
using await expect(page).toHaveURL(new RegExp(`/notes/${NOTE_ID}(\\?|$)`)); to a
string predicate such as await expect(page).toHaveURL(`/notes/${NOTE_ID}`); or,
if you only want to ignore query params, read the current URL via page.url(),
build a URL object and assert on url.pathname === `/notes/${NOTE_ID}`; update
the assertion in the test that references NOTE_ID and page.toHaveURL
accordingly.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@e2e/support/mockBackend.ts`:
- Around line 67-76: Convert the existing bilingual block comment above the
exported function installMockBackend into a proper JSDoc/TSDoc comment
immediately preceding the function declaration: start with /** and include a
short English description, the Japanese equivalent if desired, param tags for
page and options (with noteId?), and a `@returns` tag describing
Promise<MockBackend>; ensure the JSDoc is syntactically valid (use `@param` and
`@returns`) and remains directly above the export async function
installMockBackend(...) so documentation tools and linters recognize it.
- Around line 24-54: Convert the inline bilingual comments into proper
JSDoc/TSDoc blocks for all exported interfaces: add a JSDoc comment above the
MockPageRow, MockPublicLinks, and MockBackend interface declarations describing
their purpose, and add JSDoc comments for key properties/methods (e.g., id,
note_id, title, content_preview, thumbnail_url, source_url, is_deleted,
created_at, updated_at on MockPageRow; outgoing_links, backlinks, ghost_links on
MockPublicLinks; noteId, seedPage, setPublicLinks, unhandled on MockBackend)
using standard /** ... */ format so the exported types have proper documentation
and comply with the coding guidelines.

In `@e2e/support/mockRealtime.ts`:
- Around line 28-62: The exported function mockRealtime is missing proper
JSDoc/TSDoc; replace the bilingual inline comment with a JSDoc block above the
exported async function mockRealtime describing its behavior, add `@param` page -
Playwright Page (or appropriate Page type) and `@returns` Promise<void>, and
include a short sentence about the mock behavior (minimal Hocuspocus mock that
responds to AUTH and SYNC messages and triggers onSynced). Ensure the JSDoc is
immediately above the mockRealtime declaration and follows project TSDoc style.

---

Outside diff comments:
In `@packages/ui/src/components/resizable.tsx`:
- Around line 11-13: Add proper bilingual (Japanese and English) TSDoc comments
for the exported components ResizablePanelGroup and ResizableHandle: replace the
empty JSDoc block with TSDoc for each exported symbol that includes an English
summary, a Japanese summary, descriptions of props/parameters (with
types/meanings), and a brief usage example or note about behavior/side-effects;
ensure the TSDoc tags (`@param`, `@returns/`@remarks) are present and written in
both languages to satisfy the project's documentation guidelines.

---

Nitpick comments:
In `@e2e/web-clipper.spec.ts`:
- Around line 145-149: Replace the RegExp-based assertion with a string- or
pathname-based check to avoid dynamic regex construction: in the test using
NOTE_ID and page.toHaveURL, change the line using await
expect(page).toHaveURL(new RegExp(`/notes/${NOTE_ID}(\\?|$)`)); to a string
predicate such as await expect(page).toHaveURL(`/notes/${NOTE_ID}`); or, if you
only want to ignore query params, read the current URL via page.url(), build a
URL object and assert on url.pathname === `/notes/${NOTE_ID}`; update the
assertion in the test that references NOTE_ID and page.toHaveURL accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3a9a5c25-3113-4cc0-a03b-5db0a6cbfc62

📥 Commits

Reviewing files that changed from the base of the PR and between c9e5524 and d3134d9.

📒 Files selected for processing (11)
  • .github/workflows/ci.yml
  • CONTRIBUTING.md
  • e2e/linked-pages.spec.ts
  • e2e/search.spec.ts
  • e2e/support/mockBackend.ts
  • e2e/support/mockRealtime.ts
  • e2e/web-clipper.spec.ts
  • e2e/wiki-compose.spec.ts
  • e2e/wiki-link-ghost-completion.spec.ts
  • packages/ui/src/components/resizable.test.tsx
  • packages/ui/src/components/resizable.tsx

Comment thread e2e/support/mockBackend.ts
Comment thread e2e/support/mockBackend.ts
Comment thread e2e/support/mockRealtime.ts Outdated
@otomatty otomatty changed the title ci(e2e): run full Playwright suite + admin spec in e2e-web, ban waitForTimeout test(e2e): Playwright スイートを CI で全 spec 実行できる状態に復帰させる (#1036) Jun 11, 2026
- knip 失敗の修正: e2e/support/mockRealtime.ts が直接 import する lib0
  (yjs の推移的依存)を devDependencies に明示
- CodeRabbit 指摘: mockBackend / mockRealtime の公開 API に JSDoc を補強
- resizable.test: 縦積み(direction=vertical)がライブラリのインライン
  flex-direction で機能する契約を固定(レビュー指摘の検証として追加。
  削除した aria-[orientation=vertical]:flex-col は dead class であり
  縦積みは壊れていない)

https://claude.ai/code/session_01K9WBLzsePd6oip4JYcVJEp
@otomatty
otomatty merged commit eaea600 into develop Jun 11, 2026
21 checks passed
@otomatty
otomatty deleted the claude/e2e-test-implementation-y28ll4 branch June 11, 2026 08:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants