package management import ( "net/http" "net/http/httptest" "net/url" "os" "path/filepath" "testing" "github.com/gin-gonic/gin" "github.com/router-for-me/CLIProxyAPI/v6/internal/config" ) func TestDownloadAuthFile_ReturnsFile(t *testing.T) { t.Setenv("MANAGEMENT_PASSWORD", "") gin.SetMode(gin.TestMode) authDir := t.TempDir() fileName := "download-user.json" expected := []byte(`{"type":"codex"}`) if err := os.WriteFile(filepath.Join(authDir, fileName), expected, 0o600); err != nil { t.Fatalf("failed to write auth file: %v", err) } h := NewHandlerWithoutConfigFilePath(&config.Config{AuthDir: authDir}, nil) rec := httptest.NewRecorder() ctx, _ := gin.CreateTestContext(rec) ctx.Request = httptest.NewRequest(http.MethodGet, "/v0/management/auth-files/download?name="+url.QueryEscape(fileName), nil) h.DownloadAuthFile(ctx) if rec.Code != http.StatusOK { t.Fatalf("expected download status %d, got %d with body %s", http.StatusOK, rec.Code, rec.Body.String()) } if got := rec.Body.Bytes(); string(got) != string(expected) { t.Fatalf("unexpected download content: %q", string(got)) } } func TestDownloadAuthFile_RejectsPathSeparators(t *testing.T) { t.Setenv("MANAGEMENT_PASSWORD", "") gin.SetMode(gin.TestMode) h := NewHandlerWithoutConfigFilePath(&config.Config{AuthDir: t.TempDir()}, nil) for _, name := range []string{ "../external/secret.json", `..\\external\\secret.json`, "nested/secret.json", `nested\\secret.json`, } { rec := httptest.NewRecorder() ctx, _ := gin.CreateTestContext(rec) ctx.Request = httptest.NewRequest(http.MethodGet, "/v0/management/auth-files/download?name="+url.QueryEscape(name), nil) h.DownloadAuthFile(ctx) if rec.Code != http.StatusBadRequest { t.Fatalf("expected %d for name %q, got %d with body %s", http.StatusBadRequest, name, rec.Code, rec.Body.String()) } } }