Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions cmd/samples/expense/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ func startWorkflow(h *common.SampleHelper, expenseID string) {
workflowOptions := client.StartWorkflowOptions{
ID: "expense_" + uuid.New(),
TaskList: ApplicationName,
ExecutionStartToCloseTimeout: time.Minute,
DecisionTaskStartToCloseTimeout: time.Minute,
ExecutionStartToCloseTimeout: time.Minute * 12,
DecisionTaskStartToCloseTimeout: time.Minute * 12,
}
h.StartWorkflow(workflowOptions, sampleExpenseWorkflow, expenseID)
}
Expand Down
6 changes: 3 additions & 3 deletions cmd/samples/expense/workflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ func sampleExpenseWorkflow(ctx workflow.Context, expenseID string) (result strin

// step 2, wait for the expense report to be approved (or rejected)
ao = workflow.ActivityOptions{
ScheduleToStartTimeout: 10 * time.Minute,
StartToCloseTimeout: 10 * time.Minute,
ScheduleToStartTimeout: time.Minute,
StartToCloseTimeout: 4 * time.Minute,
}
ctx2 := workflow.WithActivityOptions(ctx, ao)
// Notice that we set the timeout to be 10 minutes for this sample demo. If the expected time for the activity to
// Notice that we set the timeout to be 4 minutes for this sample demo. If the expected time for the activity to
// complete (waiting for human to approve the request) is longer, you should set the timeout accordingly so the
// cadence system will wait accordingly. Otherwise, cadence system could mark the activity as failure by timeout.
var status string
Expand Down
105 changes: 105 additions & 0 deletions cmd/samples/expense/workflow_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"errors"
"io"
"net/http"
"net/http/httptest"
Expand Down Expand Up @@ -50,6 +51,110 @@ func (s *UnitTestSuite) Test_WorkflowWithMockActivities() {
s.Equal("COMPLETED", workflowResult)
}

func (s *UnitTestSuite) Test_TimeoutWithMockActivities() {
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
// s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("APPROVED", nil).Once()
// s.env.OnActivity(paymentActivity, mock.Anything, mock.Anything).Return(nil).Once()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

better to avoid checking in commented code.

s.env.SetWorkflowTimeout(time.Microsecond * 500)
s.env.SetTestTimeout(time.Minute * 10)

s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")

var workflowResult string
err := s.env.GetWorkflowResult(&workflowResult)
s.Equal("TimeoutType: SCHEDULE_TO_CLOSE", err.Error())
s.Empty(workflowResult)
}

func (s *UnitTestSuite) Test_WorkflowStatusRejected() {
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("REJECTED", nil).Once()
// s.env.OnActivity(paymentActivity, mock.Anything, mock.Anything).Return(nil).Once()

s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")

s.True(s.env.IsWorkflowCompleted())
s.NoError(s.env.GetWorkflowError())
var workflowResult string
err := s.env.GetWorkflowResult(&workflowResult)
s.NoError(err)
s.Empty(workflowResult)
}

func (s *UnitTestSuite) Test_WorkflowStatusCancelled() {
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("CANCELLED", nil).Once()

s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")

s.True(s.env.IsWorkflowCompleted())
s.NoError(s.env.GetWorkflowError())
var workflowResult string
err := s.env.GetWorkflowResult(&workflowResult)
s.NoError(err)
s.Empty(workflowResult)
}

func (s *UnitTestSuite) Test_WorkflowStatusApprovedWithPaymentError() {
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("APPROVED", nil).Once()
s.env.OnActivity(paymentActivity, mock.Anything, mock.Anything).Return(errors.New("payment error")).Once()

s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")

s.True(s.env.IsWorkflowCompleted())
s.Error(s.env.GetWorkflowError())
var workflowResult string
err := s.env.GetWorkflowResult(&workflowResult)
s.Equal("payment error", err.Error())
s.Empty(workflowResult)
}

func (s *UnitTestSuite) Test_CreateActivityFailed() {
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(errors.New("expense id is empty")).Once()

s.env.ExecuteWorkflow(sampleExpenseWorkflow, "")

s.True(s.env.IsWorkflowCompleted())
s.Error(s.env.GetWorkflowError())
var workflowResult string

err := s.env.GetWorkflowResult(&workflowResult)
s.Equal("expense id is empty", err.Error())
s.Empty(workflowResult)
}

func (s *UnitTestSuite) Test_WaitForDecisionActivityFailed() {
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("", errors.New("failed to get decision")).Once()

s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")

s.True(s.env.IsWorkflowCompleted())
s.Error(s.env.GetWorkflowError())
var workflowResult string

err := s.env.GetWorkflowResult(&workflowResult)
s.Equal("failed to get decision", err.Error())
s.Empty(workflowResult)
}

func (s *UnitTestSuite) Test_PaymentActivityFailed() {
s.env.OnActivity(createExpenseActivity, mock.Anything, mock.Anything).Return(nil).Once()
s.env.OnActivity(waitForDecisionActivity, mock.Anything, mock.Anything).Return("APPROVED", nil).Once()
s.env.OnActivity(paymentActivity, mock.Anything, mock.Anything).Return(errors.New("payment failed")).Once()

s.env.ExecuteWorkflow(sampleExpenseWorkflow, "test-expense-id")

s.True(s.env.IsWorkflowCompleted())
s.Error(s.env.GetWorkflowError())
var workflowResult string

err := s.env.GetWorkflowResult(&workflowResult)
s.Equal("payment failed", err.Error())
s.Empty(workflowResult)
}

func (s *UnitTestSuite) Test_WorkflowWithMockServer() {
// setup mock expense server
handler := func(w http.ResponseWriter, r *http.Request) {
Expand Down