| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  | const { clone, has, concat, isNil } = require('lodash/fp'); | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  | const qs = require('qs'); | 
					
						
							|  |  |  | const request = require('supertest'); | 
					
						
							|  |  |  | const { createUtils } = require('./utils'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const createAgent = (strapi, initialState = {}) => { | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |   const state = clone(initialState); | 
					
						
							|  |  |  |   const utils = createUtils(strapi); | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |   const agent = options => { | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |     const { method, url, body, formData, qs: queryString } = options; | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |     const supertestAgent = request.agent(strapi.server); | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |     if (has('token', state)) { | 
					
						
							|  |  |  |       supertestAgent.auth(state.token, { type: 'bearer' }); | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |     const fullUrl = concat(state.urlPrefix, url).join(''); | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |     const rq = supertestAgent[method.toLowerCase()](fullUrl); | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (queryString) { | 
					
						
							|  |  |  |       rq.query(qs.stringify(queryString)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (body) { | 
					
						
							|  |  |  |       rq.send(body); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |     if (formData) { | 
					
						
							|  |  |  |       const attachFieldToRequest = field => rq.field(field, formData[field]); | 
					
						
							|  |  |  |       Object.keys(formData).forEach(attachFieldToRequest); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |     if (isNil(formData)) { | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       rq.type('application/json'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return rq; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |   const createShorthandMethod = method => (url, options = {}) => { | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |     return agent({ ...options, url, method }); | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |   Object.assign(agent, { | 
					
						
							|  |  |  |     assignState(newState) { | 
					
						
							|  |  |  |       Object.assign(state, newState); | 
					
						
							|  |  |  |       return agent; | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setURLPrefix(path) { | 
					
						
							|  |  |  |       return this.assignState({ urlPrefix: path }); | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setToken(token) { | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       return this.assignState({ token }); | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setLoggedUser(loggedUser) { | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       return this.assignState({ loggedUser }); | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |     getLoggedUser() { | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |       return state.loggedUser; | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async login(userInfo) { | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |       const { token, user } = await utils.login(userInfo); | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       this.setToken(token).setLoggedUser(user); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |       return agent; | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async registerOrLogin(userCredentials) { | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |       const { token, user } = await utils.registerOrLogin(userCredentials); | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       this.setToken(token).setLoggedUser(user); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |       return agent; | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     get: createShorthandMethod('GET'), | 
					
						
							|  |  |  |     post: createShorthandMethod('POST'), | 
					
						
							|  |  |  |     put: createShorthandMethod('PUT'), | 
					
						
							|  |  |  |     delete: createShorthandMethod('DELETE'), | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-29 17:44:14 +01:00
										 |  |  |   return agent; | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							|  |  |  |   createAgent, | 
					
						
							|  |  |  | }; |