package connector_outboundintent

import (
	"context"
	"testing"

	outboundintentv1 "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/outboundintentv1"
)

type countingOperationPreparer struct{ calls int }

func (preparer *countingOperationPreparer) Prepare(context.Context, Command) (PreparedEffect, error) {
	preparer.calls++
	return preparedEffectFunc(func(context.Context) EffectResult { return EffectResult{} }), nil
}

func TestOperationPreparerRoutesOnlyMailAwayFromFallback(t *testing.T) {
	mail := &countingOperationPreparer{}
	fallback := &countingOperationPreparer{}
	preparer, err := NewOperationPreparer(mail, fallback)
	if err != nil {
		t.Fatal(err)
	}
	if _, err := preparer.Prepare(t.Context(), Command{Intent: outboundintentv1.Intent{
		Operation: outboundintentv1.OperationSendMail,
	}}); err != nil {
		t.Fatal(err)
	}
	if _, err := preparer.Prepare(t.Context(), Command{Intent: outboundintentv1.Intent{
		Operation: outboundintentv1.OperationUpsert,
	}}); err != nil {
		t.Fatal(err)
	}
	if mail.calls != 1 || fallback.calls != 1 {
		t.Fatalf("preparer calls mail=%d fallback=%d", mail.calls, fallback.calls)
	}
}
