callback.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /* global jest:false, test:false, expect:false, describe:false */
  2. jest.mock('../../src/server/helpers/oauth-state', () => require('../mockoauthstate')())
  3. const request = require('supertest')
  4. const tokenService = require('../../src/server/helpers/jwt')
  5. const { getServer } = require('../mockserver')
  6. const authServer = getServer()
  7. const authData = {
  8. dropbox: 'token value',
  9. drive: 'token value',
  10. }
  11. const token = tokenService.generateEncryptedToken(authData, process.env.COMPANION_SECRET)
  12. describe('test authentication callback', () => {
  13. test('authentication callback redirects to send-token url', () => {
  14. return request(authServer)
  15. .get('/drive/callback')
  16. .expect(302)
  17. .expect((res) => {
  18. expect(res.header.location).toContain('http://localhost:3020/drive/send-token?uppyAuthToken=')
  19. })
  20. })
  21. test('the token gets sent via cookie and html', () => {
  22. // see mock ../../src/server/helpers/oauth-state above for state values
  23. return request(authServer)
  24. .get(`/dropbox/send-token?uppyAuthToken=${token}&state=state-with-newer-version`)
  25. .expect(200)
  26. .expect((res) => {
  27. const authToken = res.header['set-cookie'][0].split(';')[0].split('uppyAuthToken--dropbox=')[1]
  28. expect(authToken).toEqual(token)
  29. const body = `
  30. <!DOCTYPE html>
  31. <html>
  32. <head>
  33. <meta charset="utf-8" />
  34. <script>
  35. window.opener.postMessage(JSON.stringify({token: "${token}"}), "http://localhost:3020")
  36. window.close()
  37. </script>
  38. </head>
  39. <body></body>
  40. </html>`
  41. expect(res.text).toBe(body)
  42. })
  43. })
  44. test('the token gets to older clients without stringify', () => {
  45. // see mock ../../src/server/helpers/oauth-state above for state values
  46. return request(authServer)
  47. .get(`/drive/send-token?uppyAuthToken=${token}&state=state-with-older-version`)
  48. .expect(200)
  49. .expect((res) => {
  50. const body = `
  51. <!DOCTYPE html>
  52. <html>
  53. <head>
  54. <meta charset="utf-8" />
  55. <script>
  56. window.opener.postMessage({token: "${token}"}, "http://localhost:3020")
  57. window.close()
  58. </script>
  59. </head>
  60. <body></body>
  61. </html>`
  62. expect(res.text).toBe(body)
  63. })
  64. })
  65. test('the token gets sent to newer clients with old version style', () => {
  66. // see mock ../../src/server/helpers/oauth-state above for state values
  67. return request(authServer)
  68. .get(`/drive/send-token?uppyAuthToken=${token}&state=state-with-newer-version-old-style`)
  69. .expect(200)
  70. .expect((res) => {
  71. const body = `
  72. <!DOCTYPE html>
  73. <html>
  74. <head>
  75. <meta charset="utf-8" />
  76. <script>
  77. window.opener.postMessage(JSON.stringify({token: "${token}"}), "http://localhost:3020")
  78. window.close()
  79. </script>
  80. </head>
  81. <body></body>
  82. </html>`
  83. expect(res.text).toBe(body)
  84. })
  85. })
  86. })