<!-- Provide a brief summary of your changes --> ## Motivation and Context <!-- Why is this change needed? What problem does it solve? --> The following PR adds a new v0.1 API version. The goal is to mark v0.1 as a "freeze" point while keeping v0 as the moving target for new features so integrators can start building on top of something stable(r). Details: * This change is quite simple - we re-register the same handlers twice, once as `v0` and once as `v0.1` * Going forward, we'll keep v0.1 frozen while we add changes either on top of both (non-breaking) or we'll have to branch if breaking changes are necessary * We all acknowledge this is not exactly best-practice, but it gives us a way to gather feedback and allow clients to start integrating with the API without breaking them (**note** this implies a follow up PR that would branch the handlers used in v0.1). * For integrators/clients: please provide your feedback - what works well, what doesn't so we can take this into account going towards GA. ## How Has This Been Tested? <!-- Have you tested this in a real application? Which scenarios were tested? --> ## Breaking Changes <!-- Will users need to update their code or configurations? --> No, this just adds a new API version alongside the existing one. ## Types of changes <!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: --> - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update ## Checklist <!-- Go over all the following points, and put an `x` in all the boxes that apply. --> - [ ] I have read the [MCP Documentation](https://modelcontextprotocol.io) - [ ] My code follows the repository's style guidelines - [ ] New and existing tests pass locally - [ ] I have added appropriate error handling - [ ] I have added or updated documentation as needed ## Additional context <!-- Add any other context, implementation notes, or design decisions --> Fixes: #649 Signed-off-by: Radoslav Dimitrov <radoslav@stacklok.com>
86 lines
2.1 KiB
Go
86 lines
2.1 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/config"
|
|
"github.com/modelcontextprotocol/registry/internal/telemetry"
|
|
)
|
|
|
|
func TestHealthEndpoint(t *testing.T) {
|
|
// Test cases
|
|
testCases := []struct {
|
|
name string
|
|
config *config.Config
|
|
expectedStatus int
|
|
expectedBody v0.HealthBody
|
|
}{
|
|
{
|
|
name: "returns health status with github client id",
|
|
config: &config.Config{
|
|
GithubClientID: "test-github-client-id",
|
|
},
|
|
expectedStatus: http.StatusOK,
|
|
expectedBody: v0.HealthBody{
|
|
Status: "ok",
|
|
GitHubClientID: "test-github-client-id",
|
|
},
|
|
},
|
|
{
|
|
name: "returns health status without github client id",
|
|
config: &config.Config{
|
|
GithubClientID: "",
|
|
},
|
|
expectedStatus: http.StatusOK,
|
|
expectedBody: v0.HealthBody{
|
|
Status: "ok",
|
|
GitHubClientID: "",
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
// Create a new test API
|
|
mux := http.NewServeMux()
|
|
api := humago.New(mux, huma.DefaultConfig("Test API", "1.0.0"))
|
|
|
|
shutdownTelemetry, metrics, _ := telemetry.InitMetrics("test")
|
|
|
|
// Register the health endpoint
|
|
v0.RegisterHealthEndpoint(api, "/v0", tc.config, metrics)
|
|
|
|
// Create a test request
|
|
req := httptest.NewRequest(http.MethodGet, "/v0/health", nil)
|
|
w := httptest.NewRecorder()
|
|
|
|
// Serve the request
|
|
mux.ServeHTTP(w, req)
|
|
|
|
// shut down the metric provider
|
|
_ = shutdownTelemetry(context.Background())
|
|
|
|
// Check the status code
|
|
assert.Equal(t, tc.expectedStatus, w.Code)
|
|
|
|
// Check the response body
|
|
// Since Huma adds a $schema field, we'll check individual fields
|
|
body := w.Body.String()
|
|
assert.Contains(t, body, `"status":"ok"`)
|
|
|
|
if tc.config.GithubClientID != "" {
|
|
assert.Contains(t, body, `"github_client_id":"test-github-client-id"`)
|
|
} else {
|
|
assert.NotContains(t, body, `"github_client_id"`)
|
|
}
|
|
})
|
|
}
|
|
}
|