@@ -380,6 +380,7 @@ const SERVER_FIXTURES: &[&str] = &[
380380 "server_multi_content_request" ,
381381 "server_multi_content_response" ,
382382 "server_prune" ,
383+ "server_filtering" ,
383384] ;
384385
385386/// Server fixtures whose generation must fail with a documented error, covering
@@ -615,6 +616,7 @@ server_generated_tests!(
615616 server_multi_content_request,
616617 server_multi_content_response,
617618 server_prune,
619+ server_filtering,
618620) ;
619621
620622/// The server `#[test]`s must cover exactly the supported server fixtures.
@@ -668,6 +670,130 @@ fn skip_prune_retains_unused_schemas() {
668670 ) ;
669671}
670672
673+ /// Path to the shared filtering fixture (three tagged/untagged operations).
674+ fn filtering_fixture ( ) -> PathBuf {
675+ return tests_dir ( ) . join ( "fixtures" ) . join ( "server_filtering.yaml" ) ;
676+ }
677+
678+ /// `exclude-tags` drops operations carrying an excluded tag, and pruning then
679+ /// removes any component schema the dropped operation uniquely referenced.
680+ #[ test]
681+ fn filter_exclude_tags_drops_tagged_operations ( ) {
682+ let mut config = server_config ( ) ;
683+ config. output_options . exclude_tags = vec ! [ "admin" . to_owned( ) ] ;
684+
685+ let generated =
686+ oapi_codegen:: generate ( & filtering_fixture ( ) , & config) . expect ( "generating filtered server output failed" ) ;
687+ assert ! (
688+ generated. contains( "fn list_pets" ) && generated. contains( "fn health_check" ) ,
689+ "operations without the excluded tag must be kept" ,
690+ ) ;
691+ assert ! (
692+ !generated. contains( "fn get_stats" ) ,
693+ "operations carrying an excluded tag must be dropped" ,
694+ ) ;
695+ assert ! (
696+ generated. contains( "struct Pet" ) && !generated. contains( "struct Stats" ) ,
697+ "a schema referenced only by a dropped operation must be pruned" ,
698+ ) ;
699+ }
700+
701+ /// `include-tags` keeps only operations carrying one of the included tags;
702+ /// untagged operations are dropped.
703+ #[ test]
704+ fn filter_include_tags_keeps_only_tagged_operations ( ) {
705+ let mut config = server_config ( ) ;
706+ config. output_options . include_tags = vec ! [ "pets" . to_owned( ) ] ;
707+
708+ let generated =
709+ oapi_codegen:: generate ( & filtering_fixture ( ) , & config) . expect ( "generating filtered server output failed" ) ;
710+ assert ! (
711+ generated. contains( "fn list_pets" ) ,
712+ "operations with an included tag must be kept" ,
713+ ) ;
714+ assert ! (
715+ !generated. contains( "fn get_stats" ) && !generated. contains( "fn health_check" ) ,
716+ "operations without an included tag (including untagged) must be dropped" ,
717+ ) ;
718+ }
719+
720+ /// `exclude-operation-ids` drops operations by `operationId`; the rest survive.
721+ #[ test]
722+ fn filter_exclude_operation_ids_drops_named_operations ( ) {
723+ let mut config = server_config ( ) ;
724+ config. output_options . exclude_operation_ids = vec ! [ "healthCheck" . to_owned( ) ] ;
725+
726+ let generated =
727+ oapi_codegen:: generate ( & filtering_fixture ( ) , & config) . expect ( "generating filtered server output failed" ) ;
728+ assert ! (
729+ generated. contains( "fn list_pets" ) && generated. contains( "fn get_stats" ) ,
730+ "operations not named in exclude-operation-ids must be kept" ,
731+ ) ;
732+ assert ! (
733+ !generated. contains( "fn health_check" ) ,
734+ "operations named in exclude-operation-ids must be dropped" ,
735+ ) ;
736+ }
737+
738+ /// `include-operation-ids` keeps only operations whose `operationId` is listed.
739+ #[ test]
740+ fn filter_include_operation_ids_keeps_only_named_operations ( ) {
741+ let mut config = server_config ( ) ;
742+ config. output_options . include_operation_ids = vec ! [ "listPets" . to_owned( ) ] ;
743+
744+ let generated =
745+ oapi_codegen:: generate ( & filtering_fixture ( ) , & config) . expect ( "generating filtered server output failed" ) ;
746+ assert ! (
747+ generated. contains( "fn list_pets" ) ,
748+ "operations named in include-operation-ids must be kept" ,
749+ ) ;
750+ assert ! (
751+ !generated. contains( "fn get_stats" ) && !generated. contains( "fn health_check" ) ,
752+ "operations not named in include-operation-ids must be dropped" ,
753+ ) ;
754+ }
755+
756+ /// `exclude-schemas` removes named component schemas from models generation,
757+ /// leaving the rest intact. Models-only generation never prunes, so a negative
758+ /// control (generation without the option) proves the removal is attributable to
759+ /// `exclude-schemas` and not to pruning.
760+ #[ test]
761+ fn filter_exclude_schemas_removes_named_models ( ) {
762+ let models_only = oapi_codegen:: config:: Generate {
763+ models : true ,
764+ ..Default :: default ( )
765+ } ;
766+
767+ let baseline = oapi_codegen:: Config {
768+ generate : models_only. clone ( ) ,
769+ ..Default :: default ( )
770+ } ;
771+ let unfiltered =
772+ oapi_codegen:: generate ( & filtering_fixture ( ) , & baseline) . expect ( "generating baseline models failed" ) ;
773+ assert ! (
774+ unfiltered. contains( "struct Standalone" ) ,
775+ "without exclude-schemas the schema must be generated (models-only never prunes)" ,
776+ ) ;
777+
778+ let config = oapi_codegen:: Config {
779+ generate : models_only,
780+ output_options : oapi_codegen:: config:: OutputOptions {
781+ exclude_schemas : vec ! [ "Standalone" . to_owned( ) ] ,
782+ ..Default :: default ( )
783+ } ,
784+ ..Default :: default ( )
785+ } ;
786+ let generated = oapi_codegen:: generate ( & filtering_fixture ( ) , & config) . expect ( "generating filtered models failed" ) ;
787+ assert ! (
788+ generated. contains( "struct Pet" ) && generated. contains( "struct Stats" ) ,
789+ "schemas not named in exclude-schemas must be generated" ,
790+ ) ;
791+ assert ! (
792+ !generated. contains( "struct Standalone" ) ,
793+ "schemas named in exclude-schemas must not be generated" ,
794+ ) ;
795+ }
796+
671797/// Configuration that enables the blocking `reqwest` client generator.
672798fn client_config ( ) -> oapi_codegen:: Config {
673799 return oapi_codegen:: Config {
0 commit comments