dashboard-aws-multipart.spec.ts 5.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. describe('Dashboard with @uppy/aws-s3-multipart', () => {
  2. beforeEach(() => {
  3. cy.visit('/dashboard-aws-multipart')
  4. cy.get('.uppy-Dashboard-input:first').as('file-input')
  5. cy.intercept({ method: 'POST', pathname: '/s3/multipart' }).as('post')
  6. cy.intercept({ method: 'GET', pathname: '/s3/multipart/*/1' }).as('get')
  7. cy.intercept({ method: 'PUT' }).as('put')
  8. })
  9. it('should upload cat image successfully', () => {
  10. cy.get('@file-input').selectFile('cypress/fixtures/images/cat.jpg', { force:true })
  11. cy.get('.uppy-StatusBar-actionBtn--upload').click()
  12. cy.wait(['@post', '@get', '@put'])
  13. cy.get('.uppy-StatusBar-statusPrimary').should('contain', 'Complete')
  14. })
  15. it('should upload Russian poem image successfully', () => {
  16. const fileName = '١٠ كم мест для Нью-Йорке.pdf'
  17. cy.get('@file-input').selectFile(`cypress/fixtures/images/${fileName}`, { force:true })
  18. cy.get('.uppy-StatusBar-actionBtn--upload').click()
  19. cy.wait(['@post', '@get', '@put'])
  20. cy.get('.uppy-Dashboard-Item-name').should('contain', fileName)
  21. cy.get('.uppy-StatusBar-statusPrimary').should('contain', 'Complete')
  22. })
  23. it('should handle retry request gracefully', () => {
  24. cy.get('@file-input').selectFile('cypress/fixtures/images/cat.jpg', { force:true })
  25. cy.intercept('POST', '/s3/multipart', { forceNetworkError: true, times: 1 }).as('createMultipartUpload-fails')
  26. cy.get('.uppy-StatusBar-actionBtn--upload').click()
  27. cy.wait(['@createMultipartUpload-fails'])
  28. cy.get('.uppy-StatusBar-statusPrimary').should('contain', 'Upload failed')
  29. cy.intercept('POST', '/s3/multipart', { statusCode: 200, times: 1, body: JSON.stringify({ key:'mocked-key-attempt1', uploadId:'mocked-uploadId-attempt1' }) }).as('createMultipartUpload-attempt1')
  30. cy.intercept('GET', '/s3/multipart/mocked-uploadId-attempt1/1?key=mocked-key-attempt1', { forceNetworkError: true }).as('signPart-fails')
  31. cy.intercept('DELETE', '/s3/multipart/mocked-uploadId-attempt1?key=mocked-key-attempt1', { statusCode: 200, body: '{}' }).as('abortAttempt-1')
  32. cy.get('.uppy-StatusBar-actions > .uppy-c-btn').click()
  33. cy.wait(['@createMultipartUpload-attempt1', '@signPart-fails', '@abortAttempt-1'])
  34. cy.get('.uppy-StatusBar-statusPrimary').should('contain', 'Upload failed')
  35. cy.intercept('POST', '/s3/multipart', { statusCode: 200, times: 1, body: JSON.stringify({ key:'mocked-key-attempt2', uploadId:'mocked-uploadId-attempt2' }) }).as('createMultipartUpload-attempt2')
  36. cy.intercept('GET', '/s3/multipart/mocked-uploadId-attempt2/1?key=mocked-key-attempt2', {
  37. statusCode: 200,
  38. headers: {
  39. ETag: 'W/"222-GXE2wLoMKDihw3wxZFH1APdUjHM"',
  40. },
  41. body: JSON.stringify({ url:'/put-fail', expires:8 }),
  42. }).as('signPart-toFail')
  43. cy.intercept('DELETE', '/s3/multipart/mocked-uploadId-attempt2?key=mocked-key-attempt2', { statusCode: 200, body: '{}' }).as('abortAttempt-2')
  44. cy.intercept('PUT', '/put-fail', { forceNetworkError: true }).as('put-fails')
  45. cy.get('.uppy-StatusBar-actions > .uppy-c-btn').click()
  46. cy.wait(['@createMultipartUpload-attempt2', '@signPart-toFail', ...Array(5).fill('@put-fails'), '@abortAttempt-2'])
  47. cy.get('.uppy-StatusBar-statusPrimary').should('contain', 'Upload failed')
  48. cy.intercept('GET', '/s3/multipart/mocked-uploadId-attempt2/1?key=mocked-key-attempt2', {
  49. statusCode: 200,
  50. headers: {
  51. ETag: 'ETag-attempt2',
  52. },
  53. body: JSON.stringify({ url:'/put-success-attempt2', expires:8 }),
  54. }).as('signPart-attempt2')
  55. cy.intercept('PUT', '/put-success-attempt2', {
  56. statusCode: 200,
  57. headers: {
  58. ETag: 'ETag-attempt2',
  59. },
  60. }).as('put-attempt2')
  61. cy.intercept('POST', '/s3/multipart/mocked-uploadId-attempt2/complete?key=mocked-key-attempt2', { forceNetworkError: true }).as('completeMultipartUpload-fails')
  62. cy.get('.uppy-StatusBar-actions > .uppy-c-btn').click()
  63. cy.wait(['@createMultipartUpload-attempt2', '@signPart-attempt2', '@put-attempt2', '@completeMultipartUpload-fails', '@abortAttempt-2'])
  64. cy.get('.uppy-StatusBar-statusPrimary').should('contain', 'Upload failed')
  65. cy.intercept('POST', '/s3/multipart', { statusCode: 200, times: 1, body: JSON.stringify({ key:'mocked-key-attempt3', uploadId:'mocked-uploadId-attempt3' }) }).as('createMultipartUpload-attempt3')
  66. cy.intercept('GET', '/s3/multipart/mocked-uploadId-attempt3/1?key=mocked-key-attempt3', {
  67. statusCode: 200,
  68. headers: {
  69. ETag: 'ETag-attempt3',
  70. },
  71. body: JSON.stringify({ url:'/put-success-attempt3', expires:8 }),
  72. }).as('signPart-attempt3')
  73. cy.intercept('PUT', '/put-success-attempt3', {
  74. statusCode: 200,
  75. headers: {
  76. ETag: 'ETag-attempt3',
  77. },
  78. }).as('put-attempt3')
  79. cy.intercept('POST', '/s3/multipart/mocked-uploadId-attempt3/complete?key=mocked-key-attempt3', {
  80. statusCode: 200,
  81. body: JSON.stringify({
  82. location: 'someLocation',
  83. }),
  84. }).as('completeMultipartUpload-attempt3')
  85. cy.get('.uppy-StatusBar-actions > .uppy-c-btn').click()
  86. cy.wait(['@createMultipartUpload-attempt3', '@signPart-attempt3', '@put-attempt3', '@completeMultipartUpload-attempt3'])
  87. cy.get('.uppy-StatusBar-statusPrimary').should('contain', 'Complete')
  88. })
  89. })