From 6f95e9f7e88c931afae619207c1635105db1c123 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Wed, 3 Jun 2020 17:02:12 +0300 Subject: [PATCH] fix datasource tests --- pkg/cache/cache.go | 9 +++ pkg/datasource_test.go | 153 ++++++++++++----------------------------- 2 files changed, 53 insertions(+), 109 deletions(-) diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index a19cf07..2890927 100644 --- a/pkg/cache/cache.go +++ b/pkg/cache/cache.go @@ -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 diff --git a/pkg/datasource_test.go b/pkg/datasource_test.go index 8c5bb43..12f7b1b 100644 --- a/pkg/datasource_test.go +++ b/pkg/datasource_test.go @@ -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) - }) - } -}