refactor: create helper to fetch/parse swagger doc

This commit is contained in:
2026-01-09 18:41:14 +01:00
parent 893ee154de
commit 9ff7c98cf0

View File

@@ -8,32 +8,43 @@ import (
"goyco/internal/testutils" "goyco/internal/testutils"
) )
func fetchSwaggerDoc(t *testing.T, ctx *testContext) map[string]any {
t.Helper()
request, err := http.NewRequest("GET", ctx.baseURL+"/swagger/doc.json", nil)
if err != nil {
t.Fatalf("Failed to create request: %v", err)
}
testutils.WithStandardHeaders(request)
response, err := ctx.client.Do(request)
if err != nil {
t.Fatalf("Request failed: %v", err)
}
defer response.Body.Close()
if response.StatusCode != http.StatusOK {
t.Skipf("Swagger JSON not available (status %d)", response.StatusCode)
return nil
}
var swaggerDoc map[string]any
if err := json.NewDecoder(response.Body).Decode(&swaggerDoc); err != nil {
t.Fatalf("Failed to decode Swagger JSON: %v", err)
}
return swaggerDoc
}
func TestE2E_SwaggerDocumentation(t *testing.T) { func TestE2E_SwaggerDocumentation(t *testing.T) {
ctx := setupTestContext(t) ctx := setupTestContext(t)
t.Run("swagger_json_is_valid", func(t *testing.T) { t.Run("swagger_json_is_valid", func(t *testing.T) {
req, err := http.NewRequest("GET", ctx.baseURL+"/swagger/doc.json", nil) swaggerDoc := fetchSwaggerDoc(t, ctx)
if err != nil { if swaggerDoc == nil {
t.Fatalf("Failed to create request: %v", err)
}
testutils.WithStandardHeaders(req)
resp, err := ctx.client.Do(req)
if err != nil {
t.Fatalf("Request failed: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
t.Skipf("Swagger JSON not available (status %d)", resp.StatusCode)
return return
} }
var swaggerDoc map[string]any
if err := json.NewDecoder(resp.Body).Decode(&swaggerDoc); err != nil {
t.Fatalf("Failed to decode Swagger JSON: %v", err)
}
if swaggerDoc["swagger"] == nil && swaggerDoc["openapi"] == nil { if swaggerDoc["swagger"] == nil && swaggerDoc["openapi"] == nil {
t.Error("Swagger JSON missing swagger/openapi version") t.Error("Swagger JSON missing swagger/openapi version")
} }
@@ -66,28 +77,11 @@ func TestE2E_SwaggerDocumentation(t *testing.T) {
}) })
t.Run("api_endpoints_documented", func(t *testing.T) { t.Run("api_endpoints_documented", func(t *testing.T) {
req, err := http.NewRequest("GET", ctx.baseURL+"/swagger/doc.json", nil) swaggerDoc := fetchSwaggerDoc(t, ctx)
if err != nil { if swaggerDoc == nil {
t.Fatalf("Failed to create request: %v", err)
}
testutils.WithStandardHeaders(req)
resp, err := ctx.client.Do(req)
if err != nil {
t.Fatalf("Request failed: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
t.Skip("Swagger JSON not available")
return return
} }
var swaggerDoc map[string]any
if err := json.NewDecoder(resp.Body).Decode(&swaggerDoc); err != nil {
t.Fatalf("Failed to decode Swagger JSON: %v", err)
}
paths, ok := swaggerDoc["paths"].(map[string]any) paths, ok := swaggerDoc["paths"].(map[string]any)
if !ok { if !ok {
t.Error("Paths section is not a map") t.Error("Paths section is not a map")
@@ -110,28 +104,11 @@ func TestE2E_SwaggerDocumentation(t *testing.T) {
}) })
t.Run("request_response_schemas_present", func(t *testing.T) { t.Run("request_response_schemas_present", func(t *testing.T) {
req, err := http.NewRequest("GET", ctx.baseURL+"/swagger/doc.json", nil) swaggerDoc := fetchSwaggerDoc(t, ctx)
if err != nil { if swaggerDoc == nil {
t.Fatalf("Failed to create request: %v", err)
}
testutils.WithStandardHeaders(req)
resp, err := ctx.client.Do(req)
if err != nil {
t.Fatalf("Request failed: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
t.Skip("Swagger JSON not available")
return return
} }
var swaggerDoc map[string]any
if err := json.NewDecoder(resp.Body).Decode(&swaggerDoc); err != nil {
t.Fatalf("Failed to decode Swagger JSON: %v", err)
}
definitions, ok := swaggerDoc["definitions"].(map[string]any) definitions, ok := swaggerDoc["definitions"].(map[string]any)
if !ok { if !ok {
definitions, ok = swaggerDoc["components"].(map[string]any) definitions, ok = swaggerDoc["components"].(map[string]any)
@@ -173,28 +150,11 @@ func TestE2E_APIEndpointDocumentation(t *testing.T) {
ctx := setupTestContext(t) ctx := setupTestContext(t)
t.Run("api_info_endpoint_documented", func(t *testing.T) { t.Run("api_info_endpoint_documented", func(t *testing.T) {
req, err := http.NewRequest("GET", ctx.baseURL+"/swagger/doc.json", nil) swaggerDoc := fetchSwaggerDoc(t, ctx)
if err != nil { if swaggerDoc == nil {
t.Fatalf("Failed to create request: %v", err)
}
testutils.WithStandardHeaders(req)
resp, err := ctx.client.Do(req)
if err != nil {
t.Fatalf("Request failed: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
t.Skip("Swagger JSON not available")
return return
} }
var swaggerDoc map[string]any
if err := json.NewDecoder(resp.Body).Decode(&swaggerDoc); err != nil {
t.Fatalf("Failed to decode Swagger JSON: %v", err)
}
paths, ok := swaggerDoc["paths"].(map[string]any) paths, ok := swaggerDoc["paths"].(map[string]any)
if !ok { if !ok {
return return
@@ -218,28 +178,11 @@ func TestE2E_APIEndpointDocumentation(t *testing.T) {
}) })
t.Run("auth_endpoints_documented", func(t *testing.T) { t.Run("auth_endpoints_documented", func(t *testing.T) {
req, err := http.NewRequest("GET", ctx.baseURL+"/swagger/doc.json", nil) swaggerDoc := fetchSwaggerDoc(t, ctx)
if err != nil { if swaggerDoc == nil {
t.Fatalf("Failed to create request: %v", err)
}
testutils.WithStandardHeaders(req)
resp, err := ctx.client.Do(req)
if err != nil {
t.Fatalf("Request failed: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
t.Skip("Swagger JSON not available")
return return
} }
var swaggerDoc map[string]any
if err := json.NewDecoder(resp.Body).Decode(&swaggerDoc); err != nil {
t.Fatalf("Failed to decode Swagger JSON: %v", err)
}
paths, ok := swaggerDoc["paths"].(map[string]any) paths, ok := swaggerDoc["paths"].(map[string]any)
if !ok { if !ok {
return return