fix datasource tests

This commit is contained in:
Alexander Zobnin
2020-06-03 17:02:12 +03:00
parent 67ed44cf20
commit 6f95e9f7e8
2 changed files with 53 additions and 109 deletions

9
pkg/cache/cache.go vendored
View File

@@ -10,6 +10,15 @@ import (
cache "github.com/patrickmn/go-cache"
)
const (
// For use with functions that take an expiration time.
NoExpiration time.Duration = -1
// For use with functions that take an expiration time. Equivalent to
// passing in the same expiration duration as was given to New() or
// NewFrom() when the cache was created (e.g. 5 minutes.)
DefaultExpiration time.Duration = 0
)
// Cache is a abstraction over go-cache.
type Cache struct {
cache *cache.Cache

View File

@@ -1,66 +1,64 @@
package main
import (
"fmt"
"testing"
simplejson "github.com/bitly/go-simplejson"
"github.com/grafana/grafana_plugin_model/go/datasource"
hclog "github.com/hashicorp/go-hclog"
cache "github.com/patrickmn/go-cache"
"github.com/alexanderzobnin/grafana-zabbix/pkg/cache"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
"gotest.tools/assert"
"gotest.tools/assert/cmp"
)
func TestZabbixBackend_getCachedDatasource(t *testing.T) {
basicDatasourceInfo := &datasource.DatasourceInfo{
Id: 1,
Name: "TestDatasource",
Url: "http://zabbix.org/zabbix",
basicDsSettings := &backend.DataSourceInstanceSettings{
ID: 1,
Name: "TestDatasource",
URL: "http://zabbix.org/zabbix",
JSONData: []byte("{}"),
}
basicDatasourceInfoHash := HashDatasourceInfo(basicDatasourceInfo)
modifiedDatasource, _ := newZabbixDatasource(basicDatasourceInfo)
modifiedDatasource.authToken = "AB404F1234"
altDatasourceInfo := &datasource.DatasourceInfo{
Id: 2,
Name: "AnotherDatasource",
Url: "http://zabbix.org/another/zabbix",
modifiedDatasourceSettings := &backend.DataSourceInstanceSettings{
ID: 1,
Name: "TestDatasource",
URL: "http://another.zabbix.org/zabbix",
JSONData: []byte("{}"),
}
altDatasourceInfoHash := HashDatasourceInfo(altDatasourceInfo)
modifiedDatasource, _ := NewZabbixDatasourceInstance(modifiedDatasourceSettings)
basicDS, _ := NewZabbixDatasourceInstance(basicDsSettings)
dsCache := cache.NewCache(cache.NoExpiration, cache.NoExpiration)
dsCache.Set("1-1", basicDS)
basicDS, _ := newZabbixDatasource(basicDatasourceInfo)
tests := []struct {
name string
cache *cache.Cache
request *datasource.DatasourceRequest
want *ZabbixDatasourceInstance
name string
cache *cache.Cache
pluginContext backend.PluginContext
want *ZabbixDatasourceInstance
}{
{
name: "Uncached Datasource (nothing in cache)",
request: &datasource.DatasourceRequest{
Datasource: basicDatasourceInfo,
pluginContext: backend.PluginContext{
OrgID: 1,
DataSourceInstanceSettings: basicDsSettings,
},
want: basicDS,
},
{
name: "Uncached Datasource (cache miss)",
cache: cache.NewFrom(cache.NoExpiration, cache.NoExpiration, map[string]cache.Item{
basicDatasourceInfoHash: {Object: modifiedDatasource},
}),
request: &datasource.DatasourceRequest{
Datasource: altDatasourceInfo,
name: "Cached Datasource",
cache: dsCache,
pluginContext: backend.PluginContext{
OrgID: 1,
DataSourceInstanceSettings: basicDsSettings,
},
want: basicDS,
},
{
name: "Cached Datasource",
cache: cache.NewFrom(cache.NoExpiration, cache.NoExpiration, map[string]cache.Item{
altDatasourceInfoHash: {Object: basicDS},
basicDatasourceInfoHash: {Object: modifiedDatasource},
}),
request: &datasource.DatasourceRequest{
Datasource: basicDatasourceInfo,
name: "Cached then modified",
cache: dsCache,
pluginContext: backend.PluginContext{
OrgID: 1,
DataSourceInstanceSettings: modifiedDatasourceSettings,
},
want: modifiedDatasource,
},
@@ -68,84 +66,21 @@ func TestZabbixBackend_getCachedDatasource(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.cache == nil {
tt.cache = cache.New(cache.NoExpiration, cache.NoExpiration)
tt.cache = cache.NewCache(cache.NoExpiration, cache.NoExpiration)
}
b := &ZabbixPlugin{
logger: hclog.New(&hclog.LoggerOptions{
Name: "TestZabbixBackend_getCachedDatasource",
Level: hclog.LevelFromString("DEBUG"),
}),
datasourceCache: &Cache{cache: tt.cache},
ds := &ZabbixDatasource{
datasourceCache: tt.cache,
logger: log.New(),
}
got, _ := b.GetDatasource(tt.request)
got, _ := ds.GetDatasource(tt.pluginContext)
// Only checking the authToken, being the easiest value to, and guarantee equality for
assert.Equal(t, tt.want.authToken, got.authToken)
// Only checking the URL, being the easiest value to, and guarantee equality for
assert.Equal(t, tt.want.zabbixAPI.GetUrl().String(), got.zabbixAPI.GetUrl().String())
// Ensure the datasource is in the cache
cacheds, ok := tt.cache.Get(HashDatasourceInfo(tt.request.GetDatasource()))
cacheds, ok := tt.cache.Get(fmt.Sprint("1-", tt.pluginContext.DataSourceInstanceSettings.ID))
assert.Equal(t, true, ok)
assert.Equal(t, got, cacheds)
})
}
}
func TestBuildResponse(t *testing.T) {
jsonData := simplejson.New()
jsonData.Set("testing", []int{5, 12, 75})
tests := []struct {
name string
responseData interface{}
want *datasource.DatasourceResponse
wantErr string
}{
{
name: "simplejson Response",
responseData: jsonData,
want: &datasource.DatasourceResponse{
Results: []*datasource.QueryResult{
{
RefId: "zabbixAPI",
MetaJson: `{"testing":[5,12,75]}`,
},
},
},
},
{
name: "Connection Status Response",
responseData: connectionTestResponse{
ZabbixVersion: "2.4",
DbConnectorStatus: &dbConnectionStatus{
DsType: "mysql",
DsName: "MyDatabase",
},
},
want: &datasource.DatasourceResponse{
Results: []*datasource.QueryResult{
{
RefId: "zabbixAPI",
MetaJson: `{"zabbixVersion":"2.4","dbConnectorStatus":{"dsType":"mysql","dsName":"MyDatabase"}}`,
},
},
},
},
{
name: "Unmarshalable",
responseData: 2i,
wantErr: "json: unsupported type: complex128",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := BuildResponse(tt.responseData)
if tt.wantErr != "" {
assert.Error(t, err, tt.wantErr)
assert.Assert(t, cmp.Nil(got))
return
}
assert.NilError(t, err)
assert.DeepEqual(t, got, tt.want)
})
}
}