Skip to content
Snippets Groups Projects
Commit f18de08c authored by Alex Petraky's avatar Alex Petraky :basketball_player_tone1: Committed by Pavel Antonov
Browse files

Добавлена опция создавать записи в статусе драфт при установке через Setup

parent 48b9c853
No related branches found
No related tags found
No related merge requests found
......@@ -18,18 +18,21 @@ var (
)
type ItemsOption func(c *ItemConfig)
type PublishItemFn func(s *Setup, item *items.Item) (*items.Item, bool)
type UpdateItemFn func(s *Setup, exist, new *items.Item) (*items.Item, bool)
type DeleteItemFn func(s *Setup, col *items.Item) bool
type ItemConfig struct {
item *items.Item
UpdateFn UpdateItemFn
DeleteFn DeleteItemFn
item *items.Item
PublishFn PublishItemFn
UpdateFn UpdateItemFn
DeleteFn DeleteItemFn
}
func NewItemConfig(item *items.Item, opt ...ItemsOption) ItemConfig {
c := ItemConfig{item: item}
PublishItem()(&c)
KeepExistingItem()(&c)
DeleteItemIfRemove()(&c)
......@@ -120,6 +123,18 @@ func DeleteItemIfRemove() ItemsOption {
}
}
func PublishItem() ItemsOption {
return func(c *ItemConfig) {
c.PublishFn = func(s *Setup, item *items.Item) (*items.Item, bool) { return item, true }
}
}
func KeepDraft() ItemsOption {
return func(c *ItemConfig) {
c.PublishFn = func(s *Setup, item *items.Item) (*items.Item, bool) { return item, false }
}
}
func (s *Setup) InstallItems(ctx context.Context) error {
if len(s.Items) == 0 {
return nil
......@@ -153,11 +168,27 @@ func (s *Setup) InstallItem(ctx context.Context, exists map[string]*items.Item,
exist, ok := exists[item.ID]
if !ok {
return items.CreateAndPublishItem(ctx, s.content.Items, item)
if item, publish := c.PublishFn(s, item); publish {
return items.CreateAndPublishItem(ctx, s.content.Items, item)
}
if _, err := s.content.Items.Create(ctx, item); err != nil {
return errors.Wrap(err, "create item")
}
return nil
}
if item, changed := c.UpdateFn(s, exist, c.item); changed {
return items.UpdateAndPublishItem(ctx, s.content.Items, item)
if item, changed := c.UpdateFn(s, exist, item); changed {
if _, publish := c.PublishFn(s, item); publish {
return items.UpdateAndPublishItem(ctx, s.content.Items, item)
}
if err := s.content.Items.Update(ctx, item); err != nil {
return errors.Wrap(err, "update item")
}
if err := s.content.Items.Unpublish(ctx, item); err != nil {
return errors.Wrap(err, "unpublish item")
}
return nil
}
return nil
......
......@@ -277,3 +277,89 @@ func TestSetup_InstallItems(t *testing.T) {
})
}
}
func TestSetup_CreateDraft(t *testing.T) {
tests := []struct {
name string
items []*items.Item
itemsCall func(svc *itemsMock.Items)
wantErr func(t *testing.T, err error)
}{
{
name: "Install one item",
items: []*items.Item{{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll", Data: map[string]interface{}{"text": "test"}}},
itemsCall: func(svc *itemsMock.Items) {
svc.On("Find", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, 0, nil).Once()
svc.On("Create", mock.Anything, &items.Item{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll", Data: map[string]interface{}{"text": "test"}}).Return(&items.Item{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll", Data: map[string]interface{}{"text": "test"}}, nil).Once()
},
wantErr: func(t *testing.T, err error) {
assert.NoError(t, err)
},
},
{
name: "Install multiple items success",
items: []*items.Item{
{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll", Data: map[string]interface{}{"text": "test"}},
{ID: "2", SpaceID: "sp", EnvID: "env", CollectionID: "coll", Data: map[string]interface{}{"text": "test"}},
},
itemsCall: func(svc *itemsMock.Items) {
svc.On("Find", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, 0, nil).Once()
svc.On("Create", mock.Anything, &items.Item{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll", Data: map[string]interface{}{"text": "test"}}).Return(&items.Item{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll", Data: map[string]interface{}{"text": "test"}}, nil).Once()
svc.On("Create", mock.Anything, &items.Item{ID: "2", SpaceID: "sp", EnvID: "env", CollectionID: "coll", Data: map[string]interface{}{"text": "test"}}).Return(&items.Item{ID: "2", SpaceID: "sp", EnvID: "env", CollectionID: "coll", Data: map[string]interface{}{"text": "test"}}, nil).Once()
},
wantErr: func(t *testing.T, err error) {
assert.NoError(t, err)
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
i := &itemsMock.Items{}
if tt.itemsCall != nil {
tt.itemsCall(i)
}
s := NewSetup(&content.Content{Items: i}, "sp", "env", nil)
s.AddItems(tt.items, KeepDraft())
tt.wantErr(t, s.InstallItems(context.Background()))
})
}
}
func TestSetup_UpdateDraft(t *testing.T) {
tests := []struct {
name string
items []*items.Item
itemsCall func(svc *itemsMock.Items)
wantErr func(t *testing.T, err error)
}{
{
name: "Update one item that was published",
items: []*items.Item{{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll", Data: map[string]interface{}{"text": "test"}}},
itemsCall: func(svc *itemsMock.Items) {
svc.On("Find", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*items.Item{{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll", State: items.StatePublished, Data: map[string]interface{}{"text": "test"}}}, 1, nil).Once()
svc.On("Update", mock.Anything, &items.Item{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll", State: items.StatePublished, Data: map[string]interface{}{"text": "test"}}).Return(nil).Once()
svc.On("Unpublish", mock.Anything, &items.Item{ID: "1", SpaceID: "sp", EnvID: "env", CollectionID: "coll", State: items.StatePublished, Data: map[string]interface{}{"text": "test"}}).Return(nil).Once()
},
wantErr: func(t *testing.T, err error) {
assert.NoError(t, err)
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
i := &itemsMock.Items{}
if tt.itemsCall != nil {
tt.itemsCall(i)
}
s := NewSetup(&content.Content{Items: i}, "sp", "env", nil)
s.AddItems(tt.items, KeepDraft())
tt.wantErr(t, s.InstallItems(context.Background()))
})
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment