@react-native-harness/jest 1.4.0-rc.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/crash-monitor.d.ts +7 -0
  2. package/dist/crash-monitor.d.ts.map +1 -1
  3. package/dist/crash-monitor.js +19 -0
  4. package/dist/diagnostics/derivers.d.ts +24 -0
  5. package/dist/diagnostics/derivers.d.ts.map +1 -0
  6. package/dist/diagnostics/derivers.js +146 -0
  7. package/dist/diagnostics/index.d.ts +3 -0
  8. package/dist/diagnostics/index.d.ts.map +1 -0
  9. package/dist/diagnostics/index.js +2 -0
  10. package/dist/diagnostics/report.d.ts +7 -0
  11. package/dist/diagnostics/report.d.ts.map +1 -0
  12. package/dist/diagnostics/report.js +84 -0
  13. package/dist/environment-reset.d.ts +51 -0
  14. package/dist/environment-reset.d.ts.map +1 -0
  15. package/dist/environment-reset.js +83 -0
  16. package/dist/execute-run.d.ts.map +1 -1
  17. package/dist/execute-run.js +121 -69
  18. package/dist/format-harness-error.d.ts +5 -0
  19. package/dist/format-harness-error.d.ts.map +1 -0
  20. package/dist/format-harness-error.js +43 -0
  21. package/dist/harness-session.d.ts +26 -1
  22. package/dist/harness-session.d.ts.map +1 -1
  23. package/dist/harness-session.js +260 -87
  24. package/dist/run.d.ts.map +1 -1
  25. package/dist/run.js +21 -4
  26. package/package.json +8 -7
  27. package/src/crash-monitor.ts +28 -0
  28. package/src/diagnostics/derivers.ts +170 -0
  29. package/src/diagnostics/index.ts +2 -0
  30. package/src/diagnostics/report.ts +124 -0
  31. package/src/environment-reset.ts +138 -0
  32. package/src/execute-run.ts +136 -77
  33. package/src/format-harness-error.ts +73 -0
  34. package/src/harness-session.ts +369 -131
  35. package/src/run.ts +23 -4
  36. package/tsconfig.json +3 -0
  37. package/tsconfig.lib.json +3 -0
  38. package/dist/__tests__/bridge.test.d.ts +0 -2
  39. package/dist/__tests__/bridge.test.d.ts.map +0 -1
  40. package/dist/__tests__/bridge.test.js +0 -163
  41. package/dist/__tests__/client-log-handler.test.d.ts +0 -2
  42. package/dist/__tests__/client-log-handler.test.d.ts.map +0 -1
  43. package/dist/__tests__/client-log-handler.test.js +0 -306
  44. package/dist/__tests__/crash-monitor.test.d.ts +0 -2
  45. package/dist/__tests__/crash-monitor.test.d.ts.map +0 -1
  46. package/dist/__tests__/crash-monitor.test.js +0 -166
  47. package/dist/__tests__/crash-supervisor.test.d.ts +0 -2
  48. package/dist/__tests__/crash-supervisor.test.d.ts.map +0 -1
  49. package/dist/__tests__/crash-supervisor.test.js +0 -151
  50. package/dist/__tests__/errors.test.d.ts +0 -2
  51. package/dist/__tests__/errors.test.d.ts.map +0 -1
  52. package/dist/__tests__/errors.test.js +0 -98
  53. package/dist/__tests__/execute-run.test.d.ts +0 -2
  54. package/dist/__tests__/execute-run.test.d.ts.map +0 -1
  55. package/dist/__tests__/execute-run.test.js +0 -393
  56. package/dist/__tests__/fixtures/mock-platform-runner.d.ts +0 -7
  57. package/dist/__tests__/fixtures/mock-platform-runner.d.ts.map +0 -1
  58. package/dist/__tests__/fixtures/mock-platform-runner.js +0 -6
  59. package/dist/__tests__/harness-cache.test.d.ts +0 -2
  60. package/dist/__tests__/harness-cache.test.d.ts.map +0 -1
  61. package/dist/__tests__/harness-cache.test.js +0 -51
  62. package/dist/__tests__/harness-session.test.d.ts +0 -2
  63. package/dist/__tests__/harness-session.test.d.ts.map +0 -1
  64. package/dist/__tests__/harness-session.test.js +0 -74
  65. package/dist/__tests__/harness.test.d.ts +0 -2
  66. package/dist/__tests__/harness.test.d.ts.map +0 -1
  67. package/dist/__tests__/harness.test.js +0 -636
  68. package/dist/__tests__/hook-queue.test.d.ts +0 -2
  69. package/dist/__tests__/hook-queue.test.d.ts.map +0 -1
  70. package/dist/__tests__/hook-queue.test.js +0 -56
  71. package/dist/__tests__/index.test.d.ts +0 -2
  72. package/dist/__tests__/index.test.d.ts.map +0 -1
  73. package/dist/__tests__/index.test.js +0 -148
  74. package/dist/__tests__/metro-port.test.d.ts +0 -2
  75. package/dist/__tests__/metro-port.test.d.ts.map +0 -1
  76. package/dist/__tests__/metro-port.test.js +0 -52
  77. package/dist/__tests__/resource-lock.test.d.ts +0 -2
  78. package/dist/__tests__/resource-lock.test.d.ts.map +0 -1
  79. package/dist/__tests__/resource-lock.test.js +0 -138
  80. package/dist/__tests__/test-file-platform-filter.test.d.ts +0 -2
  81. package/dist/__tests__/test-file-platform-filter.test.d.ts.map +0 -1
  82. package/dist/__tests__/test-file-platform-filter.test.js +0 -47
  83. package/dist/cli-args.test.d.ts +0 -2
  84. package/dist/cli-args.test.d.ts.map +0 -1
  85. package/dist/cli-args.test.js +0 -1
  86. package/dist/tsconfig.lib.tsbuildinfo +0 -1
  87. package/src/__tests__/bridge.test.ts +0 -219
  88. package/src/__tests__/client-log-handler.test.ts +0 -364
  89. package/src/__tests__/crash-monitor.test.ts +0 -239
  90. package/src/__tests__/errors.test.ts +0 -157
  91. package/src/__tests__/execute-run.test.ts +0 -526
  92. package/src/__tests__/harness-session.test.ts +0 -93
  93. package/src/__tests__/hook-queue.test.ts +0 -77
  94. package/src/__tests__/index.test.ts +0 -219
  95. package/src/__tests__/metro-port.test.ts +0 -61
  96. package/src/__tests__/resource-lock.test.ts +0 -179
  97. package/src/__tests__/test-file-platform-filter.test.ts +0 -83
  98. package/tsconfig.tsbuildinfo +0 -1
@@ -1,393 +0,0 @@
1
- import { describe, expect, it, vi, beforeEach } from 'vitest';
2
- import { NativeCrashError, StartupStallError } from '../errors.js';
3
- import { AppBridgeDisconnectedError, DeviceNotRespondingError, } from '@react-native-harness/bridge/server';
4
- import { executeRun } from '../execute-run.js';
5
- const resolveUndefined = async () => undefined;
6
- // Mock the file-runner so we control what jestResult/harnessResult each test returns
7
- // without needing a real Jest config or Metro bundler.
8
- const mockRunHarnessTestFile = vi.hoisted(() => vi.fn());
9
- vi.mock('../run.js', () => ({
10
- runHarnessTestFile: mockRunHarnessTestFile,
11
- }));
12
- // ---------------------------------------------------------------------------
13
- // Helpers
14
- // ---------------------------------------------------------------------------
15
- const makeJestResult = (overrides = {}) => ({
16
- testFilePath: '/test/example.ts',
17
- testResults: [],
18
- failureMessage: null,
19
- numFailingTests: 0,
20
- numPassingTests: 1,
21
- numPendingTests: 0,
22
- numTodoTests: 0,
23
- leaks: false,
24
- openHandles: [],
25
- skipped: false,
26
- snapshot: {
27
- added: 0, fileDeleted: false, matched: 0, unchecked: 0,
28
- uncheckedKeys: [], unmatched: 0, updated: 0,
29
- },
30
- perfStats: { start: 0, end: 1, runtime: 1, slow: false,
31
- loadTestEnvironmentStart: 0, loadTestEnvironmentEnd: 0,
32
- setupAfterEnvStart: 0, setupAfterEnvEnd: 0,
33
- setupFilesStart: 0, setupFilesEnd: 0 },
34
- coverage: undefined,
35
- ...overrides,
36
- });
37
- const makeHarnessResult = (status = 'passed') => ({
38
- name: 'suite',
39
- tests: [],
40
- suites: [],
41
- status,
42
- duration: 50,
43
- });
44
- const makeFileRunResult = (overrides = {}) => ({
45
- jestResult: makeJestResult(),
46
- harnessResult: makeHarnessResult(),
47
- relativeTestPath: 'example.ts',
48
- duration: 50,
49
- ...overrides,
50
- });
51
- const makeTest = (filePath = '/test/example.ts') => ({
52
- path: filePath,
53
- context: { config: {} },
54
- });
55
- const makeWatcher = (interrupted = false) => ({ isInterrupted: () => interrupted });
56
- const makeGlobalConfig = (overrides = {}) => ({
57
- rootDir: '/project',
58
- watch: false,
59
- watchAll: false,
60
- collectCoverage: false,
61
- ...overrides,
62
- });
63
- const makeSession = (overrides = {}) => ({
64
- config: {
65
- metroPort: 8081,
66
- host: undefined,
67
- resetEnvironmentBetweenTestFiles: false,
68
- detectNativeCrashes: true,
69
- runners: [
70
- { platformId: 'android', name: 'android' },
71
- { platformId: 'ios', name: 'ios' },
72
- ],
73
- },
74
- context: {
75
- platform: {
76
- platformId: 'android',
77
- name: 'android',
78
- runner: '/virtual/android-runner.js',
79
- cli: '/virtual/android-cli.js',
80
- config: {},
81
- },
82
- },
83
- ensureAppReady: vi.fn(resolveUndefined),
84
- runTestFile: vi.fn(async () => makeHarnessResult()),
85
- restartApp: vi.fn(resolveUndefined),
86
- resetCrashState: vi.fn(),
87
- flushClientLogs: vi.fn(() => []),
88
- callHook: vi.fn(resolveUndefined),
89
- onTestRunnerEvent: vi.fn(() => () => undefined),
90
- setRunState: vi.fn(),
91
- dispose: vi.fn(resolveUndefined),
92
- ...overrides,
93
- });
94
- const makeEmitEvent = () => {
95
- const calls = [];
96
- const emitEvent = (async (...eventData) => {
97
- calls.push(eventData);
98
- });
99
- return { emitEvent, calls };
100
- };
101
- // ---------------------------------------------------------------------------
102
- // Tests
103
- // ---------------------------------------------------------------------------
104
- beforeEach(() => {
105
- vi.clearAllMocks();
106
- mockRunHarnessTestFile.mockResolvedValue(makeFileRunResult());
107
- });
108
- describe('executeRun', () => {
109
- describe('lifecycle hooks', () => {
110
- it('emits run:started then run:finished in order', async () => {
111
- const hookNames = [];
112
- const session = makeSession({
113
- callHook: vi.fn(async (name) => { hookNames.push(name); }),
114
- });
115
- await executeRun(session, [makeTest()], makeWatcher(), makeEmitEvent().emitEvent, makeGlobalConfig());
116
- expect(hookNames[0]).toBe('run:started');
117
- expect(hookNames[hookNames.length - 1]).toBe('run:finished');
118
- });
119
- it('emits test-file:started and test-file:finished around each test', async () => {
120
- const hookNames = [];
121
- const session = makeSession({
122
- callHook: vi.fn(async (name) => { hookNames.push(name); }),
123
- });
124
- await executeRun(session, [makeTest('/a.ts'), makeTest('/b.ts')], makeWatcher(), makeEmitEvent().emitEvent, makeGlobalConfig());
125
- const fileHooks = hookNames.filter((n) => n === 'test-file:started' || n === 'test-file:finished');
126
- expect(fileHooks).toEqual([
127
- 'test-file:started', 'test-file:finished',
128
- 'test-file:started', 'test-file:finished',
129
- ]);
130
- });
131
- it('always emits run:finished even when a test throws', async () => {
132
- const hookNames = [];
133
- const session = makeSession({
134
- callHook: vi.fn(async (name) => { hookNames.push(name); }),
135
- ensureAppReady: vi.fn(async () => { throw new Error('unexpected'); }),
136
- });
137
- await executeRun(session, [makeTest()], makeWatcher(), makeEmitEvent().emitEvent, makeGlobalConfig());
138
- expect(hookNames).toContain('run:finished');
139
- });
140
- });
141
- describe('happy path', () => {
142
- it('emits file start, ensureAppReady, runTestFile, file success in order', async () => {
143
- const order = [];
144
- const session = makeSession({
145
- ensureAppReady: vi.fn(async () => { order.push('ensureAppReady'); }),
146
- });
147
- const emitEvent = (async (eventName, ..._eventData) => {
148
- if (eventName === 'test-file-start') {
149
- order.push('test-file-start');
150
- }
151
- if (eventName === 'test-file-success') {
152
- order.push('test-file-success');
153
- }
154
- });
155
- mockRunHarnessTestFile.mockImplementation(async () => {
156
- order.push('runTestFile');
157
- return makeFileRunResult();
158
- });
159
- await executeRun(session, [makeTest()], makeWatcher(), emitEvent, makeGlobalConfig());
160
- expect(order).toEqual([
161
- 'test-file-start',
162
- 'ensureAppReady',
163
- 'runTestFile',
164
- 'test-file-success',
165
- ]);
166
- });
167
- it('accumulates passing test counts in run:finished summary', async () => {
168
- let finishedPayload;
169
- const session = makeSession({
170
- callHook: vi.fn(async (name, payload) => {
171
- if (name === 'run:finished')
172
- finishedPayload = payload;
173
- }),
174
- });
175
- mockRunHarnessTestFile.mockResolvedValue(makeFileRunResult({ jestResult: makeJestResult({ numPassingTests: 3 }) }));
176
- await executeRun(session, [makeTest(), makeTest('/b.ts')], makeWatcher(), makeEmitEvent().emitEvent, makeGlobalConfig());
177
- const payload = finishedPayload;
178
- expect(payload.summary.passed).toBe(6);
179
- expect(payload.status).toBe('passed');
180
- });
181
- it('attaches buffered client logs to the Jest result', async () => {
182
- const clientLogs = [{ message: 'Loaded screen', origin: '', type: 'warn' }];
183
- const session = makeSession({
184
- flushClientLogs: vi.fn()
185
- .mockReturnValueOnce([])
186
- .mockReturnValueOnce(clientLogs),
187
- });
188
- const { emitEvent, calls } = makeEmitEvent();
189
- await executeRun(session, [makeTest()], makeWatcher(), emitEvent, makeGlobalConfig());
190
- expect(session.flushClientLogs).toHaveBeenCalledTimes(2);
191
- expect(calls).toContainEqual([
192
- 'test-file-success',
193
- expect.anything(),
194
- expect.objectContaining({ console: clientLogs }),
195
- ]);
196
- });
197
- it('emits test-case events before file success', async () => {
198
- let testRunnerListener;
199
- const { emitEvent, calls: emittedEvents } = makeEmitEvent();
200
- const session = makeSession({
201
- onTestRunnerEvent: vi.fn((listener) => {
202
- testRunnerListener = listener;
203
- return () => undefined;
204
- }),
205
- });
206
- mockRunHarnessTestFile.mockImplementation(async () => {
207
- testRunnerListener?.({
208
- type: 'test-started',
209
- file: 'example.ts',
210
- suite: 'suite',
211
- name: 'works',
212
- ancestorTitles: ['suite'],
213
- fullName: 'suite works',
214
- startedAt: 10,
215
- declarationMode: 'only',
216
- });
217
- testRunnerListener?.({
218
- type: 'test-finished',
219
- file: 'example.ts',
220
- suite: 'suite',
221
- name: 'works',
222
- ancestorTitles: ['suite'],
223
- fullName: 'suite works',
224
- startedAt: 10,
225
- declarationMode: 'only',
226
- duration: 5,
227
- status: 'passed',
228
- });
229
- return makeFileRunResult();
230
- });
231
- await executeRun(session, [makeTest()], makeWatcher(), emitEvent, makeGlobalConfig());
232
- expect(emittedEvents).toEqual([
233
- ['test-file-start', expect.anything()],
234
- [
235
- 'test-case-start',
236
- 'example.ts',
237
- expect.objectContaining({
238
- ancestorTitles: ['suite'],
239
- fullName: 'suite works',
240
- mode: 'only',
241
- title: 'works',
242
- startedAt: 10,
243
- }),
244
- ],
245
- [
246
- 'test-case-result',
247
- 'example.ts',
248
- expect.objectContaining({
249
- ancestorTitles: ['suite'],
250
- fullName: 'suite works',
251
- numPassingAsserts: 1,
252
- startedAt: 10,
253
- status: 'passed',
254
- title: 'works',
255
- }),
256
- ],
257
- ['test-file-success', expect.anything(), expect.anything()],
258
- ]);
259
- });
260
- });
261
- describe('runtime failures', () => {
262
- it('passes StartupStallError to onFailure with an empty stack', async () => {
263
- const { emitEvent, calls } = makeEmitEvent();
264
- const session = makeSession({
265
- ensureAppReady: vi.fn().mockRejectedValue(new StartupStallError(1500, 3)),
266
- });
267
- await executeRun(session, [makeTest()], makeWatcher(), emitEvent, makeGlobalConfig());
268
- expect(calls).toContainEqual([
269
- 'test-file-failure',
270
- expect.objectContaining({ path: '/test/example.ts' }),
271
- expect.objectContaining({ message: expect.stringContaining('1500'), stack: '' }),
272
- ]);
273
- });
274
- it('passes DeviceNotRespondingError to onFailure with an empty stack', async () => {
275
- const { emitEvent, calls } = makeEmitEvent();
276
- const session = makeSession({
277
- ensureAppReady: vi.fn().mockRejectedValue(new DeviceNotRespondingError('runTests', [])),
278
- });
279
- await executeRun(session, [makeTest()], makeWatcher(), emitEvent, makeGlobalConfig());
280
- expect(calls).toContainEqual([
281
- 'test-file-failure',
282
- expect.anything(),
283
- expect.objectContaining({ stack: '' }),
284
- ]);
285
- });
286
- it('passes AppBridgeDisconnectedError to onFailure with an empty stack', async () => {
287
- const { emitEvent, calls } = makeEmitEvent();
288
- const session = makeSession({
289
- ensureAppReady: vi.fn().mockRejectedValue(new AppBridgeDisconnectedError('app-disconnected')),
290
- });
291
- await executeRun(session, [makeTest()], makeWatcher(), emitEvent, makeGlobalConfig());
292
- expect(calls).toContainEqual([
293
- 'test-file-failure',
294
- expect.anything(),
295
- expect.objectContaining({
296
- message: expect.stringContaining('The app bridge disconnected during test execution.'),
297
- stack: '',
298
- }),
299
- ]);
300
- });
301
- it('calls resetCrashState after a NativeCrashError', async () => {
302
- const session = makeSession({
303
- ensureAppReady: vi.fn().mockRejectedValue(new NativeCrashError('example.ts', { phase: 'execution', source: 'polling' })),
304
- });
305
- await executeRun(session, [makeTest()], makeWatcher(), makeEmitEvent().emitEvent, makeGlobalConfig());
306
- expect(session.resetCrashState).toHaveBeenCalled();
307
- });
308
- it('counts runtime failures in the summary', async () => {
309
- let finishedPayload;
310
- const session = makeSession({
311
- callHook: vi.fn(async (name, payload) => {
312
- if (name === 'run:finished')
313
- finishedPayload = payload;
314
- }),
315
- ensureAppReady: vi.fn().mockRejectedValue(new StartupStallError(1000, 2)),
316
- });
317
- await executeRun(session, [makeTest()], makeWatcher(), makeEmitEvent().emitEvent, makeGlobalConfig());
318
- const payload = finishedPayload;
319
- expect(payload.summary.failed).toBe(1);
320
- expect(payload.status).toBe('failed');
321
- });
322
- });
323
- describe('watcher interrupt', () => {
324
- it('stops processing tests and still emits run:finished', async () => {
325
- const hookNames = [];
326
- const session = makeSession({
327
- callHook: vi.fn(async (name) => { hookNames.push(name); }),
328
- });
329
- const { emitEvent, calls } = makeEmitEvent();
330
- await executeRun(session, [makeTest('/a.ts'), makeTest('/b.ts')], makeWatcher(true /* interrupted */), emitEvent, makeGlobalConfig());
331
- // No test was started; watcher was already interrupted.
332
- expect(calls).not.toContainEqual(['test-file-start', expect.anything()]);
333
- expect(hookNames).toContain('run:finished');
334
- });
335
- });
336
- describe('resetEnvironmentBetweenTestFiles', () => {
337
- it('calls restartApp before the second test but not the first', async () => {
338
- const session = makeSession({
339
- config: {
340
- metroPort: 8081,
341
- resetEnvironmentBetweenTestFiles: true,
342
- detectNativeCrashes: false,
343
- runners: [
344
- { platformId: 'android', name: 'android' },
345
- { platformId: 'ios', name: 'ios' },
346
- ],
347
- },
348
- });
349
- await executeRun(session, [makeTest('/a.ts'), makeTest('/b.ts'), makeTest('/c.ts')], makeWatcher(), makeEmitEvent().emitEvent, makeGlobalConfig());
350
- // restartApp should be called for tests 2 and 3, not test 1.
351
- expect(session.restartApp).toHaveBeenCalledTimes(2);
352
- });
353
- });
354
- describe('platform-specific test files', () => {
355
- it('skips files for other platforms without running them on the device', async () => {
356
- const session = makeSession();
357
- const { emitEvent, calls } = makeEmitEvent();
358
- await executeRun(session, [
359
- makeTest('/project/smoke.harness.ts'),
360
- makeTest('/project/kotlin.android.harness.ts'),
361
- makeTest('/project/swift.ios.harness.ts'),
362
- ], makeWatcher(), emitEvent, makeGlobalConfig());
363
- expect(mockRunHarnessTestFile).toHaveBeenCalledTimes(2);
364
- expect(mockRunHarnessTestFile).toHaveBeenCalledWith(expect.objectContaining({ testPath: '/project/smoke.harness.ts' }));
365
- expect(mockRunHarnessTestFile).toHaveBeenCalledWith(expect.objectContaining({ testPath: '/project/kotlin.android.harness.ts' }));
366
- expect(session.ensureAppReady).toHaveBeenCalledTimes(2);
367
- expect(calls).toContainEqual([
368
- 'test-file-success',
369
- expect.objectContaining({ path: '/project/swift.ios.harness.ts' }),
370
- expect.objectContaining({ skipped: true }),
371
- ]);
372
- });
373
- it('does not restart the app for skipped platform-specific files', async () => {
374
- const session = makeSession({
375
- config: {
376
- metroPort: 8081,
377
- resetEnvironmentBetweenTestFiles: true,
378
- detectNativeCrashes: false,
379
- runners: [
380
- { platformId: 'android', name: 'android' },
381
- { platformId: 'ios', name: 'ios' },
382
- ],
383
- },
384
- });
385
- await executeRun(session, [
386
- makeTest('/project/swift.ios.harness.ts'),
387
- makeTest('/project/kotlin.android.harness.ts'),
388
- ], makeWatcher(), vi.fn(), makeGlobalConfig());
389
- expect(session.restartApp).not.toHaveBeenCalled();
390
- expect(mockRunHarnessTestFile).toHaveBeenCalledTimes(1);
391
- });
392
- });
393
- });
@@ -1,7 +0,0 @@
1
- import type { HarnessPlatformInitOptions, HarnessPlatformRunner } from '@react-native-harness/platforms';
2
- import type { Config as HarnessConfig } from '@react-native-harness/config';
3
- declare global {
4
- var __HARNESS_TEST_PLATFORM_RUNNER__: HarnessPlatformRunner | undefined;
5
- }
6
- export default function mockPlatformRunner(_platformConfig: Record<string, unknown>, _harnessConfig: HarnessConfig, _init: HarnessPlatformInitOptions): Promise<HarnessPlatformRunner>;
7
- //# sourceMappingURL=mock-platform-runner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-platform-runner.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/mock-platform-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,qBAAqB,EACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE5E,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,gCAAgC,EAChC,qBAAqB,GACrB,SAAS,CAAC;CACf;AAED,wBAA8B,kBAAkB,CAC9C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,cAAc,EAAE,aAAa,EAC7B,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAMhC"}
@@ -1,6 +0,0 @@
1
- export default async function mockPlatformRunner(_platformConfig, _harnessConfig, _init) {
2
- if (!globalThis.__HARNESS_TEST_PLATFORM_RUNNER__) {
3
- throw new Error('Missing __HARNESS_TEST_PLATFORM_RUNNER__ test fixture');
4
- }
5
- return globalThis.__HARNESS_TEST_PLATFORM_RUNNER__;
6
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=harness-cache.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"harness-cache.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/harness-cache.test.ts"],"names":[],"mappings":""}
@@ -1,51 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- const mocks = vi.hoisted(() => ({
3
- isMetroCacheReusable: vi.fn(),
4
- logMetroCacheReused: vi.fn(),
5
- logMetroPrewarmCompleted: vi.fn(),
6
- }));
7
- vi.mock('@react-native-harness/bundler-metro', () => ({
8
- isMetroCacheReusable: mocks.isMetroCacheReusable,
9
- }));
10
- vi.mock('../logs.js', () => ({
11
- logMetroCacheReused: mocks.logMetroCacheReused,
12
- logMetroPrewarmCompleted: mocks.logMetroPrewarmCompleted,
13
- }));
14
- import { maybeLogMetroCacheReuse } from '../harness.js';
15
- const platform = {
16
- name: 'ios',
17
- platformId: 'ios',
18
- runner: '/virtual/platform-runner.js',
19
- config: {},
20
- getResourceLockKey: () => 'ios:simulator:iPhone 17 Pro:26.2',
21
- };
22
- const createHarnessConfig = (overrides = {}) => ({
23
- appRegistryComponentName: 'App',
24
- disableViewFlattening: false,
25
- bridgeTimeout: 5000,
26
- entryPoint: 'index.js',
27
- unstable__enableMetroCache: true,
28
- forwardClientLogs: false,
29
- ...overrides,
30
- });
31
- describe('maybeLogMetroCacheReuse', () => {
32
- beforeEach(() => {
33
- vi.clearAllMocks();
34
- mocks.isMetroCacheReusable.mockReturnValue(false);
35
- });
36
- it('logs when an existing metro cache will be reused', () => {
37
- mocks.isMetroCacheReusable.mockReturnValue(true);
38
- maybeLogMetroCacheReuse(createHarnessConfig(), platform, '/tmp/project');
39
- expect(mocks.isMetroCacheReusable).toHaveBeenCalledWith('/tmp/project');
40
- expect(mocks.logMetroCacheReused).toHaveBeenCalledWith(platform);
41
- });
42
- it('does not log when metro cache reuse is disabled', () => {
43
- maybeLogMetroCacheReuse(createHarnessConfig({ unstable__enableMetroCache: false }), platform, '/tmp/project');
44
- expect(mocks.isMetroCacheReusable).not.toHaveBeenCalled();
45
- expect(mocks.logMetroCacheReused).not.toHaveBeenCalled();
46
- });
47
- it('does not log when the metro cache is absent', () => {
48
- maybeLogMetroCacheReuse(createHarnessConfig(), platform, '/tmp/project');
49
- expect(mocks.logMetroCacheReused).not.toHaveBeenCalled();
50
- });
51
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=harness-session.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"harness-session.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/harness-session.test.ts"],"names":[],"mappings":""}
@@ -1,74 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { waitForBridgeDisconnectOrTimeout, waitForStartupCrash, } from '../harness-session.js';
3
- const createConnection = () => ({
4
- device: {
5
- platform: 'ios',
6
- manufacturer: 'Apple',
7
- model: 'iPhone',
8
- osVersion: '18.0',
9
- },
10
- runTests: vi.fn(),
11
- });
12
- const createBridge = (connection) => {
13
- let currentConnection = connection;
14
- let disconnectedListener = null;
15
- return {
16
- get connection() {
17
- return currentConnection;
18
- },
19
- on: vi.fn((event, listener) => {
20
- if (event === 'disconnected') {
21
- disconnectedListener = listener;
22
- }
23
- }),
24
- off: vi.fn((event, listener) => {
25
- if (event === 'disconnected' && disconnectedListener === listener) {
26
- disconnectedListener = null;
27
- }
28
- }),
29
- disconnect: () => {
30
- currentConnection = null;
31
- disconnectedListener?.();
32
- },
33
- };
34
- };
35
- describe('waitForBridgeDisconnectOrTimeout', () => {
36
- it('returns true when the bridge disconnects before the timeout', async () => {
37
- const connection = createConnection();
38
- const bridge = createBridge(connection);
39
- const waitPromise = waitForBridgeDisconnectOrTimeout({
40
- bridge,
41
- connection,
42
- timeoutMs: 50,
43
- });
44
- bridge.disconnect();
45
- await expect(waitPromise).resolves.toBe(true);
46
- });
47
- it('returns false when the bridge stays connected through the timeout', async () => {
48
- const connection = createConnection();
49
- const bridge = createBridge(connection);
50
- await expect(waitForBridgeDisconnectOrTimeout({
51
- bridge,
52
- connection,
53
- timeoutMs: 10,
54
- })).resolves.toBe(false);
55
- });
56
- });
57
- describe('waitForStartupCrash', () => {
58
- it('does not install a startup crash watch when native crash detection is disabled', async () => {
59
- const watch = vi.fn();
60
- const crashMonitor = {
61
- watch,
62
- };
63
- const controller = new AbortController();
64
- const waitPromise = waitForStartupCrash({
65
- crashMonitor,
66
- detectNativeCrashes: false,
67
- testFilePath: '/test.harness.ts',
68
- signal: controller.signal,
69
- });
70
- controller.abort(new DOMException('Aborted', 'AbortError'));
71
- await expect(waitPromise).rejects.toThrow('Aborted');
72
- expect(watch).not.toHaveBeenCalled();
73
- });
74
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=harness.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"harness.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/harness.test.ts"],"names":[],"mappings":""}