Media E2E tests: Add error handling for upload cleanup

Previously, `fs.rmdir` was called multiple times on the same path,
even when the path was already deleted.
This causes test failures in Node 16.

This commit extracts the cleanup code into a utility function
and ensures that no error is thrown when the given path is already deleted.

Signed-off-by: David Mehren <git@herrmehren.de>
This commit is contained in:
David Mehren 2021-04-22 21:29:23 +02:00
parent 20f527eb80
commit 79065b8d3f
No known key found for this signature in database
GPG key ID: 185982BA4C42B7C3
3 changed files with 31 additions and 6 deletions

View file

@ -26,6 +26,7 @@ import { join } from 'path';
import { PrivateApiModule } from '../../src/api/private/private-api.module'; import { PrivateApiModule } from '../../src/api/private/private-api.module';
import { UsersService } from '../../src/users/users.service'; import { UsersService } from '../../src/users/users.service';
import { ConsoleLoggerService } from '../../src/logger/console-logger.service'; import { ConsoleLoggerService } from '../../src/logger/console-logger.service';
import { ensureDeleted } from '../utils';
describe('Media', () => { describe('Media', () => {
let app: NestExpressApplication; let app: NestExpressApplication;
@ -95,7 +96,7 @@ describe('Media', () => {
}); });
describe('fails:', () => { describe('fails:', () => {
beforeEach(async () => { beforeEach(async () => {
await fs.rmdir(uploadPath, { recursive: true }); await ensureDeleted(uploadPath);
}); });
it('MIME type not supported', async () => { it('MIME type not supported', async () => {
await request(app.getHttpServer()) await request(app.getHttpServer())
@ -125,14 +126,14 @@ describe('Media', () => {
.expect(500); .expect(500);
}); });
afterEach(async () => { afterEach(async () => {
await fs.rmdir(uploadPath, { recursive: true }); await ensureDeleted(uploadPath);
}); });
}); });
}); });
afterAll(async () => { afterAll(async () => {
// Delete the upload folder // Delete the upload folder
await fs.rmdir(uploadPath, { recursive: true }); await ensureDeleted(uploadPath);
await app.close(); await app.close();
}); });
}); });

View file

@ -25,6 +25,7 @@ import { TokenAuthGuard } from '../../src/auth/token-auth.guard';
import { MockAuthGuard } from '../../src/auth/mock-auth.guard'; import { MockAuthGuard } from '../../src/auth/mock-auth.guard';
import { join } from 'path'; import { join } from 'path';
import { ConsoleLoggerService } from '../../src/logger/console-logger.service'; import { ConsoleLoggerService } from '../../src/logger/console-logger.service';
import { ensureDeleted } from '../utils';
describe('Media', () => { describe('Media', () => {
let app: NestExpressApplication; let app: NestExpressApplication;
@ -91,7 +92,7 @@ describe('Media', () => {
}); });
describe('fails:', () => { describe('fails:', () => {
beforeEach(async () => { beforeEach(async () => {
await fs.rmdir(uploadPath, { recursive: true }); await ensureDeleted(uploadPath);
}); });
it('MIME type not supported', async () => { it('MIME type not supported', async () => {
await request(app.getHttpServer()) await request(app.getHttpServer())
@ -121,7 +122,7 @@ describe('Media', () => {
.expect(500); .expect(500);
}); });
afterEach(async () => { afterEach(async () => {
await fs.rmdir(uploadPath, { recursive: true }); await ensureDeleted(uploadPath);
}); });
}); });
}); });
@ -141,7 +142,7 @@ describe('Media', () => {
afterAll(async () => { afterAll(async () => {
// Delete the upload folder // Delete the upload folder
await fs.rmdir(uploadPath, { recursive: true }); await ensureDeleted(uploadPath);
await app.close(); await app.close();
}); });
}); });

23
test/utils.ts Normal file
View file

@ -0,0 +1,23 @@
/*
* SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file)
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { promises as fs } from 'fs';
/**
* Ensures the directory at `path` is deleted.
* If `path` does not exist, nothing happens.
*/
export async function ensureDeleted(path: string): Promise<void> {
try {
await fs.rmdir(path, { recursive: true });
} catch (e) {
if (e.code && e.code == 'ENOENT') {
// ignore error, path is already deleted
return;
}
throw e;
}
}