## Motivation and Context The database logic was getting a bit unwieldy and fragile - especially because business logic that should really have lived at the registry service level was being pushed into the persistence level. This PR tightens the interface, simplifies the code there, as well as rips out a bunch of mocks etc. we don't need. ## How Has This Been Tested? Locally everything works ## Breaking Changes The list endpoint was surprisingly always filtering for isLatest only, which seems like a bug? I have removed this filter.
82 lines
2.6 KiB
Go
82 lines
2.6 KiB
Go
package v0_test
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/danielgtaylor/huma/v2"
|
|
"github.com/danielgtaylor/huma/v2/adapters/humago"
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
v0 "github.com/modelcontextprotocol/registry/internal/api/handlers/v0"
|
|
"github.com/modelcontextprotocol/registry/internal/api/router"
|
|
"github.com/modelcontextprotocol/registry/internal/config"
|
|
"github.com/modelcontextprotocol/registry/internal/database"
|
|
"github.com/modelcontextprotocol/registry/internal/service"
|
|
"github.com/modelcontextprotocol/registry/internal/telemetry"
|
|
apiv0 "github.com/modelcontextprotocol/registry/pkg/api/v0"
|
|
"github.com/modelcontextprotocol/registry/pkg/model"
|
|
)
|
|
|
|
func TestPrometheusHandler(t *testing.T) {
|
|
registryService := service.NewRegistryServiceWithDB(database.NewMemoryDB())
|
|
server, err := registryService.Publish(apiv0.ServerJSON{
|
|
Name: "io.github.example/test-server",
|
|
Description: "Test server detail",
|
|
Repository: model.Repository{
|
|
URL: "https://github.com/example/test-server",
|
|
Source: "github",
|
|
ID: "example/test-server",
|
|
},
|
|
VersionDetail: model.VersionDetail{
|
|
Version: "2.0.0",
|
|
},
|
|
})
|
|
assert.NoError(t, err)
|
|
|
|
cfg := config.NewConfig()
|
|
shutdownTelemetry, metrics, _ := telemetry.InitMetrics("dev")
|
|
|
|
mux := http.NewServeMux()
|
|
api := humago.New(mux, huma.DefaultConfig("Test API", "1.0.0"))
|
|
|
|
// Add metrics middleware with options
|
|
api.UseMiddleware(router.MetricTelemetryMiddleware(metrics,
|
|
router.WithSkipPaths("/health", "/metrics", "/ping", "/docs"),
|
|
))
|
|
v0.RegisterHealthEndpoint(api, cfg, metrics)
|
|
v0.RegisterServersEndpoints(api, registryService)
|
|
|
|
// Add /metrics for Prometheus metrics using promhttp
|
|
mux.Handle("/metrics", metrics.PrometheusHandler())
|
|
|
|
// Create request
|
|
url := "/v0/servers/" + server.Meta.IOModelContextProtocolRegistry.ID
|
|
req := httptest.NewRequest(http.MethodGet, url, nil)
|
|
w := httptest.NewRecorder()
|
|
|
|
// Serve the request
|
|
mux.ServeHTTP(w, req)
|
|
|
|
// Check the status code
|
|
if w.Code != http.StatusOK {
|
|
t.Fatalf("expected status %d, got %d", http.StatusOK, w.Code)
|
|
}
|
|
|
|
req = httptest.NewRequest(http.MethodGet, "/metrics", nil)
|
|
w = httptest.NewRecorder()
|
|
mux.ServeHTTP(w, req)
|
|
|
|
// shutdown metrics provider
|
|
_ = shutdownTelemetry(context.Background())
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code, "Expected status OK for /metrics endpoint")
|
|
|
|
body := w.Body.String()
|
|
// Check if the response body contains expected metrics
|
|
assert.Contains(t, body, "mcp_registry_http_request_duration_bucket")
|
|
assert.Contains(t, body, "mcp_registry_http_requests_total")
|
|
assert.Contains(t, body, "path=\"/v0/servers/{id}\"")
|
|
}
|