package order import ( "testing" "time" modelOrder "github.com/perfect-panel/server/internal/model/order" "github.com/perfect-panel/server/internal/model/user" "github.com/perfect-panel/server/internal/types" "github.com/stretchr/testify/require" "gorm.io/gorm" ) func ensureRenewalInviteSubscribeColumns(t *testing.T, db *gorm.DB) { t.Helper() for _, sql := range []string{ `ALTER TABLE "user_subscribe" ADD COLUMN node_group_id INTEGER NOT NULL DEFAULT 0`, `ALTER TABLE "user_subscribe" ADD COLUMN group_locked TINYINT NOT NULL DEFAULT 0`, `ALTER TABLE "user_subscribe" ADD COLUMN expired_download INTEGER NOT NULL DEFAULT 0`, `ALTER TABLE "user_subscribe" ADD COLUMN expired_upload INTEGER NOT NULL DEFAULT 0`, } { require.NoError(t, db.Exec(sql).Error) } } func insertRenewalInviteUserSubscribe(t *testing.T, db *gorm.DB, id, userID, orderID, subscribeID int64, token, uuid string, start, expire time.Time) { t.Helper() require.NoError(t, db.Exec(`INSERT INTO "user_subscribe" (id, user_id, order_id, subscribe_id, start_time, expire_time, traffic, download, upload, token, uuid, status, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, 0, 0, 0, ?, ?, 1, ?, ?)`, id, userID, orderID, subscribeID, start.UTC().Format("2006-01-02 15:04:05"), expire.UTC().Format("2006-01-02 15:04:05"), token, uuid, start.UTC().Format("2006-01-02 15:04:05"), time.Now().UTC().Format("2006-01-02 15:04:05"), ).Error) } func TestRenewalFirstSuccessfulPaymentMarksOrderAsNew(t *testing.T) { db := setupNewUserOnlyDB(t) ensureRenewalInviteSubscribeColumns(t, db) rds, mr := setupNewUserOnlyRedis(t) svcCtx := buildNewUserOnlySvcCtx(db, rds, mr) const ( planID = int64(1) paymentID = int64(2) ownerUserID = int64(31059) memberID = int64(31057) familyID = int64(5638) ownerSubID = int64(14672) ) insertTestSubscribe(t, db, planID, false) insertTestPayment(t, db, paymentID) member := insertTestUser(t, db, memberID, time.Now().Add(-2*time.Hour)) insertTestUser(t, db, ownerUserID, time.Now().Add(-2*time.Hour)) insertTestFamily(t, db, familyID, ownerUserID) insertTestFamilyMember(t, db, familyID, ownerUserID, user.FamilyRoleOwner, user.FamilyMemberActive, "owner_init") insertTestFamilyMember(t, db, familyID, memberID, user.FamilyRoleMember, user.FamilyMemberActive, "bind_email_with_verification") insertRenewalInviteUserSubscribe(t, db, ownerSubID, ownerUserID, 0, planID, "owner-trial-token", "owner-trial-uuid", time.Date(2026, 5, 2, 15, 53, 39, 0, time.UTC), time.Date(2026, 5, 9, 0, 0, 0, 0, time.UTC), ) resp, err := NewRenewalLogic(buildPurchaseCtx(member), svcCtx).Renewal(&types.RenewalOrderRequest{ UserSubscribeID: ownerSubID, Payment: paymentID, Quantity: 1, }) require.NoError(t, err) require.NotNil(t, resp) var created modelOrder.Order require.NoError(t, db.Where("order_no = ?", resp.OrderNo).First(&created).Error) require.Equal(t, uint8(2), created.Type) require.True(t, created.IsNew) require.Equal(t, memberID, created.UserId) require.Equal(t, ownerUserID, created.SubscriptionUserId) require.Equal(t, "owner-trial-token", created.SubscribeToken) } func TestRenewalExistingSuccessfulPaymentMarksOrderAsNotNew(t *testing.T) { db := setupNewUserOnlyDB(t) ensureRenewalInviteSubscribeColumns(t, db) rds, mr := setupNewUserOnlyRedis(t) svcCtx := buildNewUserOnlySvcCtx(db, rds, mr) const ( planID = int64(1) paymentID = int64(2) ownerUserID = int64(41059) memberID = int64(41057) familyID = int64(6638) ownerSubID = int64(24672) ) insertTestSubscribe(t, db, planID, false) insertTestPayment(t, db, paymentID) member := insertTestUser(t, db, memberID, time.Now().Add(-2*time.Hour)) insertTestUser(t, db, ownerUserID, time.Now().Add(-2*time.Hour)) insertTestFamily(t, db, familyID, ownerUserID) insertTestFamilyMember(t, db, familyID, ownerUserID, user.FamilyRoleOwner, user.FamilyMemberActive, "owner_init") insertTestFamilyMember(t, db, familyID, memberID, user.FamilyRoleMember, user.FamilyMemberActive, "bind_email_with_verification") insertScopedTestOrder(t, db, "previous-successful-order", memberID, planID, 5) insertRenewalInviteUserSubscribe(t, db, ownerSubID, ownerUserID, 0, planID, "owner-renewal-token", "owner-renewal-uuid", time.Date(2026, 5, 2, 15, 53, 39, 0, time.UTC), time.Date(2026, 5, 9, 0, 0, 0, 0, time.UTC), ) resp, err := NewRenewalLogic(buildPurchaseCtx(member), svcCtx).Renewal(&types.RenewalOrderRequest{ UserSubscribeID: ownerSubID, Payment: paymentID, Quantity: 1, }) require.NoError(t, err) require.NotNil(t, resp) var created modelOrder.Order require.NoError(t, db.Where("order_no = ?", resp.OrderNo).First(&created).Error) require.Equal(t, uint8(2), created.Type) require.False(t, created.IsNew) }