2025-04-01 10:38:02 +09:00

85 lines
3.6 KiB
Go

package routes
import (
"context"
"errors"
"net/http"
"net/http/httptest"
"testing"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/mocks"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/models"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/models/resources"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
func TestRegionsRoute(t *testing.T) {
origNewRegionsService := newRegionsService
t.Cleanup(func() {
newRegionsService = origNewRegionsService
})
t.Run("returns 200 and regions", func(t *testing.T) {
mockRegionService := mocks.RegionsService{}
newRegionsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.RegionsAPIProvider, error) {
return &mockRegionService, nil
}
mockRegionService.On("GetRegions", mock.Anything).Return([]resources.ResourceResponse[resources.Region]{{
Value: resources.Region{
Name: "us-east-1",
},
}}, nil).Once()
rr := httptest.NewRecorder()
handler := http.HandlerFunc(ResourceRequestMiddleware(RegionsHandler, logger, nil))
req := httptest.NewRequest("GET", `/regions`, nil)
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusOK, rr.Code)
assert.Contains(t, rr.Body.String(), "us-east-1")
})
t.Run("returns 400 when the service returns a missing region error", func(t *testing.T) {
newRegionsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.RegionsAPIProvider, error) {
return nil, models.ErrMissingRegion
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(ResourceRequestMiddleware(RegionsHandler, logger, nil))
req := httptest.NewRequest("GET", `/regions`, nil)
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusBadRequest, rr.Code)
assert.Contains(t, rr.Body.String(), "Error in Regions Handler when connecting to aws without a default region selection: missing default region")
})
t.Run("returns 500 when the service returns an unexpected error", func(t *testing.T) {
newRegionsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.RegionsAPIProvider, error) {
return nil, errors.New("something unexpected happened")
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(ResourceRequestMiddleware(RegionsHandler, logger, nil))
req := httptest.NewRequest("GET", `/regions`, nil)
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusInternalServerError, rr.Code)
assert.Contains(t, rr.Body.String(), "Error in Regions Handler when connecting to aws: something unexpected happened")
})
t.Run("returns 500 when get regions returns an error", func(t *testing.T) {
mockRegionService := mocks.RegionsService{}
newRegionsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.RegionsAPIProvider, error) {
return &mockRegionService, nil
}
mockRegionService.On("GetRegions", mock.Anything).Return([]resources.ResourceResponse[resources.Region](nil), errors.New("aws is having some kind of outage")).Once()
rr := httptest.NewRecorder()
handler := http.HandlerFunc(ResourceRequestMiddleware(RegionsHandler, logger, nil))
req := httptest.NewRequest("GET", `/regions`, nil)
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusInternalServerError, rr.Code)
assert.Contains(t, rr.Body.String(), "Error in Regions Handler while fetching regions: aws is having some kind of outage")
})
}