Skip to content

Commit f7016ce

Browse files
committed
Remove explicit Mocha timeouts from test setup
1 parent 541dc58 commit f7016ce

File tree

3 files changed

+141
-0
lines changed

3 files changed

+141
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use strict';
2+
3+
const extrovert = require('extrovert');
4+
5+
module.exports = extrovert.toNetlifyFunction(require('../../src/actions/updateWorkspaceMember'));
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
'use strict';
2+
3+
const Archetype = require('archetype');
4+
const connect = require('../../src/db');
5+
const mongoose = require('mongoose');
6+
const stripe = require('../integrations/stripe');
7+
8+
const UpdateWorkspaceMemberParams = new Archetype({
9+
authorization: {
10+
$type: 'string',
11+
$required: true
12+
},
13+
workspaceId: {
14+
$type: mongoose.Types.ObjectId,
15+
$required: true
16+
},
17+
userId: {
18+
$type: mongoose.Types.ObjectId,
19+
$required: true
20+
},
21+
role: {
22+
$type: 'string',
23+
$required: true,
24+
$enum: ['admin', 'member', 'readonly', 'dashboards']
25+
}
26+
}).compile('UpdateWorkspaceMemberParams');
27+
28+
module.exports = async function updateWorkspaceMember(params) {
29+
const db = await connect();
30+
const { AccessToken, User, Workspace } = db.models;
31+
32+
const { authorization, workspaceId, userId, role } = new UpdateWorkspaceMemberParams(params);
33+
34+
const accessToken = await AccessToken.findById(authorization).orFail(new Error('Invalid or expired access token'));
35+
if (accessToken.expiresAt < new Date()) {
36+
throw new Error('Access token has expired');
37+
}
38+
const initiatedByUserId = accessToken.userId;
39+
40+
const workspace = await Workspace.findById(workspaceId).orFail(new Error('Workspace not found'));
41+
const initiatedByUserRoles = workspace.members.find(member => member.userId.toString() === initiatedByUserId.toString())?.roles;
42+
if (initiatedByUserRoles == null || (!initiatedByUserRoles.includes('admin') && !initiatedByUserRoles.includes('owner'))) {
43+
throw new Error('Forbidden');
44+
}
45+
46+
const member = workspace.members.find(currentMember => currentMember.userId.toString() === userId.toString());
47+
if (member == null) {
48+
throw new Error('Member not found in the workspace');
49+
}
50+
51+
member.roles = [role];
52+
await workspace.save();
53+
54+
const users = await User.find({ _id: { $in: workspace.members.map(currentMember => currentMember.userId) } });
55+
if (workspace.stripeSubscriptionId) {
56+
const seats = users.filter(user => !user.isFreeUser).length;
57+
await stripe.updateSubscriptionSeats(workspace.stripeSubscriptionId, seats);
58+
}
59+
60+
return { workspace, users };
61+
};

test/updateWorkspaceMember.test.js

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
'use strict';
2+
3+
const { afterEach, beforeEach, describe, it } = require('mocha');
4+
const assert = require('assert');
5+
const connect = require('../src/db');
6+
const updateWorkspaceMember = require('../src/actions/updateWorkspaceMember');
7+
8+
describe('updateWorkspaceMember', function() {
9+
let db, AccessToken, User, Workspace;
10+
let user, workspace, accessToken, memberUser;
11+
12+
beforeEach(async function() {
13+
db = await connect();
14+
({ AccessToken, User, Workspace } = db.models);
15+
16+
await AccessToken.deleteMany({});
17+
await User.deleteMany({});
18+
await Workspace.deleteMany({});
19+
20+
user = await User.create({
21+
name: 'John Doe',
22+
23+
githubUsername: 'johndoe',
24+
githubUserId: '1234'
25+
});
26+
27+
memberUser = await User.create({
28+
name: 'Jane Smith',
29+
30+
githubUsername: 'janesmith',
31+
githubUserId: '5678'
32+
});
33+
34+
accessToken = await AccessToken.create({
35+
userId: user._id,
36+
expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30)
37+
});
38+
39+
workspace = await Workspace.create({
40+
name: 'Test Workspace',
41+
ownerId: user._id,
42+
apiKey: 'test-api-key',
43+
baseUrl: 'https://example.com',
44+
members: [
45+
{ userId: user._id, roles: ['owner'] },
46+
{ userId: memberUser._id, roles: ['member'] }
47+
],
48+
subscriptionTier: 'pro'
49+
});
50+
});
51+
52+
afterEach(async function() {
53+
await AccessToken.deleteMany({});
54+
await User.deleteMany({});
55+
await Workspace.deleteMany({});
56+
});
57+
58+
it('updates the role of a workspace member', async function() {
59+
const result = await updateWorkspaceMember({
60+
authorization: accessToken._id.toString(),
61+
workspaceId: workspace._id,
62+
userId: memberUser._id,
63+
role: 'admin'
64+
});
65+
66+
assert.ok(result.workspace);
67+
68+
const updatedMember = result.workspace.members.find(member => member.userId.toString() === memberUser._id.toString());
69+
assert.deepStrictEqual(updatedMember.roles, ['admin']);
70+
71+
const workspaceInDb = await Workspace.findById(workspace._id);
72+
const updatedMemberInDb = workspaceInDb.members.find(member => member.userId.toString() === memberUser._id.toString());
73+
assert.deepStrictEqual(updatedMemberInDb.roles, ['admin']);
74+
});
75+
});

0 commit comments

Comments
 (0)