­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ describe("Custom Place Order Button API",()=>{let e,t,o;beforeEach(()=>{delete global.window.wc,t={length:1,first:jest.fn(()=>t),find:jest.fn(()=>({length:1,val:jest.fn(()=>"test-gateway"),after:jest.fn()})),addClass:jest.fn(()=>t),removeClass:jest.fn(()=>t)},o={length:1,after:jest.fn()},(e=jest.fn(e=>"form.checkout"===e?{length:1,first:jest.fn(()=>t)}:"#order_review"===e?{length:0}:"#add_payment_method"===e?{length:0}:"string"==typeof e&&e.includes("div")?{length:1,get:jest.fn(()=>document.createElement("div")),empty:jest.fn(),remove:jest.fn(),append:jest.fn()}:{length:0})).contains=jest.fn(()=>!1),global.window.jQuery=e,global.window.$=e,global.window.wc_checkout_params={gateways_with_custom_place_order_button:["test-gateway"]},e.fn={};const n={trigger:jest.fn()};e.mockImplementation(e=>e===document.body?n:"form.checkout"===e?{length:1,first:jest.fn(()=>t)}:{length:0}),jest.resetModules(),require("../utils/custom-place-order-button")}),afterEach(()=>{jest.clearAllMocks()}),describe("Base tests",()=>{test("should expose the API",()=>{expect(window.wc).toBeDefined(),expect(window.wc.customPlaceOrderButton).toBeDefined(),expect(typeof window.wc.customPlaceOrderButton.register).toBe("function"),expect(typeof window.wc.customPlaceOrderButton.__maybeShow).toBe("function"),expect(typeof window.wc.customPlaceOrderButton.__maybeHideDefaultButtonOnInit).toBe("function"),expect(typeof window.wc.customPlaceOrderButton.__cleanup).toBe("function"),expect(typeof window.wc.customPlaceOrderButton.__getForm).toBe("function")}),test("should reject registration without proper configuration",()=>{const e=jest.spyOn(console,"error").mockImplementation(()=>{});window.wc.customPlaceOrderButton.register("test-gateway",{cleanup:jest.fn()}),expect(e).toHaveBeenLastCalledWith("wc.customPlaceOrderButton.register: render must be a function"),window.wc.customPlaceOrderButton.register("test-gateway",{render:jest.fn()}),expect(e).toHaveBeenLastCalledWith("wc.customPlaceOrderButton.register: cleanup must be a function"),window.wc.customPlaceOrderButton.register(null,{render:jest.fn(),cleanup:jest.fn()}),expect(e).toHaveBeenLastCalledWith("wc.customPlaceOrderButton.register: gatewayId must be a non-empty string"),window.wc.customPlaceOrderButton.register("",{render:jest.fn(),cleanup:jest.fn()}),expect(e).toHaveBeenLastCalledWith("wc.customPlaceOrderButton.register: gatewayId must be a non-empty string"),window.wc.customPlaceOrderButton.register("test-gateway",null),expect(e).toHaveBeenLastCalledWith("wc.customPlaceOrderButton.register: config must be an object"),window.wc.customPlaceOrderButton.register("test-gateway",undefined),expect(e).toHaveBeenLastCalledWith("wc.customPlaceOrderButton.register: config must be an object"),window.wc.customPlaceOrderButton.register("test-gateway","not-an-object"),expect(e).toHaveBeenLastCalledWith("wc.customPlaceOrderButton.register: config must be an object"),e.mockRestore()}),test("should inject critical CSS on load",()=>{const e=document.getElementById("wc-custom-place-order-button-styles");expect(e).toBeTruthy(),expect(e.textContent).toContain(".has-custom-place-order-button #place_order"),expect(e.textContent).toContain("display: none")}),test("should not inject duplicate styles",()=>{jest.resetModules(),require("../utils/custom-place-order-button");const e=document.querySelectorAll("#wc-custom-place-order-button-styles");expect(e.length).toBe(1)})}),describe("getGatewaysWithCustomButton",()=>{test("should hide default button for gateway in wc_checkout_params list",()=>{window.wc.customPlaceOrderButton.__maybeHideDefaultButtonOnInit("test-gateway"),expect(t.addClass).toHaveBeenCalledWith("has-custom-place-order-button")}),test("should not hide default button for gateway not in list",()=>{window.wc.customPlaceOrderButton.__maybeHideDefaultButtonOnInit("unknown-gateway"),expect(t.addClass).not.toHaveBeenCalled()}),test("should not hide default button when wc_checkout_params is undefined",()=>{delete global.window.wc_checkout_params,delete global.window.wc_add_payment_method_params,jest.resetModules(),require("../utils/custom-place-order-button"),window.wc.customPlaceOrderButton.__maybeHideDefaultButtonOnInit("test-gateway"),expect(t.addClass).not.toHaveBeenCalled()}),test("should use wc_add_payment_method_params as fallback",()=>{delete global.window.wc_checkout_params,global.window.wc_add_payment_method_params={gateways_with_custom_place_order_button:["add-method-gateway"]},jest.resetModules(),require("../utils/custom-place-order-button"),window.wc.customPlaceOrderButton.__maybeHideDefaultButtonOnInit("add-method-gateway"),expect(t.addClass).toHaveBeenCalledWith("has-custom-place-order-button")}),test("should prefer wc_checkout_params over wc_add_payment_method_params",()=>{global.window.wc_checkout_params={gateways_with_custom_place_order_button:["checkout-gateway"]},global.window.wc_add_payment_method_params={gateways_with_custom_place_order_button:["add-method-gateway"]},jest.resetModules(),require("../utils/custom-place-order-button"),window.wc.customPlaceOrderButton.__maybeHideDefaultButtonOnInit("checkout-gateway"),expect(t.addClass).toHaveBeenCalledWith("has-custom-place-order-button"),t.addClass.mockClear(),window.wc.customPlaceOrderButton.__maybeHideDefaultButtonOnInit("add-method-gateway"),expect(t.addClass).not.toHaveBeenCalled()})}),describe("Gateway switching behavior",()=>{let e,t,o,n;beforeEach(()=>{delete global.window.wc,t="gateway-a",n={validate:jest.fn(),submit:jest.fn()},e={length:1,first:jest.fn(function(){return this}),find:jest.fn(e=>'input[name="payment_method"]:checked'===e?{length:1,val:jest.fn(()=>t)}:"#place_order"===e?{length:1,after:jest.fn()}:{length:0}),addClass:jest.fn(function(){return this}),removeClass:jest.fn(function(){return this})},o={length:1,get:jest.fn(()=>document.createElement("div")),empty:jest.fn(),remove:jest.fn(),append:jest.fn()};const a={trigger:jest.fn()};global.window.jQuery=jest.fn(t=>t===document.body?a:"form.checkout"===t?{length:1,first:jest.fn(()=>e)}:"#order_review"===t?{length:0}:"#add_payment_method"===t?{length:0}:"string"==typeof t&&t.includes("div")?o:{length:0}),global.window.jQuery.fn={},global.window.jQuery.contains=jest.fn(()=>!0),global.window.$=global.window.jQuery,global.window.wc_checkout_params={gateways_with_custom_place_order_button:["gateway-a","gateway-b"]},jest.resetModules(),require("../utils/custom-place-order-button")}),afterEach(()=>{jest.clearAllMocks()}),test("should call cleanup when switching between two gateways with custom buttons",()=>{const o=jest.fn(),a=jest.fn(),s=jest.fn(),c=jest.fn();window.wc.customPlaceOrderButton.register("gateway-a",{render:o,cleanup:a}),window.wc.customPlaceOrderButton.register("gateway-b",{render:s,cleanup:c}),t="gateway-a",window.wc.customPlaceOrderButton.__maybeShow(t,n),expect(o).toHaveBeenCalledTimes(1),expect(a).not.toHaveBeenCalled(),expect(e.addClass).toHaveBeenCalledWith("has-custom-place-order-button"),t="gateway-b",window.wc.customPlaceOrderButton.__maybeShow(t,n),expect(a).toHaveBeenCalledTimes(1),expect(s).toHaveBeenCalledTimes(1),expect(c).not.toHaveBeenCalled()}),test("should call cleanup when switching from custom button gateway to regular gateway",()=>{const o=jest.fn(),a=jest.fn();window.wc.customPlaceOrderButton.register("gateway-a",{render:o,cleanup:a}),t="gateway-a",window.wc.customPlaceOrderButton.__maybeShow(t,n),expect(o).toHaveBeenCalledTimes(1),expect(e.addClass).toHaveBeenCalledWith("has-custom-place-order-button"),e.addClass.mockClear(),e.removeClass.mockClear(),t="no-custom-button-gateway",window.wc.customPlaceOrderButton.__maybeShow(t,n),expect(a).toHaveBeenCalledTimes(1),expect(e.removeClass).toHaveBeenCalledWith("has-custom-place-order-button")}),test("should show custom button when switching from regular gateway to custom button gateway",()=>{const o=jest.fn(),a=jest.fn();window.wc.customPlaceOrderButton.register("gateway-a",{render:o,cleanup:a}),t="no-custom-button-gateway",window.wc.customPlaceOrderButton.__maybeShow(t,n),expect(o).not.toHaveBeenCalled(),expect(e.addClass).not.toHaveBeenCalledWith("has-custom-place-order-button"),t="gateway-a",window.wc.customPlaceOrderButton.__maybeShow(t,n),expect(o).toHaveBeenCalledTimes(1),expect(e.addClass).toHaveBeenCalledWith("has-custom-place-order-button")})})}),describe("getForm helper",()=>{beforeEach(()=>{delete global.window.wc,global.window.jQuery=jest.fn(()=>({length:0})),global.window.wc_checkout_params={gateways_with_custom_place_order_button:[]},jest.resetModules(),require("../utils/custom-place-order-button")}),test("should return form.checkout if present",()=>{const e={length:1,first:jest.fn(()=>e)};global.window.jQuery=jest.fn(t=>"form.checkout"===t?e:{length:0}),jest.resetModules(),require("../utils/custom-place-order-button");const t=window.wc.customPlaceOrderButton.__getForm();expect(t).toBe(e)}),test("should return #order_review if form.checkout not present",()=>{const e={length:1,first:jest.fn(()=>e)};global.window.jQuery=jest.fn(t=>"form.checkout"===t?{length:0}:"#order_review"===t?e:{length:0}),jest.resetModules(),require("../utils/custom-place-order-button");const t=window.wc.customPlaceOrderButton.__getForm();expect(t).toBe(e)}),test("should return #add_payment_method as last resort",()=>{const e={length:1,first:jest.fn(()=>e)};global.window.jQuery=jest.fn(t=>"form.checkout"===t?{length:0}:"#order_review"===t?{length:0}:"#add_payment_method"===t?e:{length:0}),jest.resetModules(),require("../utils/custom-place-order-button");const t=window.wc.customPlaceOrderButton.__getForm();expect(t).toBe(e)}),test("should return empty jQuery object if no form found",()=>{const e={length:0};global.window.jQuery=jest.fn(t=>"form.checkout"===t?{length:0}:"#order_review"===t?{length:0}:"#add_payment_method"===t?{length:0}:Array.isArray(t)&&0===t.length?e:{length:0}),jest.resetModules(),require("../utils/custom-place-order-button");const t=window.wc.customPlaceOrderButton.__getForm();expect(t.length).toBe(0)})});