"use strict"; const {strict: assert} = require("assert"); const {set_global, zrequire, mock_esm} = require("../zjsunit/namespace"); const {run_test} = require("../zjsunit/test"); const $ = require("../zjsunit/zjquery"); const event_status = zrequire("billing/event_status"); const helpers = mock_esm("../../static/js/billing/helpers"); run_test("initialize_retry_with_another_card_link_click_handler", ({override}) => { override(helpers, "create_ajax_request", (url, form_name, ignored_inputs, method, callback) => { assert.equal(url, "/json/billing/session/start_retry_payment_intent_session"); assert.equal(form_name, "restartsession"); assert.deepEqual(ignored_inputs, []); assert.equal(method, "POST"); set_global("window", { location: { replace: (new_location) => { assert.equal(new_location, "stripe_session_url"); }, }, }); callback({stripe_session_url: "stripe_session_url"}); }); event_status.initialize_retry_with_another_card_link_click_handler(); const retry_click_handler = $("#retry-with-another-card-link").get_on_handler("click"); retry_click_handler({preventDefault: () => {}}); }); run_test("check_status", async ({override}) => { $("#data").attr("data-stripe-session-id", "stripe_session_id"); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_session_id: "stripe_session_id"}); return { session: { status: "created", }, }; }); let completed = await event_status.check_status(); assert.ok(!completed); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_session_id: "stripe_session_id"}); return { session: { status: "completed", event_handler: { status: "started", }, }, }; }); completed = await event_status.check_status(); assert.ok(!completed); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_session_id: "stripe_session_id"}); return { session: { status: "completed", type: "upgrade_from_billing_page", stripe_payment_intent_id: "spid_1A", event_handler: { status: "succeeded", }, }, }; }); set_global("setTimeout", (callback_func) => { callback_func(); }); set_global("window", { location: { replace: (new_location) => { assert.equal( new_location, "/billing/event_status?stripe_payment_intent_id=spid_1A", ); }, }, }); completed = await event_status.check_status(); assert.ok(completed); assert.equal( $("#webhook-success").text(), "We have received your billing details. Attempting to create charge...", ); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_session_id: "stripe_session_id"}); return { session: { status: "completed", type: "retry_upgrade_with_another_payment_method", stripe_payment_intent_id: "spid_1B", event_handler: { status: "succeeded", }, }, }; }); set_global("window", { location: { replace: (new_location) => { assert.equal( new_location, "/billing/event_status?stripe_payment_intent_id=spid_1B", ); }, }, }); completed = await event_status.check_status(); assert.ok(completed); assert.equal( $("#webhook-success").text(), "We have received your billing details. Attempting to create charge...", ); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_session_id: "stripe_session_id"}); return { session: { status: "completed", type: "free_trial_upgrade_from_billing_page", event_handler: { status: "succeeded", }, }, }; }); set_global("window", { location: { replace: (new_location) => { assert.equal(new_location, "/billing"); }, }, }); completed = await event_status.check_status(); assert.ok(completed); assert.equal( $("#webhook-success").text(), "Your free trial of Zulip Standard has been activated. You would be redirected to the billing page soon.", ); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_session_id: "stripe_session_id"}); return { session: { status: "completed", type: "free_trial_upgrade_from_onboarding_page", event_handler: { status: "succeeded", }, }, }; }); set_global("window", { location: { replace: (new_location) => { assert.equal(new_location, "/billing?onboarding=true"); }, }, }); completed = await event_status.check_status(); assert.ok(completed); assert.equal( $("#webhook-success").text(), "Your free trial of Zulip Standard has been activated. You would be redirected to the billing page soon.", ); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_session_id: "stripe_session_id"}); return { session: { status: "completed", type: "card_update_from_billing_page", event_handler: { status: "succeeded", }, }, }; }); set_global("window", { location: { replace: (new_location) => { assert.equal(new_location, "/billing#payment-method"); }, }, }); completed = await event_status.check_status(); assert.ok(completed); assert.equal( $("#webhook-success").text(), "Your card has been updated. You would be redirected to the billing page soon.", ); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_session_id: "stripe_session_id"}); return { session: { status: "completed", type: "card_update_from_billing_page", event_handler: { status: "failed", error: { message: "Something went wrong.", }, }, }, }; }); completed = await event_status.check_status(); assert.ok(completed); assert.equal($("#webhook-error").text(), "Something went wrong."); $("#data").attr("data-stripe-session-id", ""); $("#data").attr("data-stripe-payment-intent-id", "stripe_payment_intent_id"); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_payment_intent_id: "stripe_payment_intent_id"}); return { payment_intent: { status: "requires_payment_method", last_payment_error: { message: "Your Card was declined.", }, event_handler: { status: "succeeded", }, }, }; }); completed = await event_status.check_status(); assert.ok(completed); assert.equal( $("#webhook-error").html(), 'Your Card was declined.
You can try adding another card or or retry the upgrade.', ); assert.ok($("#retry-with-another-card-link").get_on_handler("click")); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_payment_intent_id: "stripe_payment_intent_id"}); return { payment_intent: { status: "requires_payment_method", last_payment_error: { message: "Your Card was declined.", }, event_handler: { status: "failed", error: { message: "Something went wrong.", }, }, }, }; }); completed = await event_status.check_status(); assert.ok(completed); assert.equal($("#webhook-error").text(), "Something went wrong."); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_payment_intent_id: "stripe_payment_intent_id"}); return { payment_intent: { status: "requires_payment_method", event_handler: { status: "started", }, }, }; }); completed = await event_status.check_status(); assert.ok(!completed); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_payment_intent_id: "stripe_payment_intent_id"}); return { payment_intent: { status: "succeeded", event_handler: { status: "succeeded", }, }, }; }); set_global("window", { location: { replace: (new_location) => { assert.equal(new_location, "/billing/"); }, }, }); completed = await event_status.check_status(); assert.ok(completed); assert.equal( $("#webhook-success").text(), "Charge created successfully. Your organization has been upgraded. Redirecting to billing page...", ); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_payment_intent_id: "stripe_payment_intent_id"}); return { payment_intent: { status: "succeeded", event_handler: { status: "failed", error: { message: "Something went wrong.", }, }, }, }; }); completed = await event_status.check_status(); assert.ok(completed); assert.equal($("#webhook-error").text(), "Something went wrong."); override($, "get", async (url, data) => { assert.equal(url, "/json/billing/event/status"); assert.deepEqual(data, {stripe_payment_intent_id: "stripe_payment_intent_id"}); return { payment_intent: { status: "requires_action", }, }; }); completed = await event_status.check_status(); assert.ok(!completed); });