Skip to content

Commit 466fab5

Browse files
committed
fix: use conn.request
1 parent 546ebba commit 466fab5

2 files changed

Lines changed: 27 additions & 62 deletions

File tree

src/commands/data/setup/transfer.ts

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -269,39 +269,19 @@ export default class SetupTransfer extends SfCommand<SetupTransferResult> {
269269
this.spinner.status = messages.getMessage('info.callingExportApi');
270270
const sourceApiVersion = sourceConnection.version;
271271
const exportApiPath = `/services/data/v${sourceApiVersion}/connect/industries/setup/dataset/actions/export`;
272-
const instanceUrl = sourceConnection.instanceUrl ?? '';
273-
const fullUrl = `${instanceUrl}${exportApiPath}`;
274272

275-
const exportAbort = new AbortController();
276-
const exportTimeoutId = setTimeout(() => exportAbort.abort(), SetupTransfer.HTTP_TIMEOUT_MS);
277-
let httpResponse: Response;
278-
try {
279-
httpResponse = await fetch(fullUrl, {
273+
const exportResponse = await sourceConnection.request<ExportResponse>(
274+
{
280275
method: 'POST',
276+
url: exportApiPath,
277+
body: JSON.stringify(exportPayload),
281278
headers: {
282279
'Content-Type': 'application/json',
283-
Authorization: `Bearer ${sourceConnection.accessToken ?? ''}`,
284280
},
285-
body: JSON.stringify(exportPayload),
286-
signal: exportAbort.signal,
287-
});
288-
} finally {
289-
clearTimeout(exportTimeoutId);
290-
}
291-
292-
const rawBody = await httpResponse.text();
293-
294-
if (!httpResponse.ok) {
295-
throw new Error(`Export API returned ${httpResponse.status}: ${rawBody}`);
296-
}
297-
298-
// eslint-disable-next-line no-control-regex
299-
const sanitizedBody = rawBody.replace(/[\x00-\x1F\x7F]/g, (ch) =>
300-
ch === '\n' || ch === '\r' || ch === '\t' ? ch : ''
281+
},
282+
{ timeout: SetupTransfer.HTTP_TIMEOUT_MS }
301283
);
302284

303-
const exportResponse = JSON.parse(sanitizedBody) as ExportResponse;
304-
305285
const errors = exportResponse.errors as Array<{ message?: string }> | undefined;
306286
if (exportResponse.isSuccess === false) {
307287
const errorDetails = errors?.map((e) => e.message ?? JSON.stringify(e)).join('\n') ?? 'Unknown error';

test/commands/data/setup/transfer.test.ts

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,12 @@ describe('data setup transfer', () => {
4040
sfCommandStubs = stubSfCommandUx($$.SANDBOX);
4141
await $$.stubAuths(mockSourceOrg, mockTargetOrg);
4242

43-
// Stub fetch for export API
44-
$$.SANDBOX.stub(global, 'fetch').resolves({
45-
ok: true,
46-
status: 200,
47-
text: async () => JSON.stringify(mockExportResponse),
48-
} as Response);
49-
50-
// Stub connection.request for import API
51-
const targetConnection = await mockTargetOrg.getConnection();
52-
targetConnection.request = $$.SANDBOX.stub().resolves(mockImportResponse);
43+
$$.fakeConnectionRequest = (request) => {
44+
if (typeof request === 'string' || (request as { url: string }).url.includes('/export')) {
45+
return Promise.resolve(mockExportResponse);
46+
}
47+
return Promise.resolve(mockImportResponse);
48+
};
5349
});
5450

5551
afterEach(() => {
@@ -171,21 +167,15 @@ describe('data setup transfer', () => {
171167

172168
describe('error handling', () => {
173169
it('throws error when export API returns error', async () => {
174-
$$.SANDBOX.restore();
175-
await $$.stubAuths(mockSourceOrg, mockTargetOrg);
176-
177-
$$.SANDBOX.stub(global, 'fetch').resolves({
178-
ok: true,
179-
status: 200,
180-
text: async () =>
181-
JSON.stringify({
170+
$$.fakeConnectionRequest = (request) => {
171+
if (typeof request === 'string' || (request as { url: string }).url.includes('/export')) {
172+
return Promise.resolve({
182173
isSuccess: false,
183174
errors: [{ message: 'Invalid definition identifier' }],
184-
}),
185-
} as Response);
186-
187-
const targetConnection = await mockTargetOrg.getConnection();
188-
targetConnection.request = $$.SANDBOX.stub().resolves(mockImportResponse);
175+
});
176+
}
177+
return Promise.resolve(mockImportResponse);
178+
};
189179

190180
try {
191181
await SetupTransfer.run([
@@ -205,18 +195,13 @@ describe('data setup transfer', () => {
205195
}
206196
});
207197

208-
it('throws error when export API returns non-200 status', async () => {
209-
$$.SANDBOX.restore();
210-
await $$.stubAuths(mockSourceOrg, mockTargetOrg);
211-
212-
$$.SANDBOX.stub(global, 'fetch').resolves({
213-
ok: false,
214-
status: 400,
215-
text: async () => 'Bad Request',
216-
} as Response);
217-
218-
const targetConnection = await mockTargetOrg.getConnection();
219-
targetConnection.request = $$.SANDBOX.stub().resolves(mockImportResponse);
198+
it('throws error when export API request fails', async () => {
199+
$$.fakeConnectionRequest = (request) => {
200+
if (typeof request === 'string' || (request as { url: string }).url.includes('/export')) {
201+
return Promise.reject(new Error('REQUEST_FAILED: Bad Request'));
202+
}
203+
return Promise.resolve(mockImportResponse);
204+
};
220205

221206
try {
222207
await SetupTransfer.run([
@@ -231,7 +216,7 @@ describe('data setup transfer', () => {
231216
]);
232217
expect.fail('Should have thrown an error');
233218
} catch (error) {
234-
expect((error as Error).message).to.include('Export API returned 400');
219+
expect((error as Error).message).to.include('REQUEST_FAILED');
235220
}
236221
});
237222
});

0 commit comments

Comments
 (0)