-
kirinzhong authored
1. Repository 接口名优化:Create -> Add; Delete -> Remove 2. Repostory Add 和 Remove 方法不直接返回错误,改为执行完 Main 后统一返回 3. 按照新的框架设计,修改了 example
kirinzhong authored1. Repository 接口名优化:Create -> Add; Delete -> Remove 2. Repostory Add 和 Remove 方法不直接返回错误,改为执行完 Main 后统一返回 3. 按照新的框架设计,修改了 example
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
command_test.go 2.99 KiB
//
// Copyright 2023 Bytedance Ltd. and/or its affiliates
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package dddfirework
import (
"context"
"testing"
"github.com/bytedance/dddfirework/testsuit"
"github.com/stretchr/testify/assert"
)
type testReturnCommand struct {
Command
}
func (c *testReturnCommand) Act(ctx context.Context, container RootContainer, roots ...IEntity) error {
toCreate := &order{
Title: "test",
}
container.Add(toCreate)
if err := c.Commit(ctx); err != nil {
return err
}
toDel := &order{
Title: "test2",
}
container.Add(toDel)
if err := c.Commit(ctx); err != nil {
return err
}
container.Remove(toDel)
if err := c.Commit(ctx); err != nil {
return err
}
c.Output([]string{toCreate.GetID(), toDel.GetID()})
return nil
}
func TestCommand_Return(t *testing.T) {
ctx := context.Background()
db := TestDB{
Data: map[string]*testModel{},
}
locker := testsuit.NewMemLock()
executor := &MapExecutor{DB: &db}
res := NewEngine(locker, executor).Run(ctx, &testReturnCommand{})
assert.NoError(t, res.Error)
assert.NotEmpty(t, res.Output)
ids := res.Output.([]string)
assert.NotEmpty(t, ids[0])
assert.NotEmpty(t, ids[1])
assert.Contains(t, db.Data, ids[0])
assert.NotContains(t, db.Data, ids[1])
}
func TestCommandMain(t *testing.T) {
ctx := context.Background()
db := TestDB{
Data: map[string]*testModel{},
}
locker := testsuit.NewMemLock()
executor := &MapExecutor{DB: &db}
engine := NewEngine(locker, executor)
var id string
res := engine.NewStage().Main(func(ctx context.Context, repo *Repository) error {
// 创建
o := &order{
Title: "testCreate",
}
repo.Add(o)
if err := repo.Save(ctx); err != nil {
return err
}
id = o.GetID()
return nil
}).Save(ctx)
assert.NoError(t, res.Error)
assert.Contains(t, db.Data, id)
res = engine.NewStage().Main(func(ctx context.Context, repo *Repository) error {
o := &order{BaseEntity: NewBase(id)}
if err := repo.Get(ctx, o); err != nil {
return err
}
o.Title = "update"
o.Dirty()
if err := repo.Save(ctx); err != nil {
return err
}
o.Title = "update_2"
o.Dirty()
if err := repo.Save(ctx); err != nil {
return err
}
return nil
}).Save(ctx)
assert.NoError(t, res.Error)
po := db.Data[id]
assert.Equal(t, "update_2", po.Name)
res = engine.NewStage().Main(func(ctx context.Context, repo *Repository) error {
o := &order{BaseEntity: NewBase(id)}
repo.Remove(o)
return nil
}).Save(ctx)
assert.NoError(t, res.Error)
assert.NotContains(t, db.Data, id)
}