Skip to content

test: update formidable to v3 #35825

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 36 additions & 37 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
"@eslint/js": "^9.19.0",
"@stylistic/eslint-plugin": "^3.0.1",
"@types/codemirror": "^5.60.7",
"@types/formidable": "^2.0.4",
"@types/formidable": "^3.4.5",
"@types/immutable": "^3.8.7",
"@types/node": "^18.19.68",
"@types/react": "^18.0.12",
Expand All @@ -84,7 +84,7 @@
"eslint-plugin-notice": "^1.0.0",
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.1.0",
"formidable": "^2.1.1",
"formidable": "^3.5.4",
"immutable": "^4.3.7",
"license-checker": "^25.0.1",
"mime": "^3.0.0",
Expand Down
20 changes: 14 additions & 6 deletions tests/config/testserver/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ export class TestServer {
readonly PREFIX: string;
readonly CROSS_PROCESS_PREFIX: string;
readonly EMPTY_PAGE: string;
private _disableRequestBodyConsumption: boolean;

static async create(dirPath: string, port: number, loopback?: string): Promise<TestServer> {
const server = new TestServer(dirPath, port, loopback);
Expand Down Expand Up @@ -185,7 +186,12 @@ export class TestServer {
return promise;
}

disableRequestBodyConsumption() {
this._disableRequestBodyConsumption = true;
}

reset() {
this._disableRequestBodyConsumption = false;
this._routes.clear();
this._auths.clear();
this._csp.clear();
Expand All @@ -207,13 +213,15 @@ export class TestServer {
else
throw error;
});
(request as any).postBody = new Promise(resolve => {
const chunks: Buffer[] = [];
request.on('data', chunk => {
chunks.push(chunk);
if (!this._disableRequestBodyConsumption) {
(request as any).postBody = new Promise(resolve => {
const chunks: Buffer[] = [];
request.on('data', chunk => {
chunks.push(chunk);
});
request.on('end', () => resolve(Buffer.concat(chunks)));
});
request.on('end', () => resolve(Buffer.concat(chunks)));
});
}
const path = url.parse(request.url!).path;
this.debugServer(`request ${request.method} ${path}`);
if (this._auths.has(path)) {
Expand Down
37 changes: 20 additions & 17 deletions tests/library/browsercontext-fetch.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -996,12 +996,13 @@ it('should encode to application/json by default', async function({ context, pag
});

it('should support multipart/form-data', async function({ context, server }) {
const formReceived = new Promise<{error: any, fields: formidable.Fields, files: Record<string, formidable.File>, serverRequest: IncomingMessage}>(resolve => {
server.disableRequestBodyConsumption();
const formReceived = new Promise<{error: any, fields: formidable.Fields, files: formidable.Files, serverRequest: IncomingMessage}>(resolve => {
server.setRoute('/empty.html', async (serverRequest, res) => {
const form = new formidable.IncomingForm();
const form = formidable();
form.parse(serverRequest, (error, fields, files) => {
server.serveFile(serverRequest, res);
resolve({ error, fields, files: files as Record<string, formidable.File>, serverRequest });
resolve({ error, fields, files, serverRequest });
});
});
});
Expand All @@ -1024,21 +1025,22 @@ it('should support multipart/form-data', async function({ context, server }) {
expect(error).toBeFalsy();
expect(serverRequest.method).toBe('POST');
expect(serverRequest.headers['content-type']).toContain('multipart/form-data');
expect(fields['firstName']).toBe('John');
expect(fields['lastName']).toBe('Doe');
expect(files['file'].originalFilename).toBe(file.name);
expect(files['file'].mimetype).toBe(file.mimeType);
expect(fs.readFileSync(files['file'].filepath).toString()).toBe(file.buffer.toString('utf8'));
expect(fields['firstName']).toEqual(['John']);
expect(fields['lastName']).toEqual(['Doe']);
expect(files['file'][0].originalFilename).toBe(file.name);
expect(files['file'][0].mimetype).toBe(file.mimeType);
expect(fs.readFileSync(files['file'][0].filepath).toString()).toBe(file.buffer.toString('utf8'));
expect(response.status()).toBe(200);
});

it('should support multipart/form-data with ReadStream values', async function({ context, page, asset, server }) {
const formReceived = new Promise<{error: any, fields: formidable.Fields, files: Record<string, formidable.File>, serverRequest: IncomingMessage}>(resolve => {
server.disableRequestBodyConsumption();
const formReceived = new Promise<{error: any, fields: formidable.Fields, files: formidable.Files, serverRequest: IncomingMessage}>(resolve => {
server.setRoute('/empty.html', async (serverRequest, res) => {
const form = new formidable.IncomingForm();
const form = formidable();
form.parse(serverRequest, (error, fields, files) => {
server.serveFile(serverRequest, res);
resolve({ error, fields, files: files as Record<string, formidable.File>, serverRequest });
resolve({ error, fields, files: files, serverRequest });
});
});
});
Expand All @@ -1057,11 +1059,11 @@ it('should support multipart/form-data with ReadStream values', async function({
expect(serverRequest.method).toBe('POST');
expect(serverRequest.headers['content-type']).toContain('multipart/form-data');
expect(serverRequest.headers['content-length']).toContain('5498');
expect(fields['firstName']).toBe('John');
expect(fields['lastName']).toBe('Doe');
expect(files['readStream'].originalFilename).toBe('simplezip.json');
expect(files['readStream'].mimetype).toBe('application/json');
expect(fs.readFileSync(files['readStream'].filepath).toString()).toBe(fs.readFileSync(asset('simplezip.json')).toString());
expect(fields['firstName']).toEqual(['John']);
expect(fields['lastName']).toEqual(['Doe']);
expect(files['readStream'][0].originalFilename).toBe('simplezip.json');
expect(files['readStream'][0].mimetype).toBe('application/json');
expect(fs.readFileSync(files['readStream'][0].filepath).toString()).toBe(fs.readFileSync(asset('simplezip.json')).toString());
expect(response.status()).toBe(200);
});

Expand All @@ -1073,9 +1075,10 @@ it('should support multipart/form-data and keep the order', async function({ con
};
given['foo'] = 'bar';
const givenKeys = Object.keys(given);
server.disableRequestBodyConsumption();
const formReceived = new Promise<{error: any, fields: formidable.Fields}>(resolve => {
server.setRoute('/empty.html', async (serverRequest, res) => {
const form = new formidable.IncomingForm();
const form = formidable();
form.parse(serverRequest, (error, fields, files) => {
server.serveFile(serverRequest, res);
resolve({ error, fields });
Expand Down
7 changes: 4 additions & 3 deletions tests/library/browsertype-connect.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -716,13 +716,14 @@ for (const kind of ['launchServer', 'run-server'] as const) {
await input.setInputFiles(uploadFile);
expect(await input.evaluate(e => (e as HTMLInputElement).files[0].name)).toBe('200MB.zip');
expect(await events.evaluate(e => e)).toEqual(['input', 'change']);
server.disableRequestBodyConsumption();
const serverFilePromise = new Promise<formidable.File>(fulfill => {
server.setRoute('/upload', async (req, res) => {
const form = new formidable.IncomingForm({ uploadDir: testInfo.outputPath() });
const form = formidable({ uploadDir: testInfo.outputPath() });
form.parse(req, function(err, fields, f) {
res.end();
const files = f as Record<string, formidable.File>;
fulfill(files.file1);
const files = f;
fulfill(files.file1[0]);
});
});
});
Expand Down
9 changes: 5 additions & 4 deletions tests/page/page-filechooser.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -245,11 +245,12 @@ test('should accept single file', async ({ page, asset }) => {
// @see https://github.com/microsoft/playwright/issues/4704
test('should not trim big uploaded files', async ({ page, server }) => {

let files: Record<string, formidable.File>;
let files: formidable.Files;
server.disableRequestBodyConsumption();
server.setRoute('/upload', async (req, res) => {
const form = new formidable.IncomingForm();
const form = formidable();
form.parse(req, function(err, fields, f) {
files = f as Record<string, formidable.File>;
files = f;
res.end();
});
});
Expand All @@ -264,7 +265,7 @@ test('should not trim big uploaded files', async ({ page, server }) => {
}, DATA_SIZE),
server.waitForRequest('/upload'),
]);
expect(files.file.size).toBe(DATA_SIZE);
expect(files.file[0].size).toBe(DATA_SIZE);
});

test('should be able to read selected file', async ({ page, asset }) => {
Expand Down
Loading
Loading