diff --git a/src/lib/routes/admin-api/project/api-token.ts b/src/lib/routes/admin-api/project/api-token.ts index 3b6b0013e1..5509856175 100644 --- a/src/lib/routes/admin-api/project/api-token.ts +++ b/src/lib/routes/admin-api/project/api-token.ts @@ -130,7 +130,7 @@ export class ProjectApiTokenController extends Controller { description: `This operation deletes the API token specified in the request URL. If the token doesn't exist, returns an OK response (status code 200).`, responses: { 200: emptyResponse, - ...getStandardResponses(401, 403), + ...getStandardResponses(400, 401, 403, 404), }, }), ], @@ -213,6 +213,10 @@ export class ProjectApiTokenController extends Controller { await this.apiTokenService.delete(token, extractUsername(req)); await this.proxyService.deleteClientForProxyToken(token); res.status(200).end(); + } else if (!storedToken) { + res.status(404).end(); + } else { + res.status(400).end(); } } diff --git a/src/test/e2e/api/admin/project/project.api.tokens.e2e.test.ts b/src/test/e2e/api/admin/project/project.api.tokens.e2e.test.ts index e60e02100b..bbb483da92 100644 --- a/src/test/e2e/api/admin/project/project.api.tokens.e2e.test.ts +++ b/src/test/e2e/api/admin/project/project.api.tokens.e2e.test.ts @@ -113,3 +113,36 @@ test('Deletes existing tokens', async () => { .set('Content-Type', 'application/json') .expect(200); }); + +test('Returns Not Found when deleting non-existing tokens', async () => { + const tokenSecret = 'random-secret'; + + return app.request + .delete(`/api/admin/projects/default/api-tokens/${tokenSecret}`) + .set('Content-Type', 'application/json') + .expect(404); +}); + +test('Returns Bad Request when deleting tokens with more than one project', async () => { + const tokenSecret = 'random-secret'; + + await db.stores.projectStore.create({ + id: 'other', + name: 'other', + description: 'other', + mode: 'open', + }); + + await db.stores.apiTokenStore.insert({ + tokenName: 'test', + secret: tokenSecret, + type: ApiTokenType.CLIENT, + environment: 'default', + projects: ['default', 'other'], + }); + + return app.request + .delete(`/api/admin/projects/default/api-tokens/${tokenSecret}`) + .set('Content-Type', 'application/json') + .expect(400); +});