Skip to content

Commit a3d53e0

Browse files
authored
Merge pull request #29 from jhotmann/card-support
Update device config links on password change
2 parents 5c7fec3 + 351576a commit a3d53e0

File tree

6 files changed

+155
-3
lines changed

6 files changed

+155
-3
lines changed

Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ FROM node:16
22

33
ENV BEHIND_PROXY=true
44
ENV NODE_ENV=production
5+
ENV ADMIN_PASSWORD=pinpointadmin
6+
ENV JWT_SECRET=pleasechangeme
57

68
EXPOSE 8000
79
EXPOSE 8888

src/routes/group.test.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
const request = require('supertest');
2+
const app = require('../app');
3+
const { User } = require('../models/User');
4+
const { Group } = require('../models/Group');
5+
6+
// Create agents to save cookies
7+
const jesterAgent = request.agent(app);
8+
const friendAgent = request.agent(app);
9+
10+
let jester;
11+
let friend;
12+
let group;
13+
14+
beforeAll(async () => {
15+
// Create test users
16+
jester = await User.create('jester-group', 'jester');
17+
friend = await User.create('jester-friend', 'jester');
18+
19+
// Login
20+
await jesterAgent.post('/login')
21+
.type('form')
22+
.send({ username: 'jester-group' })
23+
.send({ password: 'jester' });
24+
25+
await friendAgent.post('/login')
26+
.type('form')
27+
.send({ username: 'jester-friend' })
28+
.send({ password: 'jester' });
29+
});
30+
31+
afterAll(async () => {
32+
// Delete all test groups
33+
await Group.remove({ adminId: jester._id }, { multi: true });
34+
35+
// Delete test users
36+
if (jester) await jester.remove();
37+
if (friend) await friend.remove();
38+
});
39+
40+
describe('Create a group', () => {
41+
test('A user can create a group that they administer', async () => {
42+
const response = await jesterAgent.post('/group/create')
43+
.type('form')
44+
.send({ groupName: 'Court Jesters' });
45+
expect(response.text).toBe('Add Successful');
46+
group = await Group.findOne({ name: 'Court Jesters', adminId: jester._id });
47+
expect(group).toBeTruthy();
48+
});
49+
});
50+
51+
describe('Invite to group', () => {
52+
test('A user can inite user to their groups', async () => {
53+
const response = await jesterAgent.post(`/group/${group._id}/invite`)
54+
.type('form')
55+
.send({ members: friend._id });
56+
expect(response.text).toBe('Done');
57+
group = await Group.findOne({ name: 'Court Jesters', adminId: jester._id });
58+
expect(group.members.length).toBe(2);
59+
});
60+
});

src/routes/logout.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const request = require('supertest');
2+
const app = require('../app');
3+
const { User } = require('../models/User');
4+
5+
let jester;
6+
const jesterAgent = request.agent(app);
7+
8+
beforeAll(async () => {
9+
jester = await User.create('jester-logout', 'jester');
10+
await jesterAgent.post('/login')
11+
.type('form')
12+
.send({ username: 'jester-logout' })
13+
.send({ password: 'jester' });
14+
});
15+
16+
afterAll(async () => {
17+
if (jester) await jester.remove();
18+
});
19+
20+
describe('Logout', () => {
21+
test('The user should be redirected to the home page', async () => {
22+
const response = await jesterAgent.get('/logout');
23+
expect(response.statusCode).toBe(302);
24+
});
25+
26+
test('The logged out user should be redirected from the user page', async () => {
27+
const response = await jesterAgent.get('/user');
28+
expect(response.statusCode).toBe(302);
29+
});
30+
});

src/routes/register.test.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
const request = require('supertest');
2+
const app = require('../app');
3+
const { User } = require('../models/User');
4+
const { Registration } = require('../models/Registration');
5+
6+
const registrations = [];
7+
8+
beforeAll(async () => {
9+
// Create registration entries
10+
registrations.push(await Registration.create());
11+
registrations.push(await Registration.create());
12+
});
13+
14+
afterAll(async () => {
15+
// Delete registration entries
16+
await Registration.remove({ guid: { $in: registrations } }, { multi: true });
17+
18+
// Delete new users
19+
await User.remove({ username: 'jester-register' });
20+
});
21+
22+
describe('Get /register page', () => {
23+
test('With valid id', async () => {
24+
const response = await request(app).get(`/register/${registrations[0]}`);
25+
expect(response.statusCode).toBe(200);
26+
expect(response.text).toMatch('Pinpoint Registration');
27+
});
28+
29+
30+
test('With invalid id', async () => {
31+
const response = await request(app).get('/register/abc123');
32+
expect(response.text).toBe('Registration Used, please request a new link.');
33+
});
34+
});
35+
36+
describe('Use registration code', () => {
37+
test('With valid id', async () => {
38+
const response = await request(app).post(`/register/${registrations[0]}`)
39+
.type('form')
40+
.send({ username: 'jester-register' })
41+
.send({ password: 'jester' });
42+
expect(response.statusCode).toBe(200);
43+
expect(response.text).toBe('Register Successful');
44+
expect((await User.find({ username: 'jester-register' })).length).toBe(1);
45+
});
46+
47+
48+
test('With invalid id', async () => {
49+
const response = await request(app).post(`/register/abc123`)
50+
.type('form')
51+
.send({ username: 'jester-register2' })
52+
.send({ password: 'jester' });
53+
expect(response.statusCode).toBe(200);
54+
expect(response.text).toBe('Registration Used, please request a new link.');
55+
});
56+
});

src/routes/user.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,12 @@ router.post('/update-friends', userMw.one, devMw.user, async (req, res) => {
110110
router.post('/reset-password', userMw.one, async (req, res) => {
111111
const { password } = req.body;
112112
const hash = await bcrypt.hash(password, 15);
113-
const result = await req.User.setPasswordHash(hash);
114-
if (result) {
113+
const updatedUser = await req.User.setPasswordHash(hash);
114+
if (updatedUser) {
115+
const devices = await req.User.getDevices();
116+
await async.eachSeries(devices, async (device) => {
117+
await device.update(device.name, device.initials, device.card, updatedUser);
118+
});
115119
res.send('Reset Successful');
116120
} else {
117121
res.send('Error');

src/views/user.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ <h5 class="modal-title" id="create-group-modal-label">Create Group</h5>
173173
<div class="modal-dialog">
174174
<div class="modal-content">
175175
<div class="modal-header">
176-
<h5 class="modal-title" id="reset-password-modal-label">Create Group</h5>
176+
<h5 class="modal-title" id="reset-password-modal-label">Change Password</h5>
177177
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
178178
</div>
179179
<div class="modal-body">

0 commit comments

Comments
 (0)