Chore: Add some tests for the Create method (#81364)
* Add test for create method
Co-authored-by: Tania B <10127682+undef1nd@users.noreply.github.com>
* Change structure of entity package to break import cycle
* Update wire file
---------
Co-authored-by: Tania B <10127682+undef1nd@users.noreply.github.com>
This commit is contained in:
@@ -10,8 +10,6 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"xorm.io/xorm"
|
||||
|
||||
"github.com/bwmarrin/snowflake"
|
||||
"github.com/google/uuid"
|
||||
|
||||
@@ -22,20 +20,13 @@ import (
|
||||
"github.com/grafana/grafana/pkg/services/sqlstore/session"
|
||||
"github.com/grafana/grafana/pkg/services/store"
|
||||
"github.com/grafana/grafana/pkg/services/store/entity"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
"github.com/grafana/grafana/pkg/services/store/entity/db"
|
||||
)
|
||||
|
||||
type EntityDB interface {
|
||||
Init() error
|
||||
GetSession() (*session.SessionDB, error)
|
||||
GetEngine() (*xorm.Engine, error)
|
||||
GetCfg() *setting.Cfg
|
||||
}
|
||||
|
||||
// Make sure we implement both store + admin
|
||||
var _ entity.EntityStoreServer = &sqlEntityServer{}
|
||||
|
||||
func ProvideSQLEntityServer(db EntityDB /*, cfg *setting.Cfg */) (entity.EntityStoreServer, error) {
|
||||
func ProvideSQLEntityServer(db db.EntityDBInterface /*, cfg *setting.Cfg */) (entity.EntityStoreServer, error) {
|
||||
snode, err := snowflake.NewNode(rand.Int63n(1024))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -52,7 +43,7 @@ func ProvideSQLEntityServer(db EntityDB /*, cfg *setting.Cfg */) (entity.EntityS
|
||||
|
||||
type sqlEntityServer struct {
|
||||
log log.Logger
|
||||
db EntityDB // needed to keep xorm engine in scope
|
||||
db db.EntityDBInterface // needed to keep xorm engine in scope
|
||||
sess *session.SessionDB
|
||||
dialect migrator.Dialect
|
||||
snowflake *snowflake.Node
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
package sqlstash
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/db"
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/services/store/entity"
|
||||
"github.com/grafana/grafana/pkg/services/store/entity/db/dbimpl"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
)
|
||||
|
||||
func TestCreate(t *testing.T) {
|
||||
s := setUpTestServer(t)
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
ent *entity.Entity
|
||||
errIsExpected bool
|
||||
statusIsExpected bool
|
||||
}{
|
||||
{
|
||||
"request with key and entity creator",
|
||||
&entity.Entity{
|
||||
Group: "playlist.grafana.app",
|
||||
Resource: "playlists",
|
||||
Namespace: "default",
|
||||
Name: "set-minimum-uid",
|
||||
Key: "/playlist.grafana.app/playlists/default/set-minimum-uid",
|
||||
CreatedBy: "set-minimum-creator",
|
||||
},
|
||||
false,
|
||||
true,
|
||||
},
|
||||
{
|
||||
"request with no entity creator",
|
||||
&entity.Entity{
|
||||
Key: "/playlist.grafana.app/playlists/default/set-only-key",
|
||||
},
|
||||
true,
|
||||
false,
|
||||
},
|
||||
{
|
||||
"request with no key",
|
||||
&entity.Entity{
|
||||
CreatedBy: "entity-creator",
|
||||
},
|
||||
true,
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range tests {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
req := entity.CreateEntityRequest{
|
||||
Entity: &entity.Entity{
|
||||
Key: tc.ent.Key,
|
||||
CreatedBy: tc.ent.CreatedBy,
|
||||
},
|
||||
}
|
||||
resp, err := s.Create(context.Background(), &req)
|
||||
|
||||
if tc.errIsExpected {
|
||||
require.Error(t, err)
|
||||
|
||||
if tc.statusIsExpected {
|
||||
require.Equal(t, entity.CreateEntityResponse_ERROR, resp.Status)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
require.Nil(t, err)
|
||||
require.Equal(t, entity.CreateEntityResponse_CREATED, resp.Status)
|
||||
require.NotNil(t, resp)
|
||||
require.Nil(t, resp.Error)
|
||||
|
||||
read, err := s.Read(context.Background(), &entity.ReadEntityRequest{
|
||||
Key: tc.ent.Key,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, read)
|
||||
|
||||
require.Greater(t, len(read.Guid), 0)
|
||||
require.Greater(t, read.ResourceVersion, int64(0))
|
||||
|
||||
expectedETag := createContentsHash(tc.ent.Body, tc.ent.Meta, tc.ent.Status)
|
||||
require.Equal(t, expectedETag, read.ETag)
|
||||
require.Equal(t, tc.ent.Origin, read.Origin)
|
||||
require.Equal(t, tc.ent.Group, read.Group)
|
||||
require.Equal(t, tc.ent.Resource, read.Resource)
|
||||
require.Equal(t, tc.ent.Namespace, read.Namespace)
|
||||
require.Equal(t, tc.ent.Name, read.Name)
|
||||
require.Equal(t, tc.ent.Subresource, read.Subresource)
|
||||
require.Equal(t, tc.ent.GroupVersion, read.GroupVersion)
|
||||
require.Equal(t, tc.ent.Key, read.Key)
|
||||
require.Equal(t, tc.ent.Folder, read.Folder)
|
||||
require.Equal(t, tc.ent.Meta, read.Meta)
|
||||
require.Equal(t, tc.ent.Body, read.Body)
|
||||
require.Equal(t, tc.ent.Status, read.Status)
|
||||
require.Equal(t, tc.ent.Title, read.Title)
|
||||
require.Equal(t, tc.ent.Size, read.Size)
|
||||
require.Equal(t, tc.ent.CreatedAt, read.CreatedAt)
|
||||
require.Equal(t, tc.ent.CreatedBy, read.CreatedBy)
|
||||
require.Equal(t, tc.ent.UpdatedAt, read.UpdatedAt)
|
||||
require.Equal(t, tc.ent.UpdatedBy, read.UpdatedBy)
|
||||
require.Equal(t, tc.ent.Description, read.Description)
|
||||
require.Equal(t, tc.ent.Slug, read.Slug)
|
||||
require.Equal(t, tc.ent.Message, read.Message)
|
||||
require.Equal(t, tc.ent.Labels, read.Labels)
|
||||
require.Equal(t, tc.ent.Fields, read.Fields)
|
||||
require.Equal(t, tc.ent.Errors, read.Errors)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func setUpTestServer(t *testing.T) entity.EntityStoreServer {
|
||||
sqlStore := db.InitTestDB(t)
|
||||
|
||||
entityDB, err := dbimpl.ProvideEntityDB(
|
||||
sqlStore,
|
||||
setting.NewCfg(),
|
||||
featuremgmt.WithFeatures(featuremgmt.FlagUnifiedStorage))
|
||||
require.NoError(t, err)
|
||||
|
||||
s, err := ProvideSQLEntityServer(entityDB)
|
||||
require.NoError(t, err)
|
||||
return s
|
||||
}
|
||||
Reference in New Issue
Block a user