Path: blob/dev/pkg/input/formats/openapi/downloader_test.go
2844 views
package openapi12import (3"encoding/json"4"net/http"5"net/http/httptest"6"os"7"strings"8"testing"9"time"10)1112func TestOpenAPIDownloader_SupportedExtensions(t *testing.T) {13downloader := &OpenAPIDownloader{}14extensions := downloader.SupportedExtensions()1516expected := []string{".json"}17if len(extensions) != len(expected) {18t.Errorf("Expected %d extensions, got %d", len(expected), len(extensions))19}2021for i, ext := range extensions {22if ext != expected[i] {23t.Errorf("Expected extension %s, got %s", expected[i], ext)24}25}26}2728func TestOpenAPIDownloader_Download_Success(t *testing.T) {29// Create a mock OpenAPI spec30mockSpec := map[string]interface{}{31"openapi": "3.0.0",32"info": map[string]interface{}{33"title": "Test API",34"version": "1.0.0",35},36"paths": map[string]interface{}{37"/test": map[string]interface{}{38"get": map[string]interface{}{39"summary": "Test endpoint",40},41},42},43}4445// Create mock server46server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {47w.Header().Set("Content-Type", "application/json")48if err := json.NewEncoder(w).Encode(mockSpec); err != nil {49http.Error(w, "failed to encode response", http.StatusInternalServerError)50}51}))52defer server.Close()5354// Create temp directory55tmpDir, err := os.MkdirTemp("", "openapi_test")56if err != nil {57t.Fatalf("Failed to create temp dir: %v", err)58}5960defer func() {61if err := os.RemoveAll(tmpDir); err != nil {62t.Fatalf("Failed to remove temp dir: %v", err)63}64}()6566// Test download67downloader := &OpenAPIDownloader{}68filePath, err := downloader.Download(server.URL+"/openapi.json", tmpDir, nil)69if err != nil {70t.Fatalf("Download failed: %v", err)71}7273// Verify file exists74if !fileExists(filePath) {75t.Errorf("Downloaded file does not exist: %s", filePath)76}7778// Verify file content79content, err := os.ReadFile(filePath)80if err != nil {81t.Fatalf("Failed to read downloaded file: %v", err)82}8384var downloadedSpec map[string]interface{}85if err := json.Unmarshal(content, &downloadedSpec); err != nil {86t.Fatalf("Failed to parse downloaded JSON: %v", err)87}8889// Verify servers field was added90servers, exists := downloadedSpec["servers"]91if !exists {92t.Error("Servers field was not added to the spec")93}9495if serversList, ok := servers.([]interface{}); ok {96if len(serversList) == 0 {97t.Error("Servers list is empty")98}99} else {100t.Error("Servers field is not a list")101}102}103104func TestOpenAPIDownloader_Download_NonJSONURL(t *testing.T) {105tmpDir, err := os.MkdirTemp("", "openapi_test")106if err != nil {107t.Fatalf("Failed to create temp dir: %v", err)108}109110defer func() {111if err := os.RemoveAll(tmpDir); err != nil {112t.Fatalf("Failed to remove temp dir: %v", err)113}114}()115116downloader := &OpenAPIDownloader{}117_, err = downloader.Download("http://example.com/spec.yaml", tmpDir, nil)118if err == nil {119t.Error("Expected error for non-JSON URL, but got none")120}121122if !strings.Contains(err.Error(), "URL does not appear to be an OpenAPI JSON spec") {123t.Errorf("Unexpected error message: %v", err)124}125}126127func TestOpenAPIDownloader_Download_HTTPError(t *testing.T) {128// Create mock server that returns 404129server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {130w.WriteHeader(http.StatusNotFound)131}))132defer server.Close()133134tmpDir, err := os.MkdirTemp("", "openapi_test")135if err != nil {136t.Fatalf("Failed to create temp dir: %v", err)137}138139defer func() {140if err := os.RemoveAll(tmpDir); err != nil {141t.Fatalf("Failed to remove temp dir: %v", err)142}143}()144145downloader := &OpenAPIDownloader{}146_, err = downloader.Download(server.URL+"/openapi.json", tmpDir, nil)147if err == nil {148t.Error("Expected error for HTTP 404, but got none")149}150}151152func TestOpenAPIDownloader_Download_InvalidJSON(t *testing.T) {153// Create mock server that returns invalid JSON154server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {155w.Header().Set("Content-Type", "application/json")156if _, err := w.Write([]byte("invalid json")); err != nil {157http.Error(w, "failed to write response", http.StatusInternalServerError)158}159}))160defer server.Close()161162tmpDir, err := os.MkdirTemp("", "openapi_test")163if err != nil {164t.Fatalf("Failed to create temp dir: %v", err)165}166167defer func() {168if err := os.RemoveAll(tmpDir); err != nil {169t.Fatalf("Failed to remove temp dir: %v", err)170}171}()172173downloader := &OpenAPIDownloader{}174_, err = downloader.Download(server.URL+"/openapi.json", tmpDir, nil)175if err == nil {176t.Error("Expected error for invalid JSON, but got none")177}178}179180func TestOpenAPIDownloader_Download_Timeout(t *testing.T) {181// Create mock server with delay182server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {183time.Sleep(35 * time.Second) // Longer than 30 second timeout184if err := json.NewEncoder(w).Encode(map[string]interface{}{"test": "data"}); err != nil {185http.Error(w, "failed to encode response", http.StatusInternalServerError)186}187}))188defer server.Close()189190tmpDir, err := os.MkdirTemp("", "openapi_test")191if err != nil {192t.Fatalf("Failed to create temp dir: %v", err)193}194195defer func() {196if err := os.RemoveAll(tmpDir); err != nil {197t.Fatalf("Failed to remove temp dir: %v", err)198}199}()200201downloader := &OpenAPIDownloader{}202_, err = downloader.Download(server.URL+"/openapi.json", tmpDir, nil)203if err == nil {204t.Error("Expected timeout error, but got none")205}206}207208func TestOpenAPIDownloader_Download_WithExistingServers(t *testing.T) {209// Create a mock OpenAPI spec with existing servers210mockSpec := map[string]interface{}{211"openapi": "3.0.0",212"info": map[string]interface{}{213"title": "Test API",214"version": "1.0.0",215},216"servers": []interface{}{217map[string]interface{}{218"url": "https://existing-server.com",219},220},221"paths": map[string]interface{}{},222}223224// Create mock server225server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {226w.Header().Set("Content-Type", "application/json")227if err := json.NewEncoder(w).Encode(mockSpec); err != nil {228http.Error(w, "failed to encode response", http.StatusInternalServerError)229}230}))231defer server.Close()232233tmpDir, err := os.MkdirTemp("", "openapi_test")234if err != nil {235t.Fatalf("Failed to create temp dir: %v", err)236}237238defer func() {239if err := os.RemoveAll(tmpDir); err != nil {240t.Fatalf("Failed to remove temp dir: %v", err)241}242}()243244downloader := &OpenAPIDownloader{}245filePath, err := downloader.Download(server.URL+"/openapi.json", tmpDir, nil)246if err != nil {247t.Fatalf("Download failed: %v", err)248}249250// Verify existing servers are preserved251content, err := os.ReadFile(filePath)252if err != nil {253t.Fatalf("Failed to read downloaded file: %v", err)254}255256var downloadedSpec map[string]interface{}257if err := json.Unmarshal(content, &downloadedSpec); err != nil {258t.Fatalf("Failed to parse downloaded JSON: %v", err)259}260261servers, exists := downloadedSpec["servers"]262if !exists {263t.Error("Servers field was removed from the spec")264}265266if serversList, ok := servers.([]interface{}); ok {267if len(serversList) != 1 {268t.Errorf("Expected 1 server, got %d", len(serversList))269}270}271}272273// Helper function to check if file exists274func fileExists(filename string) bool {275_, err := os.Stat(filename)276return !os.IsNotExist(err)277}278279280