test.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /* global browser, expect */
  2. const path = require('path')
  3. const { spawn } = require('child_process')
  4. const testURL = 'http://localhost:4567/providers'
  5. describe('File upload with Providers', () => {
  6. let companion
  7. function prematureExit () {
  8. throw new Error('Companion exited early')
  9. }
  10. before(() => {
  11. companion = spawn('node', [
  12. path.join(__dirname, '../../../packages/@uppy/companion/lib/standalone/start-server')
  13. ], {
  14. stdio: 'pipe',
  15. env: Object.assign({}, process.env, {
  16. COMPANION_DATADIR: path.join(__dirname, '../../../output'),
  17. COMPANION_DOMAIN: 'localhost:3020',
  18. COMPANION_PROTOCOL: 'http',
  19. COMPANION_PORT: 3020,
  20. COMPANION_SECRET: process.env.TEST_COMPANION_SECRET,
  21. COMPANION_DROPBOX_KEY: process.env.TEST_COMPANION_DROPBOX_KEY,
  22. COMPANION_DROPBOX_SECRET: process.env.TEST_COMPANION_DROPBOX_SECRET,
  23. COMPANION_GOOGLE_KEY: process.env.TEST_COMPANION_GOOGLE_KEY,
  24. COMPANION_GOOGLE_SECRET: process.env.TEST_COMPANION_GOOGLE_SECRET
  25. })
  26. })
  27. return new Promise((resolve, reject) => {
  28. companion.on('error', reject)
  29. companion.stdout.on('data', (chunk) => {
  30. if (`${chunk}`.includes('Listening on')) {
  31. resolve()
  32. }
  33. })
  34. companion.on('error', console.error)
  35. companion.stderr.pipe(process.stderr)
  36. companion.on('exit', prematureExit)
  37. })
  38. })
  39. after(() => {
  40. return new Promise((resolve) => {
  41. companion.removeListener('exit', prematureExit)
  42. companion.on('exit', () => resolve())
  43. companion.kill('SIGINT')
  44. })
  45. })
  46. beforeEach(() => {
  47. browser.url(testURL)
  48. })
  49. afterEach(() => {
  50. browser.reload()
  51. })
  52. // not using arrow functions as cb so to keep mocha in the 'this' context
  53. it('should upload a file completely with Google Drive', function () {
  54. if (process.env.UPPY_GOOGLE_EMAIL === undefined) {
  55. console.log('skipping Google Drive integration test')
  56. return this.skip()
  57. }
  58. startUploadTest(browser, 'GoogleDrive')
  59. signIntoGoogle(browser)
  60. finishUploadTest(browser)
  61. })
  62. // not using arrow functions as cb so to keep mocha in the 'this' context
  63. it('should upload a file completely with Instagram', function () {
  64. if (process.env.UPPY_INSTAGRAM_USERNAME === undefined) {
  65. console.log('skipping Instagram integration test')
  66. return this.skip()
  67. }
  68. startUploadTest(browser, 'Instagram')
  69. // do oauth authentication
  70. browser.waitForExist('input[name=username]')
  71. browser.setValue('input[name=username]', process.env.UPPY_INSTAGRAM_USERNAME)
  72. browser.setValue('input[name=password]', process.env.UPPY_INSTAGRAM_PASSWORD)
  73. browser.click('form button')
  74. finishUploadTest(browser)
  75. })
  76. // not using arrow functions as cb so to keep mocha in the 'this' context
  77. it('should upload a file completely with Dropbox', function () {
  78. if (process.env.UPPY_GOOGLE_EMAIL === undefined) {
  79. console.log('skipping Dropbox integration test')
  80. return this.skip()
  81. }
  82. startUploadTest(browser, 'Dropbox')
  83. // do oauth authentication
  84. browser.waitForVisible('button.auth-google')
  85. browser.click('button.auth-google')
  86. // we login with google to avoid captcha
  87. signIntoGoogle(browser)
  88. // finish oauth
  89. browser.waitForVisible('button[name=allow_access]')
  90. browser.click('button[name=allow_access]')
  91. finishUploadTest(browser)
  92. })
  93. })
  94. const startUploadTest = (browser, providerName) => {
  95. browser.click(`.uppy-DashboardTab-btn[aria-controls=uppy-DashboardContent-panel--${providerName}]`)
  96. browser.waitForVisible('.uppy-Provider-authBtn', 3000)
  97. browser.click('.uppy-Provider-authBtn')
  98. // move control to instagram auth tab
  99. browser.switchTab(browser.getTabIds()[1])
  100. }
  101. const finishUploadTest = (browser) => {
  102. // switch back to uppy tab
  103. browser.switchTab(browser.getTabIds()[0])
  104. browser.waitForVisible('.uppy-ProviderBrowser-list li.uppy-ProviderBrowserItem')
  105. browser.click('.uppy-ProviderBrowser-list li.uppy-ProviderBrowserItem:last-child button')
  106. browser.waitForVisible('.uppy-ProviderBrowser-footer .uppy-u-reset.uppy-c-btn.uppy-c-btn-primary')
  107. browser.click('.uppy-ProviderBrowser-footer .uppy-u-reset.uppy-c-btn.uppy-c-btn-primary')
  108. browser.waitForVisible('.uppy-StatusBar-content[title="Complete"]', 20000)
  109. }
  110. const signIntoGoogle = (browser) => {
  111. browser.waitForExist('#identifierId')
  112. browser.setValue('#identifierId', process.env.UPPY_GOOGLE_EMAIL)
  113. browser.click('#identifierNext')
  114. browser.waitForVisible('input[name=password]')
  115. browser.setValue('input[name=password]', process.env.UPPY_GOOGLE_PASSWORD)
  116. browser.click('#passwordNext')
  117. // if suspicious login was detected, the window will remain unclosed
  118. // so we have to confirm the recovery email or phone no
  119. if (browser.getTabIds().length > 1) {
  120. // confirm recovery email option
  121. if (browser.isExisting('li div[data-challengetype="12"]')) {
  122. browser.click('li div[data-challengetype="12"]')
  123. browser.waitForVisible('input[name=knowledgePreregisteredEmailResponse]')
  124. browser.setValue('input[name=knowledgePreregisteredEmailResponse]', process.env.UPPY_GOOGLE_RECOVERY_EMAIL)
  125. // confirm recovery phone number
  126. } else if (browser.isExisting('#countryList')) {
  127. browser.click('div#countryList')
  128. browser.click('div[data-value=nl]')
  129. browser.setValue('input#phoneNumberId', process.env.UPPY_GOOGLE_PHONE_NO)
  130. }
  131. browser.click('#next[role=button]')
  132. }
  133. }