@@ -14,7 +14,7 @@ void global_filter_runs() {
1414
1515 List <String > events = new ArrayList <>();
1616
17- HttpFilter filter = new TestFilter (events , false );
17+ HttpFilter filter = new TestFilter ("g1" , events , false );
1818
1919 List <FilterRegistration > regs = List .of (
2020 new FilterRegistration (filter , 1 , null )
@@ -29,7 +29,7 @@ void global_filter_runs() {
2929 );
3030
3131 assertEquals (
32- List .of ("filter " , "handler" ),
32+ List .of ("g1 " , "handler" ),
3333 events
3434 );
3535 }
@@ -39,7 +39,7 @@ void filter_can_stop_chain() {
3939
4040 List <String > events = new ArrayList <>();
4141
42- HttpFilter stopFilter = new TestFilter (events , true );
42+ HttpFilter stopFilter = new TestFilter ("stop" , events , true );
4343
4444 List <FilterRegistration > regs = List .of (
4545 new FilterRegistration (stopFilter , 1 , null )
@@ -54,27 +54,116 @@ void filter_can_stop_chain() {
5454 );
5555
5656 assertEquals (403 , response .getStatusCode ());
57- assertEquals (List .of ("filter" ), events );
57+ assertEquals (List .of ("stop" ), events );
58+ }
59+
60+ @ Test
61+ void route_specific_filter_runs_when_path_matches () {
62+ List <String > events = new ArrayList <>();
63+
64+ HttpFilter routeFilter = new TestFilter ("r1" , events , false );
65+
66+ List <FilterRegistration > regs = List .of (
67+ new FilterRegistration (routeFilter , 1 , List .of ("/api/*" ))
68+ );
69+
70+ ConfigurableFilterPipeline pipeline =
71+ new ConfigurableFilterPipeline (regs );
72+
73+ pipeline .execute (
74+ new HttpRequest ("GET" , "/api/users" ),
75+ new TestHandler (events )
76+ );
77+
78+ assertEquals (List .of ("r1" , "handler" ), events );
79+ }
80+
81+ @ Test
82+ void route_specific_filter_is_skipped_when_path_does_not_match () {
83+ List <String > events = new ArrayList <>();
84+
85+ HttpFilter routeFilter = new TestFilter ("r1" , events , false );
86+
87+ List <FilterRegistration > regs = List .of (
88+ new FilterRegistration (routeFilter , 1 , List .of ("/api/*" ))
89+ );
90+
91+ ConfigurableFilterPipeline pipeline =
92+ new ConfigurableFilterPipeline (regs );
93+
94+ pipeline .execute (
95+ new HttpRequest ("GET" , "/public" ),
96+ new TestHandler (events )
97+ );
98+
99+ assertEquals (List .of ("handler" ), events );
100+ }
101+
102+ @ Test
103+ void mixed_pipeline_runs_global_then_route_then_handler () {
104+ List <String > events = new ArrayList <>();
105+
106+ HttpFilter global = new TestFilter ("g1" , events , false );
107+ HttpFilter route = new TestFilter ("r1" , events , false );
108+
109+ List <FilterRegistration > regs = List .of (
110+ new FilterRegistration (global , 1 , null ),
111+ new FilterRegistration (route , 1 , List .of ("/api/*" ))
112+ );
113+
114+ ConfigurableFilterPipeline pipeline =
115+ new ConfigurableFilterPipeline (regs );
116+
117+ pipeline .execute (
118+ new HttpRequest ("GET" , "/api/users" ),
119+ new TestHandler (events )
120+ );
121+
122+ assertEquals (List .of ("g1" , "r1" , "handler" ), events );
123+ }
124+
125+ @ Test
126+ void ordering_is_by_order_field () {
127+ List <String > events = new ArrayList <>();
128+
129+ HttpFilter f20 = new TestFilter ("f20" , events , false );
130+ HttpFilter f10 = new TestFilter ("f10" , events , false );
131+ HttpFilter f30 = new TestFilter ("f30" , events , false );
132+
133+ List <FilterRegistration > regs = List .of (
134+ new FilterRegistration (f20 , 20 , null ),
135+ new FilterRegistration (f10 , 10 , null ),
136+ new FilterRegistration (f30 , 30 , null )
137+ );
138+
139+ ConfigurableFilterPipeline pipeline =
140+ new ConfigurableFilterPipeline (regs );
141+
142+ pipeline .execute (
143+ new HttpRequest ("GET" , "/home" ),
144+ new TestHandler (events )
145+ );
146+
147+ assertEquals (List .of ("f10" , "f20" , "f30" , "handler" ), events );
58148 }
59149
60- // =====================
61- // Test helper classes
62- // =====================
63150
64151 static class TestFilter implements HttpFilter {
65152
153+ private final String name ;
66154 private final List <String > events ;
67155 private final boolean stop ;
68156
69- TestFilter (List <String > events , boolean stop ) {
157+ TestFilter (String name , List <String > events , boolean stop ) {
158+ this .name = name ;
70159 this .events = events ;
71160 this .stop = stop ;
72161 }
73162
74163 @ Override
75164 public HttpResponse handle (HttpRequest request , FilterChain chain ) {
76165
77- events .add ("filter" );
166+ events .add (name );
78167
79168 if (stop ) {
80169 return new HttpResponse (403 , "Stopped" );
0 commit comments