Path: blob/dev/pkg/input/formats/swagger/downloader_test.go
2851 views
package swagger12import (3"encoding/json"4"net/http"5"net/http/httptest"6"os"7"strings"8"testing"9"time"1011"gopkg.in/yaml.v3"12)1314func TestSwaggerDownloader_SupportedExtensions(t *testing.T) {15downloader := &SwaggerDownloader{}16extensions := downloader.SupportedExtensions()1718expected := []string{".json", ".yaml", ".yml"}19if len(extensions) != len(expected) {20t.Errorf("Expected %d extensions, got %d", len(expected), len(extensions))21}2223for i, ext := range extensions {24if ext != expected[i] {25t.Errorf("Expected extension %s, got %s", expected[i], ext)26}27}28}2930func TestSwaggerDownloader_Download_JSON_Success(t *testing.T) {31// Create a mock Swagger spec (JSON)32mockSpec := map[string]interface{}{33"swagger": "2.0",34"info": map[string]interface{}{35"title": "Test API",36"version": "1.0.0",37},38"paths": map[string]interface{}{39"/test": map[string]interface{}{40"get": map[string]interface{}{41"summary": "Test endpoint",42},43},44},45}4647// Create mock server48server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {49w.Header().Set("Content-Type", "application/json")50if err := json.NewEncoder(w).Encode(mockSpec); err != nil {51http.Error(w, "failed to encode response", http.StatusInternalServerError)52}53}))54defer server.Close()5556// Create temp directory57tmpDir, err := os.MkdirTemp("", "swagger_test")58if err != nil {59t.Fatalf("Failed to create temp dir: %v", err)60}6162defer func() {63if err := os.RemoveAll(tmpDir); err != nil {64t.Fatalf("Failed to remove temp dir: %v", err)65}66}()6768// Test download69downloader := &SwaggerDownloader{}70filePath, err := downloader.Download(server.URL+"/swagger.json", tmpDir, nil)71if err != nil {72t.Fatalf("Download failed: %v", err)73}7475// Verify file exists76if !fileExists(filePath) {77t.Errorf("Downloaded file does not exist: %s", filePath)78}7980// Verify file content81content, err := os.ReadFile(filePath)82if err != nil {83t.Fatalf("Failed to read downloaded file: %v", err)84}8586var downloadedSpec map[string]interface{}87if err := json.Unmarshal(content, &downloadedSpec); err != nil {88t.Fatalf("Failed to parse downloaded JSON: %v", err)89}9091// Verify host field was added92_, exists := downloadedSpec["host"]93if !exists {94t.Error("Host field was not added to the spec")95}96}9798func TestSwaggerDownloader_Download_YAML_Success(t *testing.T) {99// Create a mock Swagger spec (YAML)100mockSpecYAML := `101swagger: "2.0"102info:103title: "Test API"104version: "1.0.0"105paths:106/test:107get:108summary: "Test endpoint"109`110111// Create mock server112server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {113w.Header().Set("Content-Type", "application/yaml")114if _, err := w.Write([]byte(mockSpecYAML)); err != nil {115http.Error(w, "failed to write response", http.StatusInternalServerError)116}117}))118119defer server.Close()120121// Create temp directory122tmpDir, err := os.MkdirTemp("", "swagger_test")123if err != nil {124t.Fatalf("Failed to create temp dir: %v", err)125}126127defer func() {128if err := os.RemoveAll(tmpDir); err != nil {129t.Fatalf("Failed to remove temp dir: %v", err)130}131}()132133// Test download134downloader := &SwaggerDownloader{}135filePath, err := downloader.Download(server.URL+"/swagger.yaml", tmpDir, nil)136if err != nil {137t.Fatalf("Download failed: %v", err)138}139140// Verify file exists141if !fileExists(filePath) {142t.Errorf("Downloaded file does not exist: %s", filePath)143}144145// Verify file content146content, err := os.ReadFile(filePath)147if err != nil {148t.Fatalf("Failed to read downloaded file: %v", err)149}150151var downloadedSpec map[string]interface{}152if err := yaml.Unmarshal(content, &downloadedSpec); err != nil {153t.Fatalf("Failed to parse downloaded YAML: %v", err)154}155156// Verify host field was added157_, exists := downloadedSpec["host"]158if !exists {159t.Error("Host field was not added to the spec")160}161}162163func TestSwaggerDownloader_Download_UnsupportedExtension(t *testing.T) {164tmpDir, err := os.MkdirTemp("", "swagger_test")165if err != nil {166t.Fatalf("Failed to create temp dir: %v", err)167}168169defer func() {170if err := os.RemoveAll(tmpDir); err != nil {171t.Fatalf("Failed to remove temp dir: %v", err)172}173}()174175downloader := &SwaggerDownloader{}176_, err = downloader.Download("http://example.com/spec.xml", tmpDir, nil)177if err == nil {178t.Error("Expected error for unsupported extension, but got none")179}180181if !strings.Contains(err.Error(), "URL does not appear to be a Swagger spec") {182t.Errorf("Unexpected error message: %v", err)183}184}185186func TestSwaggerDownloader_Download_HTTPError(t *testing.T) {187// Create mock server that returns 404188server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {189w.WriteHeader(http.StatusNotFound)190}))191defer server.Close()192193tmpDir, err := os.MkdirTemp("", "swagger_test")194if err != nil {195t.Fatalf("Failed to create temp dir: %v", err)196}197198defer func() {199if err := os.RemoveAll(tmpDir); err != nil {200t.Fatalf("Failed to remove temp dir: %v", err)201}202}()203204downloader := &SwaggerDownloader{}205_, err = downloader.Download(server.URL+"/swagger.json", tmpDir, nil)206if err == nil {207t.Error("Expected error for HTTP 404, but got none")208}209}210211func TestSwaggerDownloader_Download_InvalidJSON(t *testing.T) {212// Create mock server that returns invalid JSON213server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {214w.Header().Set("Content-Type", "application/json")215if _, err := w.Write([]byte("invalid json")); err != nil {216http.Error(w, "failed to write response", http.StatusInternalServerError)217}218}))219defer server.Close()220221tmpDir, err := os.MkdirTemp("", "swagger_test")222if err != nil {223t.Fatalf("Failed to create temp dir: %v", err)224}225226defer func() {227if err := os.RemoveAll(tmpDir); err != nil {228t.Fatalf("Failed to remove temp dir: %v", err)229}230}()231232downloader := &SwaggerDownloader{}233_, err = downloader.Download(server.URL+"/swagger.json", tmpDir, nil)234if err == nil {235t.Error("Expected error for invalid JSON, but got none")236}237}238239func TestSwaggerDownloader_Download_InvalidYAML(t *testing.T) {240// Create mock server that returns invalid YAML241server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {242w.Header().Set("Content-Type", "application/yaml")243if _, err := w.Write([]byte("invalid: yaml: content: [")); err != nil {244http.Error(w, "failed to write response", http.StatusInternalServerError)245}246}))247defer server.Close()248249tmpDir, err := os.MkdirTemp("", "swagger_test")250if err != nil {251t.Fatalf("Failed to create temp dir: %v", err)252}253254defer func() {255if err := os.RemoveAll(tmpDir); err != nil {256t.Fatalf("Failed to remove temp dir: %v", err)257}258}()259260downloader := &SwaggerDownloader{}261_, err = downloader.Download(server.URL+"/swagger.yaml", tmpDir, nil)262if err == nil {263t.Error("Expected error for invalid YAML, but got none")264}265}266267func TestSwaggerDownloader_Download_Timeout(t *testing.T) {268// Create mock server with delay269server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {270time.Sleep(35 * time.Second) // Longer than 30 second timeout271if err := json.NewEncoder(w).Encode(map[string]interface{}{"test": "data"}); err != nil {272http.Error(w, "failed to encode response", http.StatusInternalServerError)273}274}))275defer server.Close()276277tmpDir, err := os.MkdirTemp("", "swagger_test")278if err != nil {279t.Fatalf("Failed to create temp dir: %v", err)280}281282defer func() {283if err := os.RemoveAll(tmpDir); err != nil {284t.Fatalf("Failed to remove temp dir: %v", err)285}286}()287288downloader := &SwaggerDownloader{}289_, err = downloader.Download(server.URL+"/swagger.json", tmpDir, nil)290if err == nil {291t.Error("Expected timeout error, but got none")292}293}294295func TestSwaggerDownloader_Download_WithExistingHost(t *testing.T) {296// Create a mock Swagger spec with existing host297mockSpec := map[string]interface{}{298"swagger": "2.0",299"info": map[string]interface{}{300"title": "Test API",301"version": "1.0.0",302},303"host": "existing-host.com",304"paths": map[string]interface{}{},305}306307// Create mock server308server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {309w.Header().Set("Content-Type", "application/json")310if err := json.NewEncoder(w).Encode(mockSpec); err != nil {311http.Error(w, "failed to encode response", http.StatusInternalServerError)312}313}))314defer server.Close()315316tmpDir, err := os.MkdirTemp("", "swagger_test")317if err != nil {318t.Fatalf("Failed to create temp dir: %v", err)319}320321defer func() {322if err := os.RemoveAll(tmpDir); err != nil {323t.Fatalf("Failed to remove temp dir: %v", err)324}325}()326327downloader := &SwaggerDownloader{}328filePath, err := downloader.Download(server.URL+"/swagger.json", tmpDir, nil)329if err != nil {330t.Fatalf("Download failed: %v", err)331}332333// Verify existing host is preserved334content, err := os.ReadFile(filePath)335if err != nil {336t.Fatalf("Failed to read downloaded file: %v", err)337}338339var downloadedSpec map[string]interface{}340if err := json.Unmarshal(content, &downloadedSpec); err != nil {341t.Fatalf("Failed to parse downloaded JSON: %v", err)342}343344host, exists := downloadedSpec["host"]345if !exists {346t.Error("Host field was removed from the spec")347}348349if hostStr, ok := host.(string); !ok || hostStr != "existing-host.com" {350t.Errorf("Expected host 'existing-host.com', got '%v'", host)351}352}353354// Helper function to check if file exists355func fileExists(filename string) bool {356_, err := os.Stat(filename)357return !os.IsNotExist(err)358}359360361