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:
Arati R
2024-01-30 14:15:12 +01:00
committed by GitHub
co-authored by Tania B
parent 41cd0ab12a
commit 77775d548a
9 changed files with 304 additions and 167 deletions
@@ -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
}