From 2b1b370e5c28f87ae26116f13889e851c703fab1 Mon Sep 17 00:00:00 2001 From: Cedric van Putten Date: Thu, 3 Oct 2024 17:19:08 +0200 Subject: [PATCH 1/5] test(dev-middleware): add test case for `/open-debugger` handler --- .../__tests__/InspectorProxyHttpApi-test.js | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js b/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js index cb94b100bfbf..46f8ac38fa5e 100644 --- a/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js +++ b/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js @@ -18,11 +18,13 @@ import {fetchJson, fetchLocal} from './FetchUtils'; import {createDeviceMock} from './InspectorDeviceUtils'; import {withAbortSignalForEachTest} from './ResourceUtils'; import {withServerForEachTest} from './ServerUtils'; +import DefaultBrowserLauncher from '../utils/DefaultBrowserLauncher'; // Must be greater than or equal to PAGES_POLLING_INTERVAL in `InspectorProxy.js`. const PAGES_POLLING_DELAY = 1000; jest.useFakeTimers(); +jest.mock('../utils/DefaultBrowserLauncher'); describe('inspector proxy HTTP API', () => { const serverRef = withServerForEachTest({ @@ -368,4 +370,47 @@ describe('inspector proxy HTTP API', () => { } }); }); + + describe('/open-debugger endpoint', () => { + it('opens requested device using appId, device, and target', async () => { + // Connect a device to use when opening the debugger + const device = await createDeviceMock( + `${serverRef.serverBaseWsUrl}/inspector/device?device=device1&name=foo&app=bar`, + autoCleanup.signal, + ); + device.getPages.mockImplementation(() => [ + { + app: 'bar-app', + id: 'page1', + title: 'bar-title', + vm: 'bar-vm', + }, + ]); + + try { + // Fetch the target information for the device + const pageListResponse = await fetchJson(`${serverRef.serverBaseUrl}/json`); + // Select the first target from the page list response + expect(pageListResponse.length).toBeGreaterThanOrEqual(1); + const firstPage = pageListResponse[0]; + + // Build the URL for the debugger + const openUrl = new URL('/open-debugger', serverRef.serverBaseUrl); + openUrl.searchParams.set('appId', firstPage.description); + openUrl.searchParams.set('device', firstPage.reactNative.logicalDeviceId); + openUrl.searchParams.set('target', firstPage.id); + // Request to open the debugger for the first device + const response = await fetchLocal(openUrl.toString()); + + // Ensure the request was handled properly + expect(response).toMatchObject({ ok: true }); + // Ensure the debugger was launched + expect(DefaultBrowserLauncher.launchDebuggerAppWindow).toHaveBeenCalledWith( + expect.any(String) + ); + } finally { + device.close(); + } + }); + }); }); From 2f3beeb2c4f89b0255e4a4bcc96c6425ee412184 Mon Sep 17 00:00:00 2001 From: Cedric van Putten Date: Thu, 3 Oct 2024 17:19:31 +0200 Subject: [PATCH 2/5] fix(dev-middleware): respond with status code `200` when successfully launching RNDT --- packages/dev-middleware/src/middleware/openDebuggerMiddleware.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js b/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js index 69051ec09c39..97fcb9c984f3 100644 --- a/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js +++ b/packages/dev-middleware/src/middleware/openDebuggerMiddleware.js @@ -132,6 +132,7 @@ export default function openDebuggerMiddleware({ {launchId, useFuseboxEntryPoint}, ), ); + res.writeHead(200); res.end(); break; case 'redirect': From a231bce57f97d05d6ce11aaadc2e2ffcb2294cdd Mon Sep 17 00:00:00 2001 From: Cedric van Putten Date: Thu, 3 Oct 2024 17:24:23 +0200 Subject: [PATCH 3/5] asd --- .../dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js b/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js index 46f8ac38fa5e..7e8966517975 100644 --- a/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js +++ b/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js @@ -403,7 +403,7 @@ describe('inspector proxy HTTP API', () => { const response = await fetchLocal(openUrl.toString()); // Ensure the request was handled properly - expect(response).toMatchObject({ ok: true }); + expect(response).toContain({ ok: true }); // Ensure the debugger was launched expect(DefaultBrowserLauncher.launchDebuggerAppWindow).toHaveBeenCalledWith( expect.any(String) From ad048b7929c4783409fba73ec38da26bc0bcbab0 Mon Sep 17 00:00:00 2001 From: Cedric van Putten Date: Thu, 3 Oct 2024 17:40:41 +0200 Subject: [PATCH 4/5] test(dev-middleware): update test to resolve testing failures --- .../dev-middleware/src/__tests__/FetchUtils.js | 2 +- .../src/__tests__/InspectorProxyHttpApi-test.js | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/dev-middleware/src/__tests__/FetchUtils.js b/packages/dev-middleware/src/__tests__/FetchUtils.js index 413ada1523ee..43195383e800 100644 --- a/packages/dev-middleware/src/__tests__/FetchUtils.js +++ b/packages/dev-middleware/src/__tests__/FetchUtils.js @@ -21,7 +21,7 @@ declare var globalThis: $FlowFixMe; */ export async function fetchLocal( url: string, - options?: Parameters[1] & {dispatcher?: mixed}, + options?: Partial[1] & {dispatcher?: mixed}>, ): ReturnType { return await fetch(url, { ...options, diff --git a/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js b/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js index 7e8966517975..8329765c5c23 100644 --- a/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js +++ b/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js @@ -24,7 +24,6 @@ import DefaultBrowserLauncher from '../utils/DefaultBrowserLauncher'; const PAGES_POLLING_DELAY = 1000; jest.useFakeTimers(); -jest.mock('../utils/DefaultBrowserLauncher'); describe('inspector proxy HTTP API', () => { const serverRef = withServerForEachTest({ @@ -384,8 +383,17 @@ describe('inspector proxy HTTP API', () => { id: 'page1', title: 'bar-title', vm: 'bar-vm', + capabilities: { + // Ensure the device target can be found when launching the debugger + nativePageReloads: true, + }, }, ]); + jest.advanceTimersByTime(PAGES_POLLING_DELAY); + + // Hook into `DefaultBrowserLauncher.launchDebuggerAppWindow` to ensure debugger was launched + const launchDebuggerSpy = jest.spyOn(DefaultBrowserLauncher, 'launchDebuggerAppWindow') + .mockResolvedValueOnce(); try { // Fetch the target information for the device @@ -400,12 +408,12 @@ describe('inspector proxy HTTP API', () => { openUrl.searchParams.set('device', firstPage.reactNative.logicalDeviceId); openUrl.searchParams.set('target', firstPage.id); // Request to open the debugger for the first device - const response = await fetchLocal(openUrl.toString()); + const response = await fetchLocal(openUrl.toString(), {method: 'POST'}); // Ensure the request was handled properly - expect(response).toContain({ ok: true }); + expect(response.status).toBe(200); // Ensure the debugger was launched - expect(DefaultBrowserLauncher.launchDebuggerAppWindow).toHaveBeenCalledWith( + expect(launchDebuggerSpy).toHaveBeenCalledWith( expect.any(String) ); } finally { From 656f35304bfe53d773ebf46fa94130332b0f130b Mon Sep 17 00:00:00 2001 From: Cedric van Putten Date: Thu, 3 Oct 2024 17:46:34 +0200 Subject: [PATCH 5/5] chore(dev-middleware): resolve linting issue --- .../src/__tests__/InspectorProxyHttpApi-test.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js b/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js index 8329765c5c23..52a53de214b0 100644 --- a/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js +++ b/packages/dev-middleware/src/__tests__/InspectorProxyHttpApi-test.js @@ -392,12 +392,15 @@ describe('inspector proxy HTTP API', () => { jest.advanceTimersByTime(PAGES_POLLING_DELAY); // Hook into `DefaultBrowserLauncher.launchDebuggerAppWindow` to ensure debugger was launched - const launchDebuggerSpy = jest.spyOn(DefaultBrowserLauncher, 'launchDebuggerAppWindow') + const launchDebuggerSpy = jest + .spyOn(DefaultBrowserLauncher, 'launchDebuggerAppWindow') .mockResolvedValueOnce(); try { // Fetch the target information for the device - const pageListResponse = await fetchJson(`${serverRef.serverBaseUrl}/json`); + const pageListResponse = await fetchJson( + `${serverRef.serverBaseUrl}/json`, + ); // Select the first target from the page list response expect(pageListResponse.length).toBeGreaterThanOrEqual(1); const firstPage = pageListResponse[0]; @@ -405,7 +408,10 @@ describe('inspector proxy HTTP API', () => { // Build the URL for the debugger const openUrl = new URL('/open-debugger', serverRef.serverBaseUrl); openUrl.searchParams.set('appId', firstPage.description); - openUrl.searchParams.set('device', firstPage.reactNative.logicalDeviceId); + openUrl.searchParams.set( + 'device', + firstPage.reactNative.logicalDeviceId, + ); openUrl.searchParams.set('target', firstPage.id); // Request to open the debugger for the first device const response = await fetchLocal(openUrl.toString(), {method: 'POST'}); @@ -413,9 +419,7 @@ describe('inspector proxy HTTP API', () => { // Ensure the request was handled properly expect(response.status).toBe(200); // Ensure the debugger was launched - expect(launchDebuggerSpy).toHaveBeenCalledWith( - expect.any(String) - ); + expect(launchDebuggerSpy).toHaveBeenCalledWith(expect.any(String)); } finally { device.close(); }