expressa 1.4.7 → 2.0.1

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/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
- exports.getUserWithPermissions = util.getUserWithPermissions
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
  })