@mobilewright/driver-mobilenext 0.0.1 → 0.0.42

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.
@@ -1,70 +1,88 @@
1
- import { readFileSync } from 'node:fs';
2
- import { createRequire } from 'node:module';
3
1
  import { randomUUID } from 'node:crypto';
4
2
  import createDebug from 'debug';
5
- import { getGitInfo } from './git-info.js';
6
- const _require = createRequire(import.meta.url);
3
+ export function extractGitInfoFromReport(report) {
4
+ const config = report['config'];
5
+ const metadata = config?.['metadata'];
6
+ const gitCommit = metadata?.['gitCommit'];
7
+ if (!gitCommit) {
8
+ return undefined;
9
+ }
10
+ const author = gitCommit['author'];
11
+ const result = {
12
+ commitSha: gitCommit['hash'],
13
+ commitMessage: gitCommit['subject'],
14
+ authorName: author?.['name'],
15
+ branch: gitCommit['branch'],
16
+ };
17
+ const hasAnyField = Object.values(result).some(v => v !== undefined);
18
+ return hasAnyField ? result : undefined;
19
+ }
7
20
  const debug = createDebug('mw:reporter:upload');
8
21
  const BASE_URL = 'https://api.mobilenext.ai';
9
22
  const DASHBOARD_BASE_URL = 'https://app.mobilenext.ai';
23
+ const CONTENT_TYPE_EXTENSIONS = {
24
+ 'image/png': 'png',
25
+ 'image/jpeg': 'jpg',
26
+ 'image/webp': 'webp',
27
+ 'image/gif': 'gif',
28
+ };
10
29
  function extensionForContentType(contentType) {
11
- const extensions = {
12
- 'image/png': 'png',
13
- 'image/jpeg': 'jpg',
14
- 'image/webp': 'webp',
15
- 'image/gif': 'gif',
16
- };
17
- return extensions[contentType] ?? 'bin';
30
+ return CONTENT_TYPE_EXTENSIONS[contentType] ?? 'bin';
18
31
  }
19
- async function uploadAttachmentBodies(obj, testResultId, apiKey, fetchFn) {
20
- if (!obj || typeof obj !== 'object') {
21
- return;
22
- }
23
- if (Array.isArray(obj)) {
24
- for (const item of obj) {
25
- await uploadAttachmentBodies(item, testResultId, apiKey, fetchFn);
32
+ function makeAttachmentUploader(testResultId, apiKey, fetchFn, signal) {
33
+ async function uploadAndReplace(obj) {
34
+ if (!obj || typeof obj !== 'object') {
35
+ return;
26
36
  }
27
- return;
28
- }
29
- const record = obj;
30
- if (Array.isArray(record['attachments'])) {
31
- for (const att of record['attachments']) {
32
- if (typeof att['body'] === 'string') {
33
- const contentType = typeof att['contentType'] === 'string' ? att['contentType'] : 'application/octet-stream';
34
- const ext = extensionForContentType(contentType);
35
- const assetName = `${randomUUID()}.${ext}`;
36
- const buffer = Buffer.from(att['body'], 'base64');
37
- const sizeKB = (buffer.length / 1024).toFixed(1);
38
- debug('uploading attachment name=%s contentType=%s size=%skB as %s', att['name'], contentType, sizeKB, assetName);
39
- const form = new FormData();
40
- form.append('name', assetName);
41
- form.append('file', new Blob([buffer], { type: contentType }), assetName);
42
- const res = await fetchFn(`${BASE_URL}/api/v1/test-results/${testResultId}/assets`, {
43
- method: 'POST',
44
- headers: { 'Authorization': `Bearer ${apiKey}` },
45
- body: form,
46
- });
47
- if (!res.ok) {
48
- throw new Error(`Failed to upload attachment "${att['name']}": ${res.status}`);
37
+ if (Array.isArray(obj)) {
38
+ for (const item of obj) {
39
+ await uploadAndReplace(item);
40
+ }
41
+ return;
42
+ }
43
+ const record = obj;
44
+ if (Array.isArray(record['attachments'])) {
45
+ for (const att of record['attachments']) {
46
+ if (typeof att['body'] === 'string') {
47
+ const contentType = typeof att['contentType'] === 'string' ? att['contentType'] : 'application/octet-stream';
48
+ const ext = extensionForContentType(contentType);
49
+ const assetName = `${randomUUID()}.${ext}`;
50
+ const buffer = Buffer.from(att['body'], 'base64');
51
+ const sizeKB = (buffer.length / 1024).toFixed(1);
52
+ debug('uploading attachment name=%s contentType=%s size=%skB as %s', att['name'], contentType, sizeKB, assetName);
53
+ const form = new FormData();
54
+ form.append('name', assetName);
55
+ form.append('file', new Blob([buffer], { type: contentType }), assetName);
56
+ const res = await fetchFn(`${BASE_URL}/api/v1/test-results/${testResultId}/assets`, {
57
+ method: 'POST',
58
+ headers: { 'Authorization': `Bearer ${apiKey}` },
59
+ body: form,
60
+ ...(signal && { signal }),
61
+ });
62
+ if (!res.ok) {
63
+ const body = await res.text().catch(() => '');
64
+ debug('upload attachment failed status=%d body=%s', res.status, body);
65
+ throw new Error(`Failed to upload attachment "${att['name']}": ${res.status}${body ? ` — ${body}` : ''}`);
66
+ }
67
+ const asset = await res.json();
68
+ delete att['body'];
69
+ att['assetId'] = asset.id;
70
+ debug('attachment uploaded assetId=%s', asset.id);
49
71
  }
50
- const asset = await res.json();
51
- delete att['body'];
52
- att['assetId'] = asset.id;
53
- debug('attachment uploaded assetId=%s', asset.id);
54
72
  }
55
73
  }
74
+ for (const value of Object.values(record)) {
75
+ await uploadAndReplace(value);
76
+ }
56
77
  }
57
- for (const value of Object.values(record)) {
58
- await uploadAttachmentBodies(value, testResultId, apiKey, fetchFn);
59
- }
78
+ return uploadAndReplace;
60
79
  }
61
80
  export async function uploadTestResult(params) {
62
81
  const fetchFn = params._fetchFn ?? fetch;
63
- const pkg = _require('../package.json');
64
- const userAgent = `mobilewright/${pkg.version}`;
65
- const gitInfo = getGitInfo();
66
- const hasGitInfo = Object.values(gitInfo).some(v => v !== undefined);
67
- debug('creating test result name=%s userAgent=%s', params.name ?? 'Test Run', userAgent);
82
+ const signal = params.timeout ? AbortSignal.timeout(params.timeout) : undefined;
83
+ const hasGitInfo = params.gitInfo !== undefined && Object.values(params.gitInfo).some(v => v !== undefined);
84
+ const stats = params.report['stats'];
85
+ debug('creating test result name=%s userAgent=%s', params.name ?? 'Test Run', params.userAgent);
68
86
  const createRes = await fetchFn(`${BASE_URL}/api/v1/test-results`, {
69
87
  method: 'POST',
70
88
  headers: {
@@ -73,23 +91,29 @@ export async function uploadTestResult(params) {
73
91
  },
74
92
  body: JSON.stringify({
75
93
  name: params.name ?? 'Test Run',
76
- userAgent,
77
- ...(hasGitInfo ? { git: gitInfo } : {}),
94
+ userAgent: params.userAgent,
95
+ ...(hasGitInfo ? { git: params.gitInfo } : {}),
96
+ ...(params.tags?.length ? { tags: params.tags } : {}),
97
+ ...(params.environment ? { environment: params.environment } : {}),
98
+ ...(stats !== undefined ? { stats } : {}),
78
99
  }),
100
+ ...(signal && { signal }),
79
101
  });
80
102
  if (!createRes.ok) {
81
- throw new Error(`Failed to create test result: ${createRes.status}`);
103
+ const body = await createRes.text().catch(() => '');
104
+ debug('create test result failed status=%d body=%s', createRes.status, body);
105
+ throw new Error(`Failed to create test result: ${createRes.status}${body ? ` — ${body}` : ''}`);
82
106
  }
83
107
  const testResult = await createRes.json();
84
108
  debug('test result created id=%s', testResult.id);
85
- // Parse into a fresh in-memory copy original file on disk is never modified
86
- const rawJson = readFileSync(params.jsonResultsPath);
87
- const report = JSON.parse(rawJson.toString());
88
- await uploadAttachmentBodies(report, testResult.id, params.apiKey, fetchFn);
109
+ // Deep-clone so attachment body replacement does not mutate the caller's object
110
+ const report = JSON.parse(JSON.stringify(params.report));
111
+ const uploadAndReplace = makeAttachmentUploader(testResult.id, params.apiKey, fetchFn, signal);
112
+ await uploadAndReplace(report);
89
113
  const modifiedJson = JSON.stringify(report);
90
114
  const modifiedBuffer = Buffer.from(modifiedJson);
91
115
  const fileSizeKB = (modifiedBuffer.length / 1024).toFixed(1);
92
- debug('uploading report.json size=%skB path=%s', fileSizeKB, params.jsonResultsPath);
116
+ debug('uploading report.json size=%skB', fileSizeKB);
93
117
  const form = new FormData();
94
118
  form.append('name', 'report.json');
95
119
  form.append('file', new Blob([modifiedBuffer], { type: 'application/json' }), 'report.json');
@@ -100,9 +124,12 @@ export async function uploadTestResult(params) {
100
124
  method: 'POST',
101
125
  headers: { 'Authorization': `Bearer ${params.apiKey}` },
102
126
  body: form,
127
+ ...(signal && { signal }),
103
128
  }).finally(() => clearInterval(progressTimer));
104
129
  if (!uploadRes.ok) {
105
- throw new Error(`Failed to upload report.json: ${uploadRes.status}`);
130
+ const body = await uploadRes.text().catch(() => '');
131
+ debug('upload report.json failed status=%d body=%s', uploadRes.status, body);
132
+ throw new Error(`Failed to upload report.json: ${uploadRes.status}${body ? ` — ${body}` : ''}`);
106
133
  }
107
134
  debug('upload complete url=%s', `${DASHBOARD_BASE_URL}/dashboard/test-results/${testResult.id}`);
108
135
  return { url: `${DASHBOARD_BASE_URL}/dashboard/test-results/${testResult.id}` };
@@ -1 +1 @@
1
- {"version":3,"file":"upload-client.js","sourceRoot":"","sources":["../src/upload-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upload-client.js","sourceRoot":"","sources":["../src/upload-client.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,5 @@
1
1
  import { test, expect } from '@playwright/test';
2
- import { writeFileSync, mkdtempSync, rmSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { tmpdir } from 'node:os';
5
- import { uploadTestResult } from './upload-client.js';
2
+ import { uploadTestResult, extractGitInfoFromReport } from './upload-client.js';
6
3
  function makeMockFetch(testResultId) {
7
4
  const calls = [];
8
5
  const mockFetch = async (url, init) => {
@@ -17,51 +14,40 @@ function makeMockFetch(testResultId) {
17
14
  return { mockFetch: mockFetch, calls };
18
15
  }
19
16
  test('sends POST to test-results endpoint with apiKey, name, and userAgent', async () => {
20
- const workDir = mkdtempSync(join(tmpdir(), 'mw-upload-test-'));
21
- const jsonPath = join(workDir, 'results.json');
22
- writeFileSync(jsonPath, '{"tests":[]}');
23
17
  const { mockFetch, calls } = makeMockFetch('result-abc');
24
18
  await uploadTestResult({
25
19
  apiKey: 'mob_test_key',
26
- jsonResultsPath: jsonPath,
27
- outputDir: join(workDir, 'artifacts'),
20
+ report: { tests: [] },
21
+ userAgent: 'mobilewright/1.2.3',
28
22
  _fetchFn: mockFetch,
29
23
  });
30
24
  const createCall = calls.find(c => c.url === 'https://api.mobilenext.ai/api/v1/test-results');
31
25
  expect(createCall?.method).toBe('POST');
32
26
  const body = JSON.parse(createCall?.body);
33
27
  expect(body.name).toBe('Test Run');
34
- expect(body.userAgent).toMatch(/^mobilewright\//);
28
+ expect(body.userAgent).toBe('mobilewright/1.2.3');
35
29
  expect(createCall?.headers['Authorization']).toBe('Bearer mob_test_key');
36
30
  expect(createCall?.headers['Content-Type']).toBe('application/json');
37
- rmSync(workDir, { recursive: true });
38
31
  });
39
32
  test('uses provided name in the create test result request', async () => {
40
- const workDir = mkdtempSync(join(tmpdir(), 'mw-upload-test-'));
41
- const jsonPath = join(workDir, 'results.json');
42
- writeFileSync(jsonPath, '{}');
43
33
  const { mockFetch, calls } = makeMockFetch('result-abc');
44
34
  await uploadTestResult({
45
35
  apiKey: 'mob_key',
46
- jsonResultsPath: jsonPath,
47
- outputDir: join(workDir, 'artifacts'),
36
+ report: {},
37
+ userAgent: 'mobilewright/test',
48
38
  name: 'Nightly Suite',
49
39
  _fetchFn: mockFetch,
50
40
  });
51
41
  const createCall = calls.find(c => c.url === 'https://api.mobilenext.ai/api/v1/test-results');
52
42
  const body = JSON.parse(createCall?.body);
53
43
  expect(body.name).toBe('Nightly Suite');
54
- rmSync(workDir, { recursive: true });
55
44
  });
56
45
  test('uploads report.json as multipart FormData to the asset endpoint', async () => {
57
- const workDir = mkdtempSync(join(tmpdir(), 'mw-upload-test-'));
58
- const jsonPath = join(workDir, 'results.json');
59
- writeFileSync(jsonPath, '{"tests":[]}');
60
46
  const { mockFetch, calls } = makeMockFetch('result-abc');
61
47
  await uploadTestResult({
62
48
  apiKey: 'mob_test_key',
63
- jsonResultsPath: jsonPath,
64
- outputDir: join(workDir, 'artifacts'),
49
+ report: { tests: [] },
50
+ userAgent: 'mobilewright/test',
65
51
  _fetchFn: mockFetch,
66
52
  });
67
53
  const assetCall = calls.find(c => c.url.includes('/assets'));
@@ -69,39 +55,85 @@ test('uploads report.json as multipart FormData to the asset endpoint', async ()
69
55
  expect(assetCall?.method).toBe('POST');
70
56
  expect(assetCall?.body).toBeInstanceOf(FormData);
71
57
  expect(assetCall?.headers['Authorization']).toBe('Bearer mob_test_key');
72
- rmSync(workDir, { recursive: true });
73
58
  });
74
59
  test('returns the dashboard URL for the created test result', async () => {
75
- const workDir = mkdtempSync(join(tmpdir(), 'mw-upload-test-'));
76
- const jsonPath = join(workDir, 'results.json');
77
- writeFileSync(jsonPath, '{}');
78
60
  const { mockFetch } = makeMockFetch('my-test-id-123');
79
61
  const result = await uploadTestResult({
80
62
  apiKey: 'mob_key',
81
- jsonResultsPath: jsonPath,
82
- outputDir: join(workDir, 'artifacts'),
63
+ report: {},
64
+ userAgent: 'mobilewright/test',
83
65
  _fetchFn: mockFetch,
84
66
  });
85
67
  expect(result.url).toBe('https://app.mobilenext.ai/dashboard/test-results/my-test-id-123');
86
- rmSync(workDir, { recursive: true });
68
+ });
69
+ test('includes git metadata in the create request when gitInfo is provided', async () => {
70
+ const { mockFetch, calls } = makeMockFetch('result-abc');
71
+ await uploadTestResult({
72
+ apiKey: 'mob_key',
73
+ report: {},
74
+ userAgent: 'mobilewright/test',
75
+ gitInfo: { branch: 'main', commitSha: 'abc123', authorName: 'alice' },
76
+ _fetchFn: mockFetch,
77
+ });
78
+ const createCall = calls.find(c => c.url.endsWith('/test-results'));
79
+ const body = JSON.parse(createCall?.body);
80
+ expect(body.git.branch).toBe('main');
81
+ expect(body.git.commitSha).toBe('abc123');
82
+ expect(body.git.authorName).toBe('alice');
83
+ });
84
+ test('omits git field when gitInfo is undefined', async () => {
85
+ const { mockFetch, calls } = makeMockFetch('result-abc');
86
+ await uploadTestResult({
87
+ apiKey: 'mob_key',
88
+ report: {},
89
+ userAgent: 'mobilewright/test',
90
+ _fetchFn: mockFetch,
91
+ });
92
+ const createCall = calls.find(c => c.url.endsWith('/test-results'));
93
+ const body = JSON.parse(createCall?.body);
94
+ expect(body.git).toBeUndefined();
95
+ });
96
+ test('includes tags, environment, and stats in the create request', async () => {
97
+ const { mockFetch, calls } = makeMockFetch('result-abc');
98
+ const stats = { startTime: '2026-01-01T00:00:00Z', duration: 5000, expected: 3, skipped: 1, unexpected: 0, flaky: 0 };
99
+ await uploadTestResult({
100
+ apiKey: 'mob_key',
101
+ report: { stats },
102
+ userAgent: 'mobilewright/test',
103
+ tags: ['ci', 'nightly'],
104
+ environment: 'staging',
105
+ _fetchFn: mockFetch,
106
+ });
107
+ const createCall = calls.find(c => c.url.endsWith('/test-results'));
108
+ const body = JSON.parse(createCall?.body);
109
+ expect(body.tags).toEqual(['ci', 'nightly']);
110
+ expect(body.environment).toBe('staging');
111
+ expect(body.stats).toEqual(stats);
112
+ });
113
+ test('omits tags, environment, and stats when not present', async () => {
114
+ const { mockFetch, calls } = makeMockFetch('result-abc');
115
+ await uploadTestResult({
116
+ apiKey: 'mob_key',
117
+ report: {},
118
+ userAgent: 'mobilewright/test',
119
+ _fetchFn: mockFetch,
120
+ });
121
+ const createCall = calls.find(c => c.url.endsWith('/test-results'));
122
+ const body = JSON.parse(createCall?.body);
123
+ expect(body.tags).toBeUndefined();
124
+ expect(body.environment).toBeUndefined();
125
+ expect(body.stats).toBeUndefined();
87
126
  });
88
127
  test('throws when create test result API returns a non-2xx status', async () => {
89
- const workDir = mkdtempSync(join(tmpdir(), 'mw-upload-test-'));
90
- const jsonPath = join(workDir, 'results.json');
91
- writeFileSync(jsonPath, '{}');
92
128
  const failingFetch = async (_url, _init) => new Response(JSON.stringify({ error: 'Unauthorized' }), { status: 401 });
93
129
  await expect(uploadTestResult({
94
130
  apiKey: 'bad-key',
95
- jsonResultsPath: jsonPath,
96
- outputDir: join(workDir, 'artifacts'),
131
+ report: {},
132
+ userAgent: 'mobilewright/test',
97
133
  _fetchFn: failingFetch,
98
134
  })).rejects.toThrow('401');
99
- rmSync(workDir, { recursive: true });
100
135
  });
101
136
  test('throws when asset upload API returns a non-2xx status', async () => {
102
- const workDir = mkdtempSync(join(tmpdir(), 'mw-upload-test-'));
103
- const jsonPath = join(workDir, 'results.json');
104
- writeFileSync(jsonPath, '{}');
105
137
  const mockFetch = async (url, _init) => {
106
138
  if (String(url).endsWith('/test-results')) {
107
139
  return new Response(JSON.stringify({ id: 'result-abc', name: 'Test Run', userAgent: 'mobilewright/0.0.1', createdAt: '2026-01-01T00:00:00Z' }), { status: 201 });
@@ -110,22 +142,18 @@ test('throws when asset upload API returns a non-2xx status', async () => {
110
142
  };
111
143
  await expect(uploadTestResult({
112
144
  apiKey: 'mob_key',
113
- jsonResultsPath: jsonPath,
114
- outputDir: join(workDir, 'artifacts'),
145
+ report: {},
146
+ userAgent: 'mobilewright/test',
115
147
  _fetchFn: mockFetch,
116
148
  })).rejects.toThrow('500');
117
- rmSync(workDir, { recursive: true });
118
149
  });
119
150
  test('uploads inline attachment bodies as separate assets before report.json', async () => {
120
- const workDir = mkdtempSync(join(tmpdir(), 'mw-upload-test-'));
121
- const jsonPath = join(workDir, 'results.json');
122
151
  const pngBase64 = Buffer.from('fake-png-data').toString('base64');
123
152
  const report = {
124
153
  suites: [{ specs: [{ tests: [{ results: [{ attachments: [
125
154
  { name: 'screenshot', contentType: 'image/png', body: pngBase64 },
126
155
  ] }] }] }] }],
127
156
  };
128
- writeFileSync(jsonPath, JSON.stringify(report));
129
157
  let assetCallCount = 0;
130
158
  const mockFetch = async (url, init) => {
131
159
  const urlStr = String(url);
@@ -137,24 +165,20 @@ test('uploads inline attachment bodies as separate assets before report.json', a
137
165
  };
138
166
  await uploadTestResult({
139
167
  apiKey: 'mob_key',
140
- jsonResultsPath: jsonPath,
141
- outputDir: join(workDir, 'artifacts'),
168
+ report,
169
+ userAgent: 'mobilewright/test',
142
170
  _fetchFn: mockFetch,
143
171
  });
144
172
  // 2 asset calls: one for the PNG attachment, one for report.json
145
173
  expect(assetCallCount).toBe(2);
146
- rmSync(workDir, { recursive: true });
147
174
  });
148
175
  test('removes body and sets assetId in the uploaded report.json', async () => {
149
- const workDir = mkdtempSync(join(tmpdir(), 'mw-upload-test-'));
150
- const jsonPath = join(workDir, 'results.json');
151
176
  const pngBase64 = Buffer.from('fake-png-data').toString('base64');
152
177
  const report = {
153
178
  suites: [{ specs: [{ tests: [{ results: [{ attachments: [
154
179
  { name: 'screenshot', contentType: 'image/png', body: pngBase64 },
155
180
  ] }] }] }] }],
156
181
  };
157
- writeFileSync(jsonPath, JSON.stringify(report));
158
182
  let assetCallCount = 0;
159
183
  let capturedReportForm;
160
184
  const mockFetch = async (url, init) => {
@@ -170,8 +194,8 @@ test('removes body and sets assetId in the uploaded report.json', async () => {
170
194
  };
171
195
  await uploadTestResult({
172
196
  apiKey: 'mob_key',
173
- jsonResultsPath: jsonPath,
174
- outputDir: join(workDir, 'artifacts'),
197
+ report,
198
+ userAgent: 'mobilewright/test',
175
199
  _fetchFn: mockFetch,
176
200
  });
177
201
  const reportFile = capturedReportForm?.get('file');
@@ -179,39 +203,29 @@ test('removes body and sets assetId in the uploaded report.json', async () => {
179
203
  const att = parsedReport.suites[0].specs[0].tests[0].results[0].attachments[0];
180
204
  expect(att['body']).toBeUndefined();
181
205
  expect(att['assetId']).toBe('asset-1');
182
- rmSync(workDir, { recursive: true });
183
206
  });
184
- test('does not modify the original json file on disk', async () => {
185
- const workDir = mkdtempSync(join(tmpdir(), 'mw-upload-test-'));
186
- const jsonPath = join(workDir, 'results.json');
207
+ test('does not modify the caller\'s report object', async () => {
187
208
  const pngBase64 = Buffer.from('fake-png-data').toString('base64');
188
209
  const report = {
189
210
  suites: [{ specs: [{ tests: [{ results: [{ attachments: [
190
211
  { name: 'screenshot', contentType: 'image/png', body: pngBase64 },
191
212
  ] }] }] }] }],
192
213
  };
193
- const originalJson = JSON.stringify(report);
194
- writeFileSync(jsonPath, originalJson);
195
214
  const { mockFetch } = makeMockFetch('result-abc');
196
215
  await uploadTestResult({
197
216
  apiKey: 'mob_key',
198
- jsonResultsPath: jsonPath,
199
- outputDir: join(workDir, 'artifacts'),
217
+ report,
218
+ userAgent: 'mobilewright/test',
200
219
  _fetchFn: mockFetch,
201
220
  });
202
- const { readFileSync: read } = await import('node:fs');
203
- expect(read(jsonPath, 'utf8')).toBe(originalJson);
204
- rmSync(workDir, { recursive: true });
221
+ expect(report.suites[0].specs[0].tests[0].results[0].attachments[0].body).toBe(pngBase64);
205
222
  });
206
223
  test('leaves path-based attachments unchanged', async () => {
207
- const workDir = mkdtempSync(join(tmpdir(), 'mw-upload-test-'));
208
- const jsonPath = join(workDir, 'results.json');
209
224
  const report = {
210
225
  suites: [{ specs: [{ tests: [{ results: [{ attachments: [
211
226
  { name: 'video', contentType: 'video/mp4', path: '/some/path/video.mp4' },
212
227
  ] }] }] }] }],
213
228
  };
214
- writeFileSync(jsonPath, JSON.stringify(report));
215
229
  let assetCallCount = 0;
216
230
  const mockFetch = async (url, _init) => {
217
231
  if (String(url).endsWith('/test-results')) {
@@ -222,12 +236,59 @@ test('leaves path-based attachments unchanged', async () => {
222
236
  };
223
237
  await uploadTestResult({
224
238
  apiKey: 'mob_key',
225
- jsonResultsPath: jsonPath,
226
- outputDir: join(workDir, 'artifacts'),
239
+ report,
240
+ userAgent: 'mobilewright/test',
227
241
  _fetchFn: mockFetch,
228
242
  });
229
243
  // Only 1 asset call: just report.json (no upload for path-based attachments)
230
244
  expect(assetCallCount).toBe(1);
231
- rmSync(workDir, { recursive: true });
245
+ });
246
+ test('uploadTestResult rejects when timeout is exceeded', async () => {
247
+ const slowFetch = (_url, init) => {
248
+ const signal = init?.signal;
249
+ return new Promise((resolve, reject) => {
250
+ if (signal?.aborted) {
251
+ reject(signal.reason);
252
+ return;
253
+ }
254
+ const timer = setTimeout(() => resolve(new Response('{}', { status: 200 })), 500);
255
+ signal?.addEventListener('abort', () => { clearTimeout(timer); reject(signal.reason); });
256
+ });
257
+ };
258
+ await expect(uploadTestResult({
259
+ apiKey: 'key',
260
+ report: {},
261
+ userAgent: 'test/1.0',
262
+ timeout: 50,
263
+ _fetchFn: slowFetch,
264
+ })).rejects.toThrow();
265
+ });
266
+ test('extractGitInfoFromReport returns undefined when report has no gitCommit metadata', () => {
267
+ expect(extractGitInfoFromReport({})).toBeUndefined();
268
+ expect(extractGitInfoFromReport({ config: {} })).toBeUndefined();
269
+ expect(extractGitInfoFromReport({ config: { metadata: {} } })).toBeUndefined();
270
+ });
271
+ test('extractGitInfoFromReport maps Playwright gitCommit fields to GitInfo fields', () => {
272
+ const report = {
273
+ config: {
274
+ metadata: {
275
+ gitCommit: {
276
+ hash: 'abc123def456',
277
+ subject: 'feat: add git support',
278
+ author: { name: 'Alice', email: 'alice@example.com', time: 1700000000 },
279
+ branch: 'main',
280
+ },
281
+ },
282
+ },
283
+ };
284
+ const result = extractGitInfoFromReport(report);
285
+ expect(result?.commitSha).toBe('abc123def456');
286
+ expect(result?.commitMessage).toBe('feat: add git support');
287
+ expect(result?.authorName).toBe('Alice');
288
+ expect(result?.branch).toBe('main');
289
+ });
290
+ test('extractGitInfoFromReport returns undefined when gitCommit has no recognizable fields', () => {
291
+ const report = { config: { metadata: { gitCommit: {} } } };
292
+ expect(extractGitInfoFromReport(report)).toBeUndefined();
232
293
  });
233
294
  //# sourceMappingURL=upload-client.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload-client.test.js","sourceRoot":"","sources":["../src/upload-client.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upload-client.test.js","sourceRoot":"","sources":["../src/upload-client.test.ts"],"names":[],"mappings":"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"}