Skip to content

Frontend Refactor PR Report#261

Merged
yusuke0610 merged 3 commits into
mainfrom
stg
May 17, 2026
Merged

Frontend Refactor PR Report#261
yusuke0610 merged 3 commits into
mainfrom
stg

Conversation

@yusuke0610

@yusuke0610 yusuke0610 commented May 17, 2026

Copy link
Copy Markdown
Owner

Summary

useProjectModalForm.initProject の 14 フィールド独立再定義を structuredClone(blankCareerProject) に置換して SSoT 違反を解消。5 つのテストファイル (useDocumentForm / useTaskPolling / useAsyncAnalysisPage / useCareerAnalysisPage / GitHubAnalysisPage) に setup factory を導入して arrange コピペを集約。payloadBuilders.test.ts を 27 行 → 280 行に拡充し境界値テスト 26 件追加。useBlogAccountManager の race condition guard を reduceActions 純粋関数として切り出し 6 件の単体テストで lock-down。hooks/blog/ hooks/career/ のサブフォルダ化と CareerResumeForm.tsx (298 行) の sections/ への JSX 分割 (Basic / Qualifications / SelfPr) で 198 行に縮小。lint / test (119 passed) / build すべて pass。

Applied Changes

High

  • frontend/src/hooks/career/useProjectModalForm.ts:18-23: initProject(null) の 14 フィールド独立定義を削除し、structuredClone(blankCareerProject) に置換 (FE_report High force commit #1)。constants.ts:blankCareerProject が唯一の SSoT となり、フィールド追加・改名は自動追従する。jscpd 16L クローン解消。

Medium

  • frontend/src/payloadBuilders.test.ts: 27 行 → 280 行に拡充、26 テスト追加 (FE_report Medium force commit #1)。
  • frontend/src/components/forms/CareerResumeForm.tsx: 298 行 → 198 行に縮小 (FE_report Medium ログイン #2)。3 つのセクションを切り出し:
    • sections/CareerBasicInfoSection.tsx (53 行)
    • sections/CareerQualificationsSection.tsx (102 行、資格 CRUD ハンドラ含む)
    • sections/CareerSelfPrSection.tsx (35 行)
  • frontend/src/components/forms/ProjectModal.tsx (274 行): 確認の結果、残り 274 行はほぼすべて JSX フォームフィールドで、state とハンドラは既に useProjectModalForm に分離済み。現状維持と判断 (FE_report Medium Dev #3)。

Low

  • Low force commit #1 (useBlogAccountManager.ts 254 行 / 意図的設計) と Low ログイン #2 (useCareerExperienceMutators.ts 207 行 / ドメイン的に違う操作) は 現状維持 (FE_report Low)。reduceActions のみ純粋関数として切り出してテスト可能にした (下記 Test Added)。

Test Changes

Removed (= setup factory への置き換えによる重複解消、テスト本体は維持)

  • frontend/src/hooks/useDocumentForm.test.ts: 5 重複ペア (18L+26L+13L+15L+14L) の renderHook + props 標準セットを setup(overrides, storeOverrides) ファクトリ関数に集約。UseDocumentFormOptions 型を export して再利用。
  • frontend/src/hooks/useTaskPolling.test.ts: 3 重複ペア (17L+15L+20L) を setup(checkStatus, overrides) に集約。
  • frontend/src/hooks/analysis/useAsyncAnalysisPage.test.ts: 4 重複ペアを setup(overrides) に集約。UseAsyncAnalysisPageOptions<TResult> を export。
  • frontend/src/hooks/career/useCareerAnalysisPage.test.ts: 2 重複ペアを setup(initialAnalyses, mockOverrides) に集約。
  • frontend/src/components/analysis/GitHubAnalysisPage.test.tsx: 2 重複ペア (msw server.use 空キャッシュ) を mockEmptyCache() ヘルパに集約。

Added

  • frontend/src/payloadBuilders.test.ts: 5 → 26 テスト:
    • validateDateRange の境界 (start>end / start=end / is_current / 空文字)
    • hasAnyText の境界 (null/undefined/空白のみ/混在)
    • buildCareerPayload の必須項目バリデーション (氏名/職務要約/自己PR)
    • buildCareerPayload (experiences)is_current=true 時 end_date null 化、空欄 filter 除外、start>end エラー
    • buildCareerPayload (projects/clients/team)is_current=true 時 end_date="" 化、has_client=false 時 name="" 化、team.members 空/有効要素のフィルタ、technology_stacks 空 name 除外
    • buildCareerPayload (qualifications) の片方欠落エラー / 空欄除外 / trim
  • frontend/src/hooks/blog/useBlogAccountManager.test.ts: reduceActions6 件単体テスト追加 (FE_report Add Stg #4 = setAction の expectedAction ガード)。テストしやすくするため setAction 内部の純粋ロジックを reduceActions(prev, platform, action, expectedAction?) として export 化し、useState 用 reducer として直接検証可能にした。
  • 未追加 (Skipped): FE_report Add ログイン #2 (guards 認証分岐の E2E) は既存の Playwright E2E でカバー想定。Add Dev #3 (api/client.ts 並行リフレッシュ flow) は既存 client.test.ts 184 行で auth/refresh の競合制御を網羅済み。Follow-ups に記載。

Duplication Resolved

  • constants.ts:66-81useProjectModalForm.ts:22-36 の 14 フィールド独立定義 (jscpd 16L): blankCareerProjectstructuredClone 参照に置換し SSoT 化。
  • 5 テストファイル × 計 16 ペアの arrange コピペ: 各ファイル内に setup(overrides) ファクトリを導入して 1 箇所に集約。
  • useBlogAccountManager.setAction の race-condition guard ロジック: useState の closure 内から reduceActions 純粋関数として切り出し、単体テスト可能にした。

残した偶発的重複 (Allowed Duplication)

  • useCareerExperienceMutators.ts 内の setForm((prev) => ({ ...prev, experiences: prev.experiences.map(...) })) パターン (jscpd 9L+8L+11L): ドメイン的に違う操作のため可読性優先で維持 (FE_report Low ログイン #2 と同判断)。
  • e2e/auth.spec.ts の 10L クローン: E2E は明示的シナリオ手順を優先する方針 (FE_report Allowed)。

Structure Changes

frontend/src/
  hooks/
    blog/                           # 新規: 関連フックの責務スコープ明示
      useBlogAccountManager.ts
      useBlogAccountManager.test.ts
      useBlogSummaryPolling.ts
    career/                         # 新規: 同上
      useCareerAnalysisPage.ts
      useCareerAnalysisPage.test.ts
      useCareerExperienceMutators.ts
      usePhotoUpload.ts
      usePhotoUpload.test.ts
      useProjectModalForm.ts
      useProjectModalForm.test.ts
      useProjectModalState.ts
      useProjectModalState.test.ts
    useDocumentForm.ts              # 共通
    useTaskPolling.ts               # 共通
    useMasterData.ts                # 共通
    useNotifications.ts             # 共通
    useAuthSession.ts               # 共通
    useTheme.ts                     # 共通
    usePdfActions.ts                # 共通
    analysis/                       # 既存
  components/
    forms/
      CareerResumeForm.tsx           # 298 行 → 198 行
      sections/                      # 既存ディレクトリへ追加
        CareerBasicInfoSection.tsx   # 新規 (53 行)
        CareerExperienceSection.tsx  # 既存
        CareerQualificationsSection.tsx  # 新規 (102 行、資格 CRUD ハンドラ含む)
        CareerSelfPrSection.tsx      # 新規 (35 行)
      ProjectModal.tsx               # 現状維持 (274 行、JSX 主体)

外部 import パスの追従先:

  • components/blog/BlogPage.tsx, BlogPlatformList.tsxhooks/blog/useBlogAccountManager
  • components/forms/ProjectModal.tsxhooks/career/useProjectModalForm
  • components/forms/sections/CareerExperienceSection.tsxhooks/career/useCareerExperienceMutators, hooks/career/useProjectModalState
  • components/career-analysis/CareerAnalysisPage.tsxhooks/career/useCareerAnalysisPage
  • 各 hook の test 内 import (../api../../api, ../types../../types) も追従

Skipped

  • FE_report Medium Dev #3 (ProjectModal.tsx の責務確認): 274 行のうちほぼ全てが JSX のフォームフィールド列挙であり、state/handler は既に useProjectModalForm に切り出し済みのため現状維持
  • FE_report Low force commit #1 (useBlogAccountManager 内部ヘルパ切り出し): per-platform lifecycle 集約という意図的設計のため現状維持reduceActions のみ純粋関数化してテスト可能にした。
  • FE_report Low ログイン #2 (useCareerExperienceMutators の高階関数化): ドメイン的に違う操作を同じ抽象で扱うと読み手が混乱するため現状維持
  • FE_report Add ログイン #2 (guards 認証分岐の追加テスト): 既存 Playwright E2E が認証フローを担保しているため今 PR ではスキップ。Follow-ups。
  • FE_report Add Dev #3 (client.ts の並行 401 リフレッシュ結合テスト): 既存 client.test.ts 184 行で auth/refresh 競合をすでに検証済み。並行ケースを更に厳格にしたい場合は別 PR。

Validation

  • make lint-frontend: pass (eslint クリーン)
  • make test-frontend: pass17 files / 119 tests passed
  • make build-frontend: pass — vite v6.4.2 build success (663 kB / gzip 207 kB)
  • E2E (npm run test:e2e): 未実行。本 PR は API パス変更なし・新規ルート/レイアウト変更なし・サイドバー変更なし。JSX の責務分割のみで UI フローへの影響なし。.claude/rules/frontend/test.md の E2E トリガー条件に該当しないため省略。

Follow-ups

  • FE_report Add ログイン #2 (guards 認証分岐): E2E もしくは unit で useNavigate を mock した分岐テスト追加。
  • FE_report Add Dev #3 (client.ts 並行リフレッシュ): 複数 401 同時発火時にリフレッシュが 1 回に集約されるか検証。
  • CareerExperienceSection の JSX セクション分割: 経歴セクション自体も大きい場合は将来切り出し候補。
  • hooks/ のフラット数: 残り 7 個 (useAuthSession / useDocumentForm / useMasterData / useNotifications / usePdfActions / useTaskPolling / useTheme)。15+ になれば hooks/common/ も検討。
  • (本 PR 由来) UseDocumentFormOptions / UseAsyncAnalysisPageOptions を export 化したが、製品コードからの利用は無いため pure type 公開。テストドキュメント上の役割を明示するなら JSDoc 追加を検討。

Summary by CodeRabbit

  • Refactor

    • Reorganized component and hook structure for better modularity, moving career and blog utilities to dedicated subdirectories.
    • Extracted career form sections into separate reusable components for maintainability.
  • Tests

    • Improved test robustness for authentication and OAuth flow validation.
    • Enhanced constraint violation recovery testing with realistic scenarios.
    • Expanded payload builder test coverage with comprehensive validation suites.
    • Refactored test setup patterns for better maintainability across multiple test files.

Review Change Stack

@yusuke0610 yusuke0610 changed the title Stg Frontend Refactor PR Report May 17, 2026
@coderabbitai

coderabbitai Bot commented May 17, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

The PR reorganizes frontend hooks into semantic subdirectories (blog/, career/), exports hook API types and pure helpers, refactors a monolithic form component into section-based composition, consolidates test setup patterns across multiple hooks, expands payload-builder test coverage, and improves backend auth and worker test robustness.

Changes

Frontend Module Reorganization and Test Refactoring

Layer / File(s) Summary
Hook module API extraction and exports
frontend/src/hooks/blog/useBlogAccountManager.ts, frontend/src/hooks/analysis/useAsyncAnalysisPage.ts, frontend/src/hooks/useDocumentForm.ts
useBlogAccountManager exports PlatformAction, PlatformActionMap, and new pure reduceActions(prev, platform, action, expectedAction?) helper; analysis and document form hooks export their options types (UseAsyncAnalysisPageOptions, UseDocumentFormOptions) for external typing.
Hook module paths reorganized into subdirectories
frontend/src/components/blog/BlogPage.tsx, frontend/src/components/blog/BlogPlatformList.tsx, frontend/src/components/career-analysis/CareerAnalysisPage.tsx, frontend/src/components/forms/ProjectModal.tsx, frontend/src/components/forms/sections/CareerExperienceSection.tsx, frontend/src/hooks/blog/useBlogSummaryPolling.ts, frontend/src/hooks/career/useCareerAnalysisPage.ts, frontend/src/hooks/career/useCareerExperienceMutators.ts, frontend/src/hooks/career/useProjectModalForm.test.ts, frontend/src/hooks/career/useProjectModalForm.ts, frontend/src/hooks/career/useProjectModalState.test.ts, frontend/src/hooks/career/useProjectModalState.ts
Hooks are moved from flat hooks/ paths to semantic subdirectories: hooks/blog/useBlogAccountManager, hooks/career/useCareerAnalysisPage, hooks/career/useProjectModalForm, and related modules; component and test imports are updated accordingly; mock paths in tests adjusted to reference new locations.
Blog account manager pure function extraction and testing
frontend/src/hooks/blog/useBlogAccountManager.ts, frontend/src/hooks/blog/useBlogAccountManager.test.ts
setAction callback logic is extracted into a pure reduceActions(prev, platform, action, expectedAction?) function that handles action setting, null-clearing, and race-condition guards; the hook callback is simplified to delegate to this reducer; comprehensive unit tests verify action overwriting, conditional deletion, and preservation of later actions.
Career resume form refactored into section components
frontend/src/components/forms/CareerResumeForm.tsx, frontend/src/components/forms/sections/CareerBasicInfoSection.tsx, frontend/src/components/forms/sections/CareerQualificationsSection.tsx, frontend/src/components/forms/sections/CareerSelfPrSection.tsx
CareerResumeForm is decomposed: basic info (full name, career summary), qualifications (list with add/remove/update handlers), and self PR sections are extracted into dedicated components that accept form state, loading flags, and change handlers; inline handlers and rendering logic are moved into section components; main form now composes these via props.
Test setup helpers consolidate repeated renderHook patterns
frontend/src/components/analysis/GitHubAnalysisPage.test.tsx, frontend/src/hooks/analysis/useAsyncAnalysisPage.test.ts, frontend/src/hooks/career/useCareerAnalysisPage.test.ts, frontend/src/hooks/useDocumentForm.test.ts, frontend/src/hooks/useTaskPolling.test.ts
Multiple test files introduce shared setup() factory helpers to centralize hook rendering, callback mocking, and state initialization; GitHubAnalysisPage.test.tsx adds a mockEmptyCache() MSW helper; tests now call setup() with per-test overrides rather than repeating inline renderHook/mock configuration, reducing duplication and enabling parameterized variations.
Payload builder test coverage expanded
frontend/src/payloadBuilders.test.ts
New comprehensive test suites for hasAnyText utility and buildCareerPayload covering basic validation, experiences normalization (is_current/end_date), projects/clients/team rules, and qualifications filtering; reusable fixture helpers (blankProject, blankExperience, baseState) support parameterized test cases.

Backend Test Robustness Improvements

Layer / File(s) Summary
Auth tests improved for formatter independence and scheme qualification
backend/tests/auth/test_endpoints.py, backend/tests/auth/test_oauth_flow.py
_auth_failed_records switches from formatter-dependent LogRecord.message to LogRecord.getMessage() for robust log filtering; test_github_login_url_uses_callback_base_url_when_set is updated to expect and assert scheme-qualified https:// callback URLs.
Safe rollback test rewritten for constraint-violation recovery
backend/tests/test_worker/test_execute_task.py
TestSafeRollback test is rewritten to trigger an actual unique-constraint violation on BlogSummaryCache.user_id by inserting duplicate rows and observing the IntegrityError, then verifying _safe_rollback recovers the session and subsequent commits/refreshes succeed; replaces the previous simulated dirty-state approach with real constraint-violation testing.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • yusuke0610/devforge#245: Frontend changes to BlogPage.tsx/BlogPlatformList.tsx that switch imports to the new hooks/blog/useBlogAccountManager location and depend on the PlatformKey export added in this PR.

Poem

🐰 Hooks hop to new homes, organized with care,
Components split sweetly, sections everywhere,
Tests setup helpers, coverage so fair,
One big refactor, but the logic stays there! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Frontend Refactor PR Report' is vague and does not clearly summarize the main change. It uses a generic term ('Refactor') without specifying what is being refactored or what the primary objective is. Provide a more descriptive title that highlights the primary change, such as 'Extract career form sections and consolidate hook patterns' or 'Reorganize frontend hooks and refactor resume form component'.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed Docstring coverage is 89.47% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ 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 stg

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

@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.

🧹 Nitpick comments (2)
frontend/src/components/forms/sections/CareerQualificationsSection.tsx (1)

17-17: ⚡ Quick win

Import React setter types explicitly to avoid namespace-dependent typing.

Using React.Dispatch here can be fragile depending on TS config. Prefer explicit type imports for stable module typing.

Suggested patch
+import type { Dispatch, SetStateAction } from "react";
 import { blankResumeQualification } from "../../../constants";
 import type { CareerFormState } from "../../../payloadBuilders";
 import type { ResumeQualification } from "../../../types";
 import shared from "../../../styles/shared.module.css";
 import { Skeleton } from "../../ui/Skeleton";
 import { Combobox } from "../Combobox";
@@
-  setForm: React.Dispatch<React.SetStateAction<CareerFormState>>;
+  setForm: Dispatch<SetStateAction<CareerFormState>>;
 };
🤖 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 `@frontend/src/components/forms/sections/CareerQualificationsSection.tsx` at
line 17, The prop type for setForm should use explicit React types instead of
the namespace form; import the types with "import type { Dispatch,
SetStateAction } from 'react';" and change the prop signature from "setForm:
React.Dispatch<React.SetStateAction<CareerFormState>>;" to "setForm:
Dispatch<SetStateAction<CareerFormState>>;" so the component (e.g.,
CareerQualificationsSection and its props interface) uses the stable, explicitly
imported types.
frontend/src/hooks/useDocumentForm.test.ts (1)

52-65: ⚡ Quick win

Consider making the cache key configurable.

The setup helper hardcodes the cache key as "career" on line 60, but the actual cacheKey is passed via overrides to the hook. This creates an implicit coupling that isn't enforced by types. If a test passes a different cacheKey in overrides, the preset cache won't match, leading to confusing failures.

♻️ Suggested fix to derive cache key from overrides
  function setup(
    overrides: Partial<UseDocumentFormOptions<TestForm, TestPayload, TestResponse>> = {},
-   storeOverrides: { presetCache?: { form: TestForm; documentId: string | null } } = {},
+   storeOverrides: { 
+     cacheKey?: string;
+     presetCache?: { form: TestForm; documentId: string | null };
+   } = {},
  ) {
    const store = createTestStore();
    if (storeOverrides.presetCache) {
+     const cacheKey = storeOverrides.cacheKey ?? overrides.cacheKey ?? "career";
      store.dispatch(
        setCache({
-         key: "career",
+         key: cacheKey,
          form: storeOverrides.presetCache.form,
          documentId: storeOverrides.presetCache.documentId,
        }),
      );
    }

Then update the test call:

    const { result } = setup(
      { cacheKey: "career" },
-     { presetCache: { form: { title: "cached title" }, documentId: "doc-cached" } },
+     { cacheKey: "career", presetCache: { form: { title: "cached title" }, documentId: "doc-cached" } },
    );
🤖 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 `@frontend/src/hooks/useDocumentForm.test.ts` around lines 52 - 65, The setup
helper hardcodes the cache key "career" which can mismatch the cacheKey passed
in overrides to UseDocumentFormOptions; update setup to derive the cache key
from the overrides (e.g., read overrides.cacheKey or a default) before calling
store.dispatch(setCache(...)) so the presetCache uses the same key the hook will
use; locate the setup function and change the hardcoded "career" to use the
override value (falling back to "career" if not provided) to ensure tests that
pass a different cacheKey in overrides work correctly.
🤖 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.

Nitpick comments:
In `@frontend/src/components/forms/sections/CareerQualificationsSection.tsx`:
- Line 17: The prop type for setForm should use explicit React types instead of
the namespace form; import the types with "import type { Dispatch,
SetStateAction } from 'react';" and change the prop signature from "setForm:
React.Dispatch<React.SetStateAction<CareerFormState>>;" to "setForm:
Dispatch<SetStateAction<CareerFormState>>;" so the component (e.g.,
CareerQualificationsSection and its props interface) uses the stable, explicitly
imported types.

In `@frontend/src/hooks/useDocumentForm.test.ts`:
- Around line 52-65: The setup helper hardcodes the cache key "career" which can
mismatch the cacheKey passed in overrides to UseDocumentFormOptions; update
setup to derive the cache key from the overrides (e.g., read overrides.cacheKey
or a default) before calling store.dispatch(setCache(...)) so the presetCache
uses the same key the hook will use; locate the setup function and change the
hardcoded "career" to use the override value (falling back to "career" if not
provided) to ensure tests that pass a different cacheKey in overrides work
correctly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c870e7f7-9d93-4b02-92ae-e8e2d3cde2a8

📥 Commits

Reviewing files that changed from the base of the PR and between c9a2c0b and 54be5e8.

📒 Files selected for processing (31)
  • backend/tests/auth/test_endpoints.py
  • backend/tests/auth/test_oauth_flow.py
  • backend/tests/test_worker/test_execute_task.py
  • frontend/src/components/analysis/GitHubAnalysisPage.test.tsx
  • frontend/src/components/blog/BlogPage.tsx
  • frontend/src/components/blog/BlogPlatformList.tsx
  • frontend/src/components/career-analysis/CareerAnalysisPage.tsx
  • frontend/src/components/forms/CareerResumeForm.tsx
  • frontend/src/components/forms/ProjectModal.tsx
  • frontend/src/components/forms/sections/CareerBasicInfoSection.tsx
  • frontend/src/components/forms/sections/CareerExperienceSection.tsx
  • frontend/src/components/forms/sections/CareerQualificationsSection.tsx
  • frontend/src/components/forms/sections/CareerSelfPrSection.tsx
  • frontend/src/hooks/analysis/useAsyncAnalysisPage.test.ts
  • frontend/src/hooks/analysis/useAsyncAnalysisPage.ts
  • frontend/src/hooks/blog/useBlogAccountManager.test.ts
  • frontend/src/hooks/blog/useBlogAccountManager.ts
  • frontend/src/hooks/blog/useBlogSummaryPolling.ts
  • frontend/src/hooks/career/useCareerAnalysisPage.test.ts
  • frontend/src/hooks/career/useCareerAnalysisPage.ts
  • frontend/src/hooks/career/useCareerExperienceMutators.ts
  • frontend/src/hooks/career/usePhotoUpload.test.ts
  • frontend/src/hooks/career/usePhotoUpload.ts
  • frontend/src/hooks/career/useProjectModalForm.test.ts
  • frontend/src/hooks/career/useProjectModalForm.ts
  • frontend/src/hooks/career/useProjectModalState.test.ts
  • frontend/src/hooks/career/useProjectModalState.ts
  • frontend/src/hooks/useDocumentForm.test.ts
  • frontend/src/hooks/useDocumentForm.ts
  • frontend/src/hooks/useTaskPolling.test.ts
  • frontend/src/payloadBuilders.test.ts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant