Skip to content

Commit bc0d94a

Browse files
committed
Add tests for admin creation/deletion
1 parent d4e2368 commit bc0d94a

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

src/api/users.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const router = require('express').Router()
22

3-
const { requireUser, failIfErrors } = require('./util')
3+
const { requireUser, failIfErrors, ApiError } = require('./util')
44

55
const { User, Course } = require('../models')
66

@@ -68,7 +68,13 @@ router.delete(
6868
'/admins/:userId',
6969
[requireAdmin, requireUser, failIfErrors],
7070
safeAsync(async (req, res, _next) => {
71+
const { id } = res.locals.userAuthn
7172
const { user } = res.locals
73+
// Prevent user from removing themselves as an admin
74+
if (user.id === id) {
75+
_next(new ApiError(403, 'You cannot remove yourself'))
76+
return
77+
}
7278
if (user.isAdmin) {
7379
user.isAdmin = false
7480
await user.save()

src/api/users.test.js

+51-2
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ const app = require('../app')
44
const testutil = require('../../test/util')
55
const { requestAsUser } = require('../../test/util')
66

7-
beforeAll(async () => {
7+
beforeEach(async () => {
88
await testutil.setupTestDb()
99
await testutil.populateTestDb()
1010
})
1111

12-
afterAll(async () => {
12+
afterEach(async () => {
1313
await testutil.destroyTestDb()
1414
})
1515

@@ -61,6 +61,55 @@ describe('Users API', () => {
6161
})
6262
})
6363

64+
describe('PUT /api/users/admins/:userId', () => {
65+
test('succeeds for existing admin', async () => {
66+
const request = await requestAsUser(app, 'dev')
67+
// make "225staff" an admin
68+
const res = await request.put('/api/users/admins/3')
69+
expect(res.statusCode).toBe(201)
70+
expect(res.body.isAdmin).toBe(true)
71+
})
72+
73+
test('fails for non-admin', async () => {
74+
const request = await requestAsUser(app, '241staff')
75+
const res = await request.put('/api/users/admins/3')
76+
expect(res.statusCode).toBe(403)
77+
})
78+
79+
test('fails for student', async () => {
80+
const request = await requestAsUser(app, 'student')
81+
const res = await request.put('/api/users/admins/3')
82+
expect(res.statusCode).toBe(403)
83+
})
84+
})
85+
86+
describe('DELETE /api/users/admins/:userId', () => {
87+
test('succeeds for existing admin', async () => {
88+
const request = await requestAsUser(app, 'dev')
89+
// make "admin" not an admin
90+
const res = await request.delete('/api/users/admins/2')
91+
expect(res.statusCode).toBe(204)
92+
})
93+
94+
test('fails for self', async () => {
95+
const request = await requestAsUser(app, 'dev')
96+
const res = await request.delete('/api/users/admins/1')
97+
expect(res.statusCode).toBe(403)
98+
})
99+
100+
test('fails for non-admin', async () => {
101+
const request = await requestAsUser(app, '241staff')
102+
const res = await request.delete('/api/users/admins/2')
103+
expect(res.statusCode).toBe(403)
104+
})
105+
106+
test('fails for student', async () => {
107+
const request = await requestAsUser(app, 'student')
108+
const res = await request.delete('/api/users/admins/2')
109+
expect(res.statusCode).toBe(403)
110+
})
111+
})
112+
64113
describe('GET /api/users', () => {
65114
test('returns all users for admin', async () => {
66115
const request = await requestAsUser(app, 'admin')

0 commit comments

Comments
 (0)