diff --git a/src/layouts/payment-adyen/payment-adyen.spec.js b/src/layouts/payment-adyen/payment-adyen.spec.js index 26d3a6aec..e45c27fa5 100644 --- a/src/layouts/payment-adyen/payment-adyen.spec.js +++ b/src/layouts/payment-adyen/payment-adyen.spec.js @@ -187,6 +187,121 @@ describe("payment-adyen.vue", () => { expect(result).toBe(true); }); }); + + describe("splitStreetAddress", () => { + const setInShopStreet = (streetAddress) => { + store.getters.order.serviceLocation.appointmentType = + AppointmentTypeStrings.IN_SHOP; + store.getters.order.serviceLocation.provider.address.streetAddress = + streetAddress; + }; + + test("splits typical address into first token as number and remainder as street", () => { + setInShopStreet("123 West Elm St"); + const wrapper = setupMocks({}); + + expect(wrapper.vm.splitStreetAddress).toEqual({ + number: "123", + street: "West Elm St", + }); + }); + + test("two tokens: number and single-word street", () => { + setInShopStreet("456 Oak"); + const wrapper = setupMocks({}); + + expect(wrapper.vm.splitStreetAddress).toEqual({ + number: "456", + street: "Oak", + }); + }); + + test("single token with no spaces: full string in number, empty street", () => { + setInShopStreet("123OakStreet"); + const wrapper = setupMocks({}); + + expect(wrapper.vm.splitStreetAddress).toEqual({ + number: "123OakStreet", + street: "", + }); + }); + + test("collapses multiple spaces between words", () => { + setInShopStreet("123 West Elm St"); + const wrapper = setupMocks({}); + + expect(wrapper.vm.splitStreetAddress).toEqual({ + number: "123", + street: "West Elm St", + }); + }); + + test("trims leading and trailing whitespace on full address", () => { + setInShopStreet(" 99 Maple Ave "); + const wrapper = setupMocks({}); + + expect(wrapper.vm.splitStreetAddress).toEqual({ + number: "99", + street: "Maple Ave", + }); + }); + + test("empty string yields empty number and street", () => { + setInShopStreet(""); + const wrapper = setupMocks({}); + + expect(wrapper.vm.splitStreetAddress).toEqual({ + number: "", + street: "", + }); + }); + + test("whitespace-only address yields empty number and street", () => { + setInShopStreet(" \t "); + const wrapper = setupMocks({}); + + expect(wrapper.vm.splitStreetAddress).toEqual({ + number: "", + street: "", + }); + }); + + test("null address yields empty number and street", () => { + setInShopStreet(null); + const wrapper = setupMocks({}); + + expect(wrapper.vm.splitStreetAddress).toEqual({ + number: "", + street: "", + }); + }); + + test("uses mobile service address when appointment is mobile", () => { + store.getters.order.serviceLocation.appointmentType = + AppointmentTypeStrings.MOBILE; + store.getters.order.serviceLocation.address = "700 Broadway Blvd"; + store.getters.order.serviceLocation.city = "Columbus"; + store.getters.order.serviceLocation.state = "OH"; + store.getters.order.serviceLocation.zipCode = "43235"; + + const wrapper = setupMocks({}); + + expect(wrapper.vm.splitStreetAddress).toEqual({ + number: "700", + street: "Broadway Blvd", + }); + }); + + test("splits on tabs and other whitespace runs", () => { + setInShopStreet("10\tPine\tLane"); + const wrapper = setupMocks({}); + + expect(wrapper.vm.splitStreetAddress).toEqual({ + number: "10", + street: "Pine Lane", + }); + }); + }); }); function setupMocks({ customMountOptions } = {}) { diff --git a/src/layouts/payment-adyen/payment-adyen.vue b/src/layouts/payment-adyen/payment-adyen.vue index bcb827623..aa75487da 100644 --- a/src/layouts/payment-adyen/payment-adyen.vue +++ b/src/layouts/payment-adyen/payment-adyen.vue @@ -516,15 +516,14 @@ export default { }, splitStreetAddress() { - const address = this.locationInfo.address; - const tokens = address.split(" ") ?? [""]; - const number = tokens[0]; - - const street = tokens.slice(1).reduce((prev, next) => `${prev} ${next}`); + const address = (this.locationInfo?.address ?? "").trim(); + const tokens = address.length ? address.split(/\s+/) : [""]; + const number = tokens[0] ?? ""; + const street = tokens.length > 1 ? tokens.slice(1).join(" ") : ""; return { - number: number ?? "", - street: street ?? "", + number, + street, }; },