Advertisement
Guest User

Untitled

a guest
Sep 4th, 2017
460
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.40 KB | None | 0 0
  1. // LocalStrategy.js
  2.  
  3. import passport from 'passport'
  4. import Strategy from 'passport-local'
  5.  
  6. import { User } from '../../models'
  7.  
  8. const localOptions = {
  9. usernameField: 'email',
  10. session: true
  11. }
  12.  
  13. passport.serializeUser((user, done) => {
  14. done(null, user.id)
  15. })
  16.  
  17. passport.deserializeUser((id, done) => {
  18. User.findById(id).then(user => {
  19. done(null, user)
  20. })
  21. })
  22.  
  23. passport.use(
  24. new Strategy(localOptions, async (email, password, done) => {
  25. try {
  26. const user = await User.findOne({ email })
  27. if (!user) {
  28. return done(null, false, `No user found for: ${email}`)
  29. } else if (!user.authenticateUser(password)) {
  30. return done(null, false, 'Incorrect Password')
  31. }
  32. return done(null, user)
  33. } catch (e) {
  34. return done(e, false)
  35. }
  36. })
  37. )
  38.  
  39. const register = async (args, ctx) => {
  40. try {
  41. const existingUser = await User.findOne({ email: args.email })
  42. if (existingUser) throw new Error('Email already in use!')
  43. return await User.create({ ...args }).then(
  44. user =>
  45. new Promise((resolve, reject) => {
  46. // req.logIn() method added to req object by `passport`
  47. ctx.logIn(user, err => {
  48. if (err) {
  49. reject(err)
  50. }
  51. resolve(user)
  52. })
  53. })
  54. )
  55. } catch (e) {
  56. throw e
  57. }
  58. }
  59.  
  60. const login = async (email, password, ctx) => {
  61. try {
  62. return await new Promise((resolve, reject) => {
  63. passport.authenticate('local', (err, user) => {
  64. if (!user) reject('Invalid Credentials')
  65. // req.logIn() method added to req object by `passport`
  66. ctx.logIn(user, error => {
  67. if (err) reject(error, 'Shit handle this!')
  68. resolve(user)
  69. })
  70. })({ body: { email, password } })
  71. })
  72. } catch (e) {
  73. throw e
  74. }
  75. }
  76.  
  77. export { login, register }
  78.  
  79. // Resolvers
  80.  
  81. import { User } from '../models'
  82. import { login, register } from '../services'
  83.  
  84. export default {
  85. //...
  86. Mutation: {
  87. login: async (parent, { email, password }, ctx) => {
  88. try {
  89. return await login(email, password, ctx)
  90. } catch (e) {
  91. throw e
  92. }
  93. },
  94. register: async (parent, args, ctx) => {
  95. try {
  96. return await register(args, ctx)
  97. } catch (e) {
  98. throw e
  99. }
  100. }
  101. }
  102. }
  103.  
  104. // Request Object being passed to GraphQL Middleware
  105.  
  106. app.use(
  107. '/graphql',
  108. graphqlExpress(req => ({
  109. schema,
  110. context: req,
  111. debug: process.env.NODE_ENV === 'development'
  112. }))
  113.  
  114. // Test Suite
  115.  
  116. describe('#login', () => {
  117. describe('Errors', () => {
  118. beforeEach(async () => {
  119. try {
  120. await cleanup()
  121. } catch (e) {
  122. throw e
  123. }
  124. })
  125.  
  126. test('1. Should throw error if no user found.', async () => {
  127. try {
  128. const { errors } = await graphql(
  129. schema,
  130. mocks.login('tedmosby@hotmail.com', '123Ab45678')
  131. )
  132. expect.assertions(1)
  133. expect(errors[0]).toHaveProperty('message', 'Invalid Credentials')
  134. } catch (e) {
  135. throw e
  136. }
  137. })
  138. })
  139.  
  140. describe('Success', () => {
  141. let testUser
  142. beforeEach(async () => {
  143. try {
  144. await cleanup()
  145. // Will throw error because `register` fails at `ctx.logIn()`
  146. const { data: { register } } = await graphql(
  147. schema,
  148. mocks.register(
  149. 'turdFerguson@gmail.com',
  150. 'Turd',
  151. 'Ferguson',
  152. 'abc123A#',
  153. '316-867-5309'
  154. )
  155. )
  156. testUser = register
  157. } catch (e) {
  158. throw e
  159. }
  160. })
  161. test('1. Should return a logged in user.', async () => {
  162. try {
  163. // Will throw error because `user` does not exist in database due to above
  164. // Still will throw error becasue `ctx.logIn()` does not exist without `req` being passed.
  165. const { data: { login }, errors } = await graphql(
  166. schema,
  167. mocks.login(testUser.email, 'abc123A#')
  168. )
  169. expect.assertions(6)
  170. expect(login).toHaveProperty('id')
  171. expect(login).toHaveProperty('email', 'turdFerguson@gmail.com')
  172. expect(login).toHaveProperty('firstName', 'Turd')
  173. expect(login).toHaveProperty('lastName', 'Ferguson')
  174. expect(login).toHaveProperty('phone', '316-867-5309')
  175. expect(errors).toEqual(undefined)
  176. } catch (e) {
  177. throw e
  178. }
  179. })
  180. })
  181. })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement