package router

import (
	"net/http"
	"testing"

	"github.com/go-chi/chi/v5"

	"github.com/pingcap/agent-git-service/internal/rest"
)

// This is deliberately a route-only contract test. It catches the failure
// mode where OpenAPI and handlers exist but the production router omits the
// endpoint, without requiring a TiDB test fixture to start.
func TestImporterContractRoutesAreRegistered(t *testing.T) {
	routes := chi.NewRouter()
	deps := &rest.Deps{}
	registerImportRoutes(routes, deps)
	registerUserScopedRoutes(routes, deps)

	registered := map[string]map[string]bool{}
	if err := chi.Walk(routes, func(method, route string, _ http.Handler, _ ...func(http.Handler) http.Handler) error {
		if registered[route] == nil {
			registered[route] = map[string]bool{}
		}
		registered[route][method] = true
		return nil
	}); err != nil {
		t.Fatalf("walk importer routes: %v", err)
	}

	required := map[string][]string{
		"/api/ext/v1/imports/{import_id}/release-assets/{source_id}":               {http.MethodPut},
		"/api/ext/v1/imports/{import_id}/source-users":                             {http.MethodGet, http.MethodPatch},
		"/api/ext/v1/imports/{import_id}/source-users/{source_user_id}/claim":      {http.MethodPost},
		"/api/ext/v1/imports/{import_id}/source-users/{source_user_id}/invitation": {http.MethodPost},
		"/api/ext/v1/user/import-source-users/pending":                             {http.MethodGet},
		"/api/ext/v1/user/import-attribution-invitations":                          {http.MethodGet},
	}
	for route, methods := range required {
		for _, method := range methods {
			if !registered[route][method] {
				t.Fatalf("required importer route %s %s is not registered", method, route)
			}
		}
	}
}
