@@ -480,14 +480,16 @@ pub async fn pages_list(
480480 team : Option < & str > ,
481481 responder : Option < & str > ,
482482 page_size : u32 ,
483+ sort : & str ,
483484) -> Result < ( ) > {
484485 if !( 1 ..=1000 ) . contains ( & page_size) {
485486 anyhow:: bail!( "invalid page_size: {page_size}. Expected a value from 1 to 1000" ) ;
486487 }
488+ validate_pages_sort ( sort) ?;
487489
488490 let page_size = page_size. to_string ( ) ;
489491 let team_filter = team. map ( |t| format ! ( "team:{t}" ) ) ;
490- let mut query = vec ! [ ( "page[size]" , page_size. as_str( ) ) ] ;
492+ let mut query = vec ! [ ( "page[size]" , page_size. as_str( ) ) , ( "sort" , sort ) ] ;
491493 if let Some ( filter) = team_filter. as_deref ( ) {
492494 query. push ( ( "filter" , filter) ) ;
493495 }
@@ -503,6 +505,15 @@ pub async fn pages_list(
503505 formatter:: output ( cfg, & resp)
504506}
505507
508+ fn validate_pages_sort ( sort : & str ) -> Result < ( ) > {
509+ match sort {
510+ "created_at" | "-created_at" => Ok ( ( ) ) ,
511+ other => {
512+ anyhow:: bail!( "invalid --sort value: {other:?}\n Expected: created_at, -created_at" )
513+ }
514+ }
515+ }
516+
506517fn filter_pages_by_responder ( resp : & mut serde_json:: Value , responder : & str ) {
507518 if let Some ( pages) = resp
508519 . get_mut ( "data" )
@@ -952,14 +963,15 @@ mod tests {
952963 . mock ( "GET" , "/api/unstable/on-call/pages" )
953964 . match_query ( mockito:: Matcher :: AllOf ( vec ! [
954965 mockito:: Matcher :: UrlEncoded ( "page[size]" . into( ) , "42" . into( ) ) ,
966+ mockito:: Matcher :: UrlEncoded ( "sort" . into( ) , "-created_at" . into( ) ) ,
955967 mockito:: Matcher :: UrlEncoded ( "filter" . into( ) , "team:core-platform" . into( ) ) ,
956968 ] ) )
957969 . with_status ( 200 )
958970 . with_header ( "content-type" , "application/json" )
959971 . with_body ( r#"{"data": []}"# )
960972 . create_async ( )
961973 . await ;
962- let result = super :: pages_list ( & cfg, Some ( "core-platform" ) , None , 42 ) . await ;
974+ let result = super :: pages_list ( & cfg, Some ( "core-platform" ) , None , 42 , "-created_at" ) . await ;
963975 assert ! ( result. is_ok( ) , "pages_list failed: {:?}" , result. err( ) ) ;
964976 mock. assert_async ( ) . await ;
965977 cleanup_env ( ) ;
@@ -969,7 +981,7 @@ mod tests {
969981 async fn test_on_call_pages_list_rejects_invalid_page_size ( ) {
970982 let _lock = lock_env ( ) . await ;
971983 let cfg = test_config ( "http://unused.local" ) ;
972- let result = super :: pages_list ( & cfg, None , None , 0 ) . await ;
984+ let result = super :: pages_list ( & cfg, None , None , 0 , "-created_at" ) . await ;
973985 assert ! ( result. is_err( ) ) ;
974986 assert ! ( result
975987 . unwrap_err( )
@@ -978,6 +990,19 @@ mod tests {
978990 cleanup_env ( ) ;
979991 }
980992
993+ #[ tokio:: test]
994+ async fn test_on_call_pages_list_rejects_invalid_sort ( ) {
995+ let _lock = lock_env ( ) . await ;
996+ let cfg = test_config ( "http://unused.local" ) ;
997+ let result = super :: pages_list ( & cfg, None , None , 100 , "started_at" ) . await ;
998+ assert ! ( result. is_err( ) ) ;
999+ assert ! ( result
1000+ . unwrap_err( )
1001+ . to_string( )
1002+ . contains( "invalid --sort value" ) ) ;
1003+ cleanup_env ( ) ;
1004+ }
1005+
9811006 #[ test]
9821007 fn test_page_has_responder_matches_and_rejects ( ) {
9831008 let page = serde_json:: json!( {
0 commit comments