@@ -257,5 +257,128 @@ module Alchemy
257257 end
258258 end
259259 end
260+
261+ describe "Wildcard URL matching" do
262+ before do
263+ PageDefinition . reset!
264+ end
265+
266+ context "with a child page that has wildcard_url (replaces slug)" do
267+ let! ( :products_page ) do
268+ create (
269+ :alchemy_page ,
270+ :public ,
271+ name : "Products" ,
272+ page_layout : "standard" ,
273+ parent : default_language_root ,
274+ language : default_language
275+ )
276+ end
277+
278+ let! ( :product_detail_page ) do
279+ create (
280+ :alchemy_page ,
281+ :public ,
282+ name : "Product Details" ,
283+ page_layout : "product_detail" ,
284+ parent : products_page ,
285+ language : default_language
286+ )
287+ end
288+
289+ it "matches a dynamic path and sets params" do
290+ get :show , params : { urlname : "products/42" }
291+ expect ( assigns ( :page ) ) . to eq ( product_detail_page )
292+ expect ( controller . params [ :id ] ) . to eq ( "42" )
293+ end
294+
295+ it "renders 404 when constraint does not match" do
296+ expect {
297+ get :show , params : { urlname : "products/not-a-number" }
298+ } . to raise_error ( ActionController ::RoutingError )
299+ end
300+ end
301+
302+ context "exact page match takes priority over pattern" do
303+ let! ( :products_page ) do
304+ create (
305+ :alchemy_page ,
306+ :public ,
307+ name : "Products" ,
308+ page_layout : "standard" ,
309+ parent : default_language_root ,
310+ language : default_language
311+ )
312+ end
313+
314+ let! ( :product_detail_page ) do
315+ create (
316+ :alchemy_page ,
317+ :public ,
318+ name : "Product Details" ,
319+ page_layout : "product_detail" ,
320+ parent : products_page ,
321+ language : default_language
322+ )
323+ end
324+
325+ let! ( :child_page ) do
326+ create (
327+ :alchemy_page ,
328+ :public ,
329+ name : "Featured" ,
330+ page_layout : "standard" ,
331+ parent : product_detail_page ,
332+ language : default_language
333+ )
334+ end
335+
336+ it "loads the exact page match, not the pattern match" do
337+ get :show , params : { urlname : child_page . urlname }
338+ expect ( assigns ( :page ) ) . to eq ( child_page )
339+ end
340+ end
341+
342+ context "with hierarchical patterns (grandchild under pattern page)" do
343+ let! ( :products_page ) do
344+ create (
345+ :alchemy_page ,
346+ :public ,
347+ name : "Products" ,
348+ page_layout : "standard" ,
349+ parent : default_language_root ,
350+ language : default_language
351+ )
352+ end
353+
354+ let! ( :product_detail_page ) do
355+ create (
356+ :alchemy_page ,
357+ :public ,
358+ name : "Product Details" ,
359+ page_layout : "product_detail" ,
360+ parent : products_page ,
361+ language : default_language
362+ )
363+ end
364+
365+ let! ( :comments_page ) do
366+ create (
367+ :alchemy_page ,
368+ :public ,
369+ name : "Comments" ,
370+ page_layout : "standard" ,
371+ parent : product_detail_page ,
372+ language : default_language
373+ )
374+ end
375+
376+ it "matches a grandchild page with parent's pattern segment" do
377+ get :show , params : { urlname : "products/42/comments" }
378+ expect ( assigns ( :page ) ) . to eq ( comments_page )
379+ expect ( controller . params [ :id ] ) . to eq ( "42" )
380+ end
381+ end
382+ end
260383 end
261384end
0 commit comments