From c2fff83d41af409abb13ad73dd0b27e96fbd1d37 Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Mon, 31 Jul 2023 16:08:05 +0200 Subject: [PATCH] refactor(api): simplify user tests (#51111) --- api/jest.utils.ts | 21 +++++++++++++ api/src/routes/challenge.test.ts | 6 ++-- api/src/routes/donate.test.ts | 13 ++------ api/src/routes/settings.test.ts | 13 +++----- api/src/routes/user.test.ts | 54 +++++++++++++------------------- 5 files changed, 52 insertions(+), 55 deletions(-) diff --git a/api/jest.utils.ts b/api/jest.utils.ts index 0591fc98ccd..612b728f0d7 100644 --- a/api/jest.utils.ts +++ b/api/jest.utils.ts @@ -1,6 +1,7 @@ import request from 'supertest'; import { build } from './src/app'; +import { defaultUser } from './src/utils/default-user'; type FastifyTestInstance = Awaited>; @@ -73,3 +74,23 @@ export function setupServer(): void { await fastifyTestInstance.close(); }); } + +export const defaultUserId = '64c7810107dd4782d32baee7'; +export const defaultUserEmail = 'foo@bar.com'; + +export async function devLogin(): Promise { + await fastifyTestInstance.prisma.user.deleteMany({ + where: { email: 'foo@bar.com' } + }); + + await fastifyTestInstance.prisma.user.create({ + data: { + ...defaultUser, + id: defaultUserId, + email: defaultUserEmail + } + }); + const res = await superRequest('/auth/dev-callback', { method: 'GET' }); + expect(res.status).toBe(200); + return res.get('Set-Cookie'); +} diff --git a/api/src/routes/challenge.test.ts b/api/src/routes/challenge.test.ts index 5bae9fb4389..5734b76414d 100644 --- a/api/src/routes/challenge.test.ts +++ b/api/src/routes/challenge.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ import { challengeTypes } from '../../../config/challenge-types'; -import { setupServer, superRequest } from '../../jest.utils'; +import { devLogin, setupServer, superRequest } from '../../jest.utils'; const isValidChallengeCompletionErrorMsg = { type: 'error', @@ -43,9 +43,7 @@ describe('challengeRoutes', () => { // Authenticate user beforeAll(async () => { - const res = await superRequest('/auth/dev-callback', { method: 'GET' }); - expect(res.status).toBe(200); - setCookies = res.get('Set-Cookie'); + setCookies = await devLogin(); }); describe('/project-completed', () => { diff --git a/api/src/routes/donate.test.ts b/api/src/routes/donate.test.ts index 3d1427eb8ad..cc4f15845dd 100644 --- a/api/src/routes/donate.test.ts +++ b/api/src/routes/donate.test.ts @@ -1,6 +1,4 @@ -import request from 'supertest'; - -import { setupServer, superRequest } from '../../jest.utils'; +import { devLogin, setupServer, superRequest } from '../../jest.utils'; describe('Donate', () => { setupServer(); @@ -9,14 +7,7 @@ describe('Donate', () => { let setCookies: string[]; beforeEach(async () => { - await fastifyTestInstance.prisma.user.updateMany({ - where: { email: 'foo@bar.com' }, - data: { isDonating: false } - }); - const res = await request(fastifyTestInstance.server).get( - '/auth/dev-callback' - ); - setCookies = res.get('Set-Cookie'); + setCookies = await devLogin(); }); describe('POST /donate/add-donation', () => { diff --git a/api/src/routes/settings.test.ts b/api/src/routes/settings.test.ts index e699c8b62ac..fe0068bff07 100644 --- a/api/src/routes/settings.test.ts +++ b/api/src/routes/settings.test.ts @@ -1,6 +1,4 @@ -import request from 'supertest'; - -import { setupServer, superRequest } from '../../jest.utils'; +import { devLogin, setupServer, superRequest } from '../../jest.utils'; const baseProfileUI = { isLocked: false, @@ -83,15 +81,14 @@ describe('settingRoutes', () => { // Authenticate user beforeAll(async () => { + setCookies = await devLogin(); + // This is not strictly necessary, since the defaultUser has this + // profileUI, but we're interested in how the profileUI is updated. As + // such, setting this explicitly isolates these tests. await fastifyTestInstance.prisma.user.updateMany({ where: { email: 'foo@bar.com' }, data: { profileUI: baseProfileUI } }); - const res = await request(fastifyTestInstance.server).get( - '/auth/dev-callback' - ); - expect(res.status).toBe(200); - setCookies = res.get('Set-Cookie'); }); describe('/update-my-profileui', () => { diff --git a/api/src/routes/user.test.ts b/api/src/routes/user.test.ts index 4a856c9c851..eeb9dff3be5 100644 --- a/api/src/routes/user.test.ts +++ b/api/src/routes/user.test.ts @@ -7,14 +7,20 @@ import { ObjectId } from 'mongodb'; import _ from 'lodash'; import { defaultUser } from '../utils/default-user'; -import { setupServer, superRequest } from '../../jest.utils'; +import { + defaultUserId, + defaultUserEmail, + devLogin, + setupServer, + superRequest +} from '../../jest.utils'; import { JWT_SECRET } from '../utils/env'; import { encodeUserToken } from '../utils/user-token'; // This is used to build a test user. const testUserData: Prisma.userCreateInput = { ...defaultUser, - email: 'foo@bar.com', + email: defaultUserEmail, username: 'foobar', usernameDisplay: 'Foo Bar', progressTimestamps: [1520002973119, 1520440323273], @@ -251,6 +257,8 @@ const modifiedProgressData = { needsModeration: true }; +const userTokenId = 'dummy-id'; + describe('userRoutes', () => { setupServer(); @@ -258,9 +266,7 @@ describe('userRoutes', () => { let setCookies: string[]; beforeEach(async () => { - const res = await superRequest('/auth/dev-callback', { method: 'GET' }); - expect(res.status).toBe(200); - setCookies = res.get('Set-Cookie'); + setCookies = await devLogin(); }); describe('/account/delete', () => { @@ -271,7 +277,7 @@ describe('userRoutes', () => { }); const userCount = await fastifyTestInstance.prisma.user.count({ - where: { email: 'foo@bar.com' } + where: { email: testUserData.email } }); expect(response.body).toStrictEqual({}); @@ -281,14 +287,9 @@ describe('userRoutes', () => { }); describe('/account/reset-progress', () => { - afterAll(async () => { - await fastifyTestInstance.prisma.user.deleteMany({ - where: { email: 'foo@bar.com' } - }); - }); test('POST returns 200 status code with empty object', async () => { await fastifyTestInstance.prisma.user.updateMany({ - where: { email: 'foo@bar.com' }, + where: { email: testUserData.email }, data: modifiedProgressData }); @@ -298,7 +299,7 @@ describe('userRoutes', () => { }); const user = await fastifyTestInstance.prisma.user.findFirst({ - where: { email: 'foo@bar.com' } + where: { email: testUserData.email } }); expect(response.body).toStrictEqual({}); @@ -309,19 +310,13 @@ describe('userRoutes', () => { }); }); describe('/user/user-token', () => { - let userId: string | undefined; beforeEach(async () => { - const user = await fastifyTestInstance.prisma.user.findFirstOrThrow({ - where: { email: 'foo@bar.com' } - }); - userId = user?.id; - await fastifyTestInstance.prisma.userToken.create({ data: { created: new Date(), id: '123', ttl: 1000, - userId + userId: defaultUserId } }); }); @@ -329,7 +324,7 @@ describe('userRoutes', () => { afterEach(async () => { await fastifyTestInstance.prisma.userToken.deleteMany({ where: { - userId + userId: defaultUserId } }); }); @@ -443,12 +438,12 @@ describe('userRoutes', () => { afterEach(async () => { await fastifyTestInstance.prisma.userToken.deleteMany({ - where: { id: 'dummy-id' } + where: { id: userTokenId } }); }); test('GET rejects with 500 status code if the username is missing', async () => { - await fastifyTestInstance?.prisma.user.updateMany({ + await fastifyTestInstance.prisma.user.updateMany({ where: { email: testUserData.email }, data: { username: '' } }); @@ -502,16 +497,10 @@ describe('userRoutes', () => { }); test('GET returns the userToken if it exists', async () => { - const testUser = await fastifyTestInstance.prisma.user.findFirstOrThrow( - { - where: { email: testUserData.email } - } - ); - const tokenData = { - userId: testUser.id, + userId: defaultUserId, ttl: 123, - id: 'dummy-id', + id: userTokenId, created: new Date() }; @@ -548,6 +537,7 @@ describe('userRoutes', () => { data: minimalUserData }); + // devLogin must not be used here since it overrides the user const res = await superRequest('/auth/dev-callback', { method: 'GET' }); setCookies = res.get('Set-Cookie'); @@ -622,7 +612,7 @@ describe('userRoutes', () => { setCookies }); - expect(response?.statusCode).toBe(401); + expect(response.statusCode).toBe(401); }); test('POST returns 401 status code with error message', async () => {