package compatibility_test

import "testing"

// TestPublishedNewWorkerStoreCompatibility compiles a consumer outside the
// module against the store method set accepted by the released constructor.
// The unexported commandStore parameter type is still a public structural
// contract because external concrete values can be passed to NewWorker.
func TestPublishedNewWorkerStoreCompatibility(t *testing.T) {
	fixture := `package compatibilityfixture

import (
	"context"
	"time"

	connector_outboundintent "github.com/pingcap-inc/nexuscrm-connectors/features/connector/outboundintent"
)

type releasedOutboundCommandStore interface {
	ClaimNext(context.Context, connector_outboundintent.Scope, string, string, time.Duration) (connector_outboundintent.Command, bool, error)
	ClaimWriteback(context.Context, connector_outboundintent.Scope, string, string, time.Duration) (connector_outboundintent.Command, bool, error)
	MarkDispatching(context.Context, connector_outboundintent.Claim) (connector_outboundintent.Command, error)
	Retry(context.Context, connector_outboundintent.Claim, time.Time, string) (connector_outboundintent.Command, error)
	RetryWriteback(context.Context, connector_outboundintent.Claim, time.Time, string) (connector_outboundintent.Command, error)
	Reject(context.Context, connector_outboundintent.Claim, int, string) (connector_outboundintent.Command, error)
	CheckpointProviderSuccess(context.Context, connector_outboundintent.Claim, int, connector_outboundintent.RemoteLinkFinalization, string) (connector_outboundintent.Command, error)
	RecordProviderSuccess(context.Context, connector_outboundintent.Claim, int, connector_outboundintent.RemoteLinkFinalization) (connector_outboundintent.Command, error)
	RecordProviderSuccessForRetry(context.Context, connector_outboundintent.Claim, int, connector_outboundintent.RemoteLinkFinalization, time.Time, string) (connector_outboundintent.Command, error)
	RecordProviderSuccessTerminal(context.Context, connector_outboundintent.Claim, int, connector_outboundintent.RemoteLinkFinalization, string) (connector_outboundintent.Command, error)
	FinalizeWriteback(context.Context, connector_outboundintent.Claim) (connector_outboundintent.Command, error)
	Uncertain(context.Context, connector_outboundintent.Claim, int, string) (connector_outboundintent.Command, error)
}

type releasedOutboundStore struct{ releasedOutboundCommandStore }

func compileReleasedNewWorkerStoreContract() {
	_, _ = connector_outboundintent.NewWorker(
		releasedOutboundStore{}, nil, nil, connector_outboundintent.Scope{}, "worker",
	)
}
`
	compileExternalConsumer(t, "released NewWorker store", fixture)
}
