Skip to content

Commit c12c0fe

Browse files
authoredNov 13, 2024··
improve(wrangler): fix subdomain tests (#7210)
Many tests had mocks that weren't called, or had false assertions about not updating subdomain routes when they actually were being updated. Additionally, available_on_subdomain is now unecessary during script-upload, as it is not read there, due to being handled entirely within triggers-deploy. This also saves a double call to get /subdomain in the new-api path. The get/update subdomain helpers are refactored from deploy/version tests, and unified to standardize default workername and legacyEnv. I wanted to remove the getSubdomain mock from mockUpload entirely, but there were a bit too many callsites... At least every test now that makes assertions about workers.dev deployments does explicitly reset the mock return value.
1 parent 4814455 commit c12c0fe

File tree

7 files changed

+199
-150
lines changed

7 files changed

+199
-150
lines changed
 

‎.changeset/clean-tigers-breathe.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"wrangler": patch
3+
---
4+
5+
Avoid an unnecessary GET request during `wrangler deploy`.

‎packages/wrangler/src/__tests__/deploy.test.ts

+94-86
Large diffs are not rendered by default.

‎packages/wrangler/src/__tests__/helpers/mock-upload-worker.ts

+8-27
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { http, HttpResponse } from "msw";
2+
import { mockGetWorkerSubdomain } from "./mock-workers-subdomain";
23
import { createFetchResult, msw } from "./msw";
34
import { serialize, toString } from "./serialize-form-data-entry";
45
import type { WorkerMetadata } from "../../deployment-bundle/create-worker-upload-form";
@@ -10,7 +11,6 @@ import type { HttpResponseResolver } from "msw";
1011
/** Create a mock handler for the request to upload a worker script. */
1112
export function mockUploadWorkerRequest(
1213
options: {
13-
available_on_subdomain?: boolean;
1414
expectedEntry?: string | RegExp | ((entry: string | null) => void);
1515
expectedMainModule?: string;
1616
expectedType?: "esm" | "sw" | "none";
@@ -50,9 +50,6 @@ export function mockUploadWorkerRequest(
5050
expect(params.envName).toEqual(env);
5151
}
5252
if (useOldUploadApi) {
53-
expect(url.searchParams.get("include_subdomain_availability")).toEqual(
54-
"true"
55-
);
5653
expect(url.searchParams.get("excludeScript")).toEqual("true");
5754
}
5855
if (expectedDispatchNamespace) {
@@ -130,7 +127,6 @@ export function mockUploadWorkerRequest(
130127
if (useOldUploadApi) {
131128
return HttpResponse.json(
132129
createFetchResult({
133-
available_on_subdomain,
134130
id: "abc12345",
135131
etag: "etag98765",
136132
pipeline_hash: "hash9999",
@@ -156,7 +152,6 @@ export function mockUploadWorkerRequest(
156152
};
157153

158154
const {
159-
available_on_subdomain = true,
160155
expectedEntry,
161156
expectedAssets,
162157
// Allow setting expectedMainModule to undefined to test static-asset only uploads
@@ -227,25 +222,11 @@ export function mockUploadWorkerRequest(
227222
)
228223
);
229224
}
230-
231-
msw.use(
232-
http.get(
233-
env && !legacyEnv
234-
? `*/accounts/:accountId/workers/services/:scriptName/environments/:envName/subdomain`
235-
: `*/accounts/:accountId/workers/scripts/:scriptName/subdomain`,
236-
({ params }) => {
237-
expect(params.accountId).toEqual("some-account-id");
238-
expect(params.scriptName).toEqual(
239-
legacyEnv && env ? `${expectedScriptName}-${env}` : expectedScriptName
240-
);
241-
if (!legacyEnv) {
242-
expect(params.envName).toEqual(env);
243-
}
244-
245-
return HttpResponse.json(
246-
createFetchResult({ enabled: available_on_subdomain })
247-
);
248-
}
249-
)
250-
);
225+
// TODO make explicit by callers?
226+
mockGetWorkerSubdomain({
227+
enabled: true,
228+
env,
229+
legacyEnv,
230+
expectedScriptName,
231+
});
251232
}

‎packages/wrangler/src/__tests__/helpers/mock-workers-subdomain.ts

+71
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,74 @@ export function mockSubDomainRequest(
3232
);
3333
}
3434
}
35+
36+
/** Create a mock handler to fetch the <script>.<user>.workers.dev subdomain status*/
37+
export function mockGetWorkerSubdomain({
38+
enabled,
39+
env,
40+
legacyEnv = false,
41+
expectedScriptName = "test-name",
42+
}: {
43+
enabled: boolean;
44+
env?: string | undefined;
45+
legacyEnv?: boolean | undefined;
46+
expectedScriptName?: string;
47+
}) {
48+
const url =
49+
env && !legacyEnv
50+
? `*/accounts/:accountId/workers/services/:scriptName/environments/:envName/subdomain`
51+
: `*/accounts/:accountId/workers/scripts/:scriptName/subdomain`;
52+
msw.use(
53+
http.get(
54+
url,
55+
({ params }) => {
56+
expect(params.accountId).toEqual("some-account-id");
57+
expect(params.scriptName).toEqual(
58+
legacyEnv && env ? `${expectedScriptName}-${env}` : expectedScriptName
59+
);
60+
if (!legacyEnv) {
61+
expect(params.envName).toEqual(env);
62+
}
63+
64+
return HttpResponse.json(createFetchResult({ enabled }));
65+
},
66+
{ once: true }
67+
)
68+
);
69+
}
70+
71+
/** Create a mock handler to toggle a <script>.<user>.workers.dev subdomain status */
72+
export function mockUpdateWorkerSubdomain({
73+
enabled,
74+
env,
75+
legacyEnv = false,
76+
expectedScriptName = "test-name",
77+
}: {
78+
enabled: boolean;
79+
env?: string | undefined;
80+
legacyEnv?: boolean | undefined;
81+
expectedScriptName?: string;
82+
}) {
83+
const url =
84+
env && !legacyEnv
85+
? `*/accounts/:accountId/workers/services/:scriptName/environments/:envName/subdomain`
86+
: `*/accounts/:accountId/workers/scripts/:scriptName/subdomain`;
87+
msw.use(
88+
http.post(
89+
url,
90+
async ({ request, params }) => {
91+
expect(params.accountId).toEqual("some-account-id");
92+
expect(params.scriptName).toEqual(
93+
legacyEnv && env ? `${expectedScriptName}-${env}` : expectedScriptName
94+
);
95+
if (!legacyEnv) {
96+
expect(params.envName).toEqual(env);
97+
}
98+
const body = await request.json();
99+
expect(body).toEqual({ enabled });
100+
return HttpResponse.json(createFetchResult({ enabled }));
101+
},
102+
{ once: true }
103+
)
104+
);
105+
}

‎packages/wrangler/src/__tests__/versions/versions.deploy.test.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import { mockAccountId, mockApiToken } from "../helpers/mock-account-id";
1212
import { mockConsoleMethods } from "../helpers/mock-console";
1313
import { useMockIsTTY } from "../helpers/mock-istty";
1414
import { mockUploadWorkerRequest } from "../helpers/mock-upload-worker";
15-
import { mockSubDomainRequest } from "../helpers/mock-workers-subdomain";
15+
import {
16+
mockGetWorkerSubdomain,
17+
mockSubDomainRequest,
18+
} from "../helpers/mock-workers-subdomain";
1619
import {
1720
msw,
1821
mswGetVersion,
@@ -57,8 +60,9 @@ describe("versions deploy", () => {
5760
);
5861
writeWranglerToml();
5962
writeWorkerSource();
60-
mockSubDomainRequest();
6163
mockUploadWorkerRequest();
64+
mockGetWorkerSubdomain({ enabled: true });
65+
mockSubDomainRequest();
6266

6367
await runWrangler("deploy ./index");
6468

‎packages/wrangler/src/__tests__/versions/versions.upload.test.ts

+15-26
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import { http, HttpResponse } from "msw";
22
import { mockAccountId, mockApiToken } from "../helpers/mock-account-id";
33
import { mockConsoleMethods } from "../helpers/mock-console";
44
import { useMockIsTTY } from "../helpers/mock-istty";
5-
import { mockSubDomainRequest } from "../helpers/mock-workers-subdomain";
5+
import {
6+
mockGetWorkerSubdomain,
7+
mockSubDomainRequest,
8+
} from "../helpers/mock-workers-subdomain";
69
import { createFetchResult, msw } from "../helpers/msw";
710
import { runInTempDir } from "../helpers/run-in-tmp";
811
import { runWrangler } from "../helpers/run-wrangler";
@@ -21,7 +24,7 @@ describe("versions upload", () => {
2124
http.get(
2225
`*/accounts/:accountId/workers/services/:scriptName`,
2326
({ params }) => {
24-
expect(params.scriptName).toEqual("test-worker");
27+
expect(params.scriptName).toEqual("test-name");
2528

2629
return HttpResponse.json(
2730
createFetchResult({
@@ -47,7 +50,7 @@ describe("versions upload", () => {
4750
return HttpResponse.error();
4851
}
4952

50-
expect(params.scriptName).toEqual("test-worker");
53+
expect(params.scriptName).toEqual("test-name");
5154

5255
return HttpResponse.json(
5356
createFetchResult({
@@ -63,27 +66,13 @@ describe("versions upload", () => {
6366
);
6467
}
6568

66-
function mockGetWorkerSubdomain(available_on_subdomain: boolean) {
67-
msw.use(
68-
http.get(
69-
`*/accounts/:accountId/workers/scripts/:scriptName/subdomain`,
70-
({ params }) => {
71-
expect(params.scriptName).toEqual("test-worker");
72-
return HttpResponse.json(
73-
createFetchResult({ enabled: available_on_subdomain })
74-
);
75-
}
76-
)
77-
);
78-
}
79-
8069
test("should print bindings & startup time on versions upload", async () => {
8170
mockGetScript();
8271
mockUploadVersion(false);
8372

8473
// Setup
8574
writeWranglerToml({
86-
name: "test-worker",
75+
name: "test-name",
8776
main: "./index.js",
8877
vars: {
8978
TEST: "test-string",
@@ -113,20 +102,20 @@ describe("versions upload", () => {
113102
\\"abc\\": \\"def\\",
114103
\\"bool\\": true
115104
}
116-
Uploaded test-worker (TIMINGS)
105+
Uploaded test-name (TIMINGS)
117106
Worker Version ID: 51e4886e-2db7-4900-8d38-fbfecfeab993"
118107
`);
119108
});
120109

121110
test("should print preview url if version has preview", async () => {
122111
mockGetScript();
123112
mockUploadVersion(true);
124-
mockGetWorkerSubdomain(true);
113+
mockGetWorkerSubdomain({ enabled: true });
125114
mockSubDomainRequest();
126115

127116
// Setup
128117
writeWranglerToml({
129-
name: "test-worker",
118+
name: "test-name",
130119
main: "./index.js",
131120
vars: {
132121
TEST: "test-string",
@@ -145,20 +134,20 @@ describe("versions upload", () => {
145134
Your worker has access to the following bindings:
146135
- Vars:
147136
- TEST: \\"test-string\\"
148-
Uploaded test-worker (TIMINGS)
137+
Uploaded test-name (TIMINGS)
149138
Worker Version ID: 51e4886e-2db7-4900-8d38-fbfecfeab993
150-
Version Preview URL: https://51e4886e-test-worker.test-sub-domain.workers.dev"
139+
Version Preview URL: https://51e4886e-test-name.test-sub-domain.workers.dev"
151140
`);
152141
});
153142

154143
it("should not print preview url workers_dev is false", async () => {
155144
mockGetScript();
156145
mockUploadVersion(true);
157-
mockGetWorkerSubdomain(false);
146+
mockGetWorkerSubdomain({ enabled: false });
158147

159148
// Setup
160149
writeWranglerToml({
161-
name: "test-worker",
150+
name: "test-name",
162151
main: "./index.js",
163152
vars: {
164153
TEST: "test-string",
@@ -177,7 +166,7 @@ describe("versions upload", () => {
177166
Your worker has access to the following bindings:
178167
- Vars:
179168
- TEST: \\"test-string\\"
180-
Uploaded test-worker (TIMINGS)
169+
Uploaded test-name (TIMINGS)
181170
Worker Version ID: 51e4886e-2db7-4900-8d38-fbfecfeab993"
182171
`);
183172
});

‎packages/wrangler/src/deploy/deploy.ts

-9
Original file line numberDiff line numberDiff line change
@@ -813,10 +813,8 @@ See https://developers.cloudflare.com/workers/platform/compatibility-dates for m
813813
let bindingsPrinted = false;
814814

815815
// Upload the script so it has time to propagate.
816-
// We can also now tell whether available_on_subdomain is set
817816
try {
818817
let result: {
819-
available_on_subdomain: boolean;
820818
id: string | null;
821819
etag: string | null;
822820
pipeline_hash: string | null;
@@ -854,12 +852,7 @@ See https://developers.cloudflare.com/workers/platform/compatibility-dates for m
854852
observability: worker.observability ?? { enabled: false },
855853
});
856854

857-
const { available_on_subdomain } = await fetchResult<{
858-
available_on_subdomain: boolean;
859-
}>(`/accounts/${accountId}/workers/scripts/${scriptName}/subdomain`);
860-
861855
result = {
862-
available_on_subdomain,
863856
id: null, // fpw - ignore
864857
etag: versionResult.resources.script.etag,
865858
pipeline_hash: null, // fpw - ignore
@@ -870,7 +863,6 @@ See https://developers.cloudflare.com/workers/platform/compatibility-dates for m
870863
} else {
871864
result = await retryOnError(async () =>
872865
fetchResult<{
873-
available_on_subdomain: boolean;
874866
id: string | null;
875867
etag: string | null;
876868
pipeline_hash: string | null;
@@ -885,7 +877,6 @@ See https://developers.cloudflare.com/workers/platform/compatibility-dates for m
885877
headers: await getMetricsUsageHeaders(config.send_metrics),
886878
},
887879
new URLSearchParams({
888-
include_subdomain_availability: "true",
889880
// pass excludeScript so the whole body of the
890881
// script doesn't get included in the response
891882
excludeScript: "true",

0 commit comments

Comments
 (0)
Please sign in to comment.