package main

import (
	"errors"
	"github.com/stretchr/testify/mock"
	"go.temporal.io/sdk/testsuite"
	"testing"
)

func TestWorkflowRetriesActivity(t *testing.T) {
	var suite testsuite.WorkflowTestSuite
	env := suite.NewTestWorkflowEnvironment()
	env.RegisterActivity(RenderInvoiceActivity)
	env.OnActivity(RenderInvoiceActivity, mock.Anything, "o1").Return("", errors.New("temporary")).Once()
	env.OnActivity(RenderInvoiceActivity, mock.Anything, "o1").Return("invoice:o1", nil).Once()
	env.ExecuteWorkflow(InvoiceWorkflow, "o1")
	if !env.IsWorkflowCompleted() || env.GetWorkflowError() != nil {
		t.Fatal(env.GetWorkflowError())
	}
	var result string
	if err := env.GetWorkflowResult(&result); err != nil {
		t.Fatal(err)
	}
	if result != "invoice:o1" {
		t.Fatal(result)
	}
	env.AssertExpectations(t)
	t.Log("activity attempts=2 result=invoice:o1")
}
func TestWorkflowRejectsInvalidOrder(t *testing.T) {
	var suite testsuite.WorkflowTestSuite
	env := suite.NewTestWorkflowEnvironment()
	env.RegisterActivity(RenderInvoiceActivity)
	env.ExecuteWorkflow(InvoiceWorkflow, "")
	if env.GetWorkflowError() == nil {
		t.Fatal("invalid order succeeded")
	}
}
