* serverless connecction * Adding api key * fix * addressing pr comments * fixing tests * refactoring * changing to value semantic * addressing pr comments * minor changes --------- Co-authored-by: Lucas Francisco Lopez <lucas.lopez@elastic.co>
189 lines
5.0 KiB
Go
189 lines
5.0 KiB
Go
package es
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestGetClusterInfo(t *testing.T) {
|
|
t.Run("Should successfully get cluster info", func(t *testing.T) {
|
|
ts := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
rw.Header().Set("Content-Type", "application/json")
|
|
_, err := rw.Write([]byte(`{
|
|
"name": "test-cluster",
|
|
"cluster_name": "elasticsearch",
|
|
"cluster_uuid": "abc123",
|
|
"version": {
|
|
"number": "8.0.0",
|
|
"build_flavor": "default",
|
|
"build_type": "tar",
|
|
"build_hash": "abc123",
|
|
"build_date": "2023-01-01T00:00:00.000Z",
|
|
"build_snapshot": false,
|
|
"lucene_version": "9.0.0"
|
|
}
|
|
}`))
|
|
require.NoError(t, err)
|
|
}))
|
|
|
|
t.Cleanup(func() {
|
|
ts.Close()
|
|
})
|
|
|
|
clusterInfo, err := GetClusterInfo(ts.Client(), ts.URL)
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, clusterInfo)
|
|
assert.Equal(t, "default", clusterInfo.Version.BuildFlavor)
|
|
})
|
|
|
|
t.Run("Should successfully get serverless cluster info", func(t *testing.T) {
|
|
ts := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
rw.Header().Set("Content-Type", "application/json")
|
|
_, err := rw.Write([]byte(`{
|
|
"name": "serverless-cluster",
|
|
"cluster_name": "elasticsearch",
|
|
"cluster_uuid": "def456",
|
|
"version": {
|
|
"number": "8.11.0",
|
|
"build_flavor": "serverless",
|
|
"build_type": "docker",
|
|
"build_hash": "def456",
|
|
"build_date": "2023-11-01T00:00:00.000Z",
|
|
"build_snapshot": false,
|
|
"lucene_version": "9.8.0"
|
|
}
|
|
}`))
|
|
require.NoError(t, err)
|
|
}))
|
|
|
|
t.Cleanup(func() {
|
|
ts.Close()
|
|
})
|
|
|
|
clusterInfo, err := GetClusterInfo(ts.Client(), ts.URL)
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, clusterInfo)
|
|
assert.Equal(t, "serverless", clusterInfo.Version.BuildFlavor)
|
|
assert.True(t, clusterInfo.IsServerless())
|
|
})
|
|
|
|
t.Run("Should return error when HTTP request fails", func(t *testing.T) {
|
|
clusterInfo, err := GetClusterInfo(http.DefaultClient, "http://invalid-url-that-does-not-exist.local:9999")
|
|
|
|
require.Error(t, err)
|
|
require.Equal(t, ClusterInfo{}, clusterInfo)
|
|
assert.Contains(t, err.Error(), "error getting ES cluster info")
|
|
})
|
|
|
|
t.Run("Should return error when response body is invalid JSON", func(t *testing.T) {
|
|
ts := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
rw.Header().Set("Content-Type", "application/json")
|
|
_, err := rw.Write([]byte(`{"invalid json`))
|
|
require.NoError(t, err)
|
|
}))
|
|
|
|
t.Cleanup(func() {
|
|
ts.Close()
|
|
})
|
|
|
|
clusterInfo, err := GetClusterInfo(ts.Client(), ts.URL)
|
|
|
|
require.Error(t, err)
|
|
require.Equal(t, ClusterInfo{}, clusterInfo)
|
|
assert.Contains(t, err.Error(), "error decoding ES cluster info")
|
|
})
|
|
|
|
t.Run("Should handle empty version object", func(t *testing.T) {
|
|
ts := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
rw.Header().Set("Content-Type", "application/json")
|
|
_, err := rw.Write([]byte(`{
|
|
"name": "test-cluster",
|
|
"version": {}
|
|
}`))
|
|
require.NoError(t, err)
|
|
}))
|
|
|
|
t.Cleanup(func() {
|
|
ts.Close()
|
|
})
|
|
|
|
clusterInfo, err := GetClusterInfo(ts.Client(), ts.URL)
|
|
|
|
require.NoError(t, err)
|
|
require.Equal(t, ClusterInfo{}, clusterInfo)
|
|
assert.Equal(t, "", clusterInfo.Version.BuildFlavor)
|
|
assert.False(t, clusterInfo.IsServerless())
|
|
})
|
|
|
|
t.Run("Should handle HTTP error status codes", func(t *testing.T) {
|
|
ts := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
rw.WriteHeader(http.StatusUnauthorized)
|
|
_, err := rw.Write([]byte(`{"error": "Unauthorized"}`))
|
|
require.NoError(t, err)
|
|
}))
|
|
|
|
t.Cleanup(func() {
|
|
ts.Close()
|
|
})
|
|
|
|
clusterInfo, err := GetClusterInfo(ts.Client(), ts.URL)
|
|
|
|
require.Error(t, err)
|
|
require.Equal(t, ClusterInfo{}, clusterInfo)
|
|
assert.Contains(t, err.Error(), "unexpected status code 401 getting ES cluster info")
|
|
})
|
|
}
|
|
|
|
func TestClusterInfo_IsServerless(t *testing.T) {
|
|
t.Run("Should return true when build_flavor is serverless", func(t *testing.T) {
|
|
clusterInfo := ClusterInfo{
|
|
Version: VersionInfo{
|
|
BuildFlavor: BuildFlavorServerless,
|
|
},
|
|
}
|
|
|
|
assert.True(t, clusterInfo.IsServerless())
|
|
})
|
|
|
|
t.Run("Should return false when build_flavor is default", func(t *testing.T) {
|
|
clusterInfo := ClusterInfo{
|
|
Version: VersionInfo{
|
|
BuildFlavor: "default",
|
|
},
|
|
}
|
|
|
|
assert.False(t, clusterInfo.IsServerless())
|
|
})
|
|
|
|
t.Run("Should return false when build_flavor is empty", func(t *testing.T) {
|
|
clusterInfo := ClusterInfo{
|
|
Version: VersionInfo{
|
|
BuildFlavor: "",
|
|
},
|
|
}
|
|
|
|
assert.False(t, clusterInfo.IsServerless())
|
|
})
|
|
|
|
t.Run("Should return false when build_flavor is unknown value", func(t *testing.T) {
|
|
clusterInfo := ClusterInfo{
|
|
Version: VersionInfo{
|
|
BuildFlavor: "unknown",
|
|
},
|
|
}
|
|
|
|
assert.False(t, clusterInfo.IsServerless())
|
|
})
|
|
|
|
t.Run("should return false when cluster info is empty", func(t *testing.T) {
|
|
clusterInfo := ClusterInfo{}
|
|
assert.False(t, clusterInfo.IsServerless())
|
|
})
|
|
}
|