Skip to content

Commit 4dcb3f9

Browse files
committed
test: cover manifest query override precedence
1 parent 3407784 commit 4dcb3f9

3 files changed

Lines changed: 151 additions & 0 deletions

File tree

tests/integration/rsc-mf/tests/manifestFallback.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,21 @@ describe('manifest fallback shared helpers', () => {
198198
);
199199
});
200200

201+
it('lets request query params override manifest query params', () => {
202+
const fallbackUrl = createManifestFallbackAssetUrl({
203+
remoteOrigin: 'http://127.0.0.1:3999',
204+
fallbackAssetPath:
205+
'http://127.0.0.1:3999/static/js/async/__federation_expose_RemoteClientCounter.7745fe5f0a.js?cache=manifest&v=1',
206+
requestSearch: '?cache=request&x=2',
207+
requestedAssetDirectory: 'static/js/async/',
208+
});
209+
expect(fallbackUrl).toBeDefined();
210+
const parsedFallbackUrl = new URL(fallbackUrl!);
211+
expect(parsedFallbackUrl.searchParams.get('cache')).toBe('request');
212+
expect(parsedFallbackUrl.searchParams.get('v')).toBe('1');
213+
expect(parsedFallbackUrl.searchParams.get('x')).toBe('2');
214+
});
215+
201216
it('rejects unsafe fallback URLs', () => {
202217
expect(
203218
createManifestFallbackAssetUrl({

tests/integration/rsc-mf/tests/modernServerConfig.test.ts

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,73 @@ describe('rsc-mf host modern.server middleware contracts', () => {
907907
);
908908
});
909909

910+
it('lets request query params override manifest fallback query params', async () => {
911+
const handler = getProxyMiddlewareHandler();
912+
const next = jest.fn(async (): Promise<void> => undefined);
913+
const fetchMock = installFetchMock(
914+
jest
915+
.fn()
916+
.mockResolvedValueOnce(new Response('not-found', { status: 404 }))
917+
.mockResolvedValueOnce(
918+
new Response(
919+
JSON.stringify({
920+
exposes: [
921+
{
922+
assets: {
923+
js: {
924+
sync: [
925+
'http://127.0.0.1:3999/static/js/async/__federation_expose_RemoteClientCounter.7745fe5f0a.js?cache=manifest&v=1',
926+
],
927+
async: [],
928+
},
929+
css: {
930+
sync: [],
931+
async: [],
932+
},
933+
},
934+
},
935+
],
936+
}),
937+
{
938+
status: 200,
939+
headers: {
940+
'content-type': 'application/json',
941+
},
942+
},
943+
),
944+
)
945+
.mockResolvedValueOnce(
946+
new Response('query-override-fallback-hit', {
947+
status: 200,
948+
headers: {
949+
'content-type': 'application/javascript',
950+
},
951+
}),
952+
),
953+
);
954+
const context: { req: { url: string }; res?: Response } = {
955+
req: {
956+
url: 'http://127.0.0.1:3007/static/js/async/__federation_expose_RemoteClientCounter.js?cache=request&x=2',
957+
},
958+
};
959+
960+
await withRemotePort('3999', () => handler(context, next));
961+
962+
const fallbackCallUrl = fetchMock.mock.calls[2]?.[0] as string;
963+
const parsedFallbackCallUrl = new URL(fallbackCallUrl);
964+
expect(parsedFallbackCallUrl.origin).toBe('http://127.0.0.1:3999');
965+
expect(parsedFallbackCallUrl.pathname).toBe(
966+
'/static/js/async/__federation_expose_RemoteClientCounter.7745fe5f0a.js',
967+
);
968+
expect(parsedFallbackCallUrl.searchParams.get('cache')).toBe('request');
969+
expect(parsedFallbackCallUrl.searchParams.get('v')).toBe('1');
970+
expect(parsedFallbackCallUrl.searchParams.get('x')).toBe('2');
971+
expect(next).not.toHaveBeenCalled();
972+
await expect(context.res?.text()).resolves.toBe(
973+
'query-override-fallback-hit',
974+
);
975+
});
976+
910977
it('falls through when manifest fallback asset URL points to another origin', async () => {
911978
const handler = getProxyMiddlewareHandler();
912979
const next = jest.fn(async (): Promise<void> => undefined);

tests/integration/rsc-mf/tests/remoteModernServerConfig.test.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,75 @@ describe('rsc-mf remote modern.server middleware contracts', () => {
670670
await expect(context.res?.text()).resolves.toBe('absolute-fallback-asset');
671671
});
672672

673+
it('lets request query params override manifest fallback query params', async () => {
674+
const handler = getRecoverMiddlewareHandler();
675+
const next = jest.fn(async (): Promise<void> => undefined);
676+
const fetchMock = installFetchMock(
677+
jest
678+
.fn()
679+
.mockResolvedValueOnce(
680+
new Response(
681+
JSON.stringify({
682+
shared: [
683+
{
684+
assets: {
685+
js: {
686+
sync: [
687+
'http://127.0.0.1:3008/static/js/async/__federation_expose_RemoteClientCounter.7745fe5f0a.js?cache=manifest&v=1',
688+
],
689+
async: [],
690+
},
691+
css: {
692+
sync: [],
693+
async: [],
694+
},
695+
},
696+
},
697+
],
698+
}),
699+
{
700+
status: 200,
701+
headers: {
702+
'content-type': 'application/json',
703+
},
704+
},
705+
),
706+
)
707+
.mockResolvedValueOnce(
708+
new Response('query-override-fallback-asset', {
709+
status: 200,
710+
headers: {
711+
'content-type': 'application/javascript',
712+
},
713+
}),
714+
),
715+
);
716+
const context: {
717+
req: { url: string; headers?: { get?: (name: string) => string | null } };
718+
res?: Response;
719+
} = {
720+
req: {
721+
url: 'http://127.0.0.1:3008/static/js/async/__federation_expose_RemoteClientCounter.js?cache=request&x=2',
722+
},
723+
};
724+
725+
await handler(context, next);
726+
727+
const fallbackCallUrl = fetchMock.mock.calls[1]?.[0] as string;
728+
const parsedFallbackCallUrl = new URL(fallbackCallUrl);
729+
expect(parsedFallbackCallUrl.origin).toBe('http://127.0.0.1:3008');
730+
expect(parsedFallbackCallUrl.pathname).toBe(
731+
'/static/js/async/__federation_expose_RemoteClientCounter.7745fe5f0a.js',
732+
);
733+
expect(parsedFallbackCallUrl.searchParams.get('cache')).toBe('request');
734+
expect(parsedFallbackCallUrl.searchParams.get('v')).toBe('1');
735+
expect(parsedFallbackCallUrl.searchParams.get('x')).toBe('2');
736+
expect(next).not.toHaveBeenCalled();
737+
await expect(context.res?.text()).resolves.toBe(
738+
'query-override-fallback-asset',
739+
);
740+
});
741+
673742
it('falls through when fallback asset resolves to the same request url', async () => {
674743
const handler = getRecoverMiddlewareHandler();
675744
const next = jest.fn(async (): Promise<void> => undefined);

0 commit comments

Comments
 (0)