@@ -24,7 +24,14 @@ describe('UserController', () => {
24
24
25
25
firstName : 'Example' ,
26
26
lastName : 'User' ,
27
- roles : [ ] ,
27
+ roles : [ ] as string [ ] ,
28
+ } ;
29
+
30
+ const adminUserData = {
31
+
32
+ firstName : 'Example' ,
33
+ lastName : 'User' ,
34
+ roles : [ 'admin' ] ,
28
35
} ;
29
36
30
37
const userDataReturned = {
@@ -54,8 +61,18 @@ describe('UserController', () => {
54
61
} ) ;
55
62
56
63
it ( 'creates new user when POST /users is invoked' , async ( ) => {
57
- const res = await client
64
+ const newUser = await createAUser ( adminUserData ) ;
65
+
66
+ let res = await client
67
+ . post ( '/users/login' )
68
+ . send ( { principal : newUser . email , password : userPassword } )
69
+ . expect ( 200 ) ;
70
+
71
+ const token = res . body . token ;
72
+
73
+ res = await client
58
74
. post ( '/users' )
75
+ . set ( 'Authorization' , 'Bearer ' + token )
59
76
. send ( { ...userData , password : userPassword } )
60
77
. expect ( 200 ) ;
61
78
@@ -70,20 +87,66 @@ describe('UserController', () => {
70
87
it ( 'creates a new user with the given id' , async ( ) => {
71
88
// This test verifies the scenario described in our docs, see
72
89
// https://loopback.io/doc/en/lb4/Authentication-Tutorial.html
73
- const res = await client . post ( '/users' ) . send ( {
74
- id : '5dd6acee242760334f6aef65' ,
75
- ...userData ,
76
- password : userPassword ,
77
- } ) ;
90
+ const newUser = await createAUser ( adminUserData ) ;
91
+
92
+ let res = await client
93
+ . post ( '/users/login' )
94
+ . send ( { principal : newUser . email , password : userPassword } )
95
+ . expect ( 200 ) ;
96
+
97
+ const token = res . body . token ;
98
+
99
+ res = await client
100
+ . post ( '/users' )
101
+ . set ( 'Authorization' , 'Bearer ' + token )
102
+ . send ( {
103
+ id : '5dd6acee242760334f6aef65' ,
104
+ ...userData ,
105
+ password : userPassword ,
106
+ } ) ;
78
107
expect ( res . body ) . to . deepEqual ( {
79
108
id : '5dd6acee242760334f6aef65' ,
80
109
...userDataReturned ,
81
110
} ) ;
82
111
} ) ;
83
112
113
+ it ( 'throws 403 Forbidden for POST /users when not authenticated as admin' , async ( ) => {
114
+ const newUser = await createAUser ( userData ) ; // non-admin user
115
+
116
+ let res = await client
117
+ . post ( '/users/login' )
118
+ . send ( { principal : newUser . email , password : userPassword } )
119
+ . expect ( 200 ) ;
120
+
121
+ const token = res . body . token ;
122
+
123
+ res = await client
124
+ . post ( '/users' )
125
+ . set ( 'Authorization' , 'Bearer ' + token )
126
+ . send ( {
127
+
128
+ username : 'test' ,
129
+ password : 'p4ssw0rd' ,
130
+ firstName : 'Example' ,
131
+ lastName : 'User' ,
132
+ } )
133
+ . expect ( 403 ) ;
134
+ } ) ;
135
+
84
136
it ( 'throws error for POST /users with a missing email' , async ( ) => {
85
- const res = await client
137
+ const newUser = await createAUser ( adminUserData ) ;
138
+
139
+ let res = await client
140
+ . post ( '/users/login' )
141
+ . send ( { principal : newUser . email , password : userPassword } )
142
+ . expect ( 200 ) ;
143
+
144
+ const token = res . body . token ;
145
+ expect ( token ) . to . not . be . empty ( ) ;
146
+
147
+ res = await client
86
148
. post ( '/users' )
149
+ . set ( 'Authorization' , 'Bearer ' + token )
87
150
. send ( {
88
151
password : 'p4ssw0rd' ,
89
152
firstName : 'Example' ,
@@ -98,8 +161,18 @@ describe('UserController', () => {
98
161
} ) ;
99
162
100
163
it ( 'throws error for POST /users with an invalid email' , async ( ) => {
101
- const res = await client
164
+ const newUser = await createAUser ( adminUserData ) ;
165
+
166
+ let res = await client
167
+ . post ( '/users/login' )
168
+ . send ( { principal : newUser . email , password : userPassword } )
169
+ . expect ( 200 ) ;
170
+
171
+ const token = res . body . token ;
172
+
173
+ res = await client
102
174
. post ( '/users' )
175
+ . set ( 'Authorization' , 'Bearer ' + token )
103
176
. send ( {
104
177
email : 'test@loop&back.io' ,
105
178
password : 'p4ssw0rd' ,
@@ -137,12 +210,23 @@ describe('UserController', () => {
137
210
} ) ;
138
211
139
212
it ( 'throws error for POST /users with an existing email' , async ( ) => {
213
+ const newUser = await createAUser ( adminUserData ) ;
214
+
215
+ let res = await client
216
+ . post ( '/users/login' )
217
+ . send ( { principal : newUser . email , password : userPassword } )
218
+ . expect ( 200 ) ;
219
+
220
+ const token = res . body . token ;
221
+
140
222
await client
141
223
. post ( '/users' )
224
+ . set ( 'Authorization' , 'Bearer ' + token )
142
225
. send ( { ...userData , password : userPassword } )
143
226
. expect ( 200 ) ;
144
- const res = await client
227
+ res = await client
145
228
. post ( '/users' )
229
+ . set ( 'Authorization' , 'Bearer ' + token )
146
230
. send ( { ...userData , password : userPassword } )
147
231
. expect ( 409 ) ;
148
232
@@ -261,9 +345,9 @@ describe('UserController', () => {
261
345
await app . migrateSchema ( ) ;
262
346
}
263
347
264
- async function createAUser ( ) {
348
+ async function createAUser ( newUserData = userData ) {
265
349
const encryptedPassword = await passwordHasher . hashPassword ( userPassword ) ;
266
- const newUser = await userRepo . create ( userData ) ;
350
+ const newUser = await userRepo . create ( newUserData ) ;
267
351
// MongoDB returns an id object we need to convert to string
268
352
newUser . id = newUser . id . toString ( ) ;
269
353
0 commit comments