mirror of
https://github.com/lukaszraczylo/gohoarder.git
synced 2026-06-08 23:09:33 +00:00
6b037a92b4
- [x] Reorder struct fields across codebase for consistency - [x] Add analytics event handlers and tests - [x] Add authentication API key management handlers and tests - [x] Add pre-warming control handlers and tests - [x] Implement S3 storage backend with tests - [x] Implement SMB/CIFS storage backend with tests - [x] Add CDN middleware tests - [x] Integrate analytics tracking into cache manager - [x] Add S3 and SMB storage initialization in app setup - [x] Add CDN caching to proxy handlers - [x] Remove distributed locking (Redis lock manager) - [x] Remove proxy common package and utilities - [x] Remove standalone HTTP server package - [x] Remove logger middleware - [x] Simplify error handling utilities - [x] Update config with S3 and SMB options - [x] Update cache manager signature to include analytics
163 lines
3.9 KiB
Go
163 lines
3.9 KiB
Go
package app
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/lukaszraczylo/gohoarder/pkg/prewarming"
|
|
"github.com/stretchr/testify/suite"
|
|
)
|
|
|
|
type PrewarmingHandlersTestSuite struct {
|
|
suite.Suite
|
|
app *fiber.App
|
|
appInst *App
|
|
prewarmWorker *prewarming.Worker
|
|
}
|
|
|
|
func (s *PrewarmingHandlersTestSuite) SetupTest() {
|
|
// Create pre-warming worker (disabled by default)
|
|
s.prewarmWorker = prewarming.NewWorker(prewarming.Config{
|
|
Enabled: false,
|
|
MaxConcurrent: 5,
|
|
})
|
|
|
|
// Create app instance
|
|
s.appInst = &App{
|
|
prewarmWorker: s.prewarmWorker,
|
|
}
|
|
|
|
// Create Fiber app
|
|
s.app = fiber.New()
|
|
|
|
// Register routes
|
|
s.app.Get("/api/admin/prewarming/status", s.appInst.handlePrewarmingStatus)
|
|
s.app.Post("/api/admin/prewarming/trigger", s.appInst.handlePrewarmingTrigger)
|
|
s.app.Post("/api/admin/prewarming/package", s.appInst.handlePrewarmingPackage)
|
|
}
|
|
|
|
func (s *PrewarmingHandlersTestSuite) TearDownTest() {
|
|
if s.prewarmWorker != nil {
|
|
s.prewarmWorker.Stop()
|
|
}
|
|
}
|
|
|
|
func TestPrewarmingHandlersTestSuite(t *testing.T) {
|
|
suite.Run(t, new(PrewarmingHandlersTestSuite))
|
|
}
|
|
|
|
func (s *PrewarmingHandlersTestSuite) TestHandlePrewarmingStatus() {
|
|
req := httptest.NewRequest("GET", "/api/admin/prewarming/status", nil)
|
|
resp, err := s.app.Test(req)
|
|
s.Require().NoError(err)
|
|
s.Equal(200, resp.StatusCode)
|
|
|
|
var result struct {
|
|
Enabled bool `json:"enabled"`
|
|
Running bool `json:"running"`
|
|
QueueSize int `json:"queue_size"`
|
|
ActiveWorkers int `json:"active_workers"`
|
|
}
|
|
err = json.NewDecoder(resp.Body).Decode(&result)
|
|
s.NoError(err)
|
|
s.False(result.Enabled) // Disabled in test setup
|
|
}
|
|
|
|
func (s *PrewarmingHandlersTestSuite) TestHandlePrewarmingTrigger() {
|
|
req := httptest.NewRequest("POST", "/api/admin/prewarming/trigger", nil)
|
|
resp, err := s.app.Test(req)
|
|
s.Require().NoError(err)
|
|
s.Equal(200, resp.StatusCode)
|
|
|
|
var result map[string]interface{}
|
|
err = json.NewDecoder(resp.Body).Decode(&result)
|
|
s.NoError(err)
|
|
s.Contains(result, "message")
|
|
}
|
|
|
|
func (s *PrewarmingHandlersTestSuite) TestHandlePrewarmingPackage() {
|
|
tests := []struct {
|
|
requestBody map[string]string
|
|
name string
|
|
expectedStatus int
|
|
}{
|
|
{
|
|
name: "prewarm npm package",
|
|
requestBody: map[string]string{
|
|
"registry": "npm",
|
|
"name": "lodash",
|
|
"version": "4.17.21",
|
|
},
|
|
expectedStatus: 200,
|
|
},
|
|
{
|
|
name: "prewarm pypi package",
|
|
requestBody: map[string]string{
|
|
"registry": "pypi",
|
|
"name": "requests",
|
|
"version": "2.28.0",
|
|
},
|
|
expectedStatus: 200,
|
|
},
|
|
{
|
|
name: "prewarm go package",
|
|
requestBody: map[string]string{
|
|
"registry": "go",
|
|
"name": "github.com/stretchr/testify",
|
|
"version": "v1.8.0",
|
|
},
|
|
expectedStatus: 200,
|
|
},
|
|
{
|
|
name: "missing registry",
|
|
requestBody: map[string]string{
|
|
"name": "lodash",
|
|
"version": "4.17.21",
|
|
},
|
|
expectedStatus: 400,
|
|
},
|
|
{
|
|
name: "missing name",
|
|
requestBody: map[string]string{
|
|
"registry": "npm",
|
|
"version": "4.17.21",
|
|
},
|
|
expectedStatus: 400,
|
|
},
|
|
{
|
|
name: "missing version",
|
|
requestBody: map[string]string{
|
|
"registry": "npm",
|
|
"name": "lodash",
|
|
},
|
|
expectedStatus: 400,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
s.Run(tt.name, func() {
|
|
bodyBytes, err := json.Marshal(tt.requestBody)
|
|
s.Require().NoError(err)
|
|
|
|
req := httptest.NewRequest("POST", "/api/admin/prewarming/package", bytes.NewReader(bodyBytes))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
resp, err := s.app.Test(req)
|
|
s.Require().NoError(err)
|
|
s.Equal(tt.expectedStatus, resp.StatusCode)
|
|
})
|
|
}
|
|
}
|
|
|
|
func (s *PrewarmingHandlersTestSuite) TestHandlePrewarmingPackageInvalidJSON() {
|
|
req := httptest.NewRequest("POST", "/api/admin/prewarming/package", bytes.NewReader([]byte("invalid json")))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
resp, err := s.app.Test(req)
|
|
s.Require().NoError(err)
|
|
s.Equal(400, resp.StatusCode)
|
|
}
|