providers.js 4.7 KB

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