@@ -347,94 +347,95 @@ class THttpProxyTestMock : public NUnitTest::TBaseFixture {
347347 return json;
348348 }
349349
350- NJson::TJsonMap DeleteQueue ( NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
351- auto res = SendHttpRequest (" /Root" , " AmazonSQS.DeleteQueue " , request, FormAuthorizationStr (" ru-central1" ));
350+ NJson::TJsonMap SendJsonRequest (TString method, NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
351+ auto res = SendHttpRequest (" /Root" , TStringBuilder () << " AmazonSQS." << method , request, FormAuthorizationStr (" ru-central1" ));
352352 UNIT_ASSERT_VALUES_EQUAL (res.HttpCode , expectedHttpCode);
353353 NJson::TJsonMap json;
354354 UNIT_ASSERT (NJson::ReadJsonTree (res.Body , &json));
355355 return json;
356356 }
357357
358+ NJson::TJsonMap DeleteQueue (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
359+ return SendJsonRequest (" DeleteQueue" , request, expectedHttpCode);
360+ }
361+
358362 NJson::TJsonMap GetQueueAttributes (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
359- auto res = SendHttpRequest (" /Root" , " AmazonSQS.GetQueueAttributes" , request, FormAuthorizationStr (" ru-central1" ));
360- UNIT_ASSERT_VALUES_EQUAL (res.HttpCode , expectedHttpCode);
361- NJson::TJsonMap json;
362- UNIT_ASSERT (NJson::ReadJsonTree (res.Body , &json));
363- return json;
363+ return SendJsonRequest (" GetQueueAttributes" , request, expectedHttpCode);
364364 }
365365
366366 NJson::TJsonMap SendMessage (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
367- auto res = SendHttpRequest (" /Root" , " AmazonSQS.SendMessage" , request, FormAuthorizationStr (" ru-central1" ));
368- UNIT_ASSERT_VALUES_EQUAL (res.HttpCode , expectedHttpCode);
369- NJson::TJsonMap json;
370- UNIT_ASSERT (NJson::ReadJsonTree (res.Body , &json));
367+ auto json = SendJsonRequest (" SendMessage" , request, expectedHttpCode);
368+ UNIT_ASSERT (!GetByPath<TString>(json, " MD5OfMessageBody" ).empty ());
371369 return json;
372370 }
373371
372+ NJson::TJsonMap SendMessageBatch (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
373+ return SendJsonRequest (" SendMessageBatch" , request, expectedHttpCode);
374+ }
375+
374376 NJson::TJsonMap ReceiveMessage (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
375- auto res = SendHttpRequest (" /Root" , " AmazonSQS.ReceiveMessage" , request, FormAuthorizationStr (" ru-central1" ));
376- UNIT_ASSERT_VALUES_EQUAL (res.HttpCode , expectedHttpCode);
377- NJson::TJsonMap json;
378- UNIT_ASSERT (NJson::ReadJsonTree (res.Body , &json));
379- return json;
377+ return SendJsonRequest (" ReceiveMessage" , request, expectedHttpCode);
380378 }
381379
382380 NJson::TJsonMap DeleteMessage (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
383- auto res = SendHttpRequest ( " /Root " , " AmazonSQS. DeleteMessage" , request, FormAuthorizationStr ( " ru-central1 " ) );
384- UNIT_ASSERT_VALUES_EQUAL (res. HttpCode , expectedHttpCode);
385- NJson::TJsonMap json;
386- UNIT_ASSERT (NJson::ReadJsonTree (res. Body , &json));
387- return json ;
381+ return SendJsonRequest ( " DeleteMessage" , request, expectedHttpCode );
382+ }
383+
384+ NJson::TJsonMap DeleteMessageBatch (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
385+ return SendJsonRequest ( " DeleteMessageBatch " , request, expectedHttpCode) ;
388386 }
389387
390388 NJson::TJsonMap GetQueueUrl (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
391- auto res = SendHttpRequest (" /Root" , " AmazonSQS.GetQueueUrl" , request, FormAuthorizationStr (" ru-central1" ));
392- UNIT_ASSERT_VALUES_EQUAL (res.HttpCode , expectedHttpCode);
393- NJson::TJsonMap json;
394- UNIT_ASSERT (NJson::ReadJsonTree (res.Body , &json));
395- return json;
389+ return SendJsonRequest (" GetQueueUrl" , request, expectedHttpCode);
396390 }
397391
398392 NJson::TJsonMap ListQueues (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
399- auto res = SendHttpRequest (" /Root" , " AmazonSQS.ListQueues" , request, FormAuthorizationStr (" ru-central1" ));
400- UNIT_ASSERT_VALUES_EQUAL (res.HttpCode , expectedHttpCode);
401- NJson::TJsonMap json;
402- UNIT_ASSERT (NJson::ReadJsonTree (res.Body , &json));
403- return json;
393+ return SendJsonRequest (" ListQueues" , request, expectedHttpCode);
404394 }
405395
406396 NJson::TJsonMap PurgeQueue (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
407- auto res = SendHttpRequest (" /Root" , " AmazonSQS.PurgeQueue" , request, FormAuthorizationStr (" ru-central1" ));
408- UNIT_ASSERT_VALUES_EQUAL (res.HttpCode , expectedHttpCode);
409- NJson::TJsonMap json;
410- UNIT_ASSERT (NJson::ReadJsonTree (res.Body , &json));
411- return json;
397+ return SendJsonRequest (" PurgeQueue" , request, expectedHttpCode);
412398 }
413399
414400 NJson::TJsonMap SetQueueAttributes (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
415- auto res = SendHttpRequest (" /Root" , " AmazonSQS.SetQueueAttributes" , request, FormAuthorizationStr (" ru-central1" ));
416- UNIT_ASSERT_VALUES_EQUAL (res.HttpCode , expectedHttpCode);
417- NJson::TJsonMap json;
418- UNIT_ASSERT (NJson::ReadJsonTree (res.Body , &json));
419- return json;
401+ return SendJsonRequest (" SetQueueAttributes" , request, expectedHttpCode);
420402 }
421403
422- bool WaitQueueAttributes (TString queueUrl, size_t retries, std::function<bool (NJson::TJsonMap json)> predicate) {
404+ void WaitQueueAttributes (TString queueUrl, size_t retries, NJson::TJsonMap attributes) {
405+ WaitQueueAttributes (queueUrl, retries, [&attributes](NJson::TJsonMap json) {
406+ for (const auto & [k, v] : attributes.GetMapSafe ()) {
407+ if (json[" Attributes" ][k] != v) {
408+ return false ;
409+ }
410+ }
411+ return true ;
412+ });
413+ }
414+
415+ void WaitQueueAttributes (TString queueUrl, size_t retries, std::function<bool (NJson::TJsonMap json)> predicate) {
423416 for (size_t i = 0 ; i < retries; ++i) {
424417 auto json = GetQueueAttributes ({
425418 {" QueueUrl" , queueUrl},
426419 {" AttributeNames" , NJson::TJsonArray{" All" }}
427420 });
428421
429422 if (predicate (json)) {
430- return true ;
423+ return ;
431424 }
432425
433426 if (i + 1 < retries) {
434427 std::this_thread::sleep_for (std::chrono::milliseconds (1000 ));
435428 }
436429 }
437- return false ;
430+ UNIT_FAIL (" WaitQueueAttributes: predicate is still false" );
431+ }
432+
433+ NJson::TJsonMap ChangeMessageVisibility (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
434+ return SendJsonRequest (" ChangeMessageVisibility" , request, expectedHttpCode);
435+ }
436+
437+ NJson::TJsonMap ChangeMessageVisibilityBatch (NJson::TJsonMap request, ui32 expectedHttpCode = 200 ) {
438+ return SendJsonRequest (" ChangeMessageVisibilityBatch" , request, expectedHttpCode);
438439 }
439440
440441private:
@@ -593,6 +594,54 @@ class THttpProxyTestMock : public NUnitTest::TBaseFixture {
593594 " KeyColumnNames: [\" QueueIdNumberHash\" , \" QueueIdNumber\" , \" Offset\" ]"
594595 );
595596
597+ client.CreateTable (" /Root/SQS/.FIFO" ,
598+ " Name: \" Deduplication\" "
599+ " Columns { Name: \" QueueIdNumberHash\" Type: \" Uint64\" }"
600+ " Columns { Name: \" QueueIdNumber\" Type: \" Uint64\" }"
601+ " Columns { Name: \" DedupId\" Type: \" String\" }"
602+ " Columns { Name: \" Deadline\" Type: \" Uint64\" }"
603+ " Columns { Name: \" Offset\" Type: \" Uint64\" }"
604+ " Columns { Name: \" MessageId\" Type: \" String\" }"
605+ " KeyColumnNames: [\" QueueIdNumberHash\" , \" QueueIdNumber\" , \" DedupId\" ]"
606+ );
607+
608+ client.CreateTable (" /Root/SQS/.FIFO" ,
609+ " Name: \" Groups\" "
610+ " Columns { Name: \" QueueIdNumberHash\" Type: \" Uint64\" }"
611+ " Columns { Name: \" QueueIdNumber\" Type: \" Uint64\" }"
612+ " Columns { Name: \" GroupId\" Type: \" String\" }"
613+ " Columns { Name: \" VisibilityDeadline\" Type: \" Uint64\" }"
614+ " Columns { Name: \" RandomId\" Type: \" Uint64\" }"
615+ " Columns { Name: \" Head\" Type: \" Uint64\" }"
616+ " Columns { Name: \" Tail\" Type: \" Uint64\" }"
617+ " Columns { Name: \" ReceiveAttemptId\" Type: \" Utf8\" }"
618+ " Columns { Name: \" LockTimestamp\" Type: \" Uint64\" }"
619+ " KeyColumnNames: [\" QueueIdNumberHash\" , \" QueueIdNumber\" , \" GroupId\" ]"
620+ );
621+
622+ client.CreateTable (" /Root/SQS/.FIFO" ,
623+ " Name: \" Data\" "
624+ " Columns { Name: \" QueueIdNumberHash\" Type: \" Uint64\" }"
625+ " Columns { Name: \" QueueIdNumber\" Type: \" Uint64\" }"
626+ " Columns { Name: \" RandomId\" Type: \" Uint64\" }"
627+ " Columns { Name: \" Offset\" Type: \" Uint64\" }"
628+ " Columns { Name: \" SenderId\" Type: \" String\" }"
629+ " Columns { Name: \" DedupId\" Type: \" String\" }"
630+ " Columns { Name: \" Attributes\" Type: \" String\" }"
631+ " Columns { Name: \" Data\" Type: \" String\" }"
632+ " Columns { Name: \" MessageId\" Type: \" String\" }"
633+ " KeyColumnNames: [\" QueueIdNumberHash\" , \" QueueIdNumber\" , \" RandomId\" , \" Offset\" ]"
634+ );
635+
636+ client.CreateTable (" /Root/SQS/.FIFO" ,
637+ " Name: \" Reads\" "
638+ " Columns { Name: \" QueueIdNumberHash\" Type: \" Uint64\" }"
639+ " Columns { Name: \" QueueIdNumber\" Type: \" Uint64\" }"
640+ " Columns { Name: \" ReceiveAttemptId\" Type: \" Utf8\" }"
641+ " Columns { Name: \" Deadline\" Type: \" Uint64\" }"
642+ " KeyColumnNames: [\" QueueIdNumberHash\" , \" QueueIdNumber\" , \" ReceiveAttemptId\" ]"
643+ );
644+
596645 client.CreateTable (" /Root/SQS" ,
597646 " Name: \" .Settings\" "
598647 " Columns { Name: \" Account\" Type: \" Utf8\" }"
@@ -697,12 +746,17 @@ class THttpProxyTestMock : public NUnitTest::TBaseFixture {
697746 << sentTimestampIdxCommonColumns
698747 << sendTimestampIdsKeys
699748 );
749+
700750 client.CreateTable (" /Root/SQS/.FIFO" ,
701- TStringBuilder ()
702- << " Name: \" SentTimestampIdx\" "
703- << " Columns { Name: \" GroupId\" Type: \" String\" }"
704- << sentTimestampIdxCommonColumns
705- << sendTimestampIdsKeys
751+ " Name: \" SentTimestampIdx\" "
752+ " Columns { Name: \" QueueIdNumberHash\" Type: \" Uint64\" }"
753+ " Columns { Name: \" QueueIdNumber\" Type: \" Uint64\" }"
754+ " Columns { Name: \" SentTimestamp\" Type: \" Uint64\" }"
755+ " Columns { Name: \" Offset\" Type: \" Uint64\" }"
756+ " Columns { Name: \" GroupId\" Type: \" String\" }"
757+ " Columns { Name: \" RandomId\" Type: \" Uint64\" }"
758+ " Columns { Name: \" DelayDeadline\" Type: \" Uint64\" }"
759+ " KeyColumnNames: [\" QueueIdNumberHash\" , \" QueueIdNumber\" , \" SentTimestamp\" , \" Offset\" ]"
706760 );
707761
708762 client.CreateTable (" /Root/SQS/.STD" ,
0 commit comments