From 6dd434913b6fb41f6ede006c64c01a35a02c458f Mon Sep 17 00:00:00 2001 From: Fabian Martinez <46371672+famarting@users.noreply.github.com> Date: Wed, 20 Aug 2025 15:12:08 +0200 Subject: [PATCH 1/3] workflows: support timer names (#729) * workflows: support timer names Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> * add unit test Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> --------- Signed-off-by: Fabian Martinez <46371672+famarting@users.noreply.github.com> --- workflow/context.go | 11 ++++++++++- workflow/workflow.go | 13 +++++++++++++ workflow/workflow_test.go | 19 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/workflow/context.go b/workflow/context.go index 7c293514..67071a75 100644 --- a/workflow/context.go +++ b/workflow/context.go @@ -94,7 +94,16 @@ func (wfc *WorkflowContext) CallChildWorkflow(workflow interface{}, opts ...call // The value passed to the Await method must be a pointer or can be nil to ignore the returned value. // Alternatively, tasks can be awaited using the task.WhenAll or task.WhenAny methods, allowing the workflow // to block and wait for multiple tasks at the same time. -func (wfc *WorkflowContext) CreateTimer(duration time.Duration) task.Task { +func (wfc *WorkflowContext) CreateTimer(duration time.Duration, opts ...createTimerOption) task.Task { + options := new(createTimerOptions) + for _, configure := range opts { + if err := configure(options); err != nil { + return nil + } + } + if options.name != nil { + return wfc.orchestrationContext.CreateTimer(duration, task.WithTimerName(*options.name)) + } return wfc.orchestrationContext.CreateTimer(duration) } diff --git a/workflow/workflow.go b/workflow/workflow.go index b40ba4c8..a0bfd09e 100644 --- a/workflow/workflow.go +++ b/workflow/workflow.go @@ -148,3 +148,16 @@ func NewTaskSlice(length int) []task.Task { taskSlice := make([]task.Task, length) return taskSlice } + +type createTimerOption func(*createTimerOptions) error + +type createTimerOptions struct { + name *string +} + +func WithTimerName(name string) createTimerOption { + return func(opt *createTimerOptions) error { + opt.name = &name + return nil + } +} diff --git a/workflow/workflow_test.go b/workflow/workflow_test.go index 3def77cb..983b8622 100644 --- a/workflow/workflow_test.go +++ b/workflow/workflow_test.go @@ -5,6 +5,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/dapr/durabletask-go/api/protos" "github.com/dapr/durabletask-go/task" @@ -76,3 +77,21 @@ func TestNewTaskSlice(t *testing.T) { tasks := NewTaskSlice(10) assert.Len(t, tasks, 10) } + +func TestCreateTimerOptions(t *testing.T) { + t.Run("create timer options - valid", func(t *testing.T) { + opts := returnCreateTimerOptions(WithTimerName("test")) + require.NotNil(t, opts.name) + require.Equal(t, "test", *opts.name) + }) +} + +func returnCreateTimerOptions(opts ...createTimerOption) createTimerOptions { + options := new(createTimerOptions) + for _, configure := range opts { + if err := configure(options); err != nil { + return *options + } + } + return *options +} From 318b5dd8fa757e604598ed81ff20733c1f80f2ba Mon Sep 17 00:00:00 2001 From: Marc Duiker Date: Mon, 1 Sep 2025 10:57:42 +0200 Subject: [PATCH 2/3] Update markdown based shortcode for card elements Signed-off-by: Marc Duiker --- daprdocs/content/en/go-sdk-docs/_index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/daprdocs/content/en/go-sdk-docs/_index.md b/daprdocs/content/en/go-sdk-docs/_index.md index 57fc63fd..21ba1310 100644 --- a/daprdocs/content/en/go-sdk-docs/_index.md +++ b/daprdocs/content/en/go-sdk-docs/_index.md @@ -15,14 +15,14 @@ cascade: A client library to help build Dapr applications in Go. This client supports all public Dapr APIs while focusing on idiomatic Go experiences and developer productivity. {{< cardpane >}} -{{< card title="**Client**">}} +{{% card title="**Client**"%}} Use the Go Client SDK for invoking public Dapr APIs [**Learn more about the Go Client SDK**]({{% ref go-client %}}) -{{< /card >}} -{{< card title="**Service**">}} +{{% /card %}} +{{% card title="**Service**"%}} Use the Dapr Service (Callback) SDK for Go to create services that will be invoked by Dapr. [**Learn more about the Go Service (Callback) SDK**]({{% ref go-service %}}) -{{< /card >}} -{{< /cardpane >}} \ No newline at end of file +{{% /card %}} +{{< /cardpane >}} From dbd1351644028568039178f54311c9334accaf07 Mon Sep 17 00:00:00 2001 From: Mike Nguyen Date: Tue, 26 Aug 2025 21:40:01 +0100 Subject: [PATCH 3/3] chore!: prune deprecated client workflow methods (#763) Signed-off-by: Mike Nguyen --- client/client.go | 35 ---- client/client_test.go | 56 ------ client/workflow.go | 268 ---------------------------- client/workflow_test.go | 374 ---------------------------------------- examples/go.mod | 2 +- examples/go.sum | 1 + go.mod | 2 +- go.sum | 6 +- 8 files changed, 5 insertions(+), 739 deletions(-) delete mode 100644 client/workflow.go delete mode 100644 client/workflow_test.go diff --git a/client/client.go b/client/client.go index 7b82164c..57814c46 100644 --- a/client/client.go +++ b/client/client.go @@ -229,41 +229,6 @@ type Client interface { // ImplActorClientStub is to impl user defined actor client stub ImplActorClientStub(actorClientStub actor.Client, opt ...config.Option) - // StartWorkflowBeta1 starts a workflow. - // Deprecated: Please use the workflow client (github.com/dapr/go-sdk/workflow). - // These methods for managing workflows are no longer supported and will be removed in the 1.16 release. - StartWorkflowBeta1(ctx context.Context, req *StartWorkflowRequest) (*StartWorkflowResponse, error) - - // GetWorkflowBeta1 gets a workflow. - // Deprecated: Please use the workflow client (github.com/dapr/go-sdk/workflow). - // These methods for managing workflows are no longer supported and will be removed in the 1.16 release. - GetWorkflowBeta1(ctx context.Context, req *GetWorkflowRequest) (*GetWorkflowResponse, error) - - // PurgeWorkflowBeta1 purges a workflow. - // Deprecated: Please use the workflow client (github.com/dapr/go-sdk/workflow). - // These methods for managing workflows are no longer supported and will be removed in the 1.16 release. - PurgeWorkflowBeta1(ctx context.Context, req *PurgeWorkflowRequest) error - - // TerminateWorkflowBeta1 terminates a workflow. - // Deprecated: Please use the workflow client (github.com/dapr/go-sdk/workflow). - // These methods for managing workflows are no longer supported and will be removed in the 1.16 release. - TerminateWorkflowBeta1(ctx context.Context, req *TerminateWorkflowRequest) error - - // PauseWorkflowBeta1 pauses a workflow. - // Deprecated: Please use the workflow client (github.com/dapr/go-sdk/workflow). - // These methods for managing workflows are no longer supported and will be removed in the 1.16 release. - PauseWorkflowBeta1(ctx context.Context, req *PauseWorkflowRequest) error - - // ResumeWorkflowBeta1 resumes a workflow. - // Deprecated: Please use the workflow client (github.com/dapr/go-sdk/workflow). - // These methods for managing workflows are no longer supported and will be removed in the 1.16 release. - ResumeWorkflowBeta1(ctx context.Context, req *ResumeWorkflowRequest) error - - // RaiseEventWorkflowBeta1 raises an event for a workflow. - // Deprecated: Please use the workflow client (github.com/dapr/go-sdk/workflow). - // These methods for managing workflows are no longer supported and will be removed in the 1.16 release. - RaiseEventWorkflowBeta1(ctx context.Context, req *RaiseEventWorkflowRequest) error - // ScheduleJobAlpha1 creates and schedules a job. ScheduleJobAlpha1(ctx context.Context, req *Job) error diff --git a/client/client_test.go b/client/client_test.go index 9161e056..27b591b3 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -502,62 +502,6 @@ func (s *testDaprServer) UnsubscribeConfiguration(ctx context.Context, in *pb.Un return &pb.UnsubscribeConfigurationResponse{Ok: true}, nil } -func (s *testDaprServer) StartWorkflowBeta1(ctx context.Context, in *pb.StartWorkflowRequest) (*pb.StartWorkflowResponse, error) { - if in.GetInstanceId() == testWorkflowFailureID { - return nil, errors.New("test failure") - } - return &pb.StartWorkflowResponse{ - InstanceId: in.GetInstanceId(), - }, nil -} - -func (s *testDaprServer) GetWorkflowBeta1(ctx context.Context, in *pb.GetWorkflowRequest) (*pb.GetWorkflowResponse, error) { - if in.GetInstanceId() == testWorkflowFailureID { - return nil, errors.New("test failure") - } - return &pb.GetWorkflowResponse{ - InstanceId: in.GetInstanceId(), - WorkflowName: "TestWorkflowName", - RuntimeStatus: "Running", - Properties: make(map[string]string), - }, nil -} - -func (s *testDaprServer) PurgeWorkflowBeta1(ctx context.Context, in *pb.PurgeWorkflowRequest) (*emptypb.Empty, error) { - if in.GetInstanceId() == testWorkflowFailureID { - return nil, errors.New("test failure") - } - return &emptypb.Empty{}, nil -} - -func (s *testDaprServer) TerminateWorkflowBeta1(ctx context.Context, in *pb.TerminateWorkflowRequest) (*emptypb.Empty, error) { - if in.GetInstanceId() == testWorkflowFailureID { - return nil, errors.New("test failure") - } - return &emptypb.Empty{}, nil -} - -func (s *testDaprServer) PauseWorkflowBeta1(ctx context.Context, in *pb.PauseWorkflowRequest) (*emptypb.Empty, error) { - if in.GetInstanceId() == testWorkflowFailureID { - return nil, errors.New("test failure") - } - return &emptypb.Empty{}, nil -} - -func (s *testDaprServer) ResumeWorkflowBeta1(ctx context.Context, in *pb.ResumeWorkflowRequest) (*emptypb.Empty, error) { - if in.GetInstanceId() == testWorkflowFailureID { - return nil, errors.New("test failure") - } - return &emptypb.Empty{}, nil -} - -func (s *testDaprServer) RaiseEventWorkflowBeta1(ctx context.Context, in *pb.RaiseEventWorkflowRequest) (*emptypb.Empty, error) { - if in.GetInstanceId() == testWorkflowFailureID { - return nil, errors.New("test failure") - } - return &emptypb.Empty{}, nil -} - func (s *testDaprServer) ScheduleJobAlpha1(ctx context.Context, in *pb.ScheduleJobRequest) (*pb.ScheduleJobResponse, error) { return &pb.ScheduleJobResponse{}, nil } diff --git a/client/workflow.go b/client/workflow.go deleted file mode 100644 index 75b105d3..00000000 --- a/client/workflow.go +++ /dev/null @@ -1,268 +0,0 @@ -/* -Copyright 2024 The Dapr Authors -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 client - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "time" - - "github.com/google/uuid" - - pb "github.com/dapr/dapr/pkg/proto/runtime/v1" -) - -const ( - DefaultWorkflowComponent = "dapr" -) - -type StartWorkflowRequest struct { - InstanceID string // Optional instance identifier - WorkflowComponent string - WorkflowName string - Options map[string]string // Optional metadata - Input any // Optional input - SendRawInput bool // Set to True in order to disable serialization on the input -} - -type StartWorkflowResponse struct { - InstanceID string -} - -type GetWorkflowRequest struct { - InstanceID string - WorkflowComponent string -} - -type GetWorkflowResponse struct { - InstanceID string - WorkflowName string - CreatedAt time.Time - LastUpdatedAt time.Time - RuntimeStatus string - Properties map[string]string -} - -type PurgeWorkflowRequest struct { - InstanceID string - WorkflowComponent string -} - -type TerminateWorkflowRequest struct { - InstanceID string - WorkflowComponent string -} - -type PauseWorkflowRequest struct { - InstanceID string - WorkflowComponent string -} - -type ResumeWorkflowRequest struct { - InstanceID string - WorkflowComponent string -} - -type RaiseEventWorkflowRequest struct { - InstanceID string - WorkflowComponent string - EventName string - EventData any - SendRawData bool // Set to True in order to disable serialization on the data -} - -// StartWorkflowBeta1 starts a workflow using the beta1 spec. -func (c *GRPCClient) StartWorkflowBeta1(ctx context.Context, req *StartWorkflowRequest) (*StartWorkflowResponse, error) { - if req.InstanceID == "" { - req.InstanceID = uuid.New().String() - } - if req.WorkflowComponent == "" { - req.WorkflowComponent = DefaultWorkflowComponent - } - if req.WorkflowName == "" { - return nil, errors.New("failed to start workflow: WorkflowName must be supplied") - } - - var input []byte - var err error - if req.SendRawInput { - var ok bool - if input, ok = req.Input.([]byte); !ok { - return nil, errors.New("failed to start workflow: sendrawinput is true however, input is not a byte slice") - } - } else { - input, err = marshalInput(req.Input) - if err != nil { - return nil, fmt.Errorf("failed to start workflow: %v", err) - } - } - - resp, err := c.protoClient.StartWorkflowBeta1(ctx, &pb.StartWorkflowRequest{ - InstanceId: req.InstanceID, - WorkflowComponent: req.WorkflowComponent, - WorkflowName: req.WorkflowName, - Options: req.Options, - Input: input, - }) - if err != nil { - return nil, fmt.Errorf("failed to start workflow instance: %v", err) - } - return &StartWorkflowResponse{ - InstanceID: resp.GetInstanceId(), - }, nil -} - -// GetWorkflowBeta1 gets the status of a workflow using the beta1 spec. -func (c *GRPCClient) GetWorkflowBeta1(ctx context.Context, req *GetWorkflowRequest) (*GetWorkflowResponse, error) { - if req.InstanceID == "" { - return nil, errors.New("failed to get workflow status: InstanceID must be supplied") - } - if req.WorkflowComponent == "" { - req.WorkflowComponent = DefaultWorkflowComponent - } - resp, err := c.protoClient.GetWorkflowBeta1(ctx, &pb.GetWorkflowRequest{ - InstanceId: req.InstanceID, - WorkflowComponent: req.WorkflowComponent, - }) - if err != nil { - return nil, fmt.Errorf("failed to get workflow status: %v", err) - } - return &GetWorkflowResponse{ - InstanceID: resp.GetInstanceId(), - WorkflowName: resp.GetWorkflowName(), - CreatedAt: resp.GetCreatedAt().AsTime(), - LastUpdatedAt: resp.GetLastUpdatedAt().AsTime(), - RuntimeStatus: resp.GetRuntimeStatus(), - Properties: resp.GetProperties(), - }, nil -} - -// PurgeWorkflowBeta1 removes all metadata relating to a specific workflow using the beta1 spec. -func (c *GRPCClient) PurgeWorkflowBeta1(ctx context.Context, req *PurgeWorkflowRequest) error { - if req.InstanceID == "" { - return errors.New("failed to purge workflow: InstanceID must be supplied") - } - if req.WorkflowComponent == "" { - req.WorkflowComponent = DefaultWorkflowComponent - } - _, err := c.protoClient.PurgeWorkflowBeta1(ctx, &pb.PurgeWorkflowRequest{ - InstanceId: req.InstanceID, - WorkflowComponent: req.WorkflowComponent, - }) - if err != nil { - return fmt.Errorf("failed to purge workflow: %v", err) - } - return nil -} - -// TerminateWorkflowBeta1 stops a workflow using the beta1 spec. -func (c *GRPCClient) TerminateWorkflowBeta1(ctx context.Context, req *TerminateWorkflowRequest) error { - if req.InstanceID == "" { - return errors.New("failed to terminate workflow: InstanceID must be supplied") - } - if req.WorkflowComponent == "" { - req.WorkflowComponent = DefaultWorkflowComponent - } - _, err := c.protoClient.TerminateWorkflowBeta1(ctx, &pb.TerminateWorkflowRequest{ - InstanceId: req.InstanceID, - WorkflowComponent: req.WorkflowComponent, - }) - if err != nil { - return fmt.Errorf("failed to terminate workflow: %v", err) - } - return nil -} - -// PauseWorkflowBeta1 pauses a workflow that can be resumed later using the beta1 spec. -func (c *GRPCClient) PauseWorkflowBeta1(ctx context.Context, req *PauseWorkflowRequest) error { - if req.InstanceID == "" { - return errors.New("failed to pause workflow: InstanceID must be supplied") - } - if req.WorkflowComponent == "" { - req.WorkflowComponent = DefaultWorkflowComponent - } - _, err := c.protoClient.PauseWorkflowBeta1(ctx, &pb.PauseWorkflowRequest{ - InstanceId: req.InstanceID, - WorkflowComponent: req.WorkflowComponent, - }) - if err != nil { - return fmt.Errorf("failed to pause workflow: %v", err) - } - return nil -} - -// ResumeWorkflowBeta1 resumes a paused workflow using the beta1 spec. -func (c *GRPCClient) ResumeWorkflowBeta1(ctx context.Context, req *ResumeWorkflowRequest) error { - if req.InstanceID == "" { - return errors.New("failed to resume workflow: InstanceID must be supplied") - } - if req.WorkflowComponent == "" { - req.WorkflowComponent = DefaultWorkflowComponent - } - _, err := c.protoClient.ResumeWorkflowBeta1(ctx, &pb.ResumeWorkflowRequest{ - InstanceId: req.InstanceID, - WorkflowComponent: req.WorkflowComponent, - }) - if err != nil { - return fmt.Errorf("failed to resume workflow: %v", err) - } - return nil -} - -// RaiseEventWorkflowBeta1 raises an event on a workflow using the beta1 spec. -func (c *GRPCClient) RaiseEventWorkflowBeta1(ctx context.Context, req *RaiseEventWorkflowRequest) error { - if req.InstanceID == "" { - return errors.New("failed to raise event on workflow: InstanceID must be supplied") - } - if req.WorkflowComponent == "" { - req.WorkflowComponent = DefaultWorkflowComponent - } - if req.EventName == "" { - return errors.New("failed to raise event on workflow: EventName must be supplied") - } - var eventData []byte - var err error - if req.SendRawData { - var ok bool - if eventData, ok = req.EventData.([]byte); !ok { - return errors.New("failed to raise event on workflow: SendRawData is true however, eventData is not a byte slice") - } - } else { - eventData, err = marshalInput(req.EventData) - if err != nil { - return fmt.Errorf("failed to raise an event on workflow: %v", err) - } - } - - _, err = c.protoClient.RaiseEventWorkflowBeta1(ctx, &pb.RaiseEventWorkflowRequest{ - InstanceId: req.InstanceID, - WorkflowComponent: req.WorkflowComponent, - EventName: req.EventName, - EventData: eventData, - }) - if err != nil { - return fmt.Errorf("failed to raise event on workflow: %v", err) - } - return nil -} - -func marshalInput(input any) (data []byte, err error) { - if input == nil { - return nil, nil - } - return json.Marshal(input) -} diff --git a/client/workflow_test.go b/client/workflow_test.go deleted file mode 100644 index a6f52dd3..00000000 --- a/client/workflow_test.go +++ /dev/null @@ -1,374 +0,0 @@ -/* -Copyright 2024 The Dapr Authors -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 client - -import ( - "math" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/stretchr/testify/assert" -) - -func TestMarshalInput(t *testing.T) { - var input any - t.Run("string", func(t *testing.T) { - input = "testString" - data, err := marshalInput(input) - require.NoError(t, err) - assert.Equal(t, []byte{0x22, 0x74, 0x65, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22}, data) - }) -} - -func TestWorkflowBeta1(t *testing.T) { - ctx := t.Context() - - // 1: StartWorkflow - t.Run("start workflow - valid (without id)", func(t *testing.T) { - resp, err := testClient.StartWorkflowBeta1(ctx, &StartWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - WorkflowName: "TestWorkflow", - }) - require.NoError(t, err) - assert.NotNil(t, resp.InstanceID) - }) - t.Run("start workflow - valid (with id)", func(t *testing.T) { - resp, err := testClient.StartWorkflowBeta1(ctx, &StartWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "dapr", - WorkflowName: "TestWorkflow", - }) - require.NoError(t, err) - assert.Equal(t, "TestID", resp.InstanceID) - }) - t.Run("start workflow - valid (without component name)", func(t *testing.T) { - resp, err := testClient.StartWorkflowBeta1(ctx, &StartWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "", - WorkflowName: "TestWorkflow", - }) - require.NoError(t, err) - assert.Equal(t, "TestID", resp.InstanceID) - }) - t.Run("start workflow - rpc failure", func(t *testing.T) { - resp, err := testClient.StartWorkflowBeta1(ctx, &StartWorkflowRequest{ - InstanceID: testWorkflowFailureID, - WorkflowComponent: "dapr", - WorkflowName: "TestWorkflow", - }) - require.Error(t, err) - assert.Nil(t, resp) - }) - t.Run("start workflow - grpc failure", func(t *testing.T) { - resp, err := testClient.StartWorkflowBeta1(ctx, &StartWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - WorkflowName: "", - }) - require.Error(t, err) - assert.Nil(t, resp) - }) - t.Run("start workflow - cannot serialize input", func(t *testing.T) { - resp, err := testClient.StartWorkflowBeta1(ctx, &StartWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - WorkflowName: "TestWorkflow", - Input: math.NaN(), - SendRawInput: false, - }) - require.Error(t, err) - assert.Nil(t, resp) - }) - t.Run("start workflow - raw input", func(t *testing.T) { - resp, err := testClient.StartWorkflowBeta1(ctx, &StartWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - WorkflowName: "TestWorkflow", - Input: []byte("stringtest"), - SendRawInput: true, - }) - require.NoError(t, err) - assert.NotNil(t, resp) - }) - - t.Run("start workflow - raw input (invalid)", func(t *testing.T) { - resp, err := testClient.StartWorkflowBeta1(ctx, &StartWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - WorkflowName: "TestWorkflow", - Input: "test string", - SendRawInput: true, - }) - require.Error(t, err) - assert.Nil(t, resp) - }) - - // 2: GetWorkflow - t.Run("get workflow", func(t *testing.T) { - resp, err := testClient.GetWorkflowBeta1(ctx, &GetWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "dapr", - }) - require.NoError(t, err) - assert.NotNil(t, resp) - }) - - t.Run("get workflow - valid", func(t *testing.T) { - resp, err := testClient.GetWorkflowBeta1(ctx, &GetWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "dapr", - }) - require.NoError(t, err) - assert.NotNil(t, resp) - }) - - t.Run("get workflow - valid (without component)", func(t *testing.T) { - resp, err := testClient.GetWorkflowBeta1(ctx, &GetWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "", - }) - require.NoError(t, err) - assert.NotNil(t, resp) - }) - - t.Run("get workflow - invalid id", func(t *testing.T) { - resp, err := testClient.GetWorkflowBeta1(ctx, &GetWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - }) - require.Error(t, err) - assert.Nil(t, resp) - }) - - t.Run("get workflow - grpc fail", func(t *testing.T) { - resp, err := testClient.GetWorkflowBeta1(ctx, &GetWorkflowRequest{ - InstanceID: testWorkflowFailureID, - WorkflowComponent: "dapr", - }) - require.Error(t, err) - assert.Nil(t, resp) - }) - - // 3: PauseWorkflow - t.Run("pause workflow", func(t *testing.T) { - err := testClient.PauseWorkflowBeta1(ctx, &PauseWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "dapr", - }) - require.NoError(t, err) - }) - - t.Run("pause workflow - valid (without component)", func(t *testing.T) { - err := testClient.PauseWorkflowBeta1(ctx, &PauseWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "", - }) - require.NoError(t, err) - }) - - t.Run("pause workflow invalid instanceid", func(t *testing.T) { - err := testClient.PauseWorkflowBeta1(ctx, &PauseWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - }) - require.Error(t, err) - }) - - t.Run("pause workflow", func(t *testing.T) { - err := testClient.PauseWorkflowBeta1(ctx, &PauseWorkflowRequest{ - InstanceID: testWorkflowFailureID, - WorkflowComponent: "dapr", - }) - require.Error(t, err) - }) - - // 4: ResumeWorkflow - t.Run("resume workflow", func(t *testing.T) { - err := testClient.ResumeWorkflowBeta1(ctx, &ResumeWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "dapr", - }) - require.NoError(t, err) - }) - - t.Run("resume workflow - valid (without component)", func(t *testing.T) { - err := testClient.ResumeWorkflowBeta1(ctx, &ResumeWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "", - }) - require.NoError(t, err) - }) - - t.Run("resume workflow - invalid instanceid", func(t *testing.T) { - err := testClient.ResumeWorkflowBeta1(ctx, &ResumeWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - }) - require.Error(t, err) - }) - - t.Run("resume workflow - grpc fail", func(t *testing.T) { - err := testClient.ResumeWorkflowBeta1(ctx, &ResumeWorkflowRequest{ - InstanceID: testWorkflowFailureID, - WorkflowComponent: "dapr", - }) - require.Error(t, err) - }) - - // 5: TerminateWorkflow - t.Run("terminate workflow", func(t *testing.T) { - err := testClient.TerminateWorkflowBeta1(ctx, &TerminateWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "dapr", - }) - require.NoError(t, err) - }) - - t.Run("terminate workflow - valid (without component)", func(t *testing.T) { - err := testClient.TerminateWorkflowBeta1(ctx, &TerminateWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "", - }) - require.NoError(t, err) - }) - - t.Run("terminate workflow - invalid instanceid", func(t *testing.T) { - err := testClient.TerminateWorkflowBeta1(ctx, &TerminateWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - }) - require.Error(t, err) - }) - - t.Run("terminate workflow - grpc failure", func(t *testing.T) { - err := testClient.TerminateWorkflowBeta1(ctx, &TerminateWorkflowRequest{ - InstanceID: testWorkflowFailureID, - WorkflowComponent: "dapr", - }) - require.Error(t, err) - }) - - // 6: RaiseEventWorkflow - t.Run("raise event workflow", func(t *testing.T) { - err := testClient.RaiseEventWorkflowBeta1(ctx, &RaiseEventWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "dapr", - EventName: "TestEvent", - }) - require.NoError(t, err) - }) - - t.Run("raise event workflow - valid (without component)", func(t *testing.T) { - err := testClient.RaiseEventWorkflowBeta1(ctx, &RaiseEventWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "", - EventName: "TestEvent", - }) - require.NoError(t, err) - }) - - t.Run("raise event workflow - invalid instanceid", func(t *testing.T) { - err := testClient.RaiseEventWorkflowBeta1(ctx, &RaiseEventWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - EventName: "TestEvent", - }) - require.Error(t, err) - }) - - t.Run("raise event workflow - invalid eventname", func(t *testing.T) { - err := testClient.RaiseEventWorkflowBeta1(ctx, &RaiseEventWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "dapr", - EventName: "", - }) - require.Error(t, err) - }) - - t.Run("raise event workflow - grpc failure", func(t *testing.T) { - err := testClient.RaiseEventWorkflowBeta1(ctx, &RaiseEventWorkflowRequest{ - InstanceID: testWorkflowFailureID, - WorkflowComponent: "dapr", - EventName: "TestEvent", - }) - require.Error(t, err) - }) - t.Run("raise event workflow - cannot serialize input", func(t *testing.T) { - err := testClient.RaiseEventWorkflowBeta1(ctx, &RaiseEventWorkflowRequest{ - InstanceID: testWorkflowFailureID, - WorkflowComponent: "dapr", - EventName: "TestEvent", - EventData: math.NaN(), - SendRawData: false, - }) - require.Error(t, err) - }) - t.Run("raise event workflow - raw input", func(t *testing.T) { - err := testClient.RaiseEventWorkflowBeta1(ctx, &RaiseEventWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "dapr", - EventName: "TestEvent", - EventData: []byte("teststring"), - SendRawData: true, - }) - require.NoError(t, err) - }) - - t.Run("raise event workflow - raw input (invalid)", func(t *testing.T) { - err := testClient.RaiseEventWorkflowBeta1(ctx, &RaiseEventWorkflowRequest{ - InstanceID: testWorkflowFailureID, - WorkflowComponent: "dapr", - EventName: "TestEvent", - EventData: "test string", - SendRawData: true, - }) - require.Error(t, err) - }) - - // 7: PurgeWorkflow - t.Run("purge workflow", func(t *testing.T) { - err := testClient.PurgeWorkflowBeta1(ctx, &PurgeWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "dapr", - }) - require.NoError(t, err) - }) - - t.Run("purge workflow - valid (without component)", func(t *testing.T) { - err := testClient.PurgeWorkflowBeta1(ctx, &PurgeWorkflowRequest{ - InstanceID: "TestID", - WorkflowComponent: "", - }) - require.NoError(t, err) - }) - - t.Run("purge workflow - invalid instanceid", func(t *testing.T) { - err := testClient.PurgeWorkflowBeta1(ctx, &PurgeWorkflowRequest{ - InstanceID: "", - WorkflowComponent: "dapr", - }) - require.Error(t, err) - }) - - t.Run("purge workflow - grpc failure", func(t *testing.T) { - err := testClient.PurgeWorkflowBeta1(ctx, &PurgeWorkflowRequest{ - InstanceID: testWorkflowFailureID, - WorkflowComponent: "dapr", - }) - require.Error(t, err) - }) -} diff --git a/examples/go.mod b/examples/go.mod index 313cda95..50ca3682 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -20,7 +20,7 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/dapr/dapr v1.16.0-rc.3 // indirect github.com/dapr/durabletask-go v0.7.3-0.20250711135247-7a35af6fe0e5 // indirect - github.com/dapr/kit v0.15.4 // indirect + github.com/dapr/kit v0.16.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/go-chi/chi/v5 v5.2.2 // indirect github.com/go-logr/logr v1.4.3 // indirect diff --git a/examples/go.sum b/examples/go.sum index 244ea529..af5644a6 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -12,6 +12,7 @@ github.com/dapr/durabletask-go v0.7.3-0.20250711135247-7a35af6fe0e5 h1:l8oBGwcfC github.com/dapr/durabletask-go v0.7.3-0.20250711135247-7a35af6fe0e5/go.mod h1:0Ts4rXp74JyG19gDWPcwNo5V6NBZzhARzHF5XynmA7Q= github.com/dapr/kit v0.15.4 h1:29DezCR22OuZhXX4yPEc+lqcOf/PNaeAuIEx9nGv394= github.com/dapr/kit v0.15.4/go.mod h1:HwFsBKEbcyLanWlDZE7u/jnaDCD/tU+n3pkFNUctQNw= +github.com/dapr/kit v0.16.0/go.mod h1:40ZWs5P6xfYf7O59XgwqZkIyDldTIXlhTQhGop8QoSM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= diff --git a/go.mod b/go.mod index 374def22..7820fdc0 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24.4 require ( github.com/dapr/dapr v1.16.0-rc.3 github.com/dapr/durabletask-go v0.7.3-0.20250711135247-7a35af6fe0e5 - github.com/dapr/kit v0.15.4 + github.com/dapr/kit v0.16.0 github.com/go-chi/chi/v5 v5.2.2 github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 84395fe1..e9549654 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/dapr/dapr v1.16.0-rc.3 h1:D99V20GOhb+bZXH1PngME+wgzIZCcBFOvmaP7DOZxGo github.com/dapr/dapr v1.16.0-rc.3/go.mod h1:uyKnxMohSg87LSFzZ/oyuiGSo0+qkzeR0eXncPyIV9c= github.com/dapr/durabletask-go v0.7.3-0.20250711135247-7a35af6fe0e5 h1:l8oBGwcfCwqvSYDZwla0A2fhENmXFc1Wk4lR0VEq+is= github.com/dapr/durabletask-go v0.7.3-0.20250711135247-7a35af6fe0e5/go.mod h1:0Ts4rXp74JyG19gDWPcwNo5V6NBZzhARzHF5XynmA7Q= -github.com/dapr/kit v0.15.4 h1:29DezCR22OuZhXX4yPEc+lqcOf/PNaeAuIEx9nGv394= -github.com/dapr/kit v0.15.4/go.mod h1:HwFsBKEbcyLanWlDZE7u/jnaDCD/tU+n3pkFNUctQNw= +github.com/dapr/kit v0.16.0 h1:I2sMBzndw5XTjsaH0J/hbKK6WNbuT0AHxIY5M9OhzGI= +github.com/dapr/kit v0.16.0/go.mod h1:40ZWs5P6xfYf7O59XgwqZkIyDldTIXlhTQhGop8QoSM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -55,8 +55,6 @@ go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKr go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=