@@ -237,6 +237,59 @@ fn mapped_get_and_post_projects_pass_the_offline_compiler() {
237237 }
238238}
239239
240+ #[ test]
241+ fn unsupported_path_placeholders_are_refused_without_mutation ( ) {
242+ for name in [
243+ "RecordId" . to_owned ( ) ,
244+ "1record" . to_owned ( ) ,
245+ "record.id" . to_owned ( ) ,
246+ "récord" . to_owned ( ) ,
247+ "r" . repeat ( 65 ) ,
248+ ] {
249+ let document = request_openapi (
250+ "GET" ,
251+ & format ! ( "/records/{{{name}}}" ) ,
252+ vec ! [ parameter( & name, "path" , true , "string" ) ] ,
253+ None ,
254+ ) ;
255+ let workspace = tempfile:: tempdir ( ) . expect ( "tempdir" ) ;
256+ let project = scaffold ( workspace. path ( ) , & document) ;
257+ assert_mapping_failure_is_atomic (
258+ & project,
259+ & [ format ! (
260+ "subject.subject-reference-v1.reference=path:{name}"
261+ ) ] ,
262+ "must be a Registry Stack LocalId" ,
263+ & format ! ( "unsupported path placeholder {name}" ) ,
264+ ) ;
265+ }
266+ for ( path, parameters, mapping, expected) in [
267+ (
268+ "/records/{record_id}/{record_id}" ,
269+ vec ! [ parameter( "record_id" , "path" , true , "string" ) ] ,
270+ "subject.subject-reference-v1.reference=path:record_id" ,
271+ "path placeholders must be unique" ,
272+ ) ,
273+ (
274+ "/records/{missing}" ,
275+ vec ! [ parameter( "reference" , "query" , true , "string" ) ] ,
276+ "subject.subject-reference-v1.reference=query:reference" ,
277+ "path:missing" ,
278+ ) ,
279+ (
280+ "/records/prefix-{record_id}" ,
281+ vec ! [ parameter( "reference" , "query" , true , "string" ) ] ,
282+ "subject.subject-reference-v1.reference=query:reference" ,
283+ "path placeholder must occupy one complete segment" ,
284+ ) ,
285+ ] {
286+ let document = request_openapi ( "GET" , path, parameters, None ) ;
287+ let workspace = tempfile:: tempdir ( ) . expect ( "tempdir" ) ;
288+ let project = scaffold ( workspace. path ( ) , & document) ;
289+ assert_mapping_failure_is_atomic ( & project, & [ mapping. to_owned ( ) ] , expected, path) ;
290+ }
291+ }
292+
240293#[ test]
241294fn invalid_selector_mappings_refuse_before_mutating_the_project ( ) {
242295 struct Case {
0 commit comments