@@ -14,6 +14,7 @@ use rabbitmq_stream_client::{
1414use tokio:: task;
1515use tokio:: time:: sleep;
1616
17+ use crate :: producer_test:: routing_key_strategy_value_extractor;
1718use rabbitmq_stream_client:: types:: {
1819 HashRoutingMurmurStrategy , RoutingKeyRoutingStrategy , RoutingStrategy ,
1920} ;
@@ -505,6 +506,88 @@ async fn consumer_test_with_filtering() {
505506 producer. close ( ) . await . unwrap ( ) ;
506507}
507508
509+ #[ tokio:: test( flavor = "multi_thread" ) ]
510+ async fn super_stream_consumer_test_with_filtering ( ) {
511+ let env = TestEnvironment :: create_super_stream ( ) . await ;
512+ let reference: String = Faker . fake ( ) ;
513+
514+ let message_count = 10 ;
515+ let mut super_stream_producer = env
516+ . env
517+ . super_stream_producer ( RoutingStrategy :: RoutingKeyStrategy (
518+ RoutingKeyRoutingStrategy {
519+ routing_extractor : & routing_key_strategy_value_extractor,
520+ } ,
521+ ) )
522+ . filter_value_extractor ( |_| "filtering" . to_string ( ) )
523+ . build ( & env. super_stream )
524+ . await
525+ . unwrap ( ) ;
526+
527+ let filter_configuration = FilterConfiguration :: new ( vec ! [ "filtering" . to_string( ) ] , false )
528+ . post_filter ( |message| {
529+ String :: from_utf8 ( message. data ( ) . unwrap ( ) . to_vec ( ) ) . unwrap_or ( "" . to_string ( ) )
530+ == "filtering" . to_string ( )
531+ } ) ;
532+
533+ let mut super_stream_consumer = env
534+ . env
535+ . super_stream_consumer ( )
536+ . offset ( OffsetSpecification :: First )
537+ . filter_input ( Some ( filter_configuration) )
538+ . build ( & env. super_stream )
539+ . await
540+ . unwrap ( ) ;
541+
542+ for _ in 0 ..message_count {
543+ let _ = super_stream_producer
544+ . send (
545+ Message :: builder ( ) . body ( "filtering" ) . build ( ) ,
546+ |_| async move { } ,
547+ )
548+ . await ;
549+
550+ let _ = super_stream_producer
551+ . send (
552+ Message :: builder ( ) . body ( "filtering" ) . build ( ) ,
553+ |_| async move { } ,
554+ )
555+ . await ;
556+ }
557+
558+ let response = Arc :: new ( tokio:: sync:: Mutex :: new ( vec ! [ ] ) ) ;
559+ let response_clone = Arc :: clone ( & response) ;
560+
561+ let task = tokio:: task:: spawn ( async move {
562+ loop {
563+ let delivery = super_stream_consumer. next ( ) . await . unwrap ( ) ;
564+
565+ let d = delivery. unwrap ( ) ;
566+ let data = d
567+ . message ( )
568+ . data ( )
569+ . map ( |data| String :: from_utf8 ( data. to_vec ( ) ) . unwrap ( ) )
570+ . unwrap ( ) ;
571+
572+ let mut r = response_clone. lock ( ) . await ;
573+ r. push ( data) ;
574+ }
575+ } ) ;
576+
577+ let _ = tokio:: time:: timeout ( tokio:: time:: Duration :: from_secs ( 3 ) , task) . await ;
578+ let repsonse_length = response. lock ( ) . await . len ( ) ;
579+ let filtering_response_length = response
580+ . lock ( )
581+ . await
582+ . iter ( )
583+ . filter ( |item| item == & & "filtering" )
584+ . collect :: < Vec < _ > > ( )
585+ . len ( ) ;
586+
587+ assert ! ( repsonse_length == filtering_response_length) ;
588+ super_stream_producer. close ( ) . await . unwrap ( ) ;
589+ }
590+
508591#[ tokio:: test( flavor = "multi_thread" ) ]
509592async fn consumer_test_with_filtering_match_unfiltered ( ) {
510593 let env = TestEnvironment :: create ( ) . await ;
0 commit comments