feat: implement plan upgrade logic with prorated pricing and MercadoPago integration
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
import { MercadoPagoWebhookService } from "../MercadoPagoWebhook.Service";
|
||||
import PlanPaymentsList from "../../../Models/PlanPayments/PlanPayments";
|
||||
|
||||
jest.mock("../../../Models/PlanPayments/PlanPayments", () => ({
|
||||
__esModule: true,
|
||||
default: {
|
||||
createIfMissingByTransactionId: jest.fn(),
|
||||
},
|
||||
}));
|
||||
|
||||
jest.mock("../../../Models/PlanSubscriptions/PlanSubscriptons", () => ({
|
||||
__esModule: true,
|
||||
default: {},
|
||||
}));
|
||||
|
||||
describe("MercadoPagoWebhookService", () => {
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
});
|
||||
|
||||
it("should clear pending upgrade metadata without changing the current plan or dates when payment is rejected", async () => {
|
||||
const startDate = new Date("2026-07-01T00:00:00.000Z");
|
||||
const endDate = new Date("2026-08-01T00:00:00.000Z");
|
||||
const subscription = {
|
||||
_id: "subscription-id",
|
||||
planId: "current-plan-id",
|
||||
startDate,
|
||||
endDate,
|
||||
pendingPaymentInitPoint: "https://checkout.example",
|
||||
pendingPaymentPreferenceId: "preference-id",
|
||||
pendingPaymentBillingMonths: undefined,
|
||||
pendingPaymentType: "upgrade",
|
||||
pendingPaymentPlanId: "requested-plan-id",
|
||||
pendingPaymentCurrentPlanPrice: 1000,
|
||||
pendingPaymentRequestedPlanPrice: 2000,
|
||||
pendingPaymentProratedAmount: 500,
|
||||
pendingPaymentRemainingDays: 15,
|
||||
pendingPaymentPeriodEndDate: endDate,
|
||||
save: jest.fn().mockResolvedValue(undefined),
|
||||
};
|
||||
const service = new MercadoPagoWebhookService() as any;
|
||||
|
||||
await service.applyRejectedPayment(
|
||||
subscription,
|
||||
{
|
||||
id: "payment-id",
|
||||
status: "rejected",
|
||||
transaction_amount: 500,
|
||||
payment_method_id: "visa",
|
||||
},
|
||||
"user-id",
|
||||
"preference-id"
|
||||
);
|
||||
|
||||
expect(subscription.planId).toBe("current-plan-id");
|
||||
expect(subscription.startDate).toBe(startDate);
|
||||
expect(subscription.endDate).toBe(endDate);
|
||||
expect(subscription.pendingPaymentInitPoint).toBe("");
|
||||
expect(subscription.pendingPaymentPreferenceId).toBe("");
|
||||
expect(subscription.pendingPaymentType).toBeUndefined();
|
||||
expect(subscription.pendingPaymentPlanId).toBeUndefined();
|
||||
expect(subscription.pendingPaymentProratedAmount).toBeUndefined();
|
||||
expect(subscription.save).toHaveBeenCalledTimes(1);
|
||||
expect(PlanPaymentsList.createIfMissingByTransactionId).toHaveBeenCalledWith({
|
||||
userId: "user-id",
|
||||
subscriptionId: "subscription-id",
|
||||
amount: 500,
|
||||
paymentDate: expect.any(Date),
|
||||
paymentMethod: "visa",
|
||||
status: "failed",
|
||||
transactionId: "payment-id",
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user