diff --git a/internal/service/registry_service_test.go b/internal/service/registry_service_test.go index 05ec8477..97d3a9a1 100644 --- a/internal/service/registry_service_test.go +++ b/internal/service/registry_service_test.go @@ -41,6 +41,24 @@ func TestValidateNoDuplicateRemoteURLs(t *testing.T) { {Type: "streamable-http", URL: "https://api.microsoft.com/mcp"}, }, }, + "deleted": { + Schema: model.CurrentSchemaURL, + Name: "com.example/deleted-server", + Description: "A deleted server", + Version: "1.0.0", + Remotes: []model.Transport{ + {Type: "streamable-http", URL: "https://deleted.example.com/mcp"}, + }, + }, + "deprecated": { + Schema: model.CurrentSchemaURL, + Name: "com.example/deprecated-server", + Description: "A deprecated server", + Version: "1.0.0", + Remotes: []model.Transport{ + {Type: "streamable-http", URL: "https://deprecated.example.com/mcp"}, + }, + }, } testDB := database.NewTestDB(t) @@ -52,6 +70,18 @@ func TestValidateNoDuplicateRemoteURLs(t *testing.T) { require.NoError(t, err, "failed to create server: %v", err) } + deletedServer := existingServers["deleted"] + _, err := service.UpdateServerStatus(ctx, deletedServer.Name, deletedServer.Version, &StatusChangeRequest{ + NewStatus: model.StatusDeleted, + }) + require.NoError(t, err) + + deprecatedServer := existingServers["deprecated"] + _, err = service.UpdateServerStatus(ctx, deprecatedServer.Name, deprecatedServer.Version, &StatusChangeRequest{ + NewStatus: model.StatusDeprecated, + }) + require.NoError(t, err) + tests := []struct { name string serverDetail apiv0.ServerJSON @@ -97,6 +127,33 @@ func TestValidateNoDuplicateRemoteURLs(t *testing.T) { expectError: true, errorMsg: "remote URL https://api.example.com/mcp is already used by server com.example/existing-server", }, + { + name: "duplicate remote URL used only by deleted server - should pass", + serverDetail: apiv0.ServerJSON{ + Schema: model.CurrentSchemaURL, + Name: "com.example/new-server-with-deleted-conflict", + Description: "A new server reusing a deleted remote URL", + Version: "1.0.0", + Remotes: []model.Transport{ + {Type: "streamable-http", URL: "https://deleted.example.com/mcp"}, + }, + }, + expectError: false, + }, + { + name: "duplicate remote URL used by deprecated server - should fail", + serverDetail: apiv0.ServerJSON{ + Schema: model.CurrentSchemaURL, + Name: "com.example/new-server-with-deprecated-conflict", + Description: "A new server reusing a deprecated remote URL", + Version: "1.0.0", + Remotes: []model.Transport{ + {Type: "streamable-http", URL: "https://deprecated.example.com/mcp"}, + }, + }, + expectError: true, + errorMsg: "remote URL https://deprecated.example.com/mcp is already used by server com.example/deprecated-server", + }, { name: "updating same server with same URLs - should pass", serverDetail: apiv0.ServerJSON{