Skip to content
Snippets Groups Projects
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)
}