expressa 1.4.7 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +1 -1
- package/controllers/collections.js +66 -8
- package/listeners.js +5 -10
- package/listeners_collection_permissions.js +1 -4
- package/listeners_users.js +92 -92
- package/listeners_validation.js +43 -45
- package/modules/collections/collections.js +10 -2
- package/modules/permissions/permissions.js +2 -8
- package/package.json +1 -1
- package/test/0-install.js +11 -0
- package/test/collections.querying.js +10 -10
- package/test/test.js +1 -1
- package/test/testutils.js +54 -2
- package/test/users.js +119 -0
- package/util.js +423 -461
package/test/testutils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const fs = require('fs')
|
|
2
2
|
|
|
3
3
|
const expressa = require('../')
|
|
4
|
+
const request = require('supertest')
|
|
4
5
|
const util = require('../util')
|
|
5
6
|
|
|
6
7
|
// See https://stackoverflow.com/questions/18052762/remove-directory-which-is-not-empty
|
|
@@ -25,11 +26,62 @@ exports.api = expressa.api({
|
|
|
25
26
|
file_storage_path: 'testdata'
|
|
26
27
|
})
|
|
27
28
|
const express = require('express')
|
|
29
|
+
const randomstring = require('randomstring')
|
|
28
30
|
exports.app = express()
|
|
29
31
|
exports.app.use(exports.api)
|
|
30
32
|
|
|
31
|
-
|
|
33
|
+
const tokens = {
|
|
34
|
+
admin: ''
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
exports.setAdminToken = function(token) {
|
|
38
|
+
tokens.admin = token
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
exports.getUserWithPermissions = async function(api, permissions) {
|
|
42
|
+
const service = request(exports.app)
|
|
43
|
+
if (typeof permissions === 'string') {
|
|
44
|
+
permissions = [permissions]
|
|
45
|
+
}
|
|
46
|
+
permissions = permissions || []
|
|
47
|
+
const permissionsMap = {}
|
|
48
|
+
permissions.forEach(function (permission) {
|
|
49
|
+
permissionsMap[permission] = true
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const randId = randomstring.generate(12)
|
|
53
|
+
const roleName = 'role' + randId
|
|
54
|
+
const role = {
|
|
55
|
+
_id: roleName,
|
|
56
|
+
permissions: permissionsMap
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const roleRes = await service.post('/role')
|
|
60
|
+
.set('x-access-token', tokens.admin)
|
|
61
|
+
.send(role)
|
|
62
|
+
.expect(200)
|
|
63
|
+
|
|
64
|
+
const user = {
|
|
65
|
+
email: 'test' + randId + '@example.com',
|
|
66
|
+
password: '123',
|
|
67
|
+
}
|
|
68
|
+
const registerRes = await service.post('/users/register')
|
|
69
|
+
.send(user)
|
|
70
|
+
.expect(200)
|
|
71
|
+
|
|
72
|
+
const updateRes = await service.post(`/users/${registerRes.body.id}/update`)
|
|
73
|
+
.send({ $push: { roles: roleName } })
|
|
74
|
+
.set('x-access-token', tokens.admin)
|
|
75
|
+
.expect(200)
|
|
76
|
+
|
|
77
|
+
const loginRes = await service.post('/users/login')
|
|
78
|
+
.send(user)
|
|
79
|
+
.expect(200)
|
|
80
|
+
|
|
81
|
+
user._id = loginRes.body.uid
|
|
82
|
+
return loginRes.body.token
|
|
83
|
+
}
|
|
32
84
|
exports.clone = util.clone
|
|
33
85
|
exports.sleep = function sleep(ms) {
|
|
34
86
|
return new Promise(resolve => setTimeout(resolve, ms))
|
|
35
|
-
}
|
|
87
|
+
}
|
package/test/users.js
CHANGED
|
@@ -189,4 +189,123 @@ describe('user functionality', function () {
|
|
|
189
189
|
.expect(200)
|
|
190
190
|
expect(res3.body.properties.roles.items.enum).to.not.include('testrole')
|
|
191
191
|
})
|
|
192
|
+
|
|
193
|
+
it('cannot change owner by default', async function () {
|
|
194
|
+
const token = await testutils.getUserWithPermissions(api, ['users: view', 'users: edit'])
|
|
195
|
+
|
|
196
|
+
const res = await request(app)
|
|
197
|
+
.get(`/users/me`)
|
|
198
|
+
.set('x-access-token', token)
|
|
199
|
+
const newUser = res.body
|
|
200
|
+
|
|
201
|
+
await request(app)
|
|
202
|
+
.post(`/users/${newUser._id}/update`)
|
|
203
|
+
.set('x-access-token', token)
|
|
204
|
+
.send({ $set: { 'meta.owner': user._id } }) // try change owner to another user
|
|
205
|
+
.expect(200) // will succeed but owner will not change
|
|
206
|
+
|
|
207
|
+
const res2 = await request(app)
|
|
208
|
+
.get(`/users/${newUser._id}`)
|
|
209
|
+
.set('x-access-token', token)
|
|
210
|
+
expect(res2.body.meta.owner).to.not.equal(user._id)
|
|
211
|
+
expect(res2.body.meta.owner).to.equal(newUser._id)
|
|
212
|
+
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
it('can change owner with correct permission', async function () {
|
|
216
|
+
const token = await testutils.getUserWithPermissions(api, ['users: view', 'users: edit', 'users: modify owner'])
|
|
217
|
+
|
|
218
|
+
const res = await request(app)
|
|
219
|
+
.get(`/users/me`)
|
|
220
|
+
.set('x-access-token', token)
|
|
221
|
+
const newUser = res.body
|
|
222
|
+
|
|
223
|
+
await request(app)
|
|
224
|
+
.post(`/users/${newUser._id}/update`)
|
|
225
|
+
.set('x-access-token', token)
|
|
226
|
+
.send({ $set: { 'meta.owner': user._id } }) // try change owner to another user
|
|
227
|
+
.expect(200)
|
|
228
|
+
|
|
229
|
+
const res2 = await request(app)
|
|
230
|
+
.get(`/users/${newUser._id}`)
|
|
231
|
+
.set('x-access-token', token)
|
|
232
|
+
expect(res2.body.meta.owner).to.equal(user._id)
|
|
233
|
+
})
|
|
234
|
+
|
|
235
|
+
it('changing to bogus owner fails', async function () {
|
|
236
|
+
const token = await testutils.getUserWithPermissions(api, ['users: view', 'users: edit', 'users: modify owner'])
|
|
237
|
+
|
|
238
|
+
const res = await request(app)
|
|
239
|
+
.get(`/users/me`)
|
|
240
|
+
.set('x-access-token', token)
|
|
241
|
+
const newUser = res.body
|
|
242
|
+
|
|
243
|
+
await request(app)
|
|
244
|
+
.post(`/users/${newUser._id}/update`)
|
|
245
|
+
.set('x-access-token', token)
|
|
246
|
+
.send({ $set: { 'meta.owner': 'owner-that-doesnt-exist' } }) // try change owner to another user
|
|
247
|
+
.expect(417)
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
it('cannot set owner on creation by default', async function () {
|
|
251
|
+
const token = await testutils.getUserWithPermissions(api, ['users: view', 'users: edit', 'testdoc: create', 'testdoc: view own'])
|
|
252
|
+
|
|
253
|
+
const res = await request(app)
|
|
254
|
+
.get(`/users/me`)
|
|
255
|
+
.set('x-access-token', token)
|
|
256
|
+
const newUser = res.body
|
|
257
|
+
|
|
258
|
+
const doc = {
|
|
259
|
+
title: 'Test Title',
|
|
260
|
+
meta: {
|
|
261
|
+
owner: user._id,
|
|
262
|
+
owner_collection: 'users',
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const res2 = await request(app)
|
|
267
|
+
.post(`/testdoc`)
|
|
268
|
+
.set('x-access-token', token)
|
|
269
|
+
.send(doc)
|
|
270
|
+
.expect(200) // will succeed but owner will not change
|
|
271
|
+
doc._id = res2.body.id
|
|
272
|
+
|
|
273
|
+
const res3 = await request(app)
|
|
274
|
+
.get(`/testdoc/${doc._id}`)
|
|
275
|
+
.set('x-access-token', token)
|
|
276
|
+
.expect(200)
|
|
277
|
+
expect(res3.body.meta.owner).to.not.equal(user._id)
|
|
278
|
+
expect(res3.body.meta.owner).to.equal(newUser._id)
|
|
279
|
+
})
|
|
280
|
+
|
|
281
|
+
it('can set owner on creation with correct permission', async function () {
|
|
282
|
+
const token = await testutils.getUserWithPermissions(api, ['users: view', 'users: edit', 'testdoc: create', 'testdoc: view', 'testdoc: modify owner'])
|
|
283
|
+
|
|
284
|
+
const res = await request(app)
|
|
285
|
+
.get(`/users/me`)
|
|
286
|
+
.set('x-access-token', token)
|
|
287
|
+
const newUser = res.body
|
|
288
|
+
|
|
289
|
+
const doc = {
|
|
290
|
+
title: 'Test Title',
|
|
291
|
+
meta: {
|
|
292
|
+
owner: user._id,
|
|
293
|
+
owner_collection: 'users',
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const res2 = await request(app)
|
|
298
|
+
.post(`/testdoc`)
|
|
299
|
+
.set('x-access-token', token)
|
|
300
|
+
.send(doc)
|
|
301
|
+
.expect(200) // will succeed but owner will not change
|
|
302
|
+
doc._id = res2.body.id
|
|
303
|
+
|
|
304
|
+
const res3 = await request(app)
|
|
305
|
+
.get(`/testdoc/${doc._id}`)
|
|
306
|
+
.set('x-access-token', token)
|
|
307
|
+
.expect(200)
|
|
308
|
+
expect(res3.body.meta.owner).to.not.equal(newUser._id)
|
|
309
|
+
expect(res3.body.meta.owner).to.equal(user._id)
|
|
310
|
+
})
|
|
192
311
|
})
|