callback.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. const mockOauthState = require('../mockoauthstate')()
  2. // eslint-disable-next-line import/order
  3. const request = require('supertest')
  4. const tokenService = require('../../src/server/helpers/jwt')
  5. const { getServer, grantToken } = require('../mockserver')
  6. jest.mock('../../src/server/helpers/oauth-state', () => ({
  7. ...jest.requireActual('../../src/server/helpers/oauth-state'),
  8. ...mockOauthState,
  9. }))
  10. const authServer = getServer()
  11. const authData = {
  12. dropbox: { accessToken: 'token value' },
  13. drive: { accessToken: 'token value' },
  14. }
  15. const token = tokenService.generateEncryptedAuthToken(authData, process.env.COMPANION_SECRET)
  16. describe('test authentication callback', () => {
  17. test('authentication callback redirects to send-token url', () => {
  18. return request(authServer)
  19. .get('/drive/callback')
  20. .expect(302)
  21. .expect((res) => {
  22. expect(res.header.location).toContain('http://localhost:3020/drive/send-token?uppyAuthToken=')
  23. })
  24. })
  25. test('authentication callback sets cookie', () => {
  26. console.log(process.env.COMPANION_SECRET)
  27. return request(authServer)
  28. .get('/dropbox/callback')
  29. .expect(302)
  30. .expect((res) => {
  31. expect(res.header.location).toContain('http://localhost:3020/dropbox/send-token?uppyAuthToken=')
  32. const authToken = decodeURIComponent(res.header['set-cookie'][0].split(';')[0].split('uppyAuthToken--dropbox=')[1])
  33. const payload = tokenService.verifyEncryptedAuthToken(authToken, process.env.COMPANION_SECRET, 'dropbox')
  34. expect(payload).toEqual({ dropbox: { accessToken: grantToken } })
  35. })
  36. })
  37. test('the token gets sent via html', () => {
  38. // see mock ../../src/server/helpers/oauth-state above for state values
  39. return request(authServer)
  40. .get(`/dropbox/send-token?uppyAuthToken=${token}`)
  41. .expect(200)
  42. .expect((res) => {
  43. const body = `
  44. <!DOCTYPE html>
  45. <html>
  46. <head>
  47. <meta charset="utf-8" />
  48. <script>
  49. window.opener.postMessage({"token":"${token}"}, "http:\\u002F\\u002Flocalhost:3020")
  50. window.close()
  51. </script>
  52. </head>
  53. <body></body>
  54. </html>`
  55. expect(res.text).toBe(body)
  56. })
  57. })
  58. })