package common import ( "context" "errors" "testing" "github.com/perfect-panel/server/internal/model/user" "github.com/stretchr/testify/require" ) func TestResolvePurchaseRoute(t *testing.T) { ctx := context.Background() t.Run("single mode disabled", func(t *testing.T) { called := false decision, err := ResolvePurchaseRoute(ctx, false, 1, 100, func(ctx context.Context, userID int64) (*user.Subscribe, error) { called = true return nil, nil }) require.NoError(t, err) require.NotNil(t, decision) require.Equal(t, PurchaseRouteNewPurchase, decision.Route) require.Equal(t, int64(100), decision.ResolvedSubscribeID) require.False(t, called) }) t.Run("single mode but empty user", func(t *testing.T) { decision, err := ResolvePurchaseRoute(ctx, true, 0, 100, nil) require.NoError(t, err) require.NotNil(t, decision) require.Equal(t, PurchaseRouteNewPurchase, decision.Route) require.Equal(t, int64(100), decision.ResolvedSubscribeID) }) t.Run("single mode no anchor", func(t *testing.T) { decision, err := ResolvePurchaseRoute(ctx, true, 1, 100, func(ctx context.Context, userID int64) (*user.Subscribe, error) { return nil, nil }) require.NoError(t, err) require.NotNil(t, decision) require.Equal(t, PurchaseRouteNewPurchase, decision.Route) require.Equal(t, int64(100), decision.ResolvedSubscribeID) }) t.Run("single mode routed to renewal", func(t *testing.T) { decision, err := ResolvePurchaseRoute(ctx, true, 1, 100, func(ctx context.Context, userID int64) (*user.Subscribe, error) { return &user.Subscribe{ Id: 11, SubscribeId: 100, OrderId: 7, Token: "token", }, nil }) require.NoError(t, err) require.NotNil(t, decision) require.Equal(t, PurchaseRoutePurchaseToRenewal, decision.Route) require.Equal(t, int64(100), decision.ResolvedSubscribeID) require.NotNil(t, decision.Anchor) require.Equal(t, int64(11), decision.Anchor.Id) }) t.Run("single mode plan mismatch", func(t *testing.T) { decision, err := ResolvePurchaseRoute(ctx, true, 1, 100, func(ctx context.Context, userID int64) (*user.Subscribe, error) { return &user.Subscribe{ Id: 11, SubscribeId: 200, }, nil }) require.ErrorIs(t, err, ErrSingleModePlanMismatch) require.Nil(t, decision) }) t.Run("single mode anchor query error", func(t *testing.T) { queryErr := errors.New("query failed") decision, err := ResolvePurchaseRoute(ctx, true, 1, 100, func(ctx context.Context, userID int64) (*user.Subscribe, error) { return nil, queryErr }) require.ErrorIs(t, err, queryErr) require.Nil(t, decision) }) }