@@ -500,4 +500,84 @@ describe('when HAPPO_SIGNED_URL is set', () => {
500
500
expect ( receivedRequests . length ) . toBe ( 2 ) ;
501
501
} ) ;
502
502
} ) ;
503
+
504
+ describe ( 'when the signed URL 500s the first time' , ( ) => {
505
+ beforeEach ( ( ) => {
506
+ let counter = 0 ;
507
+ mockResponses [ 'PUT /a-signed-url' ] = {
508
+ method : 'PUT' ,
509
+ url : / \/ a - s i g n e d - u r l $ / ,
510
+ handler : ( req , res ) => {
511
+ counter ++ ;
512
+ if ( counter === 1 ) {
513
+ res . statusCode = 500 ;
514
+ res . end ( 'Internal Server Error' ) ;
515
+ } else {
516
+ res . statusCode = 200 ;
517
+ res . end ( 'OK' ) ;
518
+ }
519
+ } ,
520
+ } ;
521
+ } ) ;
522
+
523
+ it ( 'retries the request and proceeds' , async ( ) => {
524
+ await expect ( subject ( ) ) . resolves . not . toThrow ( ) ;
525
+
526
+ expect ( receivedRequests [ 0 ] . method ) . toBe ( 'GET' ) ;
527
+ expect ( receivedRequests [ 0 ] . url ) . toMatch ( / \/ a s s e t s \/ [ a - f 0 - 9 ] + \/ s i g n e d - u r l $ / ) ;
528
+
529
+ expect ( receivedRequests [ 1 ] . method ) . toBe ( 'PUT' ) ;
530
+ expect ( receivedRequests [ 1 ] . url ) . toMatch ( / \/ a - s i g n e d - u r l $ / ) ;
531
+
532
+ expect ( receivedRequests [ 2 ] . method ) . toBe ( 'PUT' ) ;
533
+ expect ( receivedRequests [ 2 ] . url ) . toMatch ( / \/ a - s i g n e d - u r l $ / ) ;
534
+
535
+ expect ( receivedRequests [ 3 ] . method ) . toBe ( 'POST' ) ;
536
+ expect ( receivedRequests [ 3 ] . url ) . toMatch (
537
+ / \/ a s s e t s \/ [ a - f 0 - 9 ] + \/ s i g n e d - u r l \/ f i n a l i z e $ / ,
538
+ ) ;
539
+
540
+ // The request after the asset has been finalized is posting the report
541
+ expect ( receivedRequests [ 4 ] . method ) . toBe ( 'POST' ) ;
542
+ expect ( receivedRequests [ 4 ] . url ) . toEqual ( '/api/reports/foobar' ) ;
543
+
544
+ expect ( receivedRequests . length ) . toBe ( 5 ) ;
545
+ } ) ;
546
+ } ) ;
547
+
548
+ describe ( 'when the signed URL 500s lots of times' , ( ) => {
549
+ beforeEach ( ( ) => {
550
+ mockResponses [ 'PUT /a-signed-url' ] = {
551
+ method : 'PUT' ,
552
+ url : / \/ a - s i g n e d - u r l $ / ,
553
+ handler : ( req , res ) => {
554
+ res . statusCode = 500 ;
555
+ res . end ( 'Internal Server Error' ) ;
556
+ } ,
557
+ } ;
558
+ } ) ;
559
+
560
+ it ( 'retries the request a few times and then throws' , async ( ) => {
561
+ await expect ( subject ( ) ) . rejects . toThrow (
562
+ 'Failed to upload assets to S3 signed URL' ,
563
+ ) ;
564
+
565
+ expect ( receivedRequests [ 0 ] . method ) . toBe ( 'GET' ) ;
566
+ expect ( receivedRequests [ 0 ] . url ) . toMatch ( / \/ a s s e t s \/ [ a - f 0 - 9 ] + \/ s i g n e d - u r l $ / ) ;
567
+
568
+ expect ( receivedRequests [ 1 ] . method ) . toBe ( 'PUT' ) ;
569
+ expect ( receivedRequests [ 1 ] . url ) . toMatch ( / \/ a - s i g n e d - u r l $ / ) ;
570
+
571
+ expect ( receivedRequests [ 2 ] . method ) . toBe ( 'PUT' ) ;
572
+ expect ( receivedRequests [ 2 ] . url ) . toMatch ( / \/ a - s i g n e d - u r l $ / ) ;
573
+
574
+ expect ( receivedRequests [ 3 ] . method ) . toBe ( 'PUT' ) ;
575
+ expect ( receivedRequests [ 3 ] . url ) . toMatch ( / \/ a - s i g n e d - u r l $ / ) ;
576
+
577
+ expect ( receivedRequests [ 4 ] . method ) . toBe ( 'PUT' ) ;
578
+ expect ( receivedRequests [ 4 ] . url ) . toMatch ( / \/ a - s i g n e d - u r l $ / ) ;
579
+
580
+ expect ( receivedRequests . length ) . toBe ( 5 ) ;
581
+ } , 20000 ) ;
582
+ } ) ;
503
583
} ) ;
0 commit comments