Skip to content
Snippets Groups Projects
Commit eea78cb4 authored by Pavel Antonov's avatar Pavel Antonov :asterisk:
Browse files

Merge branch 'feature/PRXS-2046-2148-KeepUnpublished' into 'master'

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

See merge request perxis/perxis-go!186
parents 48b9c853 f18de08c
Branches release/0.23
Tags v0.23.0
No related merge requests found
...@@ -18,18 +18,21 @@ var ( ...@@ -18,18 +18,21 @@ var (
) )
type ItemsOption func(c *ItemConfig) 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 UpdateItemFn func(s *Setup, exist, new *items.Item) (*items.Item, bool)
type DeleteItemFn func(s *Setup, col *items.Item) bool type DeleteItemFn func(s *Setup, col *items.Item) bool
type ItemConfig struct { type ItemConfig struct {
item *items.Item item *items.Item
UpdateFn UpdateItemFn PublishFn PublishItemFn
DeleteFn DeleteItemFn UpdateFn UpdateItemFn
DeleteFn DeleteItemFn
} }
func NewItemConfig(item *items.Item, opt ...ItemsOption) ItemConfig { func NewItemConfig(item *items.Item, opt ...ItemsOption) ItemConfig {
c := ItemConfig{item: item} c := ItemConfig{item: item}
PublishItem()(&c)
KeepExistingItem()(&c) KeepExistingItem()(&c)
DeleteItemIfRemove()(&c) DeleteItemIfRemove()(&c)
...@@ -120,6 +123,18 @@ func DeleteItemIfRemove() ItemsOption { ...@@ -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 { func (s *Setup) InstallItems(ctx context.Context) error {
if len(s.Items) == 0 { if len(s.Items) == 0 {
return nil return nil
...@@ -153,11 +168,27 @@ func (s *Setup) InstallItem(ctx context.Context, exists map[string]*items.Item, ...@@ -153,11 +168,27 @@ func (s *Setup) InstallItem(ctx context.Context, exists map[string]*items.Item,
exist, ok := exists[item.ID] exist, ok := exists[item.ID]
if !ok { 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 { if item, changed := c.UpdateFn(s, exist, item); changed {
return items.UpdateAndPublishItem(ctx, s.content.Items, item) 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 return nil
......
...@@ -277,3 +277,89 @@ func TestSetup_InstallItems(t *testing.T) { ...@@ -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