providers.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /* global jest:false, test:false, expect:false, describe:false */
  2. jest.mock('tus-js-client')
  3. jest.mock('purest')
  4. jest.mock('../../src/server/helpers/request', () => {
  5. return {
  6. getURLMeta: () => Promise.resolve({ size: 758051 }),
  7. }
  8. })
  9. jest.mock('../../src/server/helpers/oauth-state', () => require('../mockoauthstate')())
  10. const request = require('supertest')
  11. const fixtures = require('../fixtures')
  12. const tokenService = require('../../src/server/helpers/jwt')
  13. const { getServer } = require('../mockserver')
  14. const authServer = getServer()
  15. const OAUTH_STATE = 'some-cool-nice-encrytpion'
  16. const providers = require('../../src/server/provider').getDefaultProviders()
  17. const providerNames = Object.keys(providers)
  18. const AUTH_PROVIDERS = {
  19. drive: 'google',
  20. onedrive: 'microsoft',
  21. }
  22. const authData = {}
  23. providerNames.forEach((provider) => {
  24. authData[provider] = 'token value'
  25. })
  26. const token = tokenService.generateEncryptedToken(authData, process.env.COMPANION_SECRET)
  27. const thisOrThat = (value1, value2) => {
  28. if (value1 !== undefined) {
  29. return value1
  30. }
  31. return value2
  32. }
  33. describe('set i-am header', () => {
  34. test.each(providerNames)('set i-am header in response (%s)', (providerName) => {
  35. const providerFixtures = fixtures.providers[providerName].expects
  36. return request(authServer)
  37. .get(`/${providerName}/list/${providerFixtures.listPath || ''}`)
  38. .set('uppy-auth-token', token)
  39. .expect(200)
  40. .then((res) => expect(res.header['i-am']).toBe('http://localhost:3020'))
  41. })
  42. })
  43. describe('list provider files', () => {
  44. test.each(providerNames)('list files for %s', (providerName) => {
  45. const providerFixtures = fixtures.providers[providerName].expects
  46. return request(authServer)
  47. .get(`/${providerName}/list/${providerFixtures.listPath || ''}`)
  48. .set('uppy-auth-token', token)
  49. .expect(200)
  50. .then((res) => {
  51. expect(res.body.username).toBe(fixtures.defaults.USERNAME)
  52. const items = [...res.body.items]
  53. // Drive has a virtual "shared-with-me" folder as the first item
  54. if (providerName === 'drive') {
  55. const item0 = items.shift()
  56. expect(item0.isFolder).toBe(true)
  57. expect(item0.name).toBe('Shared with me')
  58. expect(item0.mimeType).toBe('application/vnd.google-apps.folder')
  59. expect(item0.id).toBe('shared-with-me')
  60. expect(item0.requestPath).toBe('shared-with-me')
  61. expect(item0.icon).toBe('folder')
  62. }
  63. const item = items[0]
  64. expect(item.isFolder).toBe(false)
  65. expect(item.name).toBe(providerFixtures.itemName || fixtures.defaults.ITEM_NAME)
  66. expect(item.mimeType).toBe(providerFixtures.itemMimeType || fixtures.defaults.MIME_TYPE)
  67. expect(item.id).toBe(providerFixtures.itemId || fixtures.defaults.ITEM_ID)
  68. expect(item.size).toBe(thisOrThat(providerFixtures.itemSize, fixtures.defaults.FILE_SIZE))
  69. expect(item.requestPath).toBe(providerFixtures.itemRequestPath || fixtures.defaults.ITEM_ID)
  70. expect(item.icon).toBe(providerFixtures.itemIcon || fixtures.defaults.THUMBNAIL_URL)
  71. })
  72. })
  73. })
  74. describe('download provdier file', () => {
  75. test.each(providerNames)('specified file gets downloaded from %s', (providerName) => {
  76. const providerFixtures = fixtures.providers[providerName].expects
  77. return request(authServer)
  78. .post(`/${providerName}/get/${providerFixtures.itemRequestPath || fixtures.defaults.ITEM_ID}`)
  79. .set('uppy-auth-token', token)
  80. .set('Content-Type', 'application/json')
  81. .send({
  82. endpoint: 'http://tusd.tusdemo.net/files',
  83. protocol: 'tus',
  84. })
  85. .expect(200)
  86. .then((res) => expect(res.body.token).toBeTruthy())
  87. })
  88. })
  89. describe('connect to provider', () => {
  90. test.each(providerNames)('connect to %s via grant.js endpoint', (providerName) => {
  91. const authProvider = AUTH_PROVIDERS[providerName] || providerName
  92. return request(authServer)
  93. .get(`/${providerName}/connect?foo=bar`)
  94. .set('uppy-auth-token', token)
  95. .expect(302)
  96. .expect('Location', `http://localhost:3020/connect/${authProvider}?state=${OAUTH_STATE}`)
  97. })
  98. })
  99. describe('logout of provider', () => {
  100. test.each(providerNames)('logout of %s', (providerName) => {
  101. return request(authServer)
  102. .get(`/${providerName}/logout/`)
  103. .set('uppy-auth-token', token)
  104. .expect(200)
  105. .then((res) => expect(res.body.ok).toBe(true))
  106. })
  107. })