refactor(api): simplify user tests (#51111)

This commit is contained in:
Oliver Eyton-Williams
2023-07-31 16:08:05 +02:00
committed by GitHub
parent 12abcf94b2
commit c2fff83d41
5 changed files with 52 additions and 55 deletions

View File

@@ -1,6 +1,7 @@
import request from 'supertest';
import { build } from './src/app';
import { defaultUser } from './src/utils/default-user';
type FastifyTestInstance = Awaited<ReturnType<typeof build>>;
@@ -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<string[]> {
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');
}

View File

@@ -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', () => {

View File

@@ -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', () => {

View File

@@ -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', () => {

View File

@@ -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 () => {