2
0
mirror of https://github.com/tenrok/axios.git synced 2026-06-17 19:21:29 +03:00
Files
axios/tests/smoke/bun/tests/formData.smoke.test.ts
T
Jay 2f52f6b13b feat: add checks to support deno and bun (#10652)
* feat: added smoke tests for deno

* feat: added bun smoke tests

* chore: added workflows for deno and bun

* chore: swap workflow implementation

* chore: apply ai suggestion

* chore: test alt install of bun deps

* chore: deno install

* chore: map bun file install

* chore: try a different approach for bun

* chore: unpack and then install for bun

* chore: remove un-needed step

* chore: try with tgx again for bun

* chore: alternative zip approach

* ci: full ci added back
2026-04-05 14:37:16 +02:00

111 lines
3.5 KiB
TypeScript

import { describe, expect, test } from 'bun:test';
import { PassThrough, Writable } from 'node:stream';
import FormDataPackage from 'form-data';
import axios from 'axios';
const createTransportMock = (
responseFactory?: (body: Buffer, options: Record<string, any>) => Record<string, any>
) => {
const transport = {
request(options: Record<string, any>, onResponse: (res: PassThrough) => void) {
const chunks: Buffer[] = [];
const req = new Writable({
write(chunk, _encoding, callback) {
chunks.push(Buffer.from(chunk));
callback();
},
}) as Writable & Record<string, any>;
req.destroyed = false;
req.setTimeout = () => {};
req.write = req.write.bind(req);
req.destroy = () => {
req.destroyed = true;
return req;
};
req.close = req.destroy;
const originalEnd = req.end.bind(req);
req.end = (...args: unknown[]) => {
originalEnd(...(args as Parameters<Writable['end']>));
const body = Buffer.concat(chunks);
const response = responseFactory ? responseFactory(body, options) : {};
const res = new PassThrough() as PassThrough & Record<string, any>;
res.statusCode = response.statusCode ?? 200;
res.statusMessage = response.statusMessage ?? 'OK';
res.headers = response.headers ?? { 'content-type': 'application/json' };
res.req = req;
onResponse(res);
res.end(response.body ?? JSON.stringify({ ok: true }));
return req;
};
return req;
},
};
return { transport };
};
const bodyAsUtf8 = (value: unknown) => {
return Buffer.isBuffer(value) ? value.toString('utf8') : String(value);
};
describe('form data', () => {
test('native Bun FormData body produces multipart/form-data content-type', async () => {
const form = new FormData();
form.append('username', 'janedoe');
form.append('role', 'admin');
const { transport } = createTransportMock((body, options) => ({
body: JSON.stringify({
contentType:
options.headers && (options.headers['Content-Type'] || options.headers['content-type']),
payload: bodyAsUtf8(body),
}),
}));
const response = await axios.post('http://example.com/form', form, {
adapter: 'http',
proxy: false,
transport,
});
expect(response.data.contentType).toContain('multipart/form-data');
expect(response.data.payload).toContain('name="username"');
expect(response.data.payload).toContain('janedoe');
expect(response.data.payload).toContain('name="role"');
expect(response.data.payload).toContain('admin');
});
test('npm form-data package instance is serialized correctly', async () => {
const form = new FormDataPackage();
form.append('project', 'axios');
form.append('mode', 'compat');
const { transport } = createTransportMock((body, options) => ({
body: JSON.stringify({
contentType:
options.headers && (options.headers['Content-Type'] || options.headers['content-type']),
payload: bodyAsUtf8(body),
}),
}));
const response = await axios.post('http://example.com/npm-form-data', form as any, {
adapter: 'http',
proxy: false,
transport,
});
expect(response.data.contentType).toContain('multipart/form-data');
expect(response.data.payload).toContain('name="project"');
expect(response.data.payload).toContain('axios');
expect(response.data.payload).toContain('name="mode"');
expect(response.data.payload).toContain('compat');
});
});