@@ -460,6 +460,91 @@ func TestRemoteRegistryProvider_UpstreamFormat(t *testing.T) {
460460 assert .NotEmpty (t , registry .Servers , "Should have at least one container server" )
461461}
462462
463+ func TestGetServer_ShortNameResolution (t * testing.T ) {
464+ t .Parallel ()
465+
466+ // Build a controlled registry with known names
467+ reg := & types.Registry {
468+ Version : "1.0.0" ,
469+ LastUpdated : "2025-01-01T00:00:00Z" ,
470+ Servers : map [string ]* types.ImageMetadata {
471+ "io.github.stacklok/osv" : {BaseServerMetadata : types.BaseServerMetadata {Name : "io.github.stacklok/osv" }, Image : "ghcr.io/osv:latest" },
472+ "io.github.stacklok/github" : {BaseServerMetadata : types.BaseServerMetadata {Name : "io.github.stacklok/github" }, Image : "ghcr.io/github:latest" },
473+ "io.github.acme/github" : {BaseServerMetadata : types.BaseServerMetadata {Name : "io.github.acme/github" }, Image : "ghcr.io/acme-github:latest" },
474+ },
475+ RemoteServers : map [string ]* types.RemoteServerMetadata {
476+ "io.github.stacklok/slack-remote" : {BaseServerMetadata : types.BaseServerMetadata {Name : "io.github.stacklok/slack-remote" }, URL : "https://slack.example.com" },
477+ },
478+ }
479+
480+ provider := & LocalRegistryProvider {}
481+ provider .BaseProvider = NewBaseProvider (func () (* types.Registry , error ) {
482+ return reg , nil
483+ })
484+
485+ tests := []struct {
486+ name string
487+ query string
488+ expectName string
489+ expectError string
490+ }{
491+ {
492+ name : "exact full name match" ,
493+ query : "io.github.stacklok/osv" ,
494+ expectName : "io.github.stacklok/osv" ,
495+ },
496+ {
497+ name : "unique short name match" ,
498+ query : "osv" ,
499+ expectName : "io.github.stacklok/osv" ,
500+ },
501+ {
502+ name : "ambiguous short name errors with full names" ,
503+ query : "github" ,
504+ expectError : "multiple servers match 'github'" ,
505+ },
506+ {
507+ name : "ambiguous error lists both full names" ,
508+ query : "github" ,
509+ expectError : "io.github.stacklok/github" ,
510+ },
511+ {
512+ name : "ambiguous error lists both full names (second)" ,
513+ query : "github" ,
514+ expectError : "io.github.acme/github" ,
515+ },
516+ {
517+ name : "short name for remote server" ,
518+ query : "slack-remote" ,
519+ expectName : "io.github.stacklok/slack-remote" ,
520+ },
521+ {
522+ name : "no match returns not found" ,
523+ query : "nonexistent" ,
524+ expectError : "server not found: nonexistent" ,
525+ },
526+ {
527+ name : "partial name does not match (github-remote suffix check)" ,
528+ query : "remote" ,
529+ expectError : "server not found: remote" ,
530+ },
531+ }
532+
533+ for _ , tt := range tests {
534+ t .Run (tt .name , func (t * testing.T ) {
535+ t .Parallel ()
536+ server , err := provider .GetServer (tt .query )
537+ if tt .expectError != "" {
538+ require .Error (t , err )
539+ assert .Contains (t , err .Error (), tt .expectError )
540+ return
541+ }
542+ require .NoError (t , err )
543+ assert .Equal (t , tt .expectName , server .GetName ())
544+ })
545+ }
546+ }
547+
463548// getTypeName returns the type name of an interface value
464549func getTypeName (v interface {}) string {
465550 switch v .(type ) {
@@ -538,8 +623,8 @@ func TestGetServer(t *testing.T) {
538623 provider , err := NewRegistryProvider (cfg )
539624 require .NoError (t , err )
540625
541- // Test getting an existing server (using upstream reverse-DNS name )
542- server , err := provider .GetServer ("io.github.stacklok/ osv" )
626+ // Test getting an existing server (short name resolves via suffix match )
627+ server , err := provider .GetServer ("osv" )
543628 if err != nil {
544629 t .Fatalf ("Failed to get server: %v" , err )
545630 }
0 commit comments