import assert from 'assert'; import { getUser, startSession } from 'test/rest'; import { ApiClient } from '@/entities'; import { HttpStatusCodes } from '@/routes/types'; import { decodeApiKey } from '@/routes/utils'; describe('ApiClientController', () => { it('can generate and revoke clients', async () => { const username = (await getUser()).username; // generate client const { execute } = await startSession({ makeAdmin: true }); const generateClientResponse = await execute({ method: 'post', url: '/v3/api-keys', data: { username }, }); expect(generateClientResponse.status).toBe(HttpStatusCodes.CREATED); expect(generateClientResponse.body.apiKey).toBeDefined(); // re-generate client with same userId before revoking const reGenerateClientBeforeRevokingResponse = await execute({ method: 'post', url: '/v3/api-keys', data: { username }, }); expect(reGenerateClientBeforeRevokingResponse.status).toBe( HttpStatusCodes.CONFLICT ); expect( reGenerateClientBeforeRevokingResponse.body.reason ).toMatchInlineSnapshot(`"This user already has an api key."`); // revoke the user's client const revokeClientResponse = await execute({ method: 'delete', url: `/v3/api-keys/${username}`, }); expect(revokeClientResponse.status).toBe(HttpStatusCodes.NO_CONTENT); const client = decodeApiKey(generateClientResponse.body.apiKey); assert(client); const { clientId } = client; expect( await ApiClient.findOne({ clientId, }) ).toBeFalsy(); expect( await ApiClient.findOne( { clientId }, { withDeleted: true, } ) ).toBeDefined(); // re-generate client with same userId after revoking const reGenerateClientAfterRevokingResponse = await execute({ method: 'post', url: '/v3/api-keys', data: { username }, }); expect(reGenerateClientAfterRevokingResponse.status).toBe( HttpStatusCodes.CREATED ); expect(generateClientResponse.body.apiKey).toBeDefined(); }); it('will return 404 if user not found', async () => { const { execute } = await startSession({ makeAdmin: true }); const response = await execute({ method: 'post', url: '/v3/api-keys', data: { username: 'fake-username' }, }); expect(response.status).toBe(HttpStatusCodes.NOT_FOUND); expect(response.body.reason).toMatchInlineSnapshot(`"User not found."`); }); it('will return 404 if user not found', async () => { const { execute } = await startSession({ makeAdmin: true }); const response = await execute({ method: 'delete', url: '/v3/api-keys/fake-username', }); expect(response.status).toBe(HttpStatusCodes.NOT_FOUND); expect(response.body.reason).toMatchInlineSnapshot(`"User not found."`); }); });