FN-5727: speed up PrCreateModal test setup waits

Reduce repeated async waits in PrCreateModal tests by centralizing initial-load synchronization.

- add a renderModalLoaded helper that waits for the AI title field once per test setup
- replace repeated findByDisplayValue calls with the shared helper in slow-path tests
- switch one post-load lookup from async findBy* to sync getBy* where loading is already guaranteed

Files changed:
 .../components/__tests__/PrCreateModal.test.tsx    | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-5727

Fusion-Task-Lineage: bf064b14-d625-4396-91e7-02d9eb48b9eb
This commit is contained in:
gsxdsm
2026-05-30 13:54:21 -07:00
parent 158f74962d
commit 90a23e9fc1

View File

@@ -54,6 +54,12 @@ function renderModal(overrides?: Partial<ComponentProps<typeof PrCreateModal>>)
return { onClose, onCreated, addToast }; return { onClose, onCreated, addToast };
} }
async function renderModalLoaded(overrides?: Partial<ComponentProps<typeof PrCreateModal>>) {
const handles = renderModal(overrides);
await screen.findByDisplayValue("AI title");
return handles;
}
describe("PrCreateModal", () => { describe("PrCreateModal", () => {
let styleEl: HTMLStyleElement; let styleEl: HTMLStyleElement;
@@ -110,8 +116,8 @@ describe("PrCreateModal", () => {
it("regenerates and reverts AI content", async () => { it("regenerates and reverts AI content", async () => {
mocks.generatePrMetadata.mockResolvedValueOnce(metadata).mockResolvedValueOnce({ title: "New title", body: "New body", templateUsed: false }); mocks.generatePrMetadata.mockResolvedValueOnce(metadata).mockResolvedValueOnce({ title: "New title", body: "New body", templateUsed: false });
renderModal(); await renderModalLoaded();
const titleInput = await screen.findByDisplayValue("AI title"); const titleInput = screen.getByDisplayValue("AI title");
fireEvent.change(titleInput, { target: { value: "custom" } }); fireEvent.change(titleInput, { target: { value: "custom" } });
expect(screen.getByRole("button", { name: /revert to ai version/i })).toBeInTheDocument(); expect(screen.getByRole("button", { name: /revert to ai version/i })).toBeInTheDocument();
fireEvent.click(screen.getAllByRole("button", { name: /^regenerate$/i })[0]); fireEvent.click(screen.getAllByRole("button", { name: /^regenerate$/i })[0]);
@@ -131,8 +137,7 @@ describe("PrCreateModal", () => {
}); });
it("adds and removes chips and submits payload", async () => { it("adds and removes chips and submits payload", async () => {
const { onCreated, addToast, onClose } = renderModal(); const { onCreated, addToast, onClose } = await renderModalLoaded();
await screen.findByDisplayValue("AI title");
fireEvent.change(screen.getByLabelText(/base branch/i), { target: { value: "develop" } }); fireEvent.change(screen.getByLabelText(/base branch/i), { target: { value: "develop" } });
fireEvent.click(screen.getByLabelText(/create as draft/i)); fireEvent.click(screen.getByLabelText(/create as draft/i));
@@ -166,8 +171,7 @@ describe("PrCreateModal", () => {
it("shows submit error and retries with same payload", async () => { it("shows submit error and retries with same payload", async () => {
mocks.createPr.mockRejectedValueOnce(new Error("bad")).mockResolvedValueOnce({ number: 22, title: "ok", url: "u", status: "open", headBranch: "h", baseBranch: "main", commentCount: 0 } as PrInfo); mocks.createPr.mockRejectedValueOnce(new Error("bad")).mockResolvedValueOnce({ number: 22, title: "ok", url: "u", status: "open", headBranch: "h", baseBranch: "main", commentCount: 0 } as PrInfo);
renderModal(); await renderModalLoaded();
await screen.findByDisplayValue("AI title");
fireEvent.click(screen.getByRole("button", { name: "Create PR" })); fireEvent.click(screen.getByRole("button", { name: "Create PR" }));
expect(await screen.findByText("bad")).toBeInTheDocument(); expect(await screen.findByText("bad")).toBeInTheDocument();
@@ -189,15 +193,13 @@ describe("PrCreateModal", () => {
}, },
}); });
mocks.createPr.mockRejectedValueOnce(err); mocks.createPr.mockRejectedValueOnce(err);
renderModal(); await renderModalLoaded();
await screen.findByDisplayValue("AI title");
fireEvent.click(screen.getByRole("button", { name: "Create PR" })); fireEvent.click(screen.getByRole("button", { name: "Create PR" }));
expect((await screen.findAllByText(/gh auth login/i)).length).toBeGreaterThan(0); expect((await screen.findAllByText(/gh auth login/i)).length).toBeGreaterThan(0);
}); });
it("closes on escape", async () => { it("closes on escape", async () => {
const { onClose } = renderModal(); const { onClose } = await renderModalLoaded();
await screen.findByDisplayValue("AI title");
fireEvent.keyDown(document, { key: "Escape" }); fireEvent.keyDown(document, { key: "Escape" });
expect(onClose).toHaveBeenCalled(); expect(onClose).toHaveBeenCalled();
}); });