@@ -2226,6 +2226,58 @@ mod tests {
22262226 ) ;
22272227 }
22282228
2229+ #[ test]
2230+ fn canonicalize_advisor_ignores_endpoint_provenance_when_inferring_contract ( ) {
2231+ let mut provider_endpoint = endpoint ( "api.example.com" , 443 ) ;
2232+ provider_endpoint. protocol = "rest" . to_string ( ) ;
2233+ provider_endpoint. enforcement = "enforce" . to_string ( ) ;
2234+ provider_endpoint. access = "read-only" . to_string ( ) ;
2235+ provider_endpoint. provider_credentialed = true ;
2236+
2237+ let mut advisor_endpoint = provider_endpoint. clone ( ) ;
2238+ advisor_endpoint. provider_credentialed = false ;
2239+ advisor_endpoint. advisor_proposed = true ;
2240+
2241+ let mut base = SandboxPolicy :: default ( ) ;
2242+ base. network_policies . insert (
2243+ "existing_advisor" . to_string ( ) ,
2244+ NetworkPolicyRule {
2245+ name : "existing-advisor" . to_string ( ) ,
2246+ endpoints : vec ! [ advisor_endpoint] ,
2247+ binaries : vec ! [ advisor_binary( "/usr/bin/curl" ) ] ,
2248+ } ,
2249+ ) ;
2250+
2251+ let mut effective = base. clone ( ) ;
2252+ effective. network_policies . insert (
2253+ "_provider_example" . to_string ( ) ,
2254+ NetworkPolicyRule {
2255+ name : "provider-example" . to_string ( ) ,
2256+ endpoints : vec ! [ provider_endpoint] ,
2257+ binaries : vec ! [ binary( "/usr/bin/gh" ) ] ,
2258+ } ,
2259+ ) ;
2260+
2261+ let incoming = NetworkPolicyRule {
2262+ name : "advisor_example" . to_string ( ) ,
2263+ endpoints : vec ! [ NetworkEndpoint {
2264+ host: "api.example.com" . to_string( ) ,
2265+ port: 443 ,
2266+ advisor_proposed: true ,
2267+ ..Default :: default ( )
2268+ } ] ,
2269+ binaries : vec ! [ advisor_binary( "/usr/bin/python" ) ] ,
2270+ } ;
2271+
2272+ let ( rule_name, canonical) =
2273+ canonicalize_advisor_add_rule ( & base, & effective, "advisor_example" , & incoming)
2274+ . expect ( "provenance alone must not create multiple endpoint contracts" ) ;
2275+
2276+ assert_eq ! ( rule_name, "existing_advisor" ) ;
2277+ assert_eq ! ( canonical. endpoints[ 0 ] . protocol, "rest" ) ;
2278+ assert_eq ! ( canonical. endpoints[ 0 ] . access, "read-only" ) ;
2279+ }
2280+
22292281 #[ test]
22302282 fn canonicalize_advisor_narrows_multi_port_contract_and_keeps_overlay ( ) {
22312283 let mut existing_endpoint = endpoint ( "index.crates.io" , 443 ) ;
0 commit comments