mirror of
https://github.com/grafana/grafana.git
synced 2024-11-29 04:04:00 -06:00
324310abbc
* fix goimports * fix goimports order
122 lines
3.5 KiB
Go
122 lines
3.5 KiB
Go
package avatar
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
)
|
|
|
|
const DEFAULT_NONSENSE_HASH string = "9e107d9d372bb6826bd81d3542a419d6"
|
|
const CUSTOM_NONSENSE_HASH string = "d2a9116d4a63304733ca0f3471e57d16"
|
|
|
|
var NONSENSE_BODY []byte = []byte("Bogus API response")
|
|
|
|
func TestAvatar_AvatarRetrieval(t *testing.T) {
|
|
avc := ProvideAvatarCacheServer(setting.NewCfg())
|
|
callCounter := 0
|
|
mockServer := setupMockGravatarServer(&callCounter, false)
|
|
|
|
t.Cleanup(func() {
|
|
avc.cache.Flush()
|
|
mockServer.Close()
|
|
})
|
|
|
|
av := avc.getAvatarForHash(DEFAULT_NONSENSE_HASH, mockServer.URL+"/avatar/")
|
|
// verify there was a call to get the image and a call to the 404 fallback
|
|
require.Equal(t, callCounter, 2)
|
|
require.Equal(t, av.data.Bytes(), NONSENSE_BODY)
|
|
|
|
avc.getAvatarForHash(DEFAULT_NONSENSE_HASH, mockServer.URL+"/avatar/")
|
|
//since the avatar is cached, there should not have been anymore REST calls
|
|
require.Equal(t, callCounter, 2)
|
|
}
|
|
|
|
func TestAvatar_CheckCustom(t *testing.T) {
|
|
avc := ProvideAvatarCacheServer(setting.NewCfg())
|
|
callCounter := 0
|
|
mockServer := setupMockGravatarServer(&callCounter, false)
|
|
|
|
t.Cleanup(func() {
|
|
avc.cache.Flush()
|
|
mockServer.Close()
|
|
})
|
|
|
|
av := avc.getAvatarForHash(DEFAULT_NONSENSE_HASH, mockServer.URL+"/avatar/")
|
|
// verify this avatar is not marked custom
|
|
require.False(t, av.isCustom)
|
|
|
|
av2 := avc.getAvatarForHash(CUSTOM_NONSENSE_HASH, mockServer.URL+"/avatar/")
|
|
// verify this avatar is marked custom
|
|
require.True(t, av2.isCustom)
|
|
}
|
|
|
|
func TestAvatar_FallbackCase(t *testing.T) {
|
|
avc := ProvideAvatarCacheServer(setting.NewCfg())
|
|
callCounter := 0
|
|
mockServer := setupMockGravatarServer(&callCounter, true)
|
|
|
|
t.Cleanup(func() {
|
|
avc.cache.Flush()
|
|
mockServer.Close()
|
|
})
|
|
|
|
av := avc.getAvatarForHash(DEFAULT_NONSENSE_HASH, mockServer.URL+"/avatar/")
|
|
// the client should not have gotten a valid response back from the first call
|
|
// there should only be one REST call, and the avatar url should be the default
|
|
require.Equal(t, callCounter, 1)
|
|
require.False(t, av.isCustom)
|
|
require.True(t, av.notFound)
|
|
require.Equal(t, av, avc.notFound)
|
|
}
|
|
|
|
func TestAvatar_ExpirationHandler(t *testing.T) {
|
|
avc := ProvideAvatarCacheServer(setting.NewCfg())
|
|
callCounter := 0
|
|
mockServer := setupMockGravatarServer(&callCounter, false)
|
|
|
|
t.Cleanup(func() {
|
|
avc.cache.Flush()
|
|
mockServer.Close()
|
|
})
|
|
|
|
av := avc.getAvatarForHash(DEFAULT_NONSENSE_HASH, mockServer.URL+"/avatar/")
|
|
// verify there was a call to get the image and a call to the 404 fallback
|
|
require.Equal(t, callCounter, 2)
|
|
require.Equal(t, av.data.Bytes(), NONSENSE_BODY)
|
|
|
|
// manually expire the avatar in the cache
|
|
av.timestamp = av.timestamp.Add(-time.Minute * 15)
|
|
avc.getAvatarForHash(DEFAULT_NONSENSE_HASH, mockServer.URL+"/avatar/")
|
|
//since the avatar is expired, there should be two more REST calls
|
|
require.Equal(t, callCounter, 4)
|
|
}
|
|
|
|
func setupMockGravatarServer(counter *int, simulateError bool) *httptest.Server {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
(*counter)++
|
|
splitUri := strings.Split(r.RequestURI, "?")
|
|
urlHash := splitUri[0][len("/avatar/"):]
|
|
params := splitUri[1]
|
|
if params == "d=404" {
|
|
if urlHash == DEFAULT_NONSENSE_HASH {
|
|
w.WriteHeader(404)
|
|
} else {
|
|
_, _ = w.Write(NONSENSE_BODY)
|
|
}
|
|
} else {
|
|
if simulateError {
|
|
w.WriteHeader(500)
|
|
} else {
|
|
_, _ = w.Write(NONSENSE_BODY)
|
|
}
|
|
}
|
|
}))
|
|
return server
|
|
}
|