Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(remix-server-runtime): RRR 1.3 / 1.4 - handleDocumentRequest #4385

Merged
merged 32 commits into from
Nov 15, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
9d0d6e3
initial work for document requests
jacob-ebey Oct 18, 2022
fccc933
Keep thrown responses on the throw path
brophdawg11 Oct 19, 2022
138222f
get headers integration tests passing
brophdawg11 Oct 19, 2022
ebcc937
temp work on error/catch boundary distinction
brophdawg11 Oct 19, 2022
0e84d2f
chore: update test to be more reliable
jacob-ebey Oct 19, 2022
52a6fc3
be more protective when accessing route module
jacob-ebey Oct 19, 2022
2b5140f
be more protective when accessing route module
jacob-ebey Oct 19, 2022
7a6045f
revert
jacob-ebey Oct 19, 2022
4a8997e
Get catch boundary integration tests passing
brophdawg11 Oct 20, 2022
af9d450
Get error boundary tests passing
brophdawg11 Oct 20, 2022
ad09bef
test: mdx test ignores non-existing asset request
jacob-ebey Oct 21, 2022
2f44df4
fix: handle no root catch boundary
jacob-ebey Oct 21, 2022
8c12f0a
remove ".only"
jacob-ebey Oct 21, 2022
8af6805
Updates
brophdawg11 Oct 21, 2022
b25d64f
Copy over latest @remix-run/router files
brophdawg11 Oct 21, 2022
32af5b6
Bring over latest router files
brophdawg11 Oct 26, 2022
01e2277
Add data request error tests
brophdawg11 Oct 26, 2022
077e9b5
Updates for catch.error boundary data responses
brophdawg11 Oct 27, 2022
194ea13
fix: ensure route modules are loaded regardless of error state
jacob-ebey Oct 27, 2022
8d7c86a
ALL GREEN BABY ✅
brophdawg11 Oct 28, 2022
b93e0c7
Fix lint issues and one broken unit test
brophdawg11 Oct 31, 2022
c1ae7a9
Fix tsc build error
brophdawg11 Oct 31, 2022
5d1c6d1
make fetcher tests more reliable
brophdawg11 Nov 1, 2022
63cf680
Merge branch 'dev' into rrr-document-requests-1
brophdawg11 Nov 1, 2022
e6e7f9d
🧹 code
brophdawg11 Nov 1, 2022
3829f50
updated to cover aborted request case
jacob-ebey Nov 2, 2022
b944b7c
chore: remove assert flow (#4554)
jacob-ebey Nov 9, 2022
5db567e
Change missing loader from 405 -> 400 error
brophdawg11 Nov 15, 2022
8a14ade
Bring over external redirect logic from react router
brophdawg11 Nov 15, 2022
3ce0ac3
add changeset
brophdawg11 Nov 15, 2022
e3c6225
Merge branch 'dev' into rrr-document-requests-1
brophdawg11 Nov 15, 2022
ccae87f
fix tsc error
brophdawg11 Nov 15, 2022
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
179 changes: 110 additions & 69 deletions packages/remix-server-runtime/__tests__/server-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import { ServerMode } from "../mode";
import type { ServerBuild } from "../build";
import { mockServerBuild } from "./utils";

const DATA_CALL_MULTIPIER = process.env.ENABLE_REMIX_ROUTER ? 2 : 1;
const ENABLE_REMIX_ROUTER = !!process.env.ENABLE_REMIX_ROUTER;
const DATA_CALL_MULTIPIER = ENABLE_REMIX_ROUTER ? 2 : 1;

function spyConsole() {
// https://github.com/facebook/react/issues/7047
Expand Down Expand Up @@ -757,10 +758,12 @@ describe("shared server runtime", () => {
let result = await handler(request);
expect(result.status).toBe(404);
expect(rootLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.catch).toBeTruthy();
expect(entryContext.appState.catch!.status).toBe(404);
Expand All @@ -785,10 +788,12 @@ describe("shared server runtime", () => {
let result = await handler(request);
expect(result.status).toBe(404);
expect(rootLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.catch).toBeTruthy();
expect(entryContext.appState.catch!.status).toBe(404);
Expand Down Expand Up @@ -822,12 +827,14 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(400);
expect(rootLoader.mock.calls.length).toBe(1);
expect(indexLoader.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(indexLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.catch).toBeTruthy();
expect(entryContext.appState.catch!.status).toBe(400);
Expand Down Expand Up @@ -864,12 +871,14 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(400);
expect(rootLoader.mock.calls.length).toBe(1);
expect(indexLoader.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(indexLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.catch).toBeTruthy();
expect(entryContext.appState.catch!.status).toBe(400);
Expand Down Expand Up @@ -909,14 +918,16 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(400);
expect(testAction.mock.calls.length).toBe(1);
expect(testAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
// Should not call root loader since it is the boundary route
expect(rootLoader.mock.calls.length).toBe(0);
expect(testLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.catch).toBeTruthy();
expect(entryContext.appState.catch!.status).toBe(400);
Expand Down Expand Up @@ -954,14 +965,16 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(400);
expect(indexAction.mock.calls.length).toBe(1);
expect(indexAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
// Should not call root loader since it is the boundary route
expect(rootLoader.mock.calls.length).toBe(0);
expect(indexLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.catch).toBeTruthy();
expect(entryContext.appState.catch!.status).toBe(400);
Expand Down Expand Up @@ -1000,13 +1013,15 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(400);
expect(testAction.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1);
expect(testAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(testLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.catch).toBeTruthy();
expect(entryContext.appState.catch!.status).toBe(400);
Expand Down Expand Up @@ -1047,13 +1062,15 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(400);
expect(indexAction.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1);
expect(indexAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(indexLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.catch).toBeTruthy();
expect(entryContext.appState.catch!.status).toBe(400);
Expand Down Expand Up @@ -1102,13 +1119,15 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(400);
expect(testAction.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1);
expect(testAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(testLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.catch).toBeTruthy();
expect(entryContext.appState.catch.data).toBe("action");
Expand Down Expand Up @@ -1159,13 +1178,19 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(400);
expect(indexAction.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1);
expect(indexAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
// TODO: Check this out. Seems to be a gap in not being able to let
// RR know that a thrown response we catch should be treated the same
// as an error in terms of what subsequent loaders are called after an
// action throws a response.
expect(indexLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.catch).toBeTruthy();
expect(entryContext.appState.catch.data).toBe("action");
Expand Down Expand Up @@ -1203,12 +1228,14 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(500);
expect(rootLoader.mock.calls.length).toBe(1);
expect(indexLoader.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(indexLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.error).toBeTruthy();
expect(entryContext.appState.error.message).toBe("index");
Expand Down Expand Up @@ -1245,12 +1272,14 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(500);
expect(rootLoader.mock.calls.length).toBe(1);
expect(indexLoader.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(indexLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.error).toBeTruthy();
expect(entryContext.appState.error.message).toBe("index");
Expand Down Expand Up @@ -1290,14 +1319,16 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(500);
expect(testAction.mock.calls.length).toBe(1);
expect(testAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
// Should not call root loader since it is the boundary route
expect(rootLoader.mock.calls.length).toBe(0);
expect(testLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.error).toBeTruthy();
expect(entryContext.appState.error.message).toBe("test");
Expand Down Expand Up @@ -1335,14 +1366,16 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(500);
expect(indexAction.mock.calls.length).toBe(1);
expect(indexAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
// Should not call root loader since it is the boundary route
expect(rootLoader.mock.calls.length).toBe(0);
expect(indexLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.error).toBeTruthy();
expect(entryContext.appState.error.message).toBe("index");
Expand Down Expand Up @@ -1381,13 +1414,15 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(500);
expect(testAction.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1);
expect(testAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(testLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.error).toBeTruthy();
expect(entryContext.appState.error.message).toBe("test");
Expand Down Expand Up @@ -1428,13 +1463,15 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(500);
expect(indexAction.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1);
expect(indexAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(indexLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.error).toBeTruthy();
expect(entryContext.appState.error.message).toBe("index");
Expand Down Expand Up @@ -1483,13 +1520,15 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(500);
expect(testAction.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1);
expect(testAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(testLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.error).toBeTruthy();
expect(entryContext.appState.error.message).toBe("action");
Expand Down Expand Up @@ -1540,13 +1579,15 @@ describe("shared server runtime", () => {

let result = await handler(request);
expect(result.status).toBe(500);
expect(indexAction.mock.calls.length).toBe(1);
expect(rootLoader.mock.calls.length).toBe(1);
expect(indexAction.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(rootLoader.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
expect(indexLoader.mock.calls.length).toBe(0);
expect(build.entry.module.default.mock.calls.length).toBe(1);
expect(build.entry.module.default.mock.calls.length).toBe(
1 * DATA_CALL_MULTIPIER
);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(1);
expect(calls.length).toBe(1 * DATA_CALL_MULTIPIER);
let entryContext = calls[0][3];
expect(entryContext.appState.error).toBeTruthy();
expect(entryContext.appState.error.message).toBe("action");
Expand Down Expand Up @@ -1596,7 +1637,7 @@ describe("shared server runtime", () => {
expect(indexLoader.mock.calls.length).toBe(0);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(2);
expect(calls.length).toBe(2 * DATA_CALL_MULTIPIER);
let entryContext = calls[1][3];
expect(entryContext.appState.error).toBeTruthy();
expect(entryContext.appState.error.message).toBe("thrown");
Expand Down Expand Up @@ -1641,7 +1682,7 @@ describe("shared server runtime", () => {
expect(indexLoader.mock.calls.length).toBe(0);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(2);
expect(calls.length).toBe(2 * DATA_CALL_MULTIPIER);
});

test("returns more detailed message if handleDocumentRequest throws a second time in development mode", async () => {
Expand Down Expand Up @@ -1681,8 +1722,8 @@ describe("shared server runtime", () => {
expect(indexLoader.mock.calls.length).toBe(0);

let calls = build.entry.module.default.mock.calls;
expect(calls.length).toBe(2);
expect(spy.console.mock.calls.length).toBe(1);
expect(calls.length).toBe(2 * DATA_CALL_MULTIPIER);
expect(spy.console.mock.calls.length).toBe(1 * DATA_CALL_MULTIPIER);
});
});
});
Loading