Skip to content
Merged
Show file tree
Hide file tree
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
5 changes: 5 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ jobs:
# A small upload ceiling so the FILE_TOO_LARGE journey trips the real gate with a ~1 MB file
# rather than a genuine 100 MB transfer; compose interpolates it into the backend + worker env.
XTALATE_MAX_UPLOAD_BYTES: "1048576"
# The serial suite legitimately bursts past the 120/min default on the geometry-heavy journeys
# (frame-chunked fetches + job polling), which 429s every browser request for the rest of that
# wall-clock minute — including the next journey's upload — a timing flake, not a product one.
# Raise the lane's window far above suite volume; the limiter stays on (unit-tested elsewhere).
XTALATE_RATE_LIMIT_PER_MINUTE: "100000"
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -245,3 +245,6 @@ secrets.*
_xtalate_objects/
# Default Tier 0 SQLite database (backend.db default database_url; v0.5 M21)
_xtalate.db

# Visual brainstorm companion (local, ephemeral)
.superpowers/
9 changes: 9 additions & 0 deletions compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,15 @@ x-backend-env: &backend-env
# The M30 e2e lane exports a small value here so the oversized-upload journey trips the real
# `413 FILE_TOO_LARGE` gate with a kilobyte-scale file instead of a genuine 100 MB transfer.
XTALATE_MAX_UPLOAD_BYTES: ${XTALATE_MAX_UPLOAD_BYTES:-104857600}
# Defaults to the application's own 120/min rate limit, so a plain `docker compose up` is
# unchanged (the limiter's production posture is the code default; see backend/config.py). The
# e2e lane exports a generous value here: the Playwright suite is a single serial caller that
# legitimately bursts past 120 requests in a minute on the geometry-heavy journeys (frame-chunked
# fetches + job polling), and a saturated bucket 429s *every* request from the browser for the
# rest of the wall-clock minute — including the next journey's upload — making the gate flaky
# on timing, not on product behaviour. The limiter stays mechanically on; unit tests
# (`tests/backend/test_limits_auth.py`) still assert the 429 posture itself.
XTALATE_RATE_LIMIT_PER_MINUTE: ${XTALATE_RATE_LIMIT_PER_MINUTE:-120}

services:
postgres:
Expand Down
11 changes: 6 additions & 5 deletions frontend/app/conversions/[conversion_id]/page.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const { urlSearchParams } = vi.hoisted(() => ({ urlSearchParams: new URLSearchPa
vi.mock("next/navigation", () => ({
useParams: () => ({ conversion_id: "cnv-under-test" }),
useSearchParams: () => urlSearchParams,
useRouter: () => ({ push: vi.fn() }),
useRouter: () => ({ replace: vi.fn(), push: vi.fn() }),
}));

const apiGet = vi.fn();
Expand Down Expand Up @@ -144,14 +144,15 @@ describe(
);
});

it("back returns to the file page when a live file_id was handed forward", async () => {
it("back returns to the file's workspace when a live file_id was handed forward", async () => {
urlSearchParams.set("file_id", "file-42");
renderWithRecord(lossyRecord);
await screen.findByRole("heading", { level: 1 });
// Arriving from a live upload, back should return to that file — not drop the file in hand.
// Arriving from a live upload, back should return to that file's workspace — not drop the
// file in hand (UI redesign S2: the legacy route resolves into `/f/[id]`).
expect(screen.getByRole("link", { name: "Back to Inspection" })).toHaveAttribute(
"href",
"/files/file-42",
"/f/file-42",
);
});

Expand All @@ -176,7 +177,7 @@ describe(
expect(await screen.findByRole("region", { name: /resolve and retry/i })).toBeInTheDocument();
expect(screen.getByRole("link", { name: /upload the file again/i })).toHaveAttribute(
"href",
"/convert",
"/",
);
});

Expand Down
Loading
Loading