diff --git a/ts/features/messages/components/MessageDetail/MessageDetailsAttachmentItem.tsx b/ts/features/messages/components/MessageDetail/MessageDetailsAttachmentItem.tsx index 0d16ddd59f0..7bc16162b20 100644 --- a/ts/features/messages/components/MessageDetail/MessageDetailsAttachmentItem.tsx +++ b/ts/features/messages/components/MessageDetail/MessageDetailsAttachmentItem.tsx @@ -3,12 +3,17 @@ import I18n from "i18next"; import { ServiceId } from "../../../../../definitions/backend/ServiceId"; import { ThirdPartyAttachment } from "../../../../../definitions/backend/ThirdPartyAttachment"; import { useAttachmentDownload } from "../../hooks/useAttachmentDownload"; +import { + SendOpeningSource, + SendUserType +} from "../../../pushNotifications/analytics"; export type MessageDetailsAttachmentItemProps = { attachment: ThirdPartyAttachment; bottomSpacer?: boolean; disabled?: boolean; - isPN?: boolean; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; messageId: string; onPreNavigate?: () => void; serviceId: ServiceId; @@ -18,7 +23,8 @@ export const MessageDetailsAttachmentItem = ({ attachment, bottomSpacer, disabled = false, - isPN = false, + sendOpeningSource, + sendUserType, messageId, onPreNavigate = undefined, serviceId @@ -27,7 +33,8 @@ export const MessageDetailsAttachmentItem = ({ useAttachmentDownload( messageId, attachment, - isPN, + sendOpeningSource, + sendUserType, serviceId, onPreNavigate ); diff --git a/ts/features/messages/components/MessageDetail/MessageDetailsAttachments.tsx b/ts/features/messages/components/MessageDetail/MessageDetailsAttachments.tsx index f419ea290e0..58efa173e65 100644 --- a/ts/features/messages/components/MessageDetail/MessageDetailsAttachments.tsx +++ b/ts/features/messages/components/MessageDetail/MessageDetailsAttachments.tsx @@ -5,27 +5,34 @@ import { ServiceId } from "../../../../../definitions/backend/ServiceId"; import { useIOSelector } from "../../../../store/hooks"; import { thirdPartyMessageAttachments } from "../../store/reducers/thirdPartyById"; import { ATTACHMENT_CATEGORY } from "../../types/attachmentCategory"; +import { + SendOpeningSource, + SendUserType +} from "../../../pushNotifications/analytics"; import { MessageDetailsAttachmentItem } from "./MessageDetailsAttachmentItem"; export type MessageDetailsAttachmentsProps = { banner?: ReactNode; disabled?: boolean; - isPN?: boolean; messageId: string; serviceId: ServiceId; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; }; export const MessageDetailsAttachments = ({ banner, disabled = false, - isPN = false, messageId, - serviceId + serviceId, + sendOpeningSource, + sendUserType }: MessageDetailsAttachmentsProps) => { const originalAttachments = useIOSelector(state => thirdPartyMessageAttachments(state, messageId) ); - const attachments = isPN + const isSend = sendOpeningSource !== "not_set"; + const attachments = isSend ? originalAttachments.filter( attachment => attachment.category !== ATTACHMENT_CATEGORY.F24 ) @@ -47,7 +54,8 @@ export const MessageDetailsAttachments = ({ ); diff --git a/ts/features/messages/components/MessageDetail/MessagePaymentItem.tsx b/ts/features/messages/components/MessageDetail/MessagePaymentItem.tsx index 2a3a5dfa920..693ca74a290 100644 --- a/ts/features/messages/components/MessageDetail/MessagePaymentItem.tsx +++ b/ts/features/messages/components/MessageDetail/MessagePaymentItem.tsx @@ -41,6 +41,10 @@ import { formatPaymentNoticeNumber } from "../../../payments/common/utils"; import { ServiceId } from "../../../../../definitions/backend/ServiceId"; import { trackPNPaymentStart } from "../../../pn/analytics"; import { formatAndValidateDueDate } from "../../../payments/checkout/utils"; +import { + SendOpeningSource, + SendUserType +} from "../../../pushNotifications/analytics"; import { computeAndTrackPaymentStart, shouldUpdatePaymentUponReturning @@ -55,6 +59,8 @@ type MessagePaymentItemProps = { noticeNumber: string; paymentAmount?: PaymentAmount; rptId: string; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; serviceId: ServiceId; willNavigateToPayment?: () => void; }; @@ -175,6 +181,8 @@ export const MessagePaymentItem = ({ noSpaceOnTop = false, noticeNumber, rptId, + sendOpeningSource, + sendUserType, serviceId, willNavigateToPayment = undefined }: MessagePaymentItemProps) => { @@ -205,7 +213,7 @@ export const MessagePaymentItem = ({ dispatch, () => { if (isPNPayment) { - trackPNPaymentStart(); + trackPNPaymentStart(sendOpeningSource, sendUserType); } else { computeAndTrackPaymentStart(serviceId, store.getState()); } @@ -219,6 +227,8 @@ export const MessagePaymentItem = ({ isPNPayment, paymentStatusForUI, rptId, + sendOpeningSource, + sendUserType, serviceId, store, toast, diff --git a/ts/features/messages/components/MessageDetail/__mocks__/MessageDetailsAttachmentItem.tsx b/ts/features/messages/components/MessageDetail/__mocks__/MessageDetailsAttachmentItem.tsx index ced2f5c54a2..7e7dbd48de4 100644 --- a/ts/features/messages/components/MessageDetail/__mocks__/MessageDetailsAttachmentItem.tsx +++ b/ts/features/messages/components/MessageDetail/__mocks__/MessageDetailsAttachmentItem.tsx @@ -5,7 +5,8 @@ export const MessageDetailsAttachmentItem = ({ attachment, bottomSpacer, disabled, - isPN, + sendOpeningSource, + sendUserType, messageId, onPreNavigate, serviceId @@ -21,7 +22,8 @@ export const MessageDetailsAttachmentItem = ({ {`Has${bottomSpacer ? "" : " no"} bottom spacer`} {`Is ${disabled ? "" : "not "}disabled`} - {`Is ${isPN ? "" : "not "}SEND`} + {`Send Opening Source ${sendOpeningSource}`} + {`Send User Type ${sendUserType}`} {`Message Id: ${messageId}`} {`Service Id: ${serviceId}`} diff --git a/ts/features/messages/components/MessageDetail/__mocks__/MessageDetailsAttachments.tsx b/ts/features/messages/components/MessageDetail/__mocks__/MessageDetailsAttachments.tsx index 2409e171897..2f192ec1c1c 100644 --- a/ts/features/messages/components/MessageDetail/__mocks__/MessageDetailsAttachments.tsx +++ b/ts/features/messages/components/MessageDetail/__mocks__/MessageDetailsAttachments.tsx @@ -4,15 +4,17 @@ import { MessageDetailsAttachmentsProps } from "../MessageDetailsAttachments"; export const MessageDetailsAttachments = ({ banner, disabled, - isPN, messageId, - serviceId + serviceId, + sendOpeningSource, + sendUserType }: MessageDetailsAttachmentsProps) => ( <> Mock MessageDetailsAttachments {`${banner ? "Has" : "Does not have"} Banner`} {`Is ${disabled ? "" : "not "}disabled`} - {`Is ${isPN ? "" : "not "}SEND`} + {`Send Opening Source ${sendOpeningSource}`} + {`Send User Type ${sendUserType}`} {`Message Id: ${messageId}`} {`Service Id: ${serviceId}`} diff --git a/ts/features/messages/components/MessageDetail/__tests__/MessageDetailsAttachmentItem.test.tsx b/ts/features/messages/components/MessageDetail/__tests__/MessageDetailsAttachmentItem.test.tsx index 446e5e60eb4..f5672c06533 100644 --- a/ts/features/messages/components/MessageDetail/__tests__/MessageDetailsAttachmentItem.test.tsx +++ b/ts/features/messages/components/MessageDetail/__tests__/MessageDetailsAttachmentItem.test.tsx @@ -6,85 +6,79 @@ import { renderScreenWithNavigationStoreContext } from "../../../../../utils/tes import { MessageDetailsAttachmentItem } from "../MessageDetailsAttachmentItem"; import { ThirdPartyAttachment } from "../../../../../../definitions/backend/ThirdPartyAttachment"; import { ServiceId } from "../../../../../../definitions/backend/ServiceId"; +import { MESSAGES_ROUTES } from "../../../navigation/routes"; +import { + SendOpeningSource, + SendUserType +} from "../../../../pushNotifications/analytics"; -describe("MessageDetailsAttachmentItem", () => { - it("Should match snapshot with required parameters", () => { - const messageId = "01HNWXJG52YS359GWSYSRK2BWC"; - const serviceId = "01HNWXKWAGWPHV7VGMQ21EZPSA" as ServiceId; - const thirdPartyAttachment = { - id: "1", - url: "https://invalid.url", - content_type: "application/pdf", - name: "A PDF File", - category: "DOCUMENT" - } as ThirdPartyAttachment; +const messageId = "01HNWXJG52YS359GWSYSRK2BWC"; +const serviceId = "01HNWXKWAGWPHV7VGMQ21EZPSA" as ServiceId; +const thirdPartyAttachments: ReadonlyArray = [ + { + id: "1", + url: "https://invalid.url", + content_type: "application/pdf", + category: "DOCUMENT" + } as ThirdPartyAttachment, + { + id: "1", + url: "https://invalid.url", + content_type: "application/pdf", + name: "A PDF File", + category: "DOCUMENT" + } as ThirdPartyAttachment +]; - const component = renderScreen(thirdPartyAttachment, messageId, serviceId); - expect(component.toJSON()).toMatchSnapshot(); - }); - it("Should match snapshot with all parameters", () => { - const messageId = "01HNWXJG52YS359GWSYSRK2BWC"; - const thirdPartyAttachment = { - id: "1", - url: "https://invalid.url", - content_type: "application/pdf", - name: "A PDF File", - category: "DOCUMENT" - } as ThirdPartyAttachment; - const serviceId = "01HNWXKWAGWPHV7VGMQ21EZPSA" as ServiceId; - - const component = renderScreen( - thirdPartyAttachment, - messageId, - serviceId, - true, - false, - true - ); - expect(component.toJSON()).toMatchSnapshot(); - }); - it("Should match snapshot when the attachment has no name", () => { - const messageId = "01HNWXJG52YS359GWSYSRK2BWC"; - const serviceId = "01HNWXKWAGWPHV7VGMQ21EZPSA" as ServiceId; - const thirdPartyAttachment = { - id: "1", - url: "https://invalid.url", - content_type: "application/pdf", - category: "DOCUMENT" - } as ThirdPartyAttachment; - - const component = renderScreen(thirdPartyAttachment, messageId, serviceId); - expect(component.toJSON()).toMatchSnapshot(); - }); - it("Should match snapshot when is fetching the attachment", () => { - const messageId = "01HNWXJG52YS359GWSYSRK2BWC"; - const serviceId = "01HNWXKWAGWPHV7VGMQ21EZPSA" as ServiceId; - const thirdPartyAttachment = { - id: "1", - url: "https://invalid.url", - content_type: "application/pdf", - category: "DOCUMENT" - } as ThirdPartyAttachment; +const sendOpeningSources: ReadonlyArray = [ + "aar", + "message", + "not_set" +]; +const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" +]; - const component = renderScreen( - thirdPartyAttachment, - messageId, - serviceId, - undefined, - true, - false - ); - expect(component.toJSON()).toMatchSnapshot(); +thirdPartyAttachments.forEach(thirdPartyAttachment => { + // eslint-disable-next-line sonarjs/cognitive-complexity + [false, true].forEach(isFetching => { + [undefined, false, true].forEach(showBottomSpacer => { + [undefined, false, true].forEach(isDisabled => { + sendOpeningSources.forEach(sendOpeningSource => { + sendUserTypes.forEach(sendUserType => { + it(`should match snapshot (attachment ${ + thirdPartyAttachment.name ? "with" : "without" + } name, ${isFetching ? "" : "not "}fetching, ${ + showBottomSpacer ? "with" : "without" + } bottom spacer, ${ + isDisabled ? "disabled" : "enabled" + }, opening source ${sendOpeningSource}, user type ${sendUserType})`, () => { + const component = renderScreen( + thirdPartyAttachment, + isFetching, + showBottomSpacer, + isDisabled, + sendOpeningSource, + sendUserType + ); + expect(component.toJSON()).toMatchSnapshot(); + }); + }); + }); + }); + }); }); }); const renderScreen = ( attachment: ThirdPartyAttachment, - messageId: string, - serviceId: ServiceId, - bottomSpacer?: boolean, - isFetching?: boolean, - disabled?: boolean + isFetching: boolean, + bottomSpacer: boolean | undefined, + disabled: boolean | undefined, + sendOpeningSource: SendOpeningSource, + sendUserType: SendUserType ) => { const initialState = appReducer(undefined, applicationChangeState("active")); const finalState = appReducer( @@ -112,9 +106,11 @@ const renderScreen = ( disabled={disabled} messageId={messageId} serviceId={serviceId} + sendOpeningSource={sendOpeningSource} + sendUserType={sendUserType} /> ), - "DUMMY", + MESSAGES_ROUTES.MESSAGE_DETAIL, {}, store ); diff --git a/ts/features/messages/components/MessageDetail/__tests__/MessageDetailsAttachments.test.tsx b/ts/features/messages/components/MessageDetail/__tests__/MessageDetailsAttachments.test.tsx index 9926d0289f4..bc9b73bfe32 100644 --- a/ts/features/messages/components/MessageDetail/__tests__/MessageDetailsAttachments.test.tsx +++ b/ts/features/messages/components/MessageDetail/__tests__/MessageDetailsAttachments.test.tsx @@ -10,6 +10,10 @@ import { renderScreenWithNavigationStoreContext } from "../../../../../utils/tes import { MessageDetailsAttachments } from "../MessageDetailsAttachments"; import { MESSAGES_ROUTES } from "../../../navigation/routes"; import * as thirdPartySelectors from "../../../store/reducers/thirdPartyById"; +import { + SendOpeningSource, + SendUserType +} from "../../../../pushNotifications/analytics"; jest.mock("../MessageDetailsAttachmentItem"); @@ -58,28 +62,42 @@ describe("MessageDetailsAttachments", () => { ] ]; + const sendOpeningSources: ReadonlyArray = [ + "aar", + "message", + "not_set" + ]; + const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" + ]; + const reactComponent = {"A banner"}; attachments.forEach(attachmentArray => [undefined, reactComponent].forEach(banner => [undefined, false, true].forEach(disabled => - [undefined, false, true].forEach(isSend => - it(`should match snapshot (${ - attachmentArray.length - } attachments) (has ${ - banner ? "" : "no " - }banner) (disabled: ${disabled}) (isSend: ${isSend})`, () => { - jest - .spyOn(thirdPartySelectors, "thirdPartyMessageAttachments") - .mockImplementation((_state, _messageId) => attachmentArray); - const component = renderScreen( - messageId, - serviceId, - disabled, - isSend, - banner - ); - expect(component.toJSON()).toMatchSnapshot(); - }) + sendOpeningSources.forEach(sendOpeningSource => + sendUserTypes.forEach(sendUserType => + it(`should match snapshot (${ + attachmentArray.length + } attachments) (has ${ + banner ? "" : "no " + }banner) (disabled: ${disabled}) (opening source: ${sendOpeningSource} user type: ${sendUserType})`, () => { + jest + .spyOn(thirdPartySelectors, "thirdPartyMessageAttachments") + .mockImplementation((_state, _messageId) => attachmentArray); + const component = renderScreen( + messageId, + serviceId, + disabled, + sendOpeningSource, + sendUserType, + banner + ); + expect(component.toJSON()).toMatchSnapshot(); + }) + ) ) ) ) @@ -90,7 +108,8 @@ const renderScreen = ( messageId: string, serviceId: ServiceId, disabled: boolean | undefined, - isPN: boolean | undefined, + sendOpeningSource: SendOpeningSource, + sendUserType: SendUserType, banner: ReactNode | undefined ) => { const initialState = appReducer(undefined, applicationChangeState("active")); @@ -104,7 +123,8 @@ const renderScreen = ( banner={banner} messageId={messageId} disabled={disabled} - isPN={isPN} + sendOpeningSource={sendOpeningSource} + sendUserType={sendUserType} serviceId={serviceId} /> ), diff --git a/ts/features/messages/components/MessageDetail/__tests__/MessagePaymentItem.test.tsx b/ts/features/messages/components/MessageDetail/__tests__/MessagePaymentItem.test.tsx index 30d2c17bf71..69a01def7c4 100644 --- a/ts/features/messages/components/MessageDetail/__tests__/MessagePaymentItem.test.tsx +++ b/ts/features/messages/components/MessageDetail/__tests__/MessagePaymentItem.test.tsx @@ -146,6 +146,8 @@ const renderComponent = ( rptId={rptId} noticeNumber={payment.noticeCode} serviceId={"01J5X34VA7H1726CQNTG14GNDH" as ServiceId} + sendOpeningSource={"not_set"} + sendUserType={"not_set"} /> ), "DUMMY", diff --git a/ts/features/messages/components/MessageDetail/__tests__/__snapshots__/MessageDetailsAttachmentItem.test.tsx.snap b/ts/features/messages/components/MessageDetail/__tests__/__snapshots__/MessageDetailsAttachmentItem.test.tsx.snap index 593abfe1368..4b0884fc1a2 100644 --- a/ts/features/messages/components/MessageDetail/__tests__/__snapshots__/MessageDetailsAttachmentItem.test.tsx.snap +++ b/ts/features/messages/components/MessageDetail/__tests__/__snapshots__/MessageDetailsAttachmentItem.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`MessageDetailsAttachmentItem Should match snapshot when is fetching the attachment 1`] = ` +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, disabled, opening source aar, user type mandatory) 1`] = ` - DUMMY + MESSAGE_DETAIL - 1 + A PDF File + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, disabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, disabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, disabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, disabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, disabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, disabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, disabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, disabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, with bottom spacer, enabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, disabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source aar, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source message, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, disabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, disabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, disabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, disabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, disabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, disabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, disabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, disabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, disabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, with bottom spacer, enabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, disabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source aar, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source message, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment with name, not fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + A PDF File + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, disabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, disabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, disabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, disabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, disabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, disabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, disabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, disabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, disabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, with bottom spacer, enabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, disabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source aar, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source message, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, disabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, disabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, disabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, disabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, disabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, disabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, disabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, disabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, disabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, with bottom spacer, enabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, disabled, opening source not_set, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source aar, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type recipient) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type recipient) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source message, user type recipient) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type mandatory) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 2`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 3`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type not_set) 4`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + @@ -672,7 +201957,7 @@ exports[`MessageDetailsAttachmentItem Should match snapshot when is fetching the `; -exports[`MessageDetailsAttachmentItem Should match snapshot when the attachment has no name 1`] = ` +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 2`] = ` - DUMMY + MESSAGE_DETAIL `; -exports[`MessageDetailsAttachmentItem Should match snapshot with all parameters 1`] = ` +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 3`] = ` - DUMMY + MESSAGE_DETAIL - - A PDF File - + 1 + + - PDF - + + PDF + + - - - - - - + > + + + + - @@ -1827,7 +203147,7 @@ exports[`MessageDetailsAttachmentItem Should match snapshot with all parameters `; -exports[`MessageDetailsAttachmentItem Should match snapshot with required parameters 1`] = ` +exports[`should match snapshot (attachment without name, not fetching, without bottom spacer, enabled, opening source not_set, user type recipient) 4`] = ` - DUMMY + MESSAGE_DETAIL - A PDF File + 1 `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: false) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: false) (opening source: aar user type: not_set) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: false) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: false) (opening source: aar user type: recipient) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: false) (opening source: message user type: mandatory) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: false) (opening source: message user type: not_set) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: false) (opening source: message user type: recipient) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: false) (opening source: not_set user type: mandatory) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: false) (opening source: not_set user type: not_set) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: false) (opening source: not_set user type: recipient) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (opening source: aar user type: mandatory) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (opening source: aar user type: not_set) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (opening source: aar user type: recipient) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (opening source: message user type: mandatory) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (opening source: message user type: not_set) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (opening source: message user type: recipient) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (opening source: not_set user type: mandatory) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (opening source: not_set user type: not_set) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: true) (opening source: not_set user type: recipient) 1`] = ` `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (opening source: aar user type: mandatory) 1`] = ` - - - - - - Allegati - - - - - - - A banner - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is not disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -7310,7 +7182,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (opening source: aar user type: not_set) 1`] = ` - - - - - - Allegati - - - - - - - A banner - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is not disabled - - - Is SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -7816,7 +7560,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (opening source: aar user type: recipient) 1`] = ` - - - - - - Allegati - - - - - - - A banner - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is not disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -8322,7 +7938,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (opening source: message user type: mandatory) 1`] = ` - - - - - - Allegati - - - - - - - A banner - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -8828,7 +8316,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (opening source: message user type: not_set) 1`] = ` - - - - - - Allegati - - - - - - - A banner - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is disabled - - - Is SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -9334,7 +8694,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (opening source: message user type: recipient) 1`] = ` - - - - - - Allegati - - - - - - - A banner - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -9840,7 +9072,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (opening source: not_set user type: mandatory) 1`] = ` - - - - - - Allegati - - - - - - - A banner - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is not disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -10346,7 +9450,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (opening source: not_set user type: not_set) 1`] = ` - - - - - - Allegati - - - - - - - A banner - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is not disabled - - - Is SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -10852,7 +9828,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has banner) (disabled: undefined) (opening source: not_set user type: recipient) 1`] = ` - - - - - - Allegati - - - - - - - A banner - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is not disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -11358,7 +10206,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (opening source: aar user type: mandatory) 1`] = ` - - - - - - Allegati - - - - - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is not disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -11861,7 +10584,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (opening source: aar user type: not_set) 1`] = ` - - - - - - Allegati - - - - - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is not disabled - - - Is SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -12364,7 +10962,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (opening source: aar user type: recipient) 1`] = ` - - - - - - Allegati - - - - - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is not disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -12867,7 +11340,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (opening source: message user type: mandatory) 1`] = ` - - - - - - Allegati - - - - - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -13370,7 +11718,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (opening source: message user type: not_set) 1`] = ` - - - - - - Allegati - - - - - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: undefined - - - Attachment content-type: undefined - - - Attachment id: 1 - - - Attachment name: undefined - - - Attachment url: https://an.url/path - - - - Has no bottom spacer - - - Is disabled - - - Is SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - + /> @@ -13873,7 +12096,57257 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: false) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: true) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (0 attachments) (has no banner) (disabled: undefined) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: false) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: true) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has banner) (disabled: undefined) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: false) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: true) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (opening source: message user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (opening source: not_set user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (opening source: not_set user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (opening source: not_set user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + A banner + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (opening source: aar user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (opening source: aar user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (opening source: aar user type: recipient) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (opening source: message user type: mandatory) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (opening source: message user type: not_set) 1`] = ` + + + + + + + + + + + + + + + MESSAGE_DETAIL + + + + + + + + + + + + + + + + + + + + + + Allegati + + + + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: undefined + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://an.url/path + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + + + + + + + + + + +`; + +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (opening source: message user type: recipient) 1`] = ` + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + Has no bottom spacer - Is disabled + Is not disabled + + + Send Opening Source message - Is not SEND + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -14376,7 +69996,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (opening source: not_set user type: mandatory) 1`] = ` + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + Has no bottom spacer @@ -14824,7 +70660,10 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no Is not disabled - Is not SEND + Send Opening Source not_set + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -14879,7 +70718,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (opening source: not_set user type: not_set) 1`] = ` + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + Has no bottom spacer @@ -15327,7 +71382,10 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no Is not disabled - Is SEND + Send Opening Source not_set + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -15382,7 +71440,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no banner) (disabled: undefined) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (opening source: not_set user type: recipient) 1`] = ` + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: DOCUMENT + + + Attachment content-type: application/pdf + + + Attachment id: 2 + + + Attachment name: Document.pdf + + + Attachment url: https://an.url/document + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: PAGOPA + + + Attachment content-type: application/pdf + + + Attachment id: 4 + + + Attachment name: pagopa.pdf + + + Attachment url: https://an.url/pagopa + + Has no bottom spacer @@ -15830,7 +72104,10 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no Is not disabled - Is not SEND + Send Opening Source not_set + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -15885,7 +72162,7 @@ exports[`MessageDetailsAttachments should match snapshot (1 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (opening source: aar user type: mandatory) 1`] = ` - - A banner - Mock MessageDetailsAttachmentItem @@ -16333,10 +72607,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled + + + Send Opening Source aar - Is not SEND + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -16402,79 +72679,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: F24 - - - Attachment content-type: application/pdf - - - Attachment id: 3 - - - Attachment name: f24.pdf - - - Attachment url: https://an.url/f24 - - - - Has bottom spacer + Is disabled - Is not disabled + Send Opening Source aar - Is not SEND + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -16540,10 +72751,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has no bottom spacer - Is not disabled + Is disabled - Is not SEND + Send Opening Source aar + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -16598,7 +72812,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (opening source: aar user type: not_set) 1`] = ` - - A banner - Mock MessageDetailsAttachmentItem @@ -17046,10 +73257,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled - Is SEND + Send Opening Source aar + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -17115,10 +73329,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled - Is SEND + Send Opening Source aar + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -17184,10 +73401,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has no bottom spacer - Is not disabled + Is disabled - Is SEND + Send Opening Source aar + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -17242,7 +73462,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: false) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (opening source: aar user type: recipient) 1`] = ` - - A banner - Mock MessageDetailsAttachmentItem @@ -17690,10 +73907,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled + + + Send Opening Source aar - Is not SEND + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -17759,79 +73979,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: F24 - - - Attachment content-type: application/pdf - - - Attachment id: 3 - - - Attachment name: f24.pdf - - - Attachment url: https://an.url/f24 - - - - Has bottom spacer + Is disabled - Is not disabled + Send Opening Source aar - Is not SEND + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -17897,10 +74051,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has no bottom spacer - Is not disabled + Is disabled + + + Send Opening Source aar - Is not SEND + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -17955,7 +74112,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (opening source: message user type: mandatory) 1`] = ` - - A banner - Mock MessageDetailsAttachmentItem @@ -18406,7 +74560,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Is disabled - Is not SEND + Send Opening Source message + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -18475,76 +74632,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Is disabled - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - - Mock MessageDetailsAttachmentItem + Send Opening Source message - - Attachment category: F24 - - - Attachment content-type: application/pdf - - - Attachment id: 3 - - - Attachment name: f24.pdf - - - Attachment url: https://an.url/f24 - - - - Has bottom spacer - - - Is disabled - - - Is not SEND + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -18613,7 +74704,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Is disabled - Is not SEND + Send Opening Source message + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -18668,7 +74762,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (opening source: message user type: not_set) 1`] = ` - - A banner - Mock MessageDetailsAttachmentItem @@ -19119,7 +75210,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Is disabled - Is SEND + Send Opening Source message + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -19188,7 +75282,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Is disabled - Is SEND + Send Opening Source message + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -19257,7 +75354,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Is disabled - Is SEND + Send Opening Source message + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -19312,7 +75412,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: true) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (opening source: message user type: recipient) 1`] = ` - - A banner - Mock MessageDetailsAttachmentItem @@ -19763,7 +75860,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Is disabled - Is not SEND + Send Opening Source message + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -19832,76 +75932,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Is disabled - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - - Mock MessageDetailsAttachmentItem + Send Opening Source message - - Attachment category: F24 - - - Attachment content-type: application/pdf - - - Attachment id: 3 - - - Attachment name: f24.pdf - - - Attachment url: https://an.url/f24 - - - - Has bottom spacer - - - Is disabled - - - Is not SEND + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -19970,7 +76004,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Is disabled - Is not SEND + Send Opening Source message + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -20025,7 +76062,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (opening source: not_set user type: mandatory) 1`] = ` - - A banner - Mock MessageDetailsAttachmentItem @@ -20473,10 +76507,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled + + + Send Opening Source not_set - Is not SEND + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -20542,10 +76579,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled - Is not SEND + Send Opening Source not_set + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -20611,10 +76651,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled + + + Send Opening Source not_set - Is not SEND + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -20680,10 +76723,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has no bottom spacer - Is not disabled + Is disabled + + + Send Opening Source not_set - Is not SEND + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -20738,7 +76784,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (opening source: not_set user type: not_set) 1`] = ` - - A banner - Mock MessageDetailsAttachmentItem @@ -21186,10 +77229,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled - Is SEND + Send Opening Source not_set + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -21255,10 +77301,85 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback - Is SEND + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is disabled + + + Send Opening Source not_set + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -21324,10 +77445,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has no bottom spacer - Is not disabled + Is disabled + + + Send Opening Source not_set - Is SEND + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -21382,7 +77506,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has banner) (disabled: undefined) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (opening source: not_set user type: recipient) 1`] = ` - - A banner - Mock MessageDetailsAttachmentItem @@ -21830,10 +77951,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled - Is not SEND + Send Opening Source not_set + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -21899,10 +78023,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled - Is not SEND + Send Opening Source not_set + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -21968,10 +78095,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has bottom spacer - Is not disabled + Is disabled - Is not SEND + Send Opening Source not_set + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -22037,10 +78167,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba Has no bottom spacer - Is not disabled + Is disabled - Is not SEND + Send Opening Source not_set + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -22095,7 +78228,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has ba `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (opening source: aar user type: mandatory) 1`] = ` - Is not SEND + Send Opening Source aar + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -22612,76 +78748,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - - Mock MessageDetailsAttachmentItem + Send Opening Source aar - - Attachment category: F24 - - - Attachment content-type: application/pdf - - - Attachment id: 3 - - - Attachment name: f24.pdf - - - Attachment url: https://an.url/f24 - - - - Has bottom spacer - - - Is not disabled - - - Is not SEND + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -22750,7 +78820,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is not SEND + Send Opening Source aar + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -22805,7 +78878,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (opening source: aar user type: not_set) 1`] = ` - Is SEND + Send Opening Source aar + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -23322,7 +79398,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is SEND + Send Opening Source aar + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -23391,7 +79470,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is SEND + Send Opening Source aar + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -23446,7 +79528,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: false) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (opening source: aar user type: recipient) 1`] = ` - Is not SEND + Send Opening Source aar + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -23963,76 +80048,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: F24 - - - Attachment content-type: application/pdf - - - Attachment id: 3 - - - Attachment name: f24.pdf - - - Attachment url: https://an.url/f24 - - - - Has bottom spacer - - - Is not disabled + Send Opening Source aar - Is not SEND + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -24101,7 +80120,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is not SEND + Send Opening Source aar + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -24156,7 +80178,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (opening source: message user type: mandatory) 1`] = ` - Is disabled + Is not disabled - Is not SEND + Send Opening Source message + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -24670,79 +80695,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Has bottom spacer - Is disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: F24 - - - Attachment content-type: application/pdf - - - Attachment id: 3 - - - Attachment name: f24.pdf - - - Attachment url: https://an.url/f24 - - - - Has bottom spacer + Is not disabled - Is disabled + Send Opening Source message - Is not SEND + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -24808,10 +80767,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Has no bottom spacer - Is disabled + Is not disabled + + + Send Opening Source message - Is not SEND + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -24866,7 +80828,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (opening source: message user type: not_set) 1`] = ` - Is disabled + Is not disabled + + + Send Opening Source message - Is SEND + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -25380,10 +81345,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Has bottom spacer - Is disabled + Is not disabled + + + Send Opening Source message - Is SEND + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -25449,10 +81417,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Has no bottom spacer - Is disabled + Is not disabled + + + Send Opening Source message - Is SEND + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -25507,7 +81478,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: true) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (opening source: message user type: recipient) 1`] = ` - Is disabled + Is not disabled + + + Send Opening Source message - Is not SEND + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -26021,79 +81995,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Has bottom spacer - Is disabled - - - Is not SEND - - - Message Id: 01HNWYRT55GXGPXR16BW2MSBVY - - - Service Id: 01JKAGWVQRFE1P8QAHZS743M90 - - - Has no onPreNavigate callback - - - Mock MessageDetailsAttachmentItem - - - - Attachment category: F24 - - - Attachment content-type: application/pdf - - - Attachment id: 3 - - - Attachment name: f24.pdf - - - Attachment url: https://an.url/f24 - - - - Has bottom spacer + Is not disabled - Is disabled + Send Opening Source message - Is not SEND + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -26159,10 +82067,13 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Has no bottom spacer - Is disabled + Is not disabled + + + Send Opening Source message - Is not SEND + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -26217,7 +82128,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (isSend: false) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (opening source: not_set user type: mandatory) 1`] = ` - Is not SEND + Send Opening Source not_set + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -26734,7 +82648,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is not SEND + Send Opening Source not_set + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -26803,7 +82720,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is not SEND + Send Opening Source not_set + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -26872,7 +82792,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is not SEND + Send Opening Source not_set + + + Send User Type mandatory Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -26927,7 +82850,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (isSend: true) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (opening source: not_set user type: not_set) 1`] = ` - Is SEND + Send Opening Source not_set + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -27444,7 +83370,82 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is SEND + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HNWYRT55GXGPXR16BW2MSBVY + + + Service Id: 01JKAGWVQRFE1P8QAHZS743M90 + + + Has no onPreNavigate callback + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: application/pdf + + + Attachment id: 3 + + + Attachment name: f24.pdf + + + Attachment url: https://an.url/f24 + + + + Has bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -27513,7 +83514,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is SEND + Send Opening Source not_set + + + Send User Type not_set Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -27568,7 +83572,7 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no `; -exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (isSend: undefined) 1`] = ` +exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no banner) (disabled: undefined) (opening source: not_set user type: recipient) 1`] = ` - Is not SEND + Send Opening Source not_set + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -28085,7 +84092,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is not SEND + Send Opening Source not_set + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -28154,7 +84164,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is not SEND + Send Opening Source not_set + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY @@ -28223,7 +84236,10 @@ exports[`MessageDetailsAttachments should match snapshot (4 attachments) (has no Is not disabled - Is not SEND + Send Opening Source not_set + + + Send User Type recipient Message Id: 01HNWYRT55GXGPXR16BW2MSBVY diff --git a/ts/features/messages/hooks/useAttachmentDownload.tsx b/ts/features/messages/hooks/useAttachmentDownload.tsx index bca2783aa2e..86e26f316b5 100644 --- a/ts/features/messages/hooks/useAttachmentDownload.tsx +++ b/ts/features/messages/hooks/useAttachmentDownload.tsx @@ -4,14 +4,7 @@ import { useCallback, useEffect } from "react"; import RNFS from "react-native-fs"; import { ServiceId } from "../../../../definitions/backend/ServiceId"; import { ThirdPartyAttachment } from "../../../../definitions/backend/ThirdPartyAttachment"; -import NavigationService from "../../../navigation/NavigationService"; import { useIODispatch, useIOSelector, useIOStore } from "../../../store/hooks"; -import { - trackPNAttachmentDownloadFailure, - trackPNAttachmentOpening -} from "../../pn/analytics"; -import PN_ROUTES from "../../pn/navigation/routes"; -import { trackThirdPartyMessageAttachmentShowPreview } from "../analytics"; import { MESSAGES_ROUTES } from "../navigation/routes"; import { cancelPreviousAttachmentDownload, @@ -25,15 +18,28 @@ import { isRequestedAttachmentDownloadSelector } from "../store/reducers/downloads"; import { attachmentDisplayName } from "../utils/attachments"; +import { + trackPNAttachmentDownloadFailure, + trackPNAttachmentOpening +} from "../../pn/analytics"; +import { trackThirdPartyMessageAttachmentShowPreview } from "../analytics"; +import PN_ROUTES from "../../pn/navigation/routes"; +import NavigationService from "../../../navigation/NavigationService"; +import { + SendOpeningSource, + SendUserType +} from "../../pushNotifications/analytics"; export const useAttachmentDownload = ( messageId: string, attachment: ThirdPartyAttachment, - isPN: boolean, + sendOpeningSource: SendOpeningSource, + sendUserType: SendUserType, serviceId: ServiceId, onPreNavigate?: () => void ) => { const attachmentId = attachment.id; + const isSendAttachment = sendOpeningSource !== "not_set"; const dispatch = useIODispatch(); const store = useIOStore(); @@ -54,8 +60,12 @@ export const useAttachmentDownload = ( const doNavigate = useCallback(() => { dispatch(clearRequestedAttachmentDownload()); onPreNavigate?.(); - if (isPN) { - trackPNAttachmentOpening(attachmentCategory); + if (isSendAttachment) { + trackPNAttachmentOpening( + sendOpeningSource, + sendUserType, + attachmentCategory + ); NavigationService.navigate(MESSAGES_ROUTES.MESSAGES_NAVIGATOR, { screen: PN_ROUTES.MAIN, params: { @@ -80,11 +90,14 @@ export const useAttachmentDownload = ( attachmentCategory, attachmentId, dispatch, - isPN, + isSendAttachment, messageId, onPreNavigate, + sendOpeningSource, + sendUserType, serviceId ]); + const checkPathAndNavigate = useCallback( async (downloadPath: string) => { if (await RNFS.exists(downloadPath)) { @@ -100,7 +113,7 @@ export const useAttachmentDownload = ( return; } - if (!isPN) { + if (!isSendAttachment) { trackThirdPartyMessageAttachmentShowPreview(); } @@ -114,18 +127,18 @@ export const useAttachmentDownload = ( downloadAttachment.request({ attachment, messageId, - skipMixpanelTrackingOnFailure: isPN, + skipMixpanelTrackingOnFailure: isSendAttachment, serviceId }) ); } }, [ - attachment, + isFetching, + isSendAttachment, dispatch, download, doNavigate, - isFetching, - isPN, + attachment, messageId, serviceId ]); @@ -139,7 +152,7 @@ export const useAttachmentDownload = ( void checkPathAndNavigate(download.path); } else if (isDownloadError) { dispatch(clearRequestedAttachmentDownload()); - if (isPN) { + if (isSendAttachment) { trackPNAttachmentDownloadFailure(attachmentCategory); } toast.error(I18n.t("messageDetails.attachments.failing.details")); @@ -149,10 +162,9 @@ export const useAttachmentDownload = ( attachmentId, checkPathAndNavigate, dispatch, - doNavigate, download, isDownloadError, - isPN, + isSendAttachment, messageId, store, toast diff --git a/ts/features/messages/saga/__test__/handleThirdPartyMessage.test.ts b/ts/features/messages/saga/__test__/handleThirdPartyMessage.test.ts new file mode 100644 index 00000000000..c9b8072ca74 --- /dev/null +++ b/ts/features/messages/saga/__test__/handleThirdPartyMessage.test.ts @@ -0,0 +1,406 @@ +import * as E from "fp-ts/lib/Either"; +import { testSaga } from "redux-saga-test-plan"; +import { + TagEnum, + TagEnum as TEBASE +} from "../../../../../definitions/backend/MessageCategoryBase"; +import { TagEnum as TEPAYMENT } from "../../../../../definitions/backend/MessageCategoryPayment"; +import { TagEnum as TESEND } from "../../../../../definitions/backend/MessageCategoryPN"; +import { ServiceDetails } from "../../../../../definitions/services/ServiceDetails"; +import { handleThirdPartyMessage, testable } from "../handleThirdPartyMessage"; +import { ThirdPartyMessageWithContent } from "../../../../../definitions/backend/ThirdPartyMessageWithContent"; +import * as ANALYTICS from "../../analytics"; +import * as SEND_ANALYTICS from "../../../pn/analytics"; +import { loadThirdPartyMessage } from "../../store/actions"; +import { ServiceId } from "../../../../../definitions/services/ServiceId"; +import { serviceDetailsByIdSelector } from "../../../services/details/store/selectors"; +import { withRefreshApiCall } from "../../../authentication/fastLogin/saga/utils"; +import { ThirdPartyMessageUnion } from "../../types/thirdPartyById"; + +describe("handleThirdPartyMessage", () => { + const serviceDetails = { + id: "01K80HY0HV1KP41F555A854HDG", + name: "Service Name", + organization: { + name: "Organization Name", + fiscal_code: "IT34655573020" + } + } as unknown as ServiceDetails; + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("handleThirdPartyMessage saga", () => { + it("should follow the proper flow when everything goes well", () => { + const mockGetThirdPartyMessageRequest = jest.fn(); + const mockGetThirdPartyMessageFactory = () => + mockGetThirdPartyMessageRequest; + const messageId = "01K813A7EVHP2W5ZAYDSTX9J0E"; + const serviceId = "01K813ACAMDW4DRVXK0CEGFHGM" as ServiceId; + const action = loadThirdPartyMessage.request({ + id: messageId, + serviceId, + tag: TagEnum.GENERIC + }); + const thirdPartyMessage = {}; + const result = E.right({ status: 200, value: thirdPartyMessage }); + testSaga(handleThirdPartyMessage, mockGetThirdPartyMessageFactory, action) + .next() + .select(serviceDetailsByIdSelector, serviceId) + .next(serviceDetails) + .call( + withRefreshApiCall, + mockGetThirdPartyMessageRequest({ id: messageId }), + action + ) + .next(result) + .call( + testable!.trackSuccess, + thirdPartyMessage, + serviceDetails, + TagEnum.GENERIC + ) + .next() + .put( + loadThirdPartyMessage.success({ + id: messageId, + content: { + kind: "TPM" + } as ThirdPartyMessageUnion + }) + ); + }); + }); + + // eslint-disable-next-line sonarjs/cognitive-complexity + describe("testable.trackSuccess", () => { + const generateMessages = (attachmentCount: number | undefined) => { + const thirdPartyMessage = { + third_party_message: { + attachments: + attachmentCount != null + ? [...Array(attachmentCount)].map(index => ({ + id: `${index}`, + url: "https://an.url/path" + })) + : undefined + } + }; + const sendMessageNone = { + third_party_message: { + details: {} + } + }; + const sendMessageSomeNoTimeline = { + third_party_message: { + attachments: + attachmentCount != null + ? [...Array(attachmentCount)].map(index => ({ + id: `${index}`, + url: "https://an.url/path" + })) + : undefined, + details: { + subject: "", + iun: "", + recipients: [], + notificationStatusHistory: [] + } + } + }; + const sendMessageSome1ItemTimeline = { + third_party_message: { + attachments: + attachmentCount != null + ? [...Array(attachmentCount)].map(index => ({ + id: `${index}`, + url: "https://an.url/path" + })) + : undefined, + details: { + subject: "", + iun: "", + recipients: [], + notificationStatusHistory: [ + { + activeFrom: new Date(), + relatedTimelineElements: [], + status: "ACCEPTED" + } + ] + } + } + }; + const sendMessageSome2ItemsTimeline = { + third_party_message: { + attachments: + attachmentCount != null + ? [...Array(attachmentCount)].map(index => ({ + id: `${index}`, + url: "https://an.url/path" + })) + : undefined, + + details: { + subject: "", + iun: "", + recipients: [], + notificationStatusHistory: [ + { + activeFrom: new Date(), + relatedTimelineElements: [], + status: "ACCEPTED" + }, + { + activeFrom: new Date(), + relatedTimelineElements: [], + status: "CANCELLED" + } + ] + } + } + }; + return [ + { + message: thirdPartyMessage, + isNone: false, + isSend: false, + timelineStatus: undefined + }, + { + message: sendMessageNone, + isNone: true, + isSend: true, + timelineStatus: undefined + }, + { + message: sendMessageSomeNoTimeline, + isNone: false, + isSend: true, + timelineStatus: undefined + }, + { + message: sendMessageSome1ItemTimeline, + isNone: false, + isSend: true, + timelineStatus: "ACCEPTED" + }, + { + message: sendMessageSome2ItemsTimeline, + isNone: false, + isSend: true, + timelineStatus: "CANCELLED" + } + ]; + }; + [undefined, serviceDetails].forEach(serviceDetail => { + [ + TEBASE.EU_COVID_CERT, + TEBASE.GENERIC, + TEBASE.LEGAL_MESSAGE, + TEPAYMENT.PAYMENT, + TESEND.PN + ].forEach(tagEnum => { + [undefined, 0, 1, 2].forEach(attachmentCount => { + generateMessages(attachmentCount).forEach(messageWrapper => { + it(`should call proper analytics functions (service (${ + serviceDetail ? "undefined" : "defined" + }) tag (${tagEnum}) attachment count (${attachmentCount}) is send (${ + messageWrapper.isSend + }) is none (${messageWrapper.isNone}) timeline status (${ + messageWrapper.timelineStatus + })`, () => { + const spiedOnMockedTrackRemoteContentLoadSuccess = jest + .spyOn(ANALYTICS, "trackRemoteContentLoadSuccess") + .mockImplementation(); + const spiedOnMockedTrackPNNotificationLoadSuccess = jest + .spyOn(SEND_ANALYTICS, "trackPNNotificationLoadSuccess") + .mockImplementation(); + const spiedOnMockedTrackPNNotificationLoadError = jest + .spyOn(SEND_ANALYTICS, "trackPNNotificationLoadError") + .mockImplementation(); + const spiedOnMockedTrackThirdPartyMessageAttachmentCount = jest + .spyOn(ANALYTICS, "trackThirdPartyMessageAttachmentCount") + .mockImplementation(); + + testable!.trackSuccess( + messageWrapper.message as unknown as ThirdPartyMessageWithContent, + serviceDetail, + tagEnum + ); + + // trackRemoteContentLoadSuccess + expect( + spiedOnMockedTrackRemoteContentLoadSuccess.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackRemoteContentLoadSuccess.mock.calls[0].length + ).toBe(5); + expect( + spiedOnMockedTrackRemoteContentLoadSuccess.mock.calls[0][0] + ).toBe(serviceDetail?.id); + expect( + spiedOnMockedTrackRemoteContentLoadSuccess.mock.calls[0][1] + ).toBe(serviceDetail?.name); + expect( + spiedOnMockedTrackRemoteContentLoadSuccess.mock.calls[0][2] + ).toBe(serviceDetail?.organization.name); + expect( + spiedOnMockedTrackRemoteContentLoadSuccess.mock.calls[0][3] + ).toBe(serviceDetail?.organization.fiscal_code); + expect( + spiedOnMockedTrackRemoteContentLoadSuccess.mock.calls[0][4] + ).toBe(tagEnum); + + // trackPNNotificationLoadSuccess + if ( + tagEnum === TESEND.PN && + !messageWrapper.isNone && + messageWrapper.isSend + ) { + expect( + spiedOnMockedTrackPNNotificationLoadSuccess.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackPNNotificationLoadSuccess.mock.calls[0] + .length + ).toBe(4); + expect( + spiedOnMockedTrackPNNotificationLoadSuccess.mock.calls[0][0] + ).toBe(attachmentCount !== undefined && attachmentCount > 0); + expect( + spiedOnMockedTrackPNNotificationLoadSuccess.mock.calls[0][1] + ).toBe(messageWrapper.timelineStatus); + expect( + spiedOnMockedTrackPNNotificationLoadSuccess.mock.calls[0][2] + ).toBe("message"); + expect( + spiedOnMockedTrackPNNotificationLoadSuccess.mock.calls[0][3] + ).toBe("not_set"); + } else { + expect( + spiedOnMockedTrackPNNotificationLoadSuccess.mock.calls.length + ).toBe(0); + } + + // trackPNNotificationLoadError + if ( + tagEnum === TESEND.PN && + (messageWrapper.isNone || !messageWrapper.isSend) + ) { + expect( + spiedOnMockedTrackPNNotificationLoadError.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackPNNotificationLoadError.mock.calls[0].length + ).toBe(1); + expect( + spiedOnMockedTrackPNNotificationLoadError.mock.calls[0][0] + ).toBe( + "Unable convert the third party message to SEND message structure" + ); + } else { + expect( + spiedOnMockedTrackPNNotificationLoadError.mock.calls.length + ).toBe(0); + } + + // trackThirdPartyMessageAttachmentCount + if (tagEnum !== TESEND.PN) { + expect( + spiedOnMockedTrackThirdPartyMessageAttachmentCount.mock.calls + .length + ).toBe(1); + expect( + spiedOnMockedTrackThirdPartyMessageAttachmentCount.mock + .calls[0].length + ).toBe(1); + expect( + spiedOnMockedTrackThirdPartyMessageAttachmentCount.mock + .calls[0][0] + ).toBe( + !messageWrapper.isNone && attachmentCount + ? attachmentCount + : 0 + ); + } else { + expect( + spiedOnMockedTrackThirdPartyMessageAttachmentCount.mock.calls + .length + ).toBe(0); + } + }); + }); + }); + }); + }); + }); + + describe("testable.trackFailure", () => { + [undefined, serviceDetails].forEach(serviceDetail => { + [ + TEBASE.EU_COVID_CERT, + TEBASE.GENERIC, + TEBASE.LEGAL_MESSAGE, + TEPAYMENT.PAYMENT, + TESEND.PN + ].forEach(tagEnum => { + it(`should call proper analytics functions (service details (${ + serviceDetail != null ? "defined" : "undefined" + }) tag (${tagEnum}))`, () => { + const reason = "A reason"; + const spiedOnMockedTrackRemoteContentLoadFailure = jest + .spyOn(ANALYTICS, "trackRemoteContentLoadFailure") + .mockImplementation(); + const spiedOnMockedTrackPNNotificationLoadError = jest + .spyOn(SEND_ANALYTICS, "trackPNNotificationLoadError") + .mockImplementation(); + + testable!.trackFailure(reason, serviceDetail, tagEnum); + + expect( + spiedOnMockedTrackRemoteContentLoadFailure.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackRemoteContentLoadFailure.mock.calls[0].length + ).toBe(6); + expect( + spiedOnMockedTrackRemoteContentLoadFailure.mock.calls[0][0] + ).toBe(serviceDetail?.id); + expect( + spiedOnMockedTrackRemoteContentLoadFailure.mock.calls[0][1] + ).toBe(serviceDetail?.name); + expect( + spiedOnMockedTrackRemoteContentLoadFailure.mock.calls[0][2] + ).toBe(serviceDetail?.organization.name); + expect( + spiedOnMockedTrackRemoteContentLoadFailure.mock.calls[0][3] + ).toBe(serviceDetail?.organization.fiscal_code); + expect( + spiedOnMockedTrackRemoteContentLoadFailure.mock.calls[0][4] + ).toBe(tagEnum); + expect( + spiedOnMockedTrackRemoteContentLoadFailure.mock.calls[0][5] + ).toBe(reason); + + if (tagEnum === TESEND.PN) { + expect( + spiedOnMockedTrackPNNotificationLoadError.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackPNNotificationLoadError.mock.calls[0].length + ).toBe(1); + expect( + spiedOnMockedTrackPNNotificationLoadError.mock.calls[0][0] + ).toBe(reason); + } else { + expect( + spiedOnMockedTrackPNNotificationLoadError.mock.calls.length + ).toBe(0); + } + }); + }); + }); + }); +}); diff --git a/ts/features/messages/saga/handleThirdPartyMessage.ts b/ts/features/messages/saga/handleThirdPartyMessage.ts index c1c4b820db2..649f0921b40 100644 --- a/ts/features/messages/saga/handleThirdPartyMessage.ts +++ b/ts/features/messages/saga/handleThirdPartyMessage.ts @@ -24,6 +24,7 @@ import { TagEnum } from "../../../../definitions/backend/MessageCategoryPN"; import { serviceDetailsByIdSelector } from "../../services/details/store/selectors"; import { ServiceDetails } from "../../../../definitions/services/ServiceDetails"; import { thirdPartyKind } from "../types/thirdPartyById"; +import { isTestEnv } from "../../../utils/environment"; export function* handleThirdPartyMessage( getThirdPartyMessage: BackendClient["getThirdPartyMessage"], @@ -96,9 +97,21 @@ const trackSuccess = ( if (O.isSome(pnMessageOption)) { const pnMessage = pnMessageOption.value; - trackPNNotificationLoadSuccess(pnMessage); + const hasAttachments = + pnMessage.attachments != null && pnMessage.attachments.length > 0; + const timeline = pnMessage.notificationStatusHistory; + const status = + timeline.length > 0 ? timeline[timeline.length - 1].status : undefined; + trackPNNotificationLoadSuccess( + hasAttachments, + status, + "message", + "not_set" + ); } else { - trackPNNotificationLoadError(); + trackPNNotificationLoadError( + "Unable convert the third party message to SEND message structure" + ); } } else { const attachments = messageFromApi.third_party_message.attachments; @@ -125,3 +138,5 @@ const trackFailure = ( trackPNNotificationLoadError(reason); } }; + +export const testable = isTestEnv ? { trackSuccess, trackFailure } : undefined; diff --git a/ts/features/messages/screens/MessageDetailsScreen.tsx b/ts/features/messages/screens/MessageDetailsScreen.tsx index 5b5f989b8e4..7c7a86bafaa 100644 --- a/ts/features/messages/screens/MessageDetailsScreen.tsx +++ b/ts/features/messages/screens/MessageDetailsScreen.tsx @@ -204,6 +204,8 @@ export const MessageDetailsScreen = (props: MessageDetailsScreenProps) => { {hasRemoteContent && } diff --git a/ts/features/pn/__mocks__/pnMessage.ts b/ts/features/pn/__mocks__/pnMessage.ts index 0bea75bc58e..7f9dd196baa 100644 --- a/ts/features/pn/__mocks__/pnMessage.ts +++ b/ts/features/pn/__mocks__/pnMessage.ts @@ -1,45 +1,52 @@ import { ThirdPartyMessageWithContent } from "../../../../definitions/backend/ThirdPartyMessageWithContent"; +import { Denomination } from "../../../../definitions/pn/Denomination"; +import { noticeCode } from "../../../../definitions/pn/noticeCode"; +import { paTaxId } from "../../../../definitions/pn/paTaxId"; +import { TaxId } from "../../../../definitions/pn/TaxId"; import { ThirdPartyAttachment } from "../../../../definitions/pn/ThirdPartyAttachment"; +import { ThirdPartyMessage } from "../../../../definitions/pn/ThirdPartyMessage"; import { message_1 } from "../../messages/__mocks__/message"; import { ATTACHMENT_CATEGORY } from "../../messages/types/attachmentCategory"; -export const thirdPartyMessage: ThirdPartyMessageWithContent = { - ...message_1, - created_at: new Date("2020-01-01T00:00:00.000Z"), - third_party_message: { - attachments: [ - { - id: "1", - name: "A First Attachment", - content_type: "application/pdf", - category: ATTACHMENT_CATEGORY.DOCUMENT, - url: "/resource/attachment1.pdf" - }, +export const sendThirdPartyMessage: ThirdPartyMessage = { + attachments: [ + { + id: "1", + name: "A First Attachment", + content_type: "application/pdf", + category: ATTACHMENT_CATEGORY.DOCUMENT, + url: "/resource/attachment1.pdf" + }, + { + id: "2", + name: "A Second Attachment", + content_type: "application/pdf", + category: ATTACHMENT_CATEGORY.DOCUMENT, + url: "/resource/attachment2.pdf" + } + ] as Array, + details: { + abstract: "######## abstract ########", + iun: "731143-7-0317-8200-0", + subject: "######## subject ########", + recipients: [ { - id: "2", - name: "A Second Attachment", - content_type: "application/pdf", - category: ATTACHMENT_CATEGORY.DOCUMENT, - url: "/resource/attachment2.pdf" - } - ] as Array, - details: { - abstract: "######## abstract ########", - iun: "731143-7-0317-8200-0", - subject: "######## subject ########", - recipients: [ - { - recipientType: "-", - taxId: "AAABBB00A00A000A", - denomination: "AaAaAa BbBbBb", - payment: { - noticeCode: "026773337463073118", - creditorTaxId: "00000000009" - } + recipientType: "-", + taxId: "AAABBB00A00A000A" as TaxId, + denomination: "AaAaAa BbBbBb" as Denomination, + payment: { + noticeCode: "026773337463073118" as noticeCode, + creditorTaxId: "00000000009" as paTaxId } - ], - notificationStatusHistory: [], - senderDenomination: "Sender denomination" - } + } + ], + notificationStatusHistory: [], + senderDenomination: "Sender denomination" } }; + +export const thirdPartyMessage: ThirdPartyMessageWithContent = { + ...message_1, + created_at: new Date("2020-01-01T00:00:00.000Z"), + third_party_message: sendThirdPartyMessage +}; diff --git a/ts/features/pn/aar/analytics/__tests__/index.test.ts b/ts/features/pn/aar/analytics/__tests__/index.test.ts index a4daa14e3b3..bf8f1e4b143 100644 --- a/ts/features/pn/aar/analytics/__tests__/index.test.ts +++ b/ts/features/pn/aar/analytics/__tests__/index.test.ts @@ -1,12 +1,33 @@ import { + trackSendAARAccessDeniedDelegateInfo, + trackSendAARAccessDeniedDismissed, + trackSendAARAccessDeniedScreenView, + trackSendAARToS, + trackSendAARToSAccepted, + trackSendAARToSDismissed, aarProblemJsonAnalyticsReport, trackSendAARFailure, trackSendQRCodeScanRedirect, trackSendQRCodeScanRedirectConfirmed, - trackSendQRCodeScanRedirectDismissed + trackSendQRCodeScanRedirectDismissed, + trackSendAarNotificationClosure, + trackSendAarNotificationClosureBack, + trackSendAarNotificationClosureConfirm, + trackSendAarNotificationClosureExit, + trackSendAarErrorScreenClosure, + trackSendAarErrorScreenDetails, + trackSendAarErrorScreenDetailsHelp, + trackSendAarErrorScreenDetailsCode } from ".."; import { AARProblemJson } from "../../../../../../definitions/pn/aar/AARProblemJson"; import * as mixpanel from "../../../../../mixpanel"; +import { SendUserType } from "../../../../pushNotifications/analytics"; + +const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" +]; describe("index", () => { const spiedOnMockedMixpanelTrack = jest @@ -321,4 +342,240 @@ describe("index", () => { }); }); }); + + describe("trackSendAARToS", () => { + it("should call 'mixpanelTrack' with proper event name and properties", () => { + trackSendAARToS(); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_TEMPORARY_NOTIFICATION_OPENING_DISCLAIMER" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "screen_view" + }); + }); + }); + + describe("trackSendAARToSAccepted", () => { + it("should call 'mixpanelTrack' with proper event name and properties", () => { + trackSendAARToSAccepted(); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_TEMPORARY_NOTIFICATION_OPENING_DISCLAIMER_ACCEPTED" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action" + }); + }); + }); + + describe("trackSendAARToSDismissed", () => { + it("should call 'mixpanelTrack' with proper event name and properties", () => { + trackSendAARToSDismissed(); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_TEMPORARY_NOTIFICATION_OPENING_DISCLAIMER_DISMISSED" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action" + }); + }); + }); + + describe("trackSendAARAccessDeniedScreenView", () => { + it("should call 'mixpanelTrack' with proper event name and properties", () => { + trackSendAARAccessDeniedScreenView(); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_TEMPORARY_NOTIFICATION_OPENING_NOT_ALLOWED" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "screen_view" + }); + }); + }); + + describe("trackSendAARAccessDeniedDelegateInfo", () => { + it("should call 'mixpanelTrack' with proper event name and properties", () => { + trackSendAARAccessDeniedDelegateInfo(); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_TEMPORARY_NOTIFICATION_OPENING_NOT_ALLOWED_MANDATE_INFO" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "exit" + }); + }); + }); + + describe("trackSendAARAccessDeniedDismissed", () => { + it("should call 'mixpanelTrack' with proper event name and properties", () => { + trackSendAARAccessDeniedDismissed(); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_TEMPORARY_NOTIFICATION_OPENING_NOT_ALLOWED_DISMISSED" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action" + }); + }); + }); + + describe("trackSendAarNotificationClosure", () => { + sendUserTypes.forEach(userType => { + it(`should call 'mixpanelTrack' with proper event name and parameters (userType ${userType})`, () => { + trackSendAarNotificationClosure(userType); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_TEMPORARY_NOTIFICATION_CLOSURE" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "screen_view", + send_user: userType + }); + }); + }); + }); + + describe("trackSendAarNotificationClosureBack", () => { + sendUserTypes.forEach(userType => { + it(`should call 'mixpanelTrack' with proper event name and parameters (userType ${userType})`, () => { + trackSendAarNotificationClosureBack(userType); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_TEMPORARY_NOTIFICATION_CLOSURE_BACK" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action", + send_user: userType + }); + }); + }); + }); + + describe("trackSendAarNotificationClosureConfirm", () => { + sendUserTypes.forEach(userType => { + it(`should call 'mixpanelTrack' with proper event name and parameters (userType ${userType})`, () => { + trackSendAarNotificationClosureConfirm(userType); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_TEMPORARY_NOTIFICATION_CLOSURE_CONFIRM" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action", + send_user: userType + }); + }); + }); + }); + + describe("trackSendAarNotificationClosureExit", () => { + sendUserTypes.forEach(userType => { + it(`should call 'mixpanelTrack' with proper event name and parameters (userType ${userType})`, () => { + trackSendAarNotificationClosureExit(userType); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_TEMPORARY_NOTIFICATION_CLOSURE_EXIT" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "exit", + send_user: userType + }); + }); + }); + }); + + describe("trackSendAarErrorScreenClosure", () => { + it(`should call 'mixpanelTrack' with proper event name and parameters)`, () => { + trackSendAarErrorScreenClosure(); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_AAR_ERROR_CLOSURE" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action" + }); + }); + }); + + describe("trackSendAarErrorScreenDetails", () => { + it(`should call 'mixpanelTrack' with proper event name and parameters)`, () => { + trackSendAarErrorScreenDetails(); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_AAR_ERROR_DETAIL" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "screen_view" + }); + }); + }); + + describe("trackSendAarErrorScreenDetailsHelp", () => { + it(`should call 'mixpanelTrack' with proper event name and parameters)`, () => { + trackSendAarErrorScreenDetailsHelp(); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_AAR_ERROR_DETAIL_HELP" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action" + }); + }); + }); + + describe("trackSendAarErrorScreenDetailsCode", () => { + it(`should call 'mixpanelTrack' with proper event name and parameters)`, () => { + trackSendAarErrorScreenDetailsCode(); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "SEND_AAR_ERROR_DETAIL_CODE" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action" + }); + }); + }); }); diff --git a/ts/features/pn/aar/analytics/index.ts b/ts/features/pn/aar/analytics/index.ts index 219f838879e..ab3ac3d02f8 100644 --- a/ts/features/pn/aar/analytics/index.ts +++ b/ts/features/pn/aar/analytics/index.ts @@ -1,6 +1,7 @@ import { AARProblemJson } from "../../../../../definitions/pn/aar/AARProblemJson"; import { mixpanelTrack } from "../../../../mixpanel"; import { buildEventProperties } from "../../../../utils/analytics"; +import { SendUserType } from "../../../pushNotifications/analytics"; import { SendAARFailurePhase } from "../utils/stateUtils"; export const trackSendQRCodeScanRedirect = () => { @@ -33,6 +34,43 @@ export const trackSendAARFailure = ( void mixpanelTrack(eventName, props); }; +export const trackSendAARToS = () => { + const eventName = "SEND_TEMPORARY_NOTIFICATION_OPENING_DISCLAIMER"; + const props = buildEventProperties("UX", "screen_view"); + void mixpanelTrack(eventName, props); +}; + +export const trackSendAARToSAccepted = () => { + const eventName = "SEND_TEMPORARY_NOTIFICATION_OPENING_DISCLAIMER_ACCEPTED"; + const props = buildEventProperties("UX", "action"); + void mixpanelTrack(eventName, props); +}; + +export const trackSendAARToSDismissed = () => { + const eventName = "SEND_TEMPORARY_NOTIFICATION_OPENING_DISCLAIMER_DISMISSED"; + const props = buildEventProperties("UX", "action"); + void mixpanelTrack(eventName, props); +}; + +export const trackSendAARAccessDeniedScreenView = () => { + const eventName = "SEND_TEMPORARY_NOTIFICATION_OPENING_NOT_ALLOWED"; + const props = buildEventProperties("UX", "screen_view"); + void mixpanelTrack(eventName, props); +}; + +export const trackSendAARAccessDeniedDelegateInfo = () => { + const eventName = + "SEND_TEMPORARY_NOTIFICATION_OPENING_NOT_ALLOWED_MANDATE_INFO"; + const props = buildEventProperties("UX", "exit"); + void mixpanelTrack(eventName, props); +}; + +export const trackSendAARAccessDeniedDismissed = () => { + const eventName = "SEND_TEMPORARY_NOTIFICATION_OPENING_NOT_ALLOWED_DISMISSED"; + const props = buildEventProperties("UX", "action"); + void mixpanelTrack(eventName, props); +}; + export const aarProblemJsonAnalyticsReport = ( responseCode: number, input: AARProblemJson @@ -52,3 +90,61 @@ export const aarProblemJsonAnalyticsReport = ( : ""; return `${responseCode} ${input.status}${titleReport} ${input.detail}${traceIdReport}${errorReport}`; }; + +export const trackSendAarNotificationClosure = (userType: SendUserType) => { + const eventName = "SEND_TEMPORARY_NOTIFICATION_CLOSURE"; + const eventProps = buildEventProperties("UX", "screen_view", { + send_user: userType + }); + void mixpanelTrack(eventName, eventProps); +}; + +export const trackSendAarNotificationClosureBack = (userType: SendUserType) => { + const eventName = "SEND_TEMPORARY_NOTIFICATION_CLOSURE_BACK"; + const eventProps = buildEventProperties("UX", "action", { + send_user: userType + }); + void mixpanelTrack(eventName, eventProps); +}; + +export const trackSendAarNotificationClosureConfirm = ( + userType: SendUserType +) => { + const eventName = "SEND_TEMPORARY_NOTIFICATION_CLOSURE_CONFIRM"; + const eventProps = buildEventProperties("UX", "action", { + send_user: userType + }); + void mixpanelTrack(eventName, eventProps); +}; + +export const trackSendAarNotificationClosureExit = (userType: SendUserType) => { + const eventName = "SEND_TEMPORARY_NOTIFICATION_CLOSURE_EXIT"; + const eventProps = buildEventProperties("UX", "exit", { + send_user: userType + }); + void mixpanelTrack(eventName, eventProps); +}; + +export const trackSendAarErrorScreenClosure = () => { + const eventName = "SEND_AAR_ERROR_CLOSURE"; + const eventProps = buildEventProperties("UX", "action"); + void mixpanelTrack(eventName, eventProps); +}; + +export const trackSendAarErrorScreenDetails = () => { + const eventName = "SEND_AAR_ERROR_DETAIL"; + const eventProps = buildEventProperties("UX", "screen_view"); + void mixpanelTrack(eventName, eventProps); +}; + +export const trackSendAarErrorScreenDetailsHelp = () => { + const eventName = "SEND_AAR_ERROR_DETAIL_HELP"; + const eventProps = buildEventProperties("UX", "action"); + void mixpanelTrack(eventName, eventProps); +}; + +export const trackSendAarErrorScreenDetailsCode = () => { + const eventName = "SEND_AAR_ERROR_DETAIL_CODE"; + const eventProps = buildEventProperties("UX", "action"); + void mixpanelTrack(eventName, eventProps); +}; diff --git a/ts/features/pn/aar/components/SendAARMessageDetailBottomSheet.tsx b/ts/features/pn/aar/components/SendAARMessageDetailBottomSheet.tsx index 5acf3ed127e..3d5886d811c 100644 --- a/ts/features/pn/aar/components/SendAARMessageDetailBottomSheet.tsx +++ b/ts/features/pn/aar/components/SendAARMessageDetailBottomSheet.tsx @@ -9,21 +9,25 @@ import { View } from "react-native"; import { useIOSelector } from "../../../../store/hooks"; import { sendVisitTheWebsiteUrlSelector } from "../../../../store/reducers/backendStatus/remoteConfig"; import { openWebUrl } from "../../../../utils/url"; +import { trackSendAarNotificationClosureExit } from "../analytics"; +import { SendUserType } from "../../../pushNotifications/analytics"; export type SendAARMessageDetailBottomSheetProps = { - isDelegate: boolean; onPrimaryActionPress: () => void; onSecondaryActionPress: () => void; + sendUserType: SendUserType; }; export const SendAARMessageDetailBottomSheet = ({ - isDelegate, onPrimaryActionPress, - onSecondaryActionPress + onSecondaryActionPress, + sendUserType }: SendAARMessageDetailBottomSheetProps) => { + const isDelegate = sendUserType === "mandatory"; const sendVisitTheWebsiteUrl = useIOSelector(sendVisitTheWebsiteUrlSelector); const onLinkPress = () => { + trackSendAarNotificationClosureExit(sendUserType); openWebUrl(sendVisitTheWebsiteUrl); }; diff --git a/ts/features/pn/aar/components/SendAARMessageDetailBottomSheetComponent.tsx b/ts/features/pn/aar/components/SendAARMessageDetailBottomSheetComponent.tsx index de0a15ec444..f1413193829 100644 --- a/ts/features/pn/aar/components/SendAARMessageDetailBottomSheetComponent.tsx +++ b/ts/features/pn/aar/components/SendAARMessageDetailBottomSheetComponent.tsx @@ -1,31 +1,35 @@ import I18n from "i18next"; import { RefObject } from "react"; import { useIONavigation } from "../../../../navigation/params/AppParamsList"; -import { useIOSelector, useIOStore } from "../../../../store/hooks"; +import { useIOStore } from "../../../../store/hooks"; import { useIOBottomSheetModal } from "../../../../utils/hooks/bottomSheet"; import { MESSAGES_ROUTES } from "../../../messages/navigation/routes"; import PN_ROUTES from "../../navigation/routes"; import { isPnServiceEnabled } from "../../reminderBanner/reducer/bannerDismiss"; -import { isAarMessageDelegatedSelector } from "../store/selectors"; +import { SendUserType } from "../../../pushNotifications/analytics"; +import { + trackSendAarNotificationClosureBack, + trackSendAarNotificationClosureConfirm +} from "../analytics"; import { SendAARMessageDetailBottomSheet } from "./SendAARMessageDetailBottomSheet"; -type SendAARMessageDetailBottomSheetComponentProps = { +export type SendAARMessageDetailBottomSheetComponentProps = { aarBottomSheetRef: RefObject<(() => void) | undefined>; - iun: string; + sendUserType: SendUserType; }; export const SendAARMessageDetailBottomSheetComponent = ({ aarBottomSheetRef, - iun + sendUserType }: SendAARMessageDetailBottomSheetComponentProps) => { const navigation = useIONavigation(); const store = useIOStore(); - const isDelegate = useIOSelector(state => - isAarMessageDelegatedSelector(state, iun) - ); const onSecondaryActionPress = () => { + trackSendAarNotificationClosureConfirm(sendUserType); + dismiss(); + const state = store.getState(); // This selector returns undefined if service's preferences have // not been requested and loaded yet. But here, we are looking at @@ -37,7 +41,6 @@ export const SendAARMessageDetailBottomSheetComponent = ({ // retrieved. The undefined case is treated as a disabled service, // showing the activation flow to the user. const isSendServiceEnabled = isPnServiceEnabled(state) ?? false; - if (isSendServiceEnabled) { navigation.popToTop(); return; @@ -49,7 +52,7 @@ export const SendAARMessageDetailBottomSheetComponent = ({ screen: PN_ROUTES.ENGAGEMENT_SCREEN, params: { sendOpeningSource: "aar", - sendUserType: isDelegate ? "mandatory" : "recipient" + sendUserType } } }); @@ -59,9 +62,12 @@ export const SendAARMessageDetailBottomSheetComponent = ({ title: I18n.t("features.pn.aar.flow.closeNotification.title"), component: ( dismiss()} + onPrimaryActionPress={() => { + trackSendAarNotificationClosureBack(sendUserType); + dismiss(); + }} onSecondaryActionPress={onSecondaryActionPress} + sendUserType={sendUserType} /> ) }); diff --git a/ts/features/pn/aar/components/SendAARTosComponent.tsx b/ts/features/pn/aar/components/SendAARTosComponent.tsx index 8a9ea726f89..75c9ce4b056 100644 --- a/ts/features/pn/aar/components/SendAARTosComponent.tsx +++ b/ts/features/pn/aar/components/SendAARTosComponent.tsx @@ -5,11 +5,17 @@ import { useIOSelector } from "../../../../store/hooks"; import { pnPrivacyUrlsSelector } from "../../../../store/reducers/backendStatus/remoteConfig"; import { openWebUrl } from "../../../../utils/url"; import { useSendAarFlowManager } from "../hooks/useSendAarFlowManager"; +import { trackSendAARToSDismissed } from "../analytics"; export const SendAARTosComponent = () => { const tosConfig = useIOSelector(pnPrivacyUrlsSelector); const { goToNextState, terminateFlow } = useSendAarFlowManager(); + const onSecondaryAction = () => { + trackSendAARToSDismissed(); + terminateFlow(); + }; + const bodyPropsArray: Array = [ { text: i18n.t("features.pn.aar.flow.aarTos.body.firstPart") @@ -53,7 +59,7 @@ export const SendAARTosComponent = () => { }} secondaryAction={{ label: i18n.t("features.pn.aar.flow.aarTos.secondaryAction"), - onPress: terminateFlow, + onPress: onSecondaryAction, testID: "secondary_button" }} /> diff --git a/ts/features/pn/aar/components/__mocks__/SendAARMessageDetailBottomSheet.tsx b/ts/features/pn/aar/components/__mocks__/SendAARMessageDetailBottomSheet.tsx new file mode 100644 index 00000000000..1eb8f6cad19 --- /dev/null +++ b/ts/features/pn/aar/components/__mocks__/SendAARMessageDetailBottomSheet.tsx @@ -0,0 +1,23 @@ +import { Pressable, View } from "react-native"; +import { SendAARMessageDetailBottomSheetProps } from "../SendAARMessageDetailBottomSheet"; + +export const SendAARMessageDetailBottomSheet = ({ + onPrimaryActionPress, + onSecondaryActionPress, + sendUserType +}: SendAARMessageDetailBottomSheetProps) => ( + + {`Mock SendAARMessageDetailBottomSheet`} + {`Send user type: ${sendUserType}`} + {`Mock Primary Action`} + {`Mock Secondary Action`} + +); diff --git a/ts/features/pn/aar/components/__mocks__/SendAARMessageDetailBottomSheetComponent.tsx b/ts/features/pn/aar/components/__mocks__/SendAARMessageDetailBottomSheetComponent.tsx new file mode 100644 index 00000000000..4b90f6f6bad --- /dev/null +++ b/ts/features/pn/aar/components/__mocks__/SendAARMessageDetailBottomSheetComponent.tsx @@ -0,0 +1,17 @@ +import { View } from "react-native"; +import { SendAARMessageDetailBottomSheetComponentProps } from "../SendAARMessageDetailBottomSheetComponent"; + +export const SendAARMessageDetailBottomSheetComponent = ({ + aarBottomSheetRef, + sendUserType +}: SendAARMessageDetailBottomSheetComponentProps) => { + // eslint-disable-next-line functional/immutable-data + aarBottomSheetRef.current = jest.fn(); + return ( + + {`Mock SendAARMessageDetailBottomSheetComponent`} + {`Ref container: set to jest.fn() internally`} + {`User type: ${sendUserType}`} + + ); +}; diff --git a/ts/features/pn/aar/components/__tests__/SendAARMessageDetailBottomSheet.test.tsx b/ts/features/pn/aar/components/__tests__/SendAARMessageDetailBottomSheet.test.tsx index aa1707d16b0..9b691369296 100644 --- a/ts/features/pn/aar/components/__tests__/SendAARMessageDetailBottomSheet.test.tsx +++ b/ts/features/pn/aar/components/__tests__/SendAARMessageDetailBottomSheet.test.tsx @@ -1,20 +1,21 @@ import { fireEvent } from "@testing-library/react-native"; import { createStore } from "redux"; import { applicationChangeState } from "../../../../../store/actions/application"; -import * as HOOKS from "../../../../../store/hooks"; import { appReducer } from "../../../../../store/reducers"; -import { sendVisitTheWebsiteUrlSelector } from "../../../../../store/reducers/backendStatus/remoteConfig"; import { GlobalState } from "../../../../../store/reducers/types"; import { renderScreenWithNavigationStoreContext } from "../../../../../utils/testWrapper"; -import * as URL_UTILS from "../../../../../utils/url"; import PN_ROUTES from "../../../navigation/routes"; -import { currentAARFlowData } from "../../store/selectors"; import { AARFlowState, sendAARFlowStates } from "../../utils/stateUtils"; import { sendAarMockStateFactory } from "../../utils/testUtils"; import { SendAARMessageDetailBottomSheet, SendAARMessageDetailBottomSheetProps } from "../SendAARMessageDetailBottomSheet"; +import { SendUserType } from "../../../../pushNotifications/analytics"; +import * as ANALYTICS from "../../analytics"; +import * as REMOTE_CONFIG_SELECTORS from "../../../../../store/reducers/backendStatus/remoteConfig"; +import * as SELECTORS from "../../store/selectors"; +import * as URL_UTILS from "../../../../../utils/url"; type DisplayingNotificationDataState = Extract< AARFlowState, @@ -26,50 +27,71 @@ describe("BottomSheetContent", () => { const mockOnSecondaryActionPress = jest.fn(); const defaultProps: SendAARMessageDetailBottomSheetProps = { - isDelegate: false, onPrimaryActionPress: mockOnPrimaryActionPress, - onSecondaryActionPress: mockOnSecondaryActionPress + onSecondaryActionPress: mockOnSecondaryActionPress, + sendUserType: "recipient" }; const stateWithMandateId = sendAarMockStateFactory.displayingNotificationData() as DisplayingNotificationDataState; - const stateWithoutMandateId = { - ...stateWithMandateId, - mandateId: undefined - } as DisplayingNotificationDataState; - beforeEach(() => { jest.clearAllMocks(); + jest.restoreAllMocks(); }); - it("calls openWebUrl when link is pressed", () => { - const openWebUrlSpy = jest - .spyOn(URL_UTILS, "openWebUrl") - .mockImplementation(jest.fn()); - - const mockUrl = "https://example.com/test-url"; - - jest.spyOn(HOOKS, "useIOSelector").mockImplementation(selector => { - if (selector === currentAARFlowData) { - return stateWithMandateId; - } - if (selector === sendVisitTheWebsiteUrlSelector) { - return mockUrl; - } - return undefined; - }); + const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" + ]; - const { getByTestId } = renderComponent(defaultProps); - const linkComponent = getByTestId("link"); - expect(openWebUrlSpy).toHaveBeenCalledTimes(0); - fireEvent.press(linkComponent); - expect(openWebUrlSpy).toHaveBeenCalledWith(mockUrl); - expect(openWebUrlSpy).toHaveBeenCalledTimes(1); + const mockUrl = "https://example.com/test-url"; + + sendUserTypes.forEach(sendUserType => { + it(`calls openWebUrl when link is pressed and trackSendAarNotificationClosureExit with proper parameters (user type ${sendUserType})`, () => { + const openWebUrlSpy = jest + .spyOn(URL_UTILS, "openWebUrl") + .mockImplementation(jest.fn()); + + jest + .spyOn(SELECTORS, "currentAARFlowData") + .mockImplementation(() => stateWithMandateId); + jest + .spyOn(REMOTE_CONFIG_SELECTORS, "sendVisitTheWebsiteUrlSelector") + .mockImplementation(() => mockUrl); + const spiedOnMockedTrackSendAarNotificationClosureExit = jest + .spyOn(ANALYTICS, "trackSendAarNotificationClosureExit") + .mockImplementation(); + + const { getByTestId } = renderComponent({ + ...defaultProps, + sendUserType + }); + + const linkComponent = getByTestId("link"); + expect(openWebUrlSpy).toHaveBeenCalledTimes(0); + fireEvent.press(linkComponent); + + expect(openWebUrlSpy).toHaveBeenCalledWith(mockUrl); + expect(openWebUrlSpy).toHaveBeenCalledTimes(1); + + expect( + spiedOnMockedTrackSendAarNotificationClosureExit.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackSendAarNotificationClosureExit.mock.calls[0].length + ).toBe(1); + expect( + spiedOnMockedTrackSendAarNotificationClosureExit.mock.calls[0][0] + ).toBe(sendUserType); + }); }); it("calls onPrimaryActionPress when primary button is pressed", () => { - jest.spyOn(HOOKS, "useIOSelector").mockReturnValue(stateWithMandateId); + jest + .spyOn(SELECTORS, "currentAARFlowData") + .mockImplementation(() => stateWithMandateId); const { getByTestId } = renderComponent(defaultProps); expect(mockOnPrimaryActionPress).toHaveBeenCalledTimes(0); @@ -79,7 +101,9 @@ describe("BottomSheetContent", () => { }); it("calls onSecondaryActionPress when secondary button is pressed", () => { - jest.spyOn(HOOKS, "useIOSelector").mockReturnValue(stateWithMandateId); + jest + .spyOn(SELECTORS, "currentAARFlowData") + .mockImplementation(() => stateWithMandateId); const { getByTestId } = renderComponent(defaultProps); const buttonComponent = getByTestId("secondary_button"); @@ -87,19 +111,6 @@ describe("BottomSheetContent", () => { fireEvent.press(buttonComponent); expect(mockOnSecondaryActionPress).toHaveBeenCalledTimes(1); }); - - [false, true].forEach(isDelegate => - it(`should match snapshot when isDelegate='${isDelegate}'`, () => { - jest - .spyOn(HOOKS, "useIOSelector") - .mockReturnValue( - isDelegate ? stateWithMandateId : stateWithoutMandateId - ); - - const { toJSON } = renderComponent({ ...defaultProps, isDelegate }); - expect(toJSON()).toMatchSnapshot(); - }) - ); }); const renderComponent = (props: SendAARMessageDetailBottomSheetProps) => { diff --git a/ts/features/pn/aar/components/__tests__/SendAARMessageDetailBottomSheetComponent.test.tsx b/ts/features/pn/aar/components/__tests__/SendAARMessageDetailBottomSheetComponent.test.tsx index 4c534118618..fe6256b1669 100644 --- a/ts/features/pn/aar/components/__tests__/SendAARMessageDetailBottomSheetComponent.test.tsx +++ b/ts/features/pn/aar/components/__tests__/SendAARMessageDetailBottomSheetComponent.test.tsx @@ -1,116 +1,166 @@ -import { act } from "@testing-library/react-native"; +import { fireEvent } from "@testing-library/react-native"; import { RefObject } from "react"; import { createStore } from "redux"; -import * as BACK_BUTTON from "../../../../../hooks/useHardwareBackButton"; -import * as NAVIGATION from "../../../../../navigation/params/AppParamsList"; import { applicationChangeState } from "../../../../../store/actions/application"; -import * as STORE_HOOKS from "../../../../../store/hooks"; import { appReducer } from "../../../../../store/reducers"; import { GlobalState } from "../../../../../store/reducers/types"; -import * as BOTTOM_SHEET from "../../../../../utils/hooks/bottomSheet"; import { renderScreenWithNavigationStoreContext } from "../../../../../utils/testWrapper"; +import { SendAARMessageDetailBottomSheetComponent } from "../SendAARMessageDetailBottomSheetComponent"; import { MESSAGES_ROUTES } from "../../../../messages/navigation/routes"; import PN_ROUTES from "../../../navigation/routes"; +import * as ANALYTICS from "../../analytics"; import * as BANNER from "../../../reminderBanner/reducer/bannerDismiss"; -import { SendAARMessageDetailBottomSheetComponent } from "../SendAARMessageDetailBottomSheetComponent"; -import * as SELECTORS from "../../store/selectors"; +import * as BOTTOM_SHEET from "../../../../../utils/hooks/bottomSheet"; +import * as IO_NAVIGATION from "../../../../../navigation/params/AppParamsList"; +import { SendUserType } from "../../../../pushNotifications/analytics"; -describe("SendAARMessageDetailBottomSheetComponent", () => { - const presentMock = jest.fn(); - const dismissMock = jest.fn(); - const replaceMock = jest.fn(); - const popToTopMock = jest.fn(); - const getStateMock = jest.fn(); +jest.mock("../SendAARMessageDetailBottomSheet"); + +const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" +]; +describe("SendAARMessageDetailBottomSheetComponent", () => { beforeEach(() => { jest.clearAllMocks(); + jest.restoreAllMocks(); + }); - jest.spyOn(BOTTOM_SHEET, "useIOBottomSheetModal").mockReturnValue({ - bottomSheet: <>, - present: presentMock, - dismiss: dismissMock - }); + it("should match snapshot", () => { + const { toJSON } = renderComponent("not_set"); + expect(toJSON()).toMatchSnapshot(); + }); - jest.spyOn(STORE_HOOKS, "useIOStore").mockReturnValue({ - getState: getStateMock - } as any); + it("should assign 'present' to aarBottomSheetRef on mount", () => { + const mockPresent = jest.fn(); + const refUseIOBottomSheetModal = BOTTOM_SHEET.useIOBottomSheetModal; + jest + .spyOn(BOTTOM_SHEET, "useIOBottomSheetModal") + .mockImplementation(props => { + const { bottomSheet } = refUseIOBottomSheetModal(props); + return { + bottomSheet, + dismiss: jest.fn(), + present: mockPresent + }; + }); + const { aarBottomSheetRef } = renderComponent("not_set"); + expect(aarBottomSheetRef.current).toBe(mockPresent); + }); - jest.spyOn(BACK_BUTTON, "useHardwareBackButton").mockImplementation(); + sendUserTypes.forEach(sendUserType => { + it(`should call trackSendAarNotificationClosureBack with proper parameters when the primary action is triggered (user type ${sendUserType})`, () => { + jest.restoreAllMocks(); - jest.spyOn(NAVIGATION, "useIONavigation").mockReturnValue({ - replace: replaceMock, - popToTop: popToTopMock - } as any); + const spiedOnMockedTrackSendAarNotificationClosureBack = jest + .spyOn(ANALYTICS, "trackSendAarNotificationClosureBack") + .mockImplementation(); - jest.spyOn(BANNER, "isPnServiceEnabled").mockReturnValue(false); - }); + const component = renderComponent(sendUserType); - it("should assign 'present' to aarBottomSheetRef on mount", () => { - const { aarBottomSheetRef } = renderComponent(); - expect(aarBottomSheetRef.current).toBe(presentMock); - }); + const primaryButton = component.getByTestId("primary_button"); + fireEvent.press(primaryButton); + + expect( + spiedOnMockedTrackSendAarNotificationClosureBack.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackSendAarNotificationClosureBack.mock.calls[0].length + ).toBe(1); + expect( + spiedOnMockedTrackSendAarNotificationClosureBack.mock.calls[0][0] + ).toBe(sendUserType); + }); - describe("onSecondaryActionPress navigation behavior", () => { - [false, true].forEach(isDelegate => - test.each([ - [false, "replace"], - [true, "popToTop"] - ])( - `when isPnServiceEnabled is %s and user is ${ - isDelegate ? "delegate" : "recipient" - } it calls navigation.%s`, - async (isEnabled, navigationMethod) => { - getStateMock.mockReturnValue({}); - (BANNER.isPnServiceEnabled as jest.Mock).mockReturnValue(isEnabled); - - jest - .spyOn(SELECTORS, "isAarMessageDelegatedSelector") - .mockImplementation((_state, _iun) => isDelegate); - - renderComponent(); - - await act(async () => { - ( - BOTTOM_SHEET.useIOBottomSheetModal as jest.Mock - ).mock.calls[0][0].component.props.onSecondaryActionPress(); + [undefined, false, true].forEach(sendServiceEnabled => { + it(`should call trackSendAarNotificationClosureConfirm, dismiss and ${ + sendServiceEnabled ? "popToTop" : "navigate to engagement screen" + } (user type ${sendUserType}, sendServiceEnabled ${sendServiceEnabled})`, () => { + const mockPopToTop = jest.fn(); + const mockReplace = jest.fn(); + jest.spyOn(IO_NAVIGATION, "useIONavigation").mockImplementation( + () => + ({ + popToTop: mockPopToTop, + replace: mockReplace + } as unknown as IO_NAVIGATION.IOStackNavigationProp< + IO_NAVIGATION.AppParamsList, + keyof IO_NAVIGATION.AppParamsList + >) + ); + + const mockDismiss = jest.fn(); + const refUseIOBottomSheetModal = BOTTOM_SHEET.useIOBottomSheetModal; + jest + .spyOn(BOTTOM_SHEET, "useIOBottomSheetModal") + .mockImplementation(props => { + const { bottomSheet } = refUseIOBottomSheetModal(props); + return { + bottomSheet, + dismiss: mockDismiss, + present: jest.fn() + }; }); - expect(dismissMock).toHaveBeenCalledTimes(1); - expect(dismissMock).toHaveBeenCalled(); - - if (navigationMethod === "replace") { - expect(popToTopMock.mock.calls.length).toEqual(0); - expect(replaceMock).toHaveBeenCalledTimes(1); - expect(replaceMock).toHaveBeenCalledWith( - MESSAGES_ROUTES.MESSAGES_NAVIGATOR, - { - screen: PN_ROUTES.MAIN, - params: { - screen: PN_ROUTES.ENGAGEMENT_SCREEN, - params: { - sendOpeningSource: "aar", - sendUserType: isDelegate ? "mandatory" : "recipient" - } - } + jest + .spyOn(BANNER, "isPnServiceEnabled") + .mockImplementation(() => sendServiceEnabled); + + const spiedOnMockedTrackSendAarNotificationClosureConfirm = jest + .spyOn(ANALYTICS, "trackSendAarNotificationClosureConfirm") + .mockImplementation(); + + const component = renderComponent(sendUserType); + + const secondaryButton = component.getByTestId("secondary_button"); + fireEvent.press(secondaryButton); + + expect( + spiedOnMockedTrackSendAarNotificationClosureConfirm.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackSendAarNotificationClosureConfirm.mock.calls[0] + .length + ).toBe(1); + expect( + spiedOnMockedTrackSendAarNotificationClosureConfirm.mock.calls[0][0] + ).toBe(sendUserType); + + expect(mockDismiss.mock.calls.length).toBe(1); + expect(mockDismiss.mock.calls[0].length).toBe(0); + + if (sendServiceEnabled) { + expect(mockPopToTop.mock.calls.length).toBe(1); + expect(mockPopToTop.mock.calls[0].length).toBe(0); + + expect(mockReplace.mock.calls.length).toBe(0); + } else { + expect(mockPopToTop.mock.calls.length).toBe(0); + + expect(mockReplace.mock.calls.length).toBe(1); + expect(mockReplace.mock.calls[0].length).toBe(2); + expect(mockReplace.mock.calls[0][0]).toBe( + MESSAGES_ROUTES.MESSAGES_NAVIGATOR + ); + expect(mockReplace.mock.calls[0][1]).toEqual({ + screen: PN_ROUTES.MAIN, + params: { + screen: PN_ROUTES.ENGAGEMENT_SCREEN, + params: { + sendOpeningSource: "aar", + sendUserType } - ); - } else { - expect(popToTopMock.mock.calls.length).toEqual(1); - expect(popToTopMock.mock.calls[0].length).toEqual(0); - expect(replaceMock).toHaveBeenCalledTimes(0); - } + } + }); } - ) - ); - }); - - it("should match snapshot", () => { - const { toJSON } = renderComponent(); - expect(toJSON()).toMatchSnapshot(); + }); + }); }); }); -const renderComponent = () => { +const renderComponent = (sendUserType: SendUserType) => { const globalState = appReducer(undefined, applicationChangeState("active")); const aarBottomSheetRef: RefObject<(() => void) | undefined> = { current: undefined @@ -120,7 +170,7 @@ const renderComponent = () => { () => ( ), PN_ROUTES.MESSAGE_DETAILS, diff --git a/ts/features/pn/aar/components/__tests__/SendAARTosComponent.test.tsx b/ts/features/pn/aar/components/__tests__/SendAARTosComponent.test.tsx index 8da1772791d..8039f4885c7 100644 --- a/ts/features/pn/aar/components/__tests__/SendAARTosComponent.test.tsx +++ b/ts/features/pn/aar/components/__tests__/SendAARTosComponent.test.tsx @@ -12,6 +12,7 @@ import * as FLOW_MANAGER from "../../hooks/useSendAarFlowManager"; import * as SELECTORS from "../../store/selectors"; import { sendAARFlowStates } from "../../utils/stateUtils"; import { SendAARTosComponent } from "../SendAARTosComponent"; +import * as ANALYTICS from "../../analytics"; const qrCodeMock = "TEST"; const mockPrivacyUrls = { @@ -51,13 +52,19 @@ describe("SendAARTosComponent", () => { fireEvent.press(button); expect(mockGoNextState).toHaveBeenCalledTimes(1); }); - it("quits out of the flow on secondary button press", () => { + it("quits out of the flow on secondary button press and call 'trackSendAARToSDismissed' ", () => { + const spiedOnMockedTrackSendAARToSDismissed = jest + .spyOn(ANALYTICS, "trackSendAARToSDismissed") + .mockImplementation(); + const { getByTestId } = renderComponent(qrCodeMock); const button = getByTestId("secondary_button"); expect(mockTerminateFlow).toHaveBeenCalledTimes(0); fireEvent.press(button); expect(mockTerminateFlow).toHaveBeenCalledTimes(1); + expect(spiedOnMockedTrackSendAARToSDismissed.mock.calls.length).toBe(1); + expect(spiedOnMockedTrackSendAARToSDismissed.mock.calls[0].length).toBe(0); }); it("should match snapshot", () => { const { toJSON } = renderComponent(qrCodeMock); diff --git a/ts/features/pn/aar/components/__tests__/__snapshots__/SendAARMessageDetailBottomSheet.test.tsx.snap b/ts/features/pn/aar/components/__tests__/__snapshots__/SendAARMessageDetailBottomSheet.test.tsx.snap deleted file mode 100644 index 62d070a048a..00000000000 --- a/ts/features/pn/aar/components/__tests__/__snapshots__/SendAARMessageDetailBottomSheet.test.tsx.snap +++ /dev/null @@ -1,2059 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`BottomSheetContent should match snapshot when isDelegate='false' 1`] = ` - - - - - - - - - - - - - - - PN_ROUTES_MESSAGE_DETAILS - - - - - - - - - - - - - - - - - - - - - - - - - - Conserva il codice QR, ti servirà per rileggere la notifica in app - - - - - - - - - - - - - Puoi inquadrarlo oppure caricare una sua foto su IO - - - - - - - - - - - - - Tutte le tue notifiche sono disponibili sul sito di SEND - Notifiche Digitali - - - - Vai sul sito di SEND - - - - - - - - - - Torna alla notifica - - - - - - - - - - - Chiudi la notifica - - - - - - - - - - - - - - - - - - -`; - -exports[`BottomSheetContent should match snapshot when isDelegate='true' 1`] = ` - - - - - - - - - - - - - - - PN_ROUTES_MESSAGE_DETAILS - - - - - - - - - - - - - - - - - - - - - - - - - - Conserva il codice QR, ti servirà per rileggere la notifica in app - - - - - - - - - - - - - Puoi inquadrarlo oppure caricare una sua foto su IO - - - - - - - - - - - - - Tutte le tue notifiche e quelle per cui hai una delega sono disponibili sul sito di SEND - Notifiche Digitali - - - - Vai sul sito di SEND - - - - - - - - - - Torna alla notifica - - - - - - - - - - - Chiudi la notifica - - - - - - - - - - - - - - - - - - -`; diff --git a/ts/features/pn/aar/components/__tests__/__snapshots__/SendAARMessageDetailBottomSheetComponent.test.tsx.snap b/ts/features/pn/aar/components/__tests__/__snapshots__/SendAARMessageDetailBottomSheetComponent.test.tsx.snap index e25542e4192..59e0005d6c2 100644 --- a/ts/features/pn/aar/components/__tests__/__snapshots__/SendAARMessageDetailBottomSheetComponent.test.tsx.snap +++ b/ts/features/pn/aar/components/__tests__/__snapshots__/SendAARMessageDetailBottomSheetComponent.test.tsx.snap @@ -365,7 +365,131 @@ exports[`SendAARMessageDetailBottomSheetComponent should match snapshot 1`] = ` "flex": 1, } } - /> + > + + + + + + Mock SendAARMessageDetailBottomSheet + + + Send user type: not_set + + + Mock Primary Action + + + Mock Secondary Action + + + + + + + diff --git a/ts/features/pn/aar/components/errors/SendAARErrorComponent.tsx b/ts/features/pn/aar/components/errors/SendAARErrorComponent.tsx index 6bc251b9896..7c045791a60 100644 --- a/ts/features/pn/aar/components/errors/SendAARErrorComponent.tsx +++ b/ts/features/pn/aar/components/errors/SendAARErrorComponent.tsx @@ -29,6 +29,12 @@ import { currentAARFlowStateErrorDebugInfoSelector } from "../../store/selectors"; import { useDebugInfo } from "../../../../../hooks/useDebugInfo"; +import { + trackSendAarErrorScreenClosure, + trackSendAarErrorScreenDetails, + trackSendAarErrorScreenDetailsCode, + trackSendAarErrorScreenDetailsHelp +} from "../../analytics"; const bottomComponent = ( onAssistancePress: () => void, @@ -65,7 +71,10 @@ const bottomComponent = ( icon="ladybug" value={assistanceErrorCode} numberOfLines={2} - onPress={() => clipboardSetStringWithFeedback(assistanceErrorCode)} + onPress={() => { + trackSendAarErrorScreenDetailsCode(); + clipboardSetStringWithFeedback(assistanceErrorCode); + }} testID="error_code_value" /> @@ -82,6 +91,8 @@ export const SendAARErrorComponent = () => { ); const zendeskAssistanceLogAndStart = () => { + trackSendAarErrorScreenDetailsHelp(); + dismiss(); resetCustomFields(); resetLog(); @@ -124,12 +135,18 @@ export const SendAARErrorComponent = () => { subtitle={I18n.t("features.pn.aar.flow.ko.GENERIC.body")} action={{ label: I18n.t("features.pn.aar.flow.ko.GENERIC.primaryAction"), - onPress: terminateFlow, + onPress: () => { + trackSendAarErrorScreenClosure(); + terminateFlow(); + }, testID: "primary_button" }} secondaryAction={{ label: I18n.t("features.pn.aar.flow.ko.GENERIC.secondaryAction"), - onPress: present, + onPress: () => { + trackSendAarErrorScreenDetails(); + present(); + }, testID: "secondary_button" }} /> diff --git a/ts/features/pn/aar/components/errors/SendAARNotAddresseeComponent.tsx b/ts/features/pn/aar/components/errors/SendAARNotAddresseeComponent.tsx index b8369ecc8f9..71b179b32d3 100644 --- a/ts/features/pn/aar/components/errors/SendAARNotAddresseeComponent.tsx +++ b/ts/features/pn/aar/components/errors/SendAARNotAddresseeComponent.tsx @@ -4,14 +4,23 @@ import { useIOSelector } from "../../../../../store/hooks"; import { sendAARDelegateUrlSelector } from "../../../../../store/reducers/backendStatus/remoteConfig"; import { openWebUrl } from "../../../../../utils/url"; import { useSendAarFlowManager } from "../../hooks/useSendAarFlowManager"; +import { + trackSendAARAccessDeniedDelegateInfo, + trackSendAARAccessDeniedDismissed +} from "../../analytics"; export const SendAARNotAddresseeComponent = () => { const { terminateFlow } = useSendAarFlowManager(); const delegateUrl = useIOSelector(sendAARDelegateUrlSelector); const handlePrimaryButton = () => { + trackSendAARAccessDeniedDelegateInfo(); openWebUrl(delegateUrl); }; + const handleSecondaryAction = () => { + trackSendAARAccessDeniedDismissed(); + terminateFlow(); + }; return ( { label: I18n.t( "features.pn.aar.flow.ko.notAddresseeFinal.secondaryAction" ), - onPress: terminateFlow, + onPress: handleSecondaryAction, testID: "secondary_button" }} /> diff --git a/ts/features/pn/aar/components/errors/__tests__/SendAARErrorComponent.test.tsx b/ts/features/pn/aar/components/errors/__tests__/SendAARErrorComponent.test.tsx index 05ffeff85bf..3a8f1da9fc5 100644 --- a/ts/features/pn/aar/components/errors/__tests__/SendAARErrorComponent.test.tsx +++ b/ts/features/pn/aar/components/errors/__tests__/SendAARErrorComponent.test.tsx @@ -21,6 +21,7 @@ import { testable } from "../../errors/SendAARErrorComponent"; import * as debugHooks from "../../../../../../hooks/useDebugInfo"; +import * as ANALYTICS from "../../../analytics"; const { bottomComponent } = testable!; @@ -50,14 +51,27 @@ describe("SendAARErrorComponent - Full Test Suite", () => { jest.restoreAllMocks(); }); - it("quits out of the flow on primary button press", () => { + it("quits out of the flow on primary button press and calls trackSendAarErrorScreenClosure", () => { + const spiedOnMockedTrackSendAarErrorScreenClosure = jest + .spyOn(ANALYTICS, "trackSendAarErrorScreenClosure") + .mockImplementation(); + const { getByTestId } = renderComponent(); + const button = getByTestId("primary_button"); fireEvent.press(button); + expect(mockTerminateFlow).toHaveBeenCalledTimes(1); + + expect(spiedOnMockedTrackSendAarErrorScreenClosure.mock.calls.length).toBe( + 1 + ); + expect( + spiedOnMockedTrackSendAarErrorScreenClosure.mock.calls[0].length + ).toBe(0); }); - it("calls present() on secondary button press", () => { + it("calls present() and trackSendAarErrorScreenDetails on secondary button press", () => { const presentMock = jest.fn(); const dismissMock = jest.fn(); jest.spyOn(BOTTOM_SHEET, "useIOBottomSheetModal").mockReturnValue({ @@ -65,14 +79,26 @@ describe("SendAARErrorComponent - Full Test Suite", () => { present: presentMock, dismiss: dismissMock }); + const spiedOnMockedTrackSendAarErrorScreenDetails = jest + .spyOn(ANALYTICS, "trackSendAarErrorScreenDetails") + .mockImplementation(); const { getByTestId } = renderComponent(); + const button = getByTestId("secondary_button"); fireEvent.press(button); + expect(presentMock).toHaveBeenCalledTimes(1); + + expect(spiedOnMockedTrackSendAarErrorScreenDetails.mock.calls.length).toBe( + 1 + ); + expect( + spiedOnMockedTrackSendAarErrorScreenDetails.mock.calls[0].length + ).toBe(0); }); - it("calls present() on assistance button press", () => { + it("calls the primary callback on assistance button press", () => { const renderedBottomComponent = bottomComponent( mockAssistance, assistanceErrorCode @@ -87,8 +113,10 @@ describe("SendAARErrorComponent - Full Test Suite", () => { }); const { getByTestId } = renderComponent(); + const button = getByTestId("button_assistance"); fireEvent.press(button); + expect(mockAssistance).toHaveBeenCalledTimes(1); }); @@ -97,11 +125,14 @@ describe("SendAARErrorComponent - Full Test Suite", () => { expect(getByText(assistanceErrorCode)).toBeTruthy(); }); - it("copies error codes to clipboard on press", async () => { + it("copies error codes to clipboard on press and calls trackSendAarErrorScreenDetailsCode", async () => { const clipboardSpy = jest.spyOn( CLIPBOARD, "clipboardSetStringWithFeedback" ); + const spiedOnMockedTrackSendAarErrorScreenDetailsCode = jest + .spyOn(ANALYTICS, "trackSendAarErrorScreenDetailsCode") + .mockImplementation(); const { getByText } = renderComponent(); const copyButton = getByText(assistanceErrorCode); @@ -109,6 +140,12 @@ describe("SendAARErrorComponent - Full Test Suite", () => { fireEvent.press(copyButton); expect(clipboardSpy).toHaveBeenCalledWith(assistanceErrorCode); + expect( + spiedOnMockedTrackSendAarErrorScreenDetailsCode.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackSendAarErrorScreenDetailsCode.mock.calls[0].length + ).toBe(0); }); it("does not render error code section when assistanceErrorCode is empty", async () => { @@ -158,6 +195,10 @@ describe("SendAARErrorComponent - Full Test Suite", () => { return { present, bottomSheet, dismiss: dismissMock }; }); + const spiedOnMockedTrackSendAarErrorScreenDetailsHelp = jest + .spyOn(ANALYTICS, "trackSendAarErrorScreenDetailsHelp") + .mockImplementation(); + const resetCustomFields = jest.spyOn( SUPPORT_ASSISTANCE, "resetCustomFields" @@ -173,6 +214,13 @@ describe("SendAARErrorComponent - Full Test Suite", () => { const buttonAssistance = getByTestId("button_assistance"); fireEvent.press(buttonAssistance); + expect( + spiedOnMockedTrackSendAarErrorScreenDetailsHelp.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackSendAarErrorScreenDetailsHelp.mock.calls[0].length + ).toBe(0); + expect(dismissMock).toHaveBeenCalledTimes(1); expect(resetCustomFields).toHaveBeenCalledTimes(1); diff --git a/ts/features/pn/aar/components/errors/__tests__/SendAARNotAddresseeComponent.test.tsx b/ts/features/pn/aar/components/errors/__tests__/SendAARNotAddresseeComponent.test.tsx index ddd7e65383a..10792455d65 100644 --- a/ts/features/pn/aar/components/errors/__tests__/SendAARNotAddresseeComponent.test.tsx +++ b/ts/features/pn/aar/components/errors/__tests__/SendAARNotAddresseeComponent.test.tsx @@ -1,7 +1,6 @@ import { fireEvent } from "@testing-library/react-native"; import { createStore } from "redux"; import { applicationChangeState } from "../../../../../../store/actions/application"; -import * as HOOKS from "../../../../../../store/hooks"; import { appReducer } from "../../../../../../store/reducers"; import { GlobalState } from "../../../../../../store/reducers/types"; import { renderScreenWithNavigationStoreContext } from "../../../../../../utils/testWrapper"; @@ -9,16 +8,13 @@ import * as URL_UTILS from "../../../../../../utils/url"; import PN_ROUTES from "../../../../navigation/routes"; import * as FLOW_MANAGER from "../../../hooks/useSendAarFlowManager"; import { SendAARNotAddresseeComponent } from "../SendAARNotAddresseeComponent"; +import * as SELECTORS from "../../../../../../store/reducers/backendStatus/remoteConfig"; +import * as ANALYTICS from "../../../analytics"; const managerSpy = jest.spyOn(FLOW_MANAGER, "useSendAarFlowManager"); const mockOpenWebUrl = jest.spyOn(URL_UTILS, "openWebUrl").mockImplementation(); const mockDelegateUrl = "https://www.test.io"; -jest.mock("../../../../../../store/hooks", () => ({ - ...jest.requireActual("../../../../../../store/hooks"), - useIOSelector: jest.fn() -})); - describe("SendAARTosComponent", () => { const mockGoNextState = jest.fn(); const mockTerminateFlow = jest.fn(); @@ -35,21 +31,48 @@ describe("SendAARTosComponent", () => { jest.clearAllMocks(); }); - it("goes to open url when the button is pressed", () => { - (HOOKS.useIOSelector as jest.Mock).mockReturnValue(mockDelegateUrl); + it("goes to open url when the button is pressed and calls trackSendAARAccessDeniedDelegateInfo", () => { + jest + .spyOn(SELECTORS, "sendAARDelegateUrlSelector") + .mockImplementation(_state => mockDelegateUrl); + const spiedOnMockedTrackSendAARAccessDeniedDelegateInfo = jest + .spyOn(ANALYTICS, "trackSendAARAccessDeniedDelegateInfo") + .mockImplementation(); + const { getByTestId } = renderComponent(); + const button = getByTestId("primary_button"); expect(mockOpenWebUrl).toHaveBeenCalledTimes(0); fireEvent.press(button); + expect(mockOpenWebUrl).toHaveBeenCalledTimes(1); expect(mockOpenWebUrl).toHaveBeenCalledWith(mockDelegateUrl); + + expect( + spiedOnMockedTrackSendAARAccessDeniedDelegateInfo.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackSendAARAccessDeniedDelegateInfo.mock.calls[0].length + ).toBe(0); }); - it("quits out of the flow on secondary button press", () => { + it("quits out of the flow on secondary button press and calls trackSendAARAccessDeniedDismissed", () => { + const spiedOnMockedTrackSendAARAccessDeniedDismissed = jest + .spyOn(ANALYTICS, "trackSendAARAccessDeniedDismissed") + .mockImplementation(); + const { getByTestId } = renderComponent(); + const button = getByTestId("secondary_button"); expect(mockTerminateFlow).toHaveBeenCalledTimes(0); fireEvent.press(button); expect(mockTerminateFlow).toHaveBeenCalledTimes(1); + + expect( + spiedOnMockedTrackSendAARAccessDeniedDismissed.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackSendAARAccessDeniedDismissed.mock.calls[0].length + ).toBe(0); }); it("should match snapshot", () => { const { toJSON } = renderComponent(); diff --git a/ts/features/pn/aar/hooks/__tests__/useSendAarFlowManager.test.tsx b/ts/features/pn/aar/hooks/__tests__/useSendAarFlowManager.test.tsx index 78144becc4d..c429acb59a0 100644 --- a/ts/features/pn/aar/hooks/__tests__/useSendAarFlowManager.test.tsx +++ b/ts/features/pn/aar/hooks/__tests__/useSendAarFlowManager.test.tsx @@ -9,6 +9,7 @@ import { import { testable, useSendAarFlowManager } from "../useSendAarFlowManager"; import { sendAarMockStates } from "../../utils/testUtils"; import { ServiceId } from "../../../../../../definitions/backend/ServiceId"; +import * as ANALYTICS from "../../analytics"; const mockPopToTop = jest.fn(); const mockReset = jest.fn(); @@ -48,7 +49,12 @@ describe("useSendAarFlowManager", () => { ); }); Object.values(sendAARFlowStates).forEach(stateKind => { - it(`should navigate to a valid state when calling "goToNextState" when the state type is ${stateKind}`, () => { + it(`should navigate to a valid state when calling "goToNextState" when the state type is ${stateKind} and ${ + stateKind === sendAARFlowStates.displayingAARToS ? "" : "not " + }call trackSendAARToSAccepted`, () => { + const spiedOnMockedTrackSendAARToSAccepted = jest + .spyOn(ANALYTICS, "trackSendAARToSAccepted") + .mockImplementation(); mockSelector.mockImplementation( () => ({ @@ -66,10 +72,19 @@ describe("useSendAarFlowManager", () => { stateKind, mockDispatch.mock.calls[0][0].payload.type as AARFlowStateName ); + expect(spiedOnMockedTrackSendAARToSAccepted.mock.calls.length).toBe( + 1 + ); + expect( + spiedOnMockedTrackSendAARToSAccepted.mock.calls[0].length + ).toBe(0); expect(mockDispatch).toHaveBeenCalledTimes(1); expect(isValid).toBe(true); break; default: + expect(spiedOnMockedTrackSendAARToSAccepted.mock.calls.length).toBe( + 0 + ); expect(mockDispatch).not.toHaveBeenCalled(); break; } diff --git a/ts/features/pn/aar/hooks/useSendAarFlowManager.tsx b/ts/features/pn/aar/hooks/useSendAarFlowManager.tsx index ceb108518b5..4b87c987d4e 100644 --- a/ts/features/pn/aar/hooks/useSendAarFlowManager.tsx +++ b/ts/features/pn/aar/hooks/useSendAarFlowManager.tsx @@ -5,6 +5,7 @@ import { setAarFlowState, terminateAarFlow } from "../store/actions"; import { currentAARFlowData } from "../store/selectors"; import { AARFlowState, sendAARFlowStates } from "../utils/stateUtils"; import { isTestEnv } from "../../../../utils/environment"; +import { trackSendAARToSAccepted } from "../analytics"; type SendAarFlowManager = { terminateFlow: () => void; @@ -41,6 +42,7 @@ export const useSendAarFlowManager = (): SendAarFlowManager => { const goToNextState = () => { switch (currentFlowData.type) { case sendAARFlowStates.displayingAARToS: + trackSendAARToSAccepted(); dispatch( setAarFlowState({ type: sendAARFlowStates.fetchingQRData, diff --git a/ts/features/pn/aar/saga/__tests__/fetchNotificationDataSaga.test.ts b/ts/features/pn/aar/saga/__tests__/fetchNotificationDataSaga.test.ts index 87e6a52f00e..179fbbe7c97 100644 --- a/ts/features/pn/aar/saga/__tests__/fetchNotificationDataSaga.test.ts +++ b/ts/features/pn/aar/saga/__tests__/fetchNotificationDataSaga.test.ts @@ -1,18 +1,13 @@ -import { NonEmptyString } from "@pagopa/ts-commons/lib/strings"; import * as E from "fp-ts/lib/Either"; import _ from "lodash"; import { testSaga } from "redux-saga-test-plan"; -import { call } from "typed-redux-saga"; -import { ThirdPartyMessage as PnThirdPartyMessage } from "../../../../../../definitions/pn/ThirdPartyMessage"; import { AARProblemJson } from "../../../../../../definitions/pn/aar/AARProblemJson"; -import { ThirdPartyMessage as AarThirdPartyMessage } from "../../../../../../definitions/pn/aar/ThirdPartyMessage"; +import { ThirdPartyMessage } from "../../../../../../definitions/pn/aar/ThirdPartyMessage"; import { pnMessagingServiceIdSelector } from "../../../../../store/reducers/backendStatus/remoteConfig"; import { isPnTestEnabledSelector } from "../../../../../store/reducers/persistedPreferences"; import { SessionToken } from "../../../../../types/SessionToken"; import { withRefreshApiCall } from "../../../../authentication/fastLogin/saga/utils"; -import * as serviceDetailsSaga from "../../../../services/common/saga/getServiceDetails"; import { profileFiscalCodeSelector } from "../../../../settings/common/store/selectors"; -import { thirdPartyMessage } from "../../../__mocks__/pnMessage"; import { trackSendAARFailure } from "../../analytics"; import { SendAARClient } from "../../api/client"; import { @@ -27,6 +22,8 @@ import { sendAarMockStates } from "../../utils/testUtils"; import { fetchAarDataSaga, testable } from "../fetchNotificationDataSaga"; +import { trackPNNotificationLoadSuccess } from "../../../analytics"; +import { getServiceDetails } from "../../../../services/common/saga/getServiceDetails"; const mockCurrentState = { type: sendAARFlowStates.fetchingNotificationData, @@ -45,13 +42,41 @@ const fetchingNotificationDataRequestAction = setAarFlowState( const { aarMessageDataPayloadFromResponse } = testable!; const mockSessionToken = "token" as SessionToken; const mockSessionTokenWithBearer = `Bearer ${mockSessionToken}` as SessionToken; -const mockNotification = { foo: "bar" }; +const mockIUn = "01K83208Z4CPBJXPFH7X9GDDMK"; +const mockSubject = "Message subject"; +const mockFiscalCode = "NMUVCN66S01F138R"; +const mockSendMessage = { + attachments: [{ id: "1", url: "https://an.url/path" }], + details: { + subject: mockSubject, + iun: mockIUn, + recipients: [ + { + recipientType: "", + taxId: mockFiscalCode, + denomination: "A denomination", + payment: { + noticeCode: "111122223333444400", + creditorTaxId: "01234567890" + } + } + ], + notificationStatusHistory: [ + { + status: "ACCEPTED", + activeFrom: new Date(), + relatedTimelineElements: [ + "xo4h59s49o95a215uhd3o35453u32o435uqhwod84s6d4" + ] + } + ] + } +} as unknown as ThirdPartyMessage; const mockResolvedCall = (resolved: any) => new Promise((res, _reject) => res(resolved)) as unknown as ReturnType< SendAARClient["getAARNotification"] >; - describe("fetchAarDataSaga", () => { describe("error paths", () => { it("should early return if state is not fetchingNotificationData", () => { @@ -72,7 +97,6 @@ describe("fetchAarDataSaga", () => { .next() .isDone(); }); - it("should handle left result and set KO state", () => { const mockFailure = E.left([]); const fetchData = jest @@ -118,7 +142,6 @@ describe("fetchAarDataSaga", () => { isTest: true }); }); - it("should handle status !== 200 and set KO state", () => { const mockResolved = { status: 400, @@ -263,8 +286,8 @@ describe("fetchAarDataSaga", () => { }); }); describe("200 status path", () => { - it("should handle a non-parsable success payload and return", () => { - const mockValue = E.right({ status: 200, value: mockNotification }); + it("should handle a successfull notification retrieval but failing when aggregating extra data", () => { + const mockValue = E.right({ status: 200, value: mockSendMessage }); const fetchData = jest.fn().mockReturnValue(mockResolvedCall(mockValue)); testSaga( fetchAarDataSaga, @@ -285,7 +308,7 @@ describe("fetchAarDataSaga", () => { .next(mockValue) .call( aarMessageDataPayloadFromResponse, - mockNotification, + mockSendMessage, mockCurrentState.mandateId ) .next(E.left("Unable to retrieve user fiscal code")) @@ -319,7 +342,7 @@ describe("fetchAarDataSaga", () => { }); it("should handle a parsable success payload and dispatch the correct actions", () => { const mockPayload = mockEphemeralAarMessageDataActionPayload; - const mockValue = E.right({ status: 200, value: mockNotification }); + const mockValue = E.right({ status: 200, value: mockSendMessage }); const fetchData = jest.fn().mockReturnValue(mockResolvedCall(mockValue)); testSaga( fetchAarDataSaga, @@ -340,7 +363,7 @@ describe("fetchAarDataSaga", () => { .next(mockValue) .call( aarMessageDataPayloadFromResponse, - mockNotification, + mockSendMessage, mockCurrentState.mandateId ) .next(E.right(mockPayload)) @@ -349,7 +372,7 @@ describe("fetchAarDataSaga", () => { .put( setAarFlowState({ type: sendAARFlowStates.displayingNotificationData, - notification: mockNotification, + notification: mockSendMessage, recipientInfo: mockCurrentState.recipientInfo, mandateId: mockPayload.mandateId, iun: mockPayload.iun, @@ -371,136 +394,102 @@ describe("fetchAarDataSaga", () => { }); describe("aarMessageDataPayloadFromResponse", () => { - it("should return left etiher if no pnServiceId can be found in the store", () => { - testSaga( - aarMessageDataPayloadFromResponse, - mockNotification, - mockCurrentState.mandateId - ) - .next() - .select(profileFiscalCodeSelector) - .next("CF") - .select(pnMessagingServiceIdSelector) - .next(undefined) - .returns(E.left("Unable to retrieve sendServiceId")); - }); - it("should return left either if no fiscalCode can be found in the store", () => { - testSaga( - aarMessageDataPayloadFromResponse, - mockNotification, - mockCurrentState.mandateId - ) - .next() - .select(profileFiscalCodeSelector) - .next(undefined) - .returns(E.left(`Unable to retrieve user fiscal code`)); - }); - it("should return left either if an invalid message has been passed as parameter", () => { - testSaga( - aarMessageDataPayloadFromResponse, - { - details: { notificationStatusHistory: "WRONG_DATA_KIND" } - } as unknown as AarThirdPartyMessage, - mockCurrentState.iun - ) - .next() - .select(profileFiscalCodeSelector) - .next("CF") - .select(pnMessagingServiceIdSelector) - .next("SID") - // function fails to decode the message - .returns( - E.left( - `Unable to decode AAR notification into SEND ThirdPartyMessage (value undefined at root.details.subject is not a valid [string]\nvalue undefined at root.details.iun is not a valid [string]\nvalue undefined at root.details.recipients is not a valid [array of NotificationRecipient]\nvalue "WRONG_DATA_KIND" at root.details.notificationStatusHistory is not a valid [array of NotificationStatusHistoryElement])` + [undefined, mockCurrentState.mandateId].forEach(mandateId => { + it(`should return a left either if the 'details' field in the message data is missing (mandateId ${mandateId})`, () => { + const { details, ...rest } = mockSendMessage; + testSaga(aarMessageDataPayloadFromResponse, rest, mandateId) + .next() + .returns(E.left(`Field 'details' in the AAR Notification is missing`)); + }); + it(`should return a left either if no pnServiceId can be found in the store (mandateId ${mandateId})`, () => { + testSaga(aarMessageDataPayloadFromResponse, mockSendMessage, mandateId) + .next() + .call( + trackPNNotificationLoadSuccess, + true, + "ACCEPTED", + "aar", + mandateId != null ? "mandatory" : "recipient" ) - ); - }); - it("should return left either if SEND service preferences cannot be retrieved", () => { - const mockFn = jest.fn(); - const getDetails = function* (_sid: NonEmptyString) { - yield* call(mockFn); - return undefined; - }; - jest - .spyOn(serviceDetailsSaga, "getServiceDetails") - .mockImplementation(getDetails); - - testSaga( - aarMessageDataPayloadFromResponse, - mockNotification, - mockCurrentState.mandateId - ) - .next() - .select(profileFiscalCodeSelector) - .next("CF") - .select(pnMessagingServiceIdSelector) - .next("SID") - .call(mockFn) - .next(undefined) - .returns(E.left(`Unable to retrieve SEND service details`)); - }); - it("should return left either if a message without a valid `details` key has been passed as parameter", () => { - const message = _.omit( - thirdPartyMessage.third_party_message as PnThirdPartyMessage, - "details" - ); - const mockFn = jest.fn(); - const getDetails = function* (_sid: NonEmptyString) { - yield* call(mockFn); - return { id: "SID" } as any; - } as typeof serviceDetailsSaga.getServiceDetails; - jest - .spyOn(serviceDetailsSaga, "getServiceDetails") - .mockImplementation(getDetails); - - testSaga( - aarMessageDataPayloadFromResponse, - message as AarThirdPartyMessage, - mockCurrentState.mandateId - ) - .next() - .select(profileFiscalCodeSelector) - .next("CF") - .select(pnMessagingServiceIdSelector) - .next("SID") - .call(mockFn) - .next({ id: "SID" } as any) - .returns(E.left(`Field 'details' in the AAR Notification is missing`)); - }); - it("should return a right either with mapped object if a message with the required keys has been passed as parameter", () => { - const message = - thirdPartyMessage.third_party_message as PnThirdPartyMessage; - const mockFn = jest.fn(); - const getDetails = function* (_sid: NonEmptyString) { - yield* call(mockFn); - return { id: "SID" } as any; - } as typeof serviceDetailsSaga.getServiceDetails; - jest - .spyOn(serviceDetailsSaga, "getServiceDetails") - .mockImplementation(getDetails); - - testSaga( - aarMessageDataPayloadFromResponse, - message as AarThirdPartyMessage, - mockCurrentState.mandateId - ) - .next() - .select(profileFiscalCodeSelector) - .next("CF") - .select(pnMessagingServiceIdSelector) - .next("SID") - .call(mockFn) - .next({ id: "SID" } as any) - .returns( - E.right({ - iun: message.details?.iun, - thirdPartyMessage: message, - fiscalCode: message.details?.recipients?.[0]?.taxId ?? "CF", - pnServiceID: "SID", - markdown: "*".repeat(81) as NonEmptyString, - subject: message.details?.subject, - mandateId: mockCurrentState.mandateId - }) - ); + .next() + .select(pnMessagingServiceIdSelector) + .next(undefined) + .returns(E.left(`Unable to retrieve sendServiceId`)); + }); + it(`should return a left either if pnServiceDetails cannot be found or fetched (mandateId ${mandateId})`, () => { + testSaga(aarMessageDataPayloadFromResponse, mockSendMessage, mandateId) + .next() + .call( + trackPNNotificationLoadSuccess, + true, + "ACCEPTED", + "aar", + mandateId != null ? "mandatory" : "recipient" + ) + .next() + .select(pnMessagingServiceIdSelector) + .next(mockEphemeralAarMessageDataActionPayload.pnServiceID) + .call( + getServiceDetails, + mockEphemeralAarMessageDataActionPayload.pnServiceID + ) + .next(undefined) + .returns(E.left(`Unable to retrieve SEND service details`)); + }); + it(`should return a left either if no fiscal code can be found in the store (mandateId ${mandateId})`, () => { + testSaga(aarMessageDataPayloadFromResponse, mockSendMessage, mandateId) + .next() + .call( + trackPNNotificationLoadSuccess, + true, + "ACCEPTED", + "aar", + mandateId != null ? "mandatory" : "recipient" + ) + .next() + .select(pnMessagingServiceIdSelector) + .next(mockEphemeralAarMessageDataActionPayload.pnServiceID) + .call( + getServiceDetails, + mockEphemeralAarMessageDataActionPayload.pnServiceID + ) + .next({}) + .select(profileFiscalCodeSelector) + .next(undefined) + .returns(E.left(`Unable to retrieve user fiscal code`)); + }); + it(`should return a right either if a message with the required keys has been passed as parameter (mandateId ${mandateId})`, () => { + testSaga(aarMessageDataPayloadFromResponse, mockSendMessage, mandateId) + .next() + .call( + trackPNNotificationLoadSuccess, + true, + "ACCEPTED", + "aar", + mandateId != null ? "mandatory" : "recipient" + ) + .next() + .select(pnMessagingServiceIdSelector) + .next(mockEphemeralAarMessageDataActionPayload.pnServiceID) + .call( + getServiceDetails, + mockEphemeralAarMessageDataActionPayload.pnServiceID + ) + .next({}) + .select(profileFiscalCodeSelector) + .next(mockFiscalCode) + .returns( + E.right({ + iun: mockIUn, + thirdPartyMessage: mockSendMessage, + fiscalCode: mockFiscalCode, + pnServiceID: mockEphemeralAarMessageDataActionPayload.pnServiceID, + markdown: + "*********************************************************************************", + subject: mockSubject, + mandateId + }) + ); + }); }); }); diff --git a/ts/features/pn/aar/saga/fetchNotificationDataSaga.ts b/ts/features/pn/aar/saga/fetchNotificationDataSaga.ts index 716c590f930..5377e7178ac 100644 --- a/ts/features/pn/aar/saga/fetchNotificationDataSaga.ts +++ b/ts/features/pn/aar/saga/fetchNotificationDataSaga.ts @@ -4,8 +4,6 @@ import { readableReportSimplified } from "@pagopa/ts-commons/lib/reporters"; import { call, put, select } from "typed-redux-saga/macro"; import { MessageBodyMarkdown } from "../../../../../definitions/backend/MessageBodyMarkdown"; import { MessageSubject } from "../../../../../definitions/backend/MessageSubject"; -import { ThirdPartyMessage as PnThirdPartyMessage } from "../../../../../definitions/pn/ThirdPartyMessage"; -import { ThirdPartyMessage as AarThirdPartyMessage } from "../../../../../definitions/pn/aar/ThirdPartyMessage"; import { pnMessagingServiceIdSelector } from "../../../../store/reducers/backendStatus/remoteConfig"; import { isPnTestEnabledSelector } from "../../../../store/reducers/persistedPreferences"; import { SessionToken } from "../../../../types/SessionToken"; @@ -22,6 +20,9 @@ import { } from "../store/actions"; import { currentAARFlowData } from "../store/selectors"; import { SendAARFailurePhase, sendAARFlowStates } from "../utils/stateUtils"; +import { trackPNNotificationLoadSuccess } from "../../analytics"; +import { SendUserType } from "../../../pushNotifications/analytics"; +import { ThirdPartyMessage } from "../../../../../definitions/pn/aar/ThirdPartyMessage"; import { aarProblemJsonAnalyticsReport, trackSendAARFailure @@ -44,14 +45,14 @@ export function* fetchAarDataSaga( ); return; } - const isTest = yield* select(isPnTestEnabledSelector); + const isSendUATEnvironment = yield* select(isPnTestEnabledSelector); try { const fetchAarRequest = fetchData({ Bearer: `Bearer ${sessionToken}`, iun: currentState.iun, mandateId: currentState.mandateId, "x-pagopa-pn-io-src": "QRCODE", - isTest + isTest: isSendUATEnvironment }); const result = (yield* call( withRefreshApiCall, @@ -144,51 +145,57 @@ export function* fetchAarDataSaga( } function* aarMessageDataPayloadFromResponse( - value: AarThirdPartyMessage, + sendMessage: ThirdPartyMessage, mandateId: string | undefined ): Generator< ReduxSagaEffect, E.Either > { - const fiscalCode = yield* select(profileFiscalCodeSelector); - if (fiscalCode === undefined) { - return E.left(`Unable to retrieve user fiscal code`); - } + const sendUserType: SendUserType = + mandateId != null ? "mandatory" : "recipient"; - const pnServiceID = yield* select(pnMessagingServiceIdSelector); - if (pnServiceID === undefined) { - return E.left(`Unable to retrieve sendServiceId`); + const details = sendMessage.details; + if (details == null) { + return E.left(`Field 'details' in the AAR Notification is missing`); } - const sendMessageEither = PnThirdPartyMessage.decode(value); - if (E.isLeft(sendMessageEither)) { - return E.left( - `Unable to decode AAR notification into SEND ThirdPartyMessage (${readableReportSimplified( - sendMessageEither.left - )})` - ); + // Notification data has been properly retrieved + const hasAttachments = + sendMessage.attachments != null && sendMessage.attachments.length > 0; + const timelineOrUndefined = sendMessage.details?.notificationStatusHistory; + const lastTimelineStatus = + timelineOrUndefined != null && timelineOrUndefined.length > 0 + ? timelineOrUndefined[timelineOrUndefined.length - 1].status + : undefined; + yield* call( + trackPNNotificationLoadSuccess, + hasAttachments, + lastTimelineStatus, + "aar", + sendUserType + ); + + // Service details (will be displayed in the SEND notification screen) + const sendServiceID = yield* select(pnMessagingServiceIdSelector); + if (sendServiceID === undefined) { + return E.left(`Unable to retrieve sendServiceId`); } - // Make sure that the SEND service details are loaded. They are - // not needed here but in the SEND notification screen in order - // to display service details - const sendServiceDetails = yield* getServiceDetails(pnServiceID); + const sendServiceDetails = yield* call(getServiceDetails, sendServiceID); if (sendServiceDetails === undefined) { return E.left(`Unable to retrieve SEND service details`); } - const sendMessage = sendMessageEither.right; - const details = sendMessage.details; - if (details == null) { - return E.left(`Field 'details' in the AAR Notification is missing`); + const fiscalCode = yield* select(profileFiscalCodeSelector); + if (fiscalCode === undefined) { + return E.left(`Unable to retrieve user fiscal code`); } - const recipients = details?.recipients; const aarFlowState: EphemeralAarMessageDataActionPayload = { iun: details.iun as NonEmptyString, thirdPartyMessage: sendMessage, - fiscalCode: recipients?.[0]?.taxId ?? fiscalCode, - pnServiceID, + fiscalCode, + pnServiceID: sendServiceID, markdown: "*".repeat(81) as MessageBodyMarkdown, subject: details.subject as MessageSubject, mandateId diff --git a/ts/features/pn/aar/screen/SendAARErrorScreen.tsx b/ts/features/pn/aar/screen/SendAARErrorScreen.tsx index d44faa1cbff..eb6154eeae4 100644 --- a/ts/features/pn/aar/screen/SendAARErrorScreen.tsx +++ b/ts/features/pn/aar/screen/SendAARErrorScreen.tsx @@ -1,12 +1,20 @@ +import { useEffect } from "react"; import { useIOSelector } from "../../../../store/hooks"; import { SendAARErrorComponent } from "../components/errors/SendAARErrorComponent"; import { SendAARNotAddresseeComponent } from "../components/errors/SendAARNotAddresseeComponent"; import { currentAARFlowStateType } from "../store/selectors"; import { sendAARFlowStates } from "../utils/stateUtils"; +import { trackSendAARAccessDeniedScreenView } from "../analytics"; export const SendAARErrorScreen = () => { const flowType = useIOSelector(currentAARFlowStateType); + useEffect(() => { + if (flowType === sendAARFlowStates.notAddresseeFinal) { + trackSendAARAccessDeniedScreenView(); + } + }, [flowType]); + if (flowType === sendAARFlowStates.notAddresseeFinal) { return ; } else { diff --git a/ts/features/pn/aar/screen/SendAARInitialFlowScreen.tsx b/ts/features/pn/aar/screen/SendAARInitialFlowScreen.tsx index 8e93feedf9b..7de3cb65e12 100644 --- a/ts/features/pn/aar/screen/SendAARInitialFlowScreen.tsx +++ b/ts/features/pn/aar/screen/SendAARInitialFlowScreen.tsx @@ -9,6 +9,7 @@ import { SendAARTosComponent } from "../components/SendAARTosComponent"; import { setAarFlowState } from "../store/actions"; import { currentAARFlowData } from "../store/selectors"; import { sendAARFlowStates } from "../utils/stateUtils"; +import { trackSendAARToS } from "../analytics"; type SendAarInitialFlowScreenT = { qrCode: string; @@ -56,7 +57,7 @@ export const SendAARInitialFlowScreen = ({ screen: PN_ROUTES.MESSAGE_DETAILS, params: { messageId: flowData.iun, - firstTimeOpening: true, + firstTimeOpening: undefined, serviceId: flowData.pnServiceId, isAarMessage: true } @@ -64,6 +65,10 @@ export const SendAARInitialFlowScreen = ({ }); break; } + case sendAARFlowStates.displayingAARToS: { + trackSendAARToS(); + break; + } } }, [navigation, flowStateType, flowData]); diff --git a/ts/features/pn/aar/screen/SendEngagementScreen.tsx b/ts/features/pn/aar/screen/SendEngagementScreen.tsx index 15846595999..3d0a470737f 100644 --- a/ts/features/pn/aar/screen/SendEngagementScreen.tsx +++ b/ts/features/pn/aar/screen/SendEngagementScreen.tsx @@ -21,8 +21,8 @@ import { PnParamsList } from "../../navigation/params"; import PN_ROUTES from "../../navigation/routes"; import { trackSendActivationModalDialog, - trackSendActivationModalDialogActivationStart, - trackSendActivationModalDialogActivationDismissed + trackSendActivationModalDialogActivationDismissed, + trackSendActivationModalDialogActivationStart } from "../../analytics/send"; const flow: NotificationModalFlow = "send_notification_opening"; @@ -39,6 +39,7 @@ type SendEngagementScreenProps = IOStackNavigationRouteProps< export const SendEngagementScreen = ({ route }: SendEngagementScreenProps) => { const { sendOpeningSource, sendUserType } = route.params; + const [screenStatus, setScreenStatus] = useState< "Waiting" | "Activating" | "Failed" >("Waiting"); @@ -76,7 +77,11 @@ export const SendEngagementScreen = ({ route }: SendEngagementScreenProps) => { const onActivateService = useCallback( (isRetry: boolean = false) => { - trackSendActivationModalDialogActivationStart(flow, sendUserType); + trackSendActivationModalDialogActivationStart( + flow, + sendOpeningSource, + sendUserType + ); if (isRetry) { navigation.setOptions({ headerShown: true @@ -94,29 +99,34 @@ export const SendEngagementScreen = ({ route }: SendEngagementScreenProps) => { [ dispatch, navigation, - sendUserType, onSENDActivationFailed, - onSENDActivationSucceeded + onSENDActivationSucceeded, + sendOpeningSource, + sendUserType ] ); const onClose = useCallback(() => { if (screenStatus !== "Activating") { - trackSendActivationModalDialogActivationDismissed(flow, sendUserType); + trackSendActivationModalDialogActivationDismissed( + flow, + sendOpeningSource, + sendUserType + ); navigation.popToTop(); } - }, [navigation, screenStatus, sendUserType]); + }, [navigation, screenStatus, sendOpeningSource, sendUserType]); useEffect(() => { if (screenStatus === "Waiting") { // Make sure that nothing sets screenStatus to Waiting, // otherwise there will be a double event tracking - trackSendActivationModalDialog(flow, sendUserType); + trackSendActivationModalDialog(flow, sendOpeningSource, sendUserType); } else if (screenStatus === "Failed") { // Here multiple tracking is fine, since we want // to track it every time that the user retries it sendBannerMixpanelEvents.bannerKO("aar"); } - }, [screenStatus, sendUserType]); + }, [screenStatus, sendOpeningSource, sendUserType]); if (screenStatus === "Failed") { return ( diff --git a/ts/features/pn/aar/screen/__tests__/SendAARErrorScreen.test.tsx b/ts/features/pn/aar/screen/__tests__/SendAARErrorScreen.test.tsx index 81ea6492657..31c4b4828c6 100644 --- a/ts/features/pn/aar/screen/__tests__/SendAARErrorScreen.test.tsx +++ b/ts/features/pn/aar/screen/__tests__/SendAARErrorScreen.test.tsx @@ -1,6 +1,5 @@ import { createStore } from "redux"; import { applicationChangeState } from "../../../../../store/actions/application"; -import * as HOOKS from "../../../../../store/hooks"; import { appReducer } from "../../../../../store/reducers"; import { GlobalState } from "../../../../../store/reducers/types"; import { renderScreenWithNavigationStoreContext } from "../../../../../utils/testWrapper"; @@ -9,13 +8,12 @@ import * as ERROR_COMPONENT from "../../components/errors/SendAARErrorComponent" import * as NOT_ADDRESSEE_COMPONENT from "../../components/errors/SendAARNotAddresseeComponent"; import { sendAARFlowStates } from "../../utils/stateUtils"; import { SendAARErrorScreen } from "../SendAARErrorScreen"; +import { sendAarMockStates } from "../../utils/testUtils"; +import * as SELECTORS from "../../store/selectors"; +import * as ANALYTICS from "../../analytics"; jest.mock("../../components/errors/SendAARNotAddresseeComponent.tsx"); jest.mock("../../components/errors/SendAARErrorComponent.tsx"); -jest.mock("../../../../../store/hooks", () => ({ - ...jest.requireActual("../../../../../store/hooks"), - useIOSelector: jest.fn() -})); describe("SendAARErrorScreen", () => { const componentMock = jest.fn(); @@ -31,19 +29,52 @@ describe("SendAARErrorScreen", () => { }); it("should render the SendAARErrorComponent if flowType==='notAddresseeFinal'", () => { - (HOOKS.useIOSelector as jest.Mock).mockReturnValue( - sendAARFlowStates.notAddresseeFinal - ); + jest + .spyOn(SELECTORS, "currentAARFlowStateType") + .mockImplementation(_state => sendAARFlowStates.notAddresseeFinal); expect(notAddresseeComponentSpy).not.toHaveBeenCalled(); renderScreen(); expect(notAddresseeComponentSpy).toHaveBeenCalled(); }); + it("should render the SendAARErrorComponent if flowType!=='notAddresseeFinal'", () => { - (HOOKS.useIOSelector as jest.Mock).mockReturnValue(sendAARFlowStates.ko); + jest + .spyOn(SELECTORS, "currentAARFlowStateType") + .mockImplementation(_state => sendAARFlowStates.ko); expect(errorComponentSpy).not.toHaveBeenCalled(); renderScreen(); expect(errorComponentSpy).toHaveBeenCalled(); }); + + sendAarMockStates.forEach(mockState => { + it(`should ${ + mockState.type === sendAARFlowStates.notAddresseeFinal ? "" : "not " + }call trackSendAARAccessDeniedScreenView when state is ${ + mockState.type + }`, () => { + jest + .spyOn(SELECTORS, "currentAARFlowStateType") + .mockImplementation(_state => mockState.type); + const spiedOnMockedTrackSendAARAccessDeniedScreenView = jest + .spyOn(ANALYTICS, "trackSendAARAccessDeniedScreenView") + .mockImplementation(); + + renderScreen(); + + if (mockState.type === sendAARFlowStates.notAddresseeFinal) { + expect( + spiedOnMockedTrackSendAARAccessDeniedScreenView.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackSendAARAccessDeniedScreenView.mock.calls[0].length + ).toBe(0); + } else { + expect( + spiedOnMockedTrackSendAARAccessDeniedScreenView.mock.calls.length + ).toBe(0); + } + }); + }); }); const renderScreen = () => { diff --git a/ts/features/pn/aar/screen/__tests__/SendAARInitialFlowScreen.test.tsx b/ts/features/pn/aar/screen/__tests__/SendAARInitialFlowScreen.test.tsx index 1dbf3752e10..84cb65efdfd 100644 --- a/ts/features/pn/aar/screen/__tests__/SendAARInitialFlowScreen.test.tsx +++ b/ts/features/pn/aar/screen/__tests__/SendAARInitialFlowScreen.test.tsx @@ -12,6 +12,8 @@ import { setAarFlowState } from "../../store/actions"; import { AARFlowState, sendAARFlowStates } from "../../utils/stateUtils"; import { SendAARInitialFlowScreen } from "../SendAARInitialFlowScreen"; import * as SELECTORS from "../../store/selectors"; +import { sendAarMockStates } from "../../utils/testUtils"; +import * as ANALYTICS from "../../analytics"; const mockReplace = jest.fn(); const mockSetOptions = jest.fn(); @@ -59,6 +61,26 @@ describe("SendAARInitialFlowScreen", () => { }); }); + sendAarMockStates.forEach(state => { + it(`should ${ + state.type === sendAARFlowStates.displayingAARToS ? "" : "not " + }call 'trackSendAARToS' when state is ${state.type}`, () => { + const spiedOnMockedTrackSendAARToS = jest + .spyOn(ANALYTICS, "trackSendAARToS") + .mockImplementation(); + flowStateSelectorSpy.mockReturnValue(state); + + renderComponent(); + + if (state.type === sendAARFlowStates.displayingAARToS) { + expect(spiedOnMockedTrackSendAARToS.mock.calls.length).toBe(1); + expect(spiedOnMockedTrackSendAARToS.mock.calls[0].length).toBe(0); + } else { + expect(spiedOnMockedTrackSendAARToS.mock.calls.length).toBe(0); + } + }); + }); + it('should initialize the aar flow state if it is "none"', () => { flowStateSelectorSpy.mockReturnValue({ type: sendAARFlowStates.none }); dispatchSpy.mockReturnValue(mockDispatch); @@ -142,7 +164,7 @@ describe("SendAARInitialFlowScreen", () => { screen: PN_ROUTES.MESSAGE_DETAILS, params: { messageId: "TEST_IUN", - firstTimeOpening: true, + firstTimeOpening: undefined, serviceId: "SERVICE_ID", isAarMessage: true } diff --git a/ts/features/pn/aar/screen/__tests__/SendEngagementScreen.test.tsx b/ts/features/pn/aar/screen/__tests__/SendEngagementScreen.test.tsx index 16cd78b4508..602b740ed80 100644 --- a/ts/features/pn/aar/screen/__tests__/SendEngagementScreen.test.tsx +++ b/ts/features/pn/aar/screen/__tests__/SendEngagementScreen.test.tsx @@ -71,13 +71,17 @@ describe("SendEngagementScreen", () => { ); expect( spiedOnMockedTrackSendActivationModalDialog.mock.calls[0].length - ).toBe(2); + ).toBe(3); expect(spiedOnMockedTrackSendActivationModalDialog.mock.calls[0][0]).toBe( expectedFlow ); expect(spiedOnMockedTrackSendActivationModalDialog.mock.calls[0][1]).toBe( + DEFAULT_OPENING_SOURCE + ); + expect(spiedOnMockedTrackSendActivationModalDialog.mock.calls[0][2]).toBe( DEFAULT_USER_TYPE ); + expect( spiedOnMockedTrackSendActivationModalDialogActivationDismissed.mock.calls .length @@ -106,13 +110,14 @@ describe("SendEngagementScreen", () => { ); expect( spiedOnMockedTrackSendActivationModalDialog.mock.calls[0].length - ).toBe(2); + ).toBe(3); expect(spiedOnMockedTrackSendActivationModalDialog.mock.calls[0][0]).toBe( expectedFlow ); expect(spiedOnMockedTrackSendActivationModalDialog.mock.calls[0][1]).toBe( DEFAULT_USER_TYPE ); + expect( spiedOnMockedTrackSendActivationModalDialogActivationDismissed.mock.calls .length @@ -120,7 +125,7 @@ describe("SendEngagementScreen", () => { expect( spiedOnMockedTrackSendActivationModalDialogActivationDismissed.mock .calls[0].length - ).toBe(2); + ).toBe(3); expect( spiedOnMockedTrackSendActivationModalDialogActivationDismissed.mock .calls[0][0] @@ -128,7 +133,12 @@ describe("SendEngagementScreen", () => { expect( spiedOnMockedTrackSendActivationModalDialogActivationDismissed.mock .calls[0][1] + ).toBe(DEFAULT_OPENING_SOURCE); + expect( + spiedOnMockedTrackSendActivationModalDialogActivationDismissed.mock + .calls[0][2] ).toBe(DEFAULT_USER_TYPE); + expect( spiedOnMockedTrackSendActivationModalDialogActivationStart.mock.calls .length @@ -138,7 +148,7 @@ describe("SendEngagementScreen", () => { [false, true].forEach(systemNotificationsEnabled => (["aar", "message", "not_set"] as const).forEach(sendOpeningSource => (["recipient", "mandatory", "not_set"] as const).forEach(sendUserType => - it(`should dispatch a 'pnActivationUpsert.request' and track proper analytics when pressing the primary action, with proper flow for success and failure actions (systemNotificationsEnabled: ${systemNotificationsEnabled})`, () => { + it(`should dispatch a 'pnActivationUpsert.request' and track proper analytics when pressing the primary action, with proper flow for success and failure actions (systemNotificationsEnabled: ${systemNotificationsEnabled} openingSource: ${sendOpeningSource} userType: ${sendUserType})`, () => { const mockPopToTop = jest.fn(); const mockReplace = jest.fn(); const mockSetOptions = jest.fn(); @@ -168,17 +178,22 @@ describe("SendEngagementScreen", () => { ).toBe(1); expect( spiedOnMockedTrackSendActivationModalDialog.mock.calls[0].length - ).toBe(2); + ).toBe(3); expect( spiedOnMockedTrackSendActivationModalDialog.mock.calls[0][0] ).toBe(expectedFlow); expect( spiedOnMockedTrackSendActivationModalDialog.mock.calls[0][1] + ).toBe(sendOpeningSource); + expect( + spiedOnMockedTrackSendActivationModalDialog.mock.calls[0][2] ).toBe(sendUserType); + expect( spiedOnMockedTrackSendActivationModalDialogActivationDismissed.mock .calls.length ).toBe(0); + expect( spiedOnMockedTrackSendActivationModalDialogActivationStart.mock .calls.length @@ -186,7 +201,7 @@ describe("SendEngagementScreen", () => { expect( spiedOnMockedTrackSendActivationModalDialogActivationStart.mock .calls[0].length - ).toBe(2); + ).toBe(3); expect( spiedOnMockedTrackSendActivationModalDialogActivationStart.mock .calls[0][0] @@ -194,6 +209,10 @@ describe("SendEngagementScreen", () => { expect( spiedOnMockedTrackSendActivationModalDialogActivationStart.mock .calls[0][1] + ).toBe(sendOpeningSource); + expect( + spiedOnMockedTrackSendActivationModalDialogActivationStart.mock + .calls[0][2] ).toBe(sendUserType); const expectedAction = pnActivationUpsert.request({ diff --git a/ts/features/pn/aar/store/actions/__tests__/index.test.ts b/ts/features/pn/aar/store/actions/__tests__/index.test.ts index 5dbbcd6e2ac..45be55b907e 100644 --- a/ts/features/pn/aar/store/actions/__tests__/index.test.ts +++ b/ts/features/pn/aar/store/actions/__tests__/index.test.ts @@ -1,5 +1,6 @@ import { FiscalCode, NonEmptyString } from "@pagopa/ts-commons/lib/strings"; import { + EphemeralAarMessageDataActionPayload, populateStoresWithEphemeralAarMessageData, setAarFlowState, terminateAarFlow @@ -40,7 +41,7 @@ describe("AARFlowStateActions", () => { markdown: {} as MessageBodyMarkdown, subject: "" as MessageSubject, mandateId: "" - }; + } as unknown as EphemeralAarMessageDataActionPayload; const action = populateStoresWithEphemeralAarMessageData(params); expect(action).toMatchSnapshot(); }); diff --git a/ts/features/pn/aar/store/actions/index.ts b/ts/features/pn/aar/store/actions/index.ts index 91b02c41b41..4372c21ea0f 100644 --- a/ts/features/pn/aar/store/actions/index.ts +++ b/ts/features/pn/aar/store/actions/index.ts @@ -2,7 +2,7 @@ import { NonEmptyString } from "@pagopa/ts-commons/lib/strings"; import { ActionType, createStandardAction } from "typesafe-actions"; import { MessageBodyMarkdown } from "../../../../../../definitions/backend/MessageBodyMarkdown"; import { MessageSubject } from "../../../../../../definitions/backend/MessageSubject"; -import { ThirdPartyMessage } from "../../../../../../definitions/pn/ThirdPartyMessage"; +import { ThirdPartyMessage } from "../../../../../../definitions/pn/aar/ThirdPartyMessage"; import { AARFlowState } from "../../utils/stateUtils"; export type EphemeralAarMessageDataActionPayload = { diff --git a/ts/features/pn/aar/utils/testUtils.ts b/ts/features/pn/aar/utils/testUtils.ts index a506b6c6777..ad62c629047 100644 --- a/ts/features/pn/aar/utils/testUtils.ts +++ b/ts/features/pn/aar/utils/testUtils.ts @@ -1,8 +1,8 @@ import { FiscalCode, NonEmptyString } from "@pagopa/ts-commons/lib/strings"; import { MessageBodyMarkdown } from "../../../../../definitions/backend/MessageBodyMarkdown"; import { MessageSubject } from "../../../../../definitions/backend/MessageSubject"; -import { ThirdPartyMessage as PnThirdPartyMessage } from "../../../../../definitions/pn/ThirdPartyMessage"; import { EphemeralAarMessageDataActionPayload } from "../store/actions"; +import { ThirdPartyMessage } from "../../../../../definitions/pn/aar/ThirdPartyMessage"; import { AARFlowState, sendAARFlowStates } from "./stateUtils"; export const sendAarMockStateFactory: Record< @@ -63,7 +63,7 @@ export const sendAarMockStates = sendAarStateNames.map(t => export const mockEphemeralAarMessageDataActionPayload: EphemeralAarMessageDataActionPayload = { iun: "IUN123" as NonEmptyString, - thirdPartyMessage: { foo: "bar" } as PnThirdPartyMessage, + thirdPartyMessage: {} as unknown as ThirdPartyMessage, fiscalCode: "TAXCODE123" as FiscalCode, pnServiceID: "SERVICEID123" as NonEmptyString, markdown: "*".repeat(81) as MessageBodyMarkdown, diff --git a/ts/features/pn/analytics/__test__/index.test.ts b/ts/features/pn/analytics/__test__/index.test.ts index e2be6ca1ea6..fd165eb21b5 100644 --- a/ts/features/pn/analytics/__test__/index.test.ts +++ b/ts/features/pn/analytics/__test__/index.test.ts @@ -1,6 +1,38 @@ -import { booleanOrUndefinedToPNServiceStatus } from ".."; +import { + booleanOrUndefinedToPNServiceStatus, + trackPNAttachmentOpening, + trackPNNotificationLoadSuccess, + trackPNPaymentStart, + trackPNPaymentStatus, + trackPNShowF24, + trackPNShowTimeline, + trackPNTimelineExternal, + trackPNUxSuccess +} from ".."; +import * as MIXPANEL from "../../../../mixpanel"; +import { PaymentStatistics } from "../../../messages/store/reducers/payments"; +import { + SendOpeningSource, + SendUserType +} from "../../../pushNotifications/analytics"; + +const sendOpeningSources: ReadonlyArray = [ + "aar", + "message", + "not_set" +]; +const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" +]; describe("index", () => { + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + describe("booleanOrUndefinedToPNServiceStatus", () => { ( [ @@ -15,4 +47,272 @@ describe("index", () => { }); }); }); + + // eslint-disable-next-line sonarjs/cognitive-complexity + describe("trackPNUxSuccess", () => { + [0, 1, 2].forEach(paymentCount => + [undefined, false, true].forEach(firstTimeOpening => + [false, true].forEach(isCancelled => + [false, true].forEach(containsF24 => + sendOpeningSources.forEach(openingSource => + sendUserTypes.forEach(userType => { + it(`should call 'mixpanelTrack' with proper event name and parameters (paymentCount ${paymentCount} firstTimeOpening ${firstTimeOpening} isCancelled ${isCancelled} containsF24 ${containsF24} openingSource ${openingSource} userType ${userType})`, () => { + const spiedOnMockedMixpanelTrack = jest + .spyOn(MIXPANEL, "mixpanelTrack") + .mockImplementation(); + + trackPNUxSuccess( + paymentCount, + firstTimeOpening, + isCancelled, + containsF24, + openingSource, + userType + ); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe( + 2 + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "PN_UX_SUCCESS" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "screen_view", + contains_payment: paymentCount > 0 ? "yes" : "no", + first_time_opening: + firstTimeOpening === true + ? "yes" + : firstTimeOpening === false + ? "no" + : "not_set", + notification_status: isCancelled ? "cancelled" : "active", + contains_multipayment: paymentCount > 1 ? "yes" : "no", + count_payment: paymentCount, + contains_f24: containsF24, + opening_source: openingSource, + send_user: userType + }); + }); + }) + ) + ) + ) + ) + ); + }); + + describe("trackPNNotificationLoadSuccess", () => { + [false, true].forEach(hasAttachments => + [undefined, "CANCELLED"].forEach(status => + sendOpeningSources.forEach(openingSource => + sendUserTypes.forEach(userType => + it(`should call 'mixpanelTrack' with proper event name and properties (hasAttachments ${hasAttachments} status ${status} openingSource ${openingSource} userType ${userType})`, () => { + const spiedOnMockedMixpanelTrack = jest + .spyOn(MIXPANEL, "mixpanelTrack") + .mockImplementation(); + + trackPNNotificationLoadSuccess( + hasAttachments, + status, + openingSource, + userType + ); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "PN_NOTIFICATION_LOAD_SUCCESS" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "TECH", + event_type: undefined, + NOTIFICATION_LAST_STATUS: status ?? "not_set", + HAS_ATTACHMENTS: hasAttachments, + opening_source: openingSource, + send_user: userType + }); + }) + ) + ) + ) + ); + }); + + describe("trackPNPaymentStatus", () => { + sendOpeningSources.forEach(source => { + sendUserTypes.forEach(userType => { + it(`should call 'mixpanelTrack' with proper event name and parameters (source ${source} userType ${userType})`, () => { + const spiedOnMockedMixpanelTrack = jest + .spyOn(MIXPANEL, "mixpanelTrack") + .mockImplementation(); + + const paymentStatistics: PaymentStatistics = { + errorCount: 1, + expiredCount: 2, + ongoingCount: 3, + paidCount: 4, + paymentCount: 5, + revokedCount: 6, + unpaidCount: 7 + }; + + trackPNPaymentStatus(paymentStatistics, source, userType); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "PN_PAYMENT_STATUS" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "TECH", + event_type: undefined, + count_payment: paymentStatistics.paymentCount, + count_unpaid: paymentStatistics.unpaidCount, + count_paid: paymentStatistics.paidCount, + count_error: paymentStatistics.errorCount, + count_expired: paymentStatistics.expiredCount, + count_revoked: paymentStatistics.revokedCount, + count_inprogress: paymentStatistics.ongoingCount, + opening_source: source, + send_user: userType + }); + }); + }); + }); + }); + + describe("trackPNAttachmentOpening", () => { + sendOpeningSources.forEach(source => { + sendUserTypes.forEach(userType => { + [undefined, "F24"].forEach(category => { + it(`should call 'mixpanelTrack' with proper event name and parameters (source ${source} userType ${userType} category ${category})`, () => { + const spiedOnMockedMixpanelTrack = jest + .spyOn(MIXPANEL, "mixpanelTrack") + .mockImplementation(); + + trackPNAttachmentOpening(source, userType, category); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "PN_ATTACHMENT_OPENING" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action", + category, + opening_source: source, + send_user: userType + }); + }); + }); + }); + }); + }); + + describe("trackPNPaymentStart", () => { + sendOpeningSources.forEach(source => { + sendUserTypes.forEach(userType => { + it(`should call 'mixpanelTrack' with proper event name and parameters (source ${source} userType ${userType})`, () => { + const spiedOnMockedMixpanelTrack = jest + .spyOn(MIXPANEL, "mixpanelTrack") + .mockImplementation(); + + trackPNPaymentStart(source, userType); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "PN_PAYMENT_START" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action", + opening_source: source, + send_user: userType + }); + }); + }); + }); + }); + + describe("trackPNShowTimeline", () => { + sendOpeningSources.forEach(source => { + sendUserTypes.forEach(userType => { + it(`should call 'mixpanelTrack' with proper event name and parameters (source ${source} userType ${userType})`, () => { + const spiedOnMockedMixpanelTrack = jest + .spyOn(MIXPANEL, "mixpanelTrack") + .mockImplementation(); + + trackPNShowTimeline(source, userType); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "PN_SHOW_TIMELINE" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action", + opening_source: source, + send_user: userType + }); + }); + }); + }); + }); + + describe("trackPNShowF24", () => { + sendOpeningSources.forEach(source => { + sendUserTypes.forEach(userType => { + it(`should call 'mixpanelTrack' with proper event name and parameters (source ${source} userType ${userType})`, () => { + const spiedOnMockedMixpanelTrack = jest + .spyOn(MIXPANEL, "mixpanelTrack") + .mockImplementation(); + + trackPNShowF24(source, userType); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "PN_SHOW_F24" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "action", + opening_source: source, + send_user: userType + }); + }); + }); + }); + }); + + describe("trackPNTimelineExternal", () => { + sendOpeningSources.forEach(source => { + sendUserTypes.forEach(userType => { + it(`should call 'mixpanelTrack' with proper event name and parameters (source ${source} userType ${userType})`, () => { + const spiedOnMockedMixpanelTrack = jest + .spyOn(MIXPANEL, "mixpanelTrack") + .mockImplementation(); + + trackPNTimelineExternal(source, userType); + + expect(spiedOnMockedMixpanelTrack.mock.calls.length).toBe(1); + expect(spiedOnMockedMixpanelTrack.mock.calls[0].length).toBe(2); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][0]).toBe( + "PN_TIMELINE_EXTERNAL" + ); + expect(spiedOnMockedMixpanelTrack.mock.calls[0][1]).toEqual({ + event_category: "UX", + event_type: "exit", + opening_source: source, + send_user: userType + }); + }); + }); + }); + }); }); diff --git a/ts/features/pn/analytics/__test__/send.test.ts b/ts/features/pn/analytics/__test__/send.test.ts index 2ee3d5cabfa..3c078b61b27 100644 --- a/ts/features/pn/analytics/__test__/send.test.ts +++ b/ts/features/pn/analytics/__test__/send.test.ts @@ -4,6 +4,7 @@ import { mixpanelTrack } from "../../../../mixpanel"; import { buildEventProperties } from "../../../../utils/analytics"; import { NotificationModalFlow, + SendOpeningSource, SendUserType } from "../../../pushNotifications/analytics"; @@ -12,6 +13,11 @@ const notificationModalFlowList: Array = [ "send_notification_opening", "access" ]; +const sendOpeningSources: Array = [ + "aar", + "message", + "not_set" +]; const sendUserList: Array = ["mandatory", "recipient", "not_set"]; const sendActivationSourceList: Array = [ "tos_bottomsheet", @@ -23,49 +29,69 @@ jest.mock("../../../../mixpanel", () => ({ })); notificationModalFlowList.forEach(flow => - sendUserList.forEach(send_user => { - describe(`SEND events when flow is "${flow}" and send_user is "${send_user}"`, () => { - beforeEach(jest.clearAllMocks); - - it(`should track "SEND_ACTIVATION_MODAL_DIALOG" event with the properties => flow = "${flow}" and send_user = "${send_user}"`, () => { - sendEvents.trackSendActivationModalDialog(flow, send_user); + sendOpeningSources.forEach(sendOpeningSource => + sendUserList.forEach(send_user => { + describe(`SEND events when flow is "${flow}" send_user is "${send_user}" and opening source is "${sendOpeningSource}"`, () => { + beforeEach(jest.clearAllMocks); - expect(mixpanelTrack).toHaveBeenCalledWith( - "SEND_ACTIVATION_MODAL_DIALOG", - buildEventProperties("UX", "screen_view", { + it(`should track "SEND_ACTIVATION_MODAL_DIALOG" event with the properties => flow = "${flow}" send_user = "${send_user}" opening source = "${sendOpeningSource}"`, () => { + sendEvents.trackSendActivationModalDialog( flow, + sendOpeningSource, send_user - }) - ); - }); - it(`should track "SEND_ACTIVATION_MODAL_DIALOG_ACTIVATION_START" event with the properties => flow = "${flow}" and send_user = "${send_user}"`, () => { - sendEvents.trackSendActivationModalDialogActivationStart( - flow, - send_user - ); + ); - expect(mixpanelTrack).toHaveBeenCalledWith( - "SEND_ACTIVATION_MODAL_DIALOG_ACTIVATION_START", - buildEventProperties("UX", "action", { + expect(mixpanelTrack).toHaveBeenCalledWith( + "SEND_ACTIVATION_MODAL_DIALOG", + buildEventProperties("UX", "screen_view", { + flow, + opening_source: sendOpeningSource, + send_user + }) + ); + }); + it(`should track "SEND_ACTIVATION_MODAL_DIALOG_ACTIVATION_START" event with the properties => flow = "${flow}" send_user = "${send_user}" opening source = "${sendOpeningSource}"`, () => { + sendEvents.trackSendActivationModalDialogActivationStart( flow, + sendOpeningSource, send_user - }) - ); - }); - it(`should track "SEND_ACTIVATION_MODAL_DIALOG_DISMISSED" event with the properties => flow = "${flow}" and send_user = "${send_user}"`, () => { - sendEvents.trackSendActivationModalDialogActivationDismissed( - flow, - send_user - ); + ); - expect(mixpanelTrack).toHaveBeenCalledWith( - "SEND_ACTIVATION_MODAL_DIALOG_DISMISSED", - buildEventProperties("UX", "action", { + expect(mixpanelTrack).toHaveBeenCalledWith( + "SEND_ACTIVATION_MODAL_DIALOG_ACTIVATION_START", + buildEventProperties("UX", "action", { + flow, + opening_source: sendOpeningSource, + send_user + }) + ); + }); + it(`should track "SEND_ACTIVATION_MODAL_DIALOG_DISMISSED" event with the properties => flow = "${flow}" send_user = "${send_user}" opening source = "${sendOpeningSource}"`, () => { + sendEvents.trackSendActivationModalDialogActivationDismissed( flow, + sendOpeningSource, send_user - }) - ); + ); + + expect(mixpanelTrack).toHaveBeenCalledWith( + "SEND_ACTIVATION_MODAL_DIALOG_DISMISSED", + buildEventProperties("UX", "action", { + flow, + opening_source: sendOpeningSource, + send_user + }) + ); + }); }); + }) + ) +); + +notificationModalFlowList.forEach(flow => + sendUserList.forEach(send_user => { + describe(`SEND events when flow is "${flow}" and send_user is "${send_user}"`, () => { + beforeEach(jest.clearAllMocks); + it(`should track "SEND_ACCEPTANCE_DIALOG" event with the properties => flow = "${flow}" and send_user = "${send_user}"`, () => { sendEvents.trackSendAcceptanceDialog(flow, send_user); diff --git a/ts/features/pn/analytics/index.ts b/ts/features/pn/analytics/index.ts index f40cb896f79..63655c5c347 100644 --- a/ts/features/pn/analytics/index.ts +++ b/ts/features/pn/analytics/index.ts @@ -1,16 +1,15 @@ -import { pipe } from "fp-ts/lib/function"; -import * as A from "fp-ts/lib/Array"; -import * as O from "fp-ts/lib/Option"; import { mixpanelTrack } from "../../../mixpanel"; -import { PNMessage } from "../../pn/store/types/types"; -import { NotificationStatusHistoryElement } from "../../../../definitions/pn/NotificationStatusHistoryElement"; import { booleanToYesNo, buildEventProperties, numberToYesNoOnThreshold } from "../../../utils/analytics"; -import { ThirdPartyAttachment } from "../../../../definitions/backend/ThirdPartyAttachment"; import { PaymentStatistics } from "../../messages/store/reducers/payments"; +import { + SendOpeningSource, + SendUserType +} from "../../pushNotifications/analytics"; +import { NotificationStatus } from "../../../../definitions/pn/NotificationStatus"; export type PNServiceStatus = "active" | "not_active" | "unknown"; @@ -116,13 +115,18 @@ export function trackPNAttachmentSaveShare(category?: string) { ); } -export function trackPNAttachmentOpening(category?: string) { - void mixpanelTrack( - "PN_ATTACHMENT_OPENING", - buildEventProperties("UX", "action", { - category - }) - ); +export function trackPNAttachmentOpening( + openingSource: SendOpeningSource, + userType: SendUserType, + category?: string +) { + const eventName = "PN_ATTACHMENT_OPENING"; + const props = buildEventProperties("UX", "action", { + category, + opening_source: openingSource, + send_user: userType + }); + void mixpanelTrack(eventName, props); } export function trackPNAttachmentOpeningSuccess( @@ -142,72 +146,88 @@ export function trackPNNotificationLoadError(errorCode?: string) { void mixpanelTrack( "PN_NOTIFICATION_LOAD_ERROR", buildEventProperties("KO", undefined, { - ERROR_CODE: errorCode, - JSON_DECODE_FAILED: errorCode ? false : true + ERROR_CODE: errorCode }) ); } -export function trackPNNotificationLoadSuccess(pnMessage: PNMessage) { - pipe( - pnMessage.notificationStatusHistory as Array, - A.last, - O.map(lastNotification => lastNotification.status), - O.fold( - () => undefined, - (status: string) => - void mixpanelTrack( - "PN_NOTIFICATION_LOAD_SUCCESS", - buildEventProperties("TECH", undefined, { - NOTIFICATION_LAST_STATUS: status, - HAS_ATTACHMENTS: pipe( - pnMessage.attachments as Array, - O.fromNullable, - O.map(A.isNonEmpty), - O.getOrElse(() => false) - ) - }) - ) - ) - ); +export function trackPNNotificationLoadSuccess( + hasAttachmens: boolean, + status: NotificationStatus | undefined, + openingSource: SendOpeningSource, + userType: SendUserType +) { + const eventName = "PN_NOTIFICATION_LOAD_SUCCESS"; + const eventProperties = buildEventProperties("TECH", undefined, { + NOTIFICATION_LAST_STATUS: status ?? "not_set", + HAS_ATTACHMENTS: hasAttachmens, + opening_source: openingSource, + send_user: userType + }); + void mixpanelTrack(eventName, eventProperties); } export function trackPNPushOpened() { void mixpanelTrack("PN_PUSH_OPENED", buildEventProperties("UX", "action")); } -export function trackPNTimelineExternal() { - void mixpanelTrack( - "PN_TIMELINE_EXTERNAL", - buildEventProperties("UX", "exit") - ); +export function trackPNTimelineExternal( + openingSource: SendOpeningSource, + userType: SendUserType +) { + const eventName = "PN_TIMELINE_EXTERNAL"; + const eventProps = buildEventProperties("UX", "exit", { + opening_source: openingSource, + send_user: userType + }); + void mixpanelTrack(eventName, eventProps); } -export function trackPNShowTimeline() { - void mixpanelTrack("PN_SHOW_TIMELINE", buildEventProperties("UX", "action")); +export function trackPNShowTimeline( + openingSource: SendOpeningSource, + userType: SendUserType +) { + const eventName = "PN_SHOW_TIMELINE"; + const eventProps = buildEventProperties("UX", "action", { + opening_source: openingSource, + send_user: userType + }); + void mixpanelTrack(eventName, eventProps); } export function trackPNUxSuccess( paymentCount: number, - firstTimeOpening: boolean, + firstTimeOpening: boolean | undefined, isCancelled: boolean, - containsF24: boolean + containsF24: boolean, + openingSource: SendOpeningSource, + userType: SendUserType ) { - void mixpanelTrack( - "PN_UX_SUCCESS", - buildEventProperties("UX", "screen_view", { - contains_payment: numberToYesNoOnThreshold(paymentCount), - first_time_opening: booleanToYesNo(firstTimeOpening), - notification_status: isCancelled ? "cancelled" : "active", - contains_multipayment: numberToYesNoOnThreshold(paymentCount, 1), - count_payment: paymentCount, - contains_f24: containsF24 - }) - ); + const eventName = "PN_UX_SUCCESS"; + const props = buildEventProperties("UX", "screen_view", { + contains_payment: numberToYesNoOnThreshold(paymentCount), + first_time_opening: + firstTimeOpening != null ? booleanToYesNo(firstTimeOpening) : "not_set", + notification_status: isCancelled ? "cancelled" : "active", + contains_multipayment: numberToYesNoOnThreshold(paymentCount, 1), + count_payment: paymentCount, + contains_f24: containsF24, + opening_source: openingSource, + send_user: userType + }); + void mixpanelTrack(eventName, props); } -export function trackPNPaymentStart() { - void mixpanelTrack("PN_PAYMENT_START", buildEventProperties("UX", "action")); +export function trackPNPaymentStart( + openingSource: SendOpeningSource, + userType: SendUserType +) { + const eventName = "PN_PAYMENT_START"; + const eventProps = buildEventProperties("UX", "action", { + opening_source: openingSource, + send_user: userType + }); + void mixpanelTrack(eventName, eventProps); } export function trackPNShowAllPayments() { @@ -217,29 +237,42 @@ export function trackPNShowAllPayments() { ); } -export function trackPNPaymentStatus({ - paymentCount, - unpaidCount, - paidCount, - errorCount, - expiredCount, - revokedCount, - ongoingCount -}: PaymentStatistics) { - void mixpanelTrack( - "PN_PAYMENT_STATUS", - buildEventProperties("TECH", undefined, { - count_payment: paymentCount, - count_unpaid: unpaidCount, - count_paid: paidCount, - count_error: errorCount, - count_expired: expiredCount, - count_revoked: revokedCount, - count_inprogress: ongoingCount - }) - ); +export function trackPNPaymentStatus( + { + paymentCount, + unpaidCount, + paidCount, + errorCount, + expiredCount, + revokedCount, + ongoingCount + }: PaymentStatistics, + openingSource: SendOpeningSource, + userType: SendUserType +) { + const eventName = "PN_PAYMENT_STATUS"; + const props = buildEventProperties("TECH", undefined, { + count_payment: paymentCount, + count_unpaid: unpaidCount, + count_paid: paidCount, + count_error: errorCount, + count_expired: expiredCount, + count_revoked: revokedCount, + count_inprogress: ongoingCount, + opening_source: openingSource, + send_user: userType + }); + void mixpanelTrack(eventName, props); } -export function trackPNShowF24() { - void mixpanelTrack("PN_SHOW_F24", buildEventProperties("UX", "action")); +export function trackPNShowF24( + openingSource: SendOpeningSource, + userType: SendUserType +) { + const eventName = "PN_SHOW_F24"; + const eventProps = buildEventProperties("UX", "action", { + opening_source: openingSource, + send_user: userType + }); + void mixpanelTrack(eventName, eventProps); } diff --git a/ts/features/pn/analytics/send.ts b/ts/features/pn/analytics/send.ts index 9cbacaf6f16..42f9277f3b6 100644 --- a/ts/features/pn/analytics/send.ts +++ b/ts/features/pn/analytics/send.ts @@ -2,6 +2,7 @@ import { mixpanelTrack } from "../../../mixpanel"; import { buildEventProperties } from "../../../utils/analytics"; import { NotificationModalFlow, + SendOpeningSource, SendUserType } from "../../pushNotifications/analytics"; @@ -9,41 +10,46 @@ export type SendActivationSource = "tos_bottomsheet" | "nurturing_bottomsheet"; export const trackSendActivationModalDialog = ( flow: NotificationModalFlow, - send_user: SendUserType = "not_set" + sendSource: SendOpeningSource = "not_set", + sendUser: SendUserType = "not_set" ) => { - void mixpanelTrack( - "SEND_ACTIVATION_MODAL_DIALOG", - buildEventProperties("UX", "screen_view", { - send_user, - flow - }) - ); + const eventName = "SEND_ACTIVATION_MODAL_DIALOG"; + const properties = buildEventProperties("UX", "screen_view", { + flow, + opening_source: sendSource, + send_user: sendUser + }); + mixpanelTrack(eventName, properties); }; export const trackSendActivationModalDialogActivationStart = ( flow: NotificationModalFlow, - send_user: SendUserType = "not_set" + sendSource: SendOpeningSource = "not_set", + sendUser: SendUserType = "not_set" ) => { - void mixpanelTrack( - "SEND_ACTIVATION_MODAL_DIALOG_ACTIVATION_START", - buildEventProperties("UX", "action", { - send_user, - flow - }) - ); + const eventName = "SEND_ACTIVATION_MODAL_DIALOG_ACTIVATION_START"; + const properties = buildEventProperties("UX", "action", { + flow, + opening_source: sendSource, + send_user: sendUser + }); + mixpanelTrack(eventName, properties); }; + export const trackSendActivationModalDialogActivationDismissed = ( flow: NotificationModalFlow, - send_user: SendUserType = "not_set" + sendSource: SendOpeningSource = "not_set", + sendUser: SendUserType = "not_set" ) => { - void mixpanelTrack( - "SEND_ACTIVATION_MODAL_DIALOG_DISMISSED", - buildEventProperties("UX", "action", { - send_user, - flow - }) - ); + const eventName = "SEND_ACTIVATION_MODAL_DIALOG_DISMISSED"; + const properties = buildEventProperties("UX", "action", { + flow, + opening_source: sendSource, + send_user: sendUser + }); + mixpanelTrack(eventName, properties); }; + export const trackSendAcceptanceDialog = ( flow: NotificationModalFlow, send_user: SendUserType = "not_set" diff --git a/ts/features/pn/components/F24ListBottomSheetLink.tsx b/ts/features/pn/components/F24ListBottomSheetLink.tsx index cb63480621e..e339e74cab3 100644 --- a/ts/features/pn/components/F24ListBottomSheetLink.tsx +++ b/ts/features/pn/components/F24ListBottomSheetLink.tsx @@ -7,17 +7,25 @@ import { trackPNShowF24 } from "../analytics"; import { useIODispatch } from "../../../store/hooks"; import { cancelPreviousAttachmentDownload } from "../../messages/store/actions"; import { ServiceId } from "../../../../definitions/backend/ServiceId"; +import { + SendOpeningSource, + SendUserType +} from "../../pushNotifications/analytics"; -type F24ListBottomSheetLinkProps = { +export type F24ListBottomSheetLinkProps = { f24List: ReadonlyArray; messageId: string; serviceId: ServiceId; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; }; export const F24ListBottomSheetLink = ({ f24List, messageId, - serviceId + serviceId, + sendOpeningSource, + sendUserType }: F24ListBottomSheetLinkProps) => { // The empty footer is needed in order for the internal scroll view to properly compute // its bottom space when the bottom sheet opens filling the entire view. Without it, the @@ -30,7 +38,8 @@ export const F24ListBottomSheetLink = ({ { @@ -50,9 +59,10 @@ export const F24ListBottomSheetLink = ({ variant="link" label={I18n.t("features.pn.details.f24Section.showAll")} onPress={() => { - trackPNShowF24(); + trackPNShowF24(sendOpeningSource, sendUserType); present(); }} + testID="f24_list_bottomsheet_link_button" /> {bottomSheet} diff --git a/ts/features/pn/components/F24Section.tsx b/ts/features/pn/components/F24Section.tsx index 7cd869e0183..c69863b4f88 100644 --- a/ts/features/pn/components/F24Section.tsx +++ b/ts/features/pn/components/F24Section.tsx @@ -5,18 +5,26 @@ import { thirdPartyMessageAttachments } from "../../messages/store/reducers/thir import { ATTACHMENT_CATEGORY } from "../../messages/types/attachmentCategory"; import { MessageDetailsAttachmentItem } from "../../messages/components/MessageDetail/MessageDetailsAttachmentItem"; import { ServiceId } from "../../../../definitions/backend/ServiceId"; +import { + SendOpeningSource, + SendUserType +} from "../../pushNotifications/analytics"; import { F24ListBottomSheetLink } from "./F24ListBottomSheetLink"; -type F24SectionProps = { +export type F24SectionProps = { isCancelled?: boolean; messageId: string; serviceId: ServiceId; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; }; export const F24Section = ({ isCancelled = false, messageId, - serviceId + serviceId, + sendOpeningSource, + sendUserType }: F24SectionProps) => { const attachments = useIOSelector(state => thirdPartyMessageAttachments(state, messageId) @@ -42,7 +50,8 @@ export const F24Section = ({ attachment={f24s[0]} messageId={messageId} serviceId={serviceId} - isPN + sendOpeningSource={sendOpeningSource} + sendUserType={sendUserType} /> )} {f24Count > 1 && ( @@ -50,6 +59,8 @@ export const F24Section = ({ f24List={f24s} messageId={messageId} serviceId={serviceId} + sendOpeningSource={sendOpeningSource} + sendUserType={sendUserType} /> )} diff --git a/ts/features/pn/components/MessageBottomMenu.tsx b/ts/features/pn/components/MessageBottomMenu.tsx index cbc1eea8723..a3ece575a5d 100644 --- a/ts/features/pn/components/MessageBottomMenu.tsx +++ b/ts/features/pn/components/MessageBottomMenu.tsx @@ -13,6 +13,10 @@ import { ShowMoreSection } from "../../messages/components/MessageDetail/ShowMoreListItem"; import { formatPaymentNoticeNumber } from "../../payments/common/utils"; +import { + SendOpeningSource, + SendUserType +} from "../../pushNotifications/analytics"; import { TimelineListItem } from "./TimelineListItem"; import { NeedHelp } from "./NeedHelp"; @@ -32,6 +36,8 @@ export type MessageBottomMenuProps = { messageId: string; paidNoticeCodes?: ReadonlyArray; payments?: ReadonlyArray; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; }; const generateMessageSectionData = ( @@ -132,7 +138,9 @@ export const MessageBottomMenu = ({ iun, messageId, paidNoticeCodes, - payments + payments, + sendOpeningSource, + sendUserType }: MessageBottomMenuProps) => { const theme = useIOTheme(); @@ -154,7 +162,11 @@ export const MessageBottomMenu = ({ { backgroundColor: IOColors[theme["appBackground-secondary"]] } ]} > - + diff --git a/ts/features/pn/components/MessageCancelledContent.tsx b/ts/features/pn/components/MessageCancelledContent.tsx index f612fc9e81d..a0794233abb 100644 --- a/ts/features/pn/components/MessageCancelledContent.tsx +++ b/ts/features/pn/components/MessageCancelledContent.tsx @@ -2,7 +2,7 @@ import { Alert, VSpacer } from "@pagopa/io-app-design-system"; import I18n from "i18next"; import { NotificationPaymentInfo } from "../../../../definitions/pn/NotificationPaymentInfo"; -type MessageCancelledContentProps = { +export type MessageCancelledContentProps = { isCancelled?: boolean; paidNoticeCodes?: ReadonlyArray; payments?: ReadonlyArray; diff --git a/ts/features/pn/components/MessageDetails.tsx b/ts/features/pn/components/MessageDetails.tsx index a8bc61d96a8..e01b7c0f267 100644 --- a/ts/features/pn/components/MessageDetails.tsx +++ b/ts/features/pn/components/MessageDetails.tsx @@ -24,6 +24,10 @@ import { maxVisiblePaymentCount, shouldUseBottomSheetForPayments } from "../utils"; +import { + SendOpeningSource, + SendUserType +} from "../../pushNotifications/analytics"; import { BannerAttachments } from "./BannerAttachments"; import { F24Section } from "./F24Section"; import { MessageBottomMenu } from "./MessageBottomMenu"; @@ -38,7 +42,9 @@ export type MessageDetailsProps = { messageId: string; serviceId: ServiceId; payments?: ReadonlyArray; - isAARMessage?: boolean; + isAARMessage: boolean; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; }; export const MessageDetails = ({ @@ -46,7 +52,9 @@ export const MessageDetails = ({ messageId, payments, serviceId, - isAARMessage = false + isAARMessage, + sendOpeningSource, + sendUserType }: MessageDetailsProps) => { const presentPaymentsBottomSheetRef = useRef<() => void>(undefined); const partitionedAttachments = pipe( @@ -113,8 +121,9 @@ export const MessageDetails = ({ banner={} disabled={message.isCancelled} messageId={messageId} - isPN serviceId={serviceId} + sendOpeningSource={sendOpeningSource} + sendUserType={sendUserType} /> @@ -141,16 +154,19 @@ export const MessageDetails = ({ messageId={messageId} paidNoticeCodes={completedPaymentNoticeCodes} payments={payments} + sendOpeningSource={sendOpeningSource} + sendUserType={sendUserType} /> {shouldUseBottomSheetForPayments(isCancelled, payments) && ( )} diff --git a/ts/features/pn/components/MessageDetailsContent.tsx b/ts/features/pn/components/MessageDetailsContent.tsx index 4d78e62e7ac..76fdf0f2b30 100644 --- a/ts/features/pn/components/MessageDetailsContent.tsx +++ b/ts/features/pn/components/MessageDetailsContent.tsx @@ -9,7 +9,7 @@ import { import { sendShowAbstractSelector } from "../../../store/reducers/backendStatus/remoteConfig"; import { isTestEnv } from "../../../utils/environment"; -type MessageDetailsContentProps = { message: PNMessage }; +export type MessageDetailsContentProps = { message: PNMessage }; export const MessageDetailsContent = ({ message }: MessageDetailsContentProps) => ( diff --git a/ts/features/pn/components/MessageFooter.tsx b/ts/features/pn/components/MessageFooter.tsx index 921644f0491..4513b5edc4c 100644 --- a/ts/features/pn/components/MessageFooter.tsx +++ b/ts/features/pn/components/MessageFooter.tsx @@ -14,16 +14,20 @@ import { trackPNPaymentStart, trackPNShowAllPayments } from "../analytics"; import { initializeAndNavigateToWalletForPayment } from "../../messages/utils"; import { paymentsButtonStateSelector } from "../store/reducers/payments"; import { shouldUseBottomSheetForPayments } from "../utils"; -import { ServiceId } from "../../../../definitions/backend/ServiceId"; +import { + SendOpeningSource, + SendUserType +} from "../../pushNotifications/analytics"; -type MessageFooterProps = { +export type MessageFooterProps = { messageId: string; payments: ReadonlyArray | undefined; maxVisiblePaymentCount: number; isCancelled: boolean; presentPaymentsBottomSheetRef: MutableRefObject<(() => void) | undefined>; - serviceId: ServiceId; onMeasure: (measurements: FooterActionsMeasurements) => void; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; }; export const MessageFooter = ({ @@ -32,7 +36,9 @@ export const MessageFooter = ({ maxVisiblePaymentCount, isCancelled, presentPaymentsBottomSheetRef, - onMeasure + onMeasure, + sendOpeningSource, + sendUserType }: MessageFooterProps) => { const dispatch = useDispatch(); const toast = useIOToast(); @@ -59,7 +65,7 @@ export const MessageFooter = ({ true, canNavigateToPayment, dispatch, - () => trackPNPaymentStart(), + () => trackPNPaymentStart(sendOpeningSource, sendUserType), () => toast.error(I18n.t("genericError")) ); } @@ -68,6 +74,8 @@ export const MessageFooter = ({ dispatch, payments, presentPaymentsBottomSheetRef, + sendOpeningSource, + sendUserType, toast ]); if (isCancelled || buttonState === "hidden") { diff --git a/ts/features/pn/components/MessagePaymentBottomSheet.tsx b/ts/features/pn/components/MessagePaymentBottomSheet.tsx index 2d7fd8ea8da..fd24ff7aba3 100644 --- a/ts/features/pn/components/MessagePaymentBottomSheet.tsx +++ b/ts/features/pn/components/MessagePaymentBottomSheet.tsx @@ -8,19 +8,27 @@ import { MessagePaymentItem } from "../../messages/components/MessageDetail/Mess import { cancelQueuedPaymentUpdates } from "../../messages/store/actions"; import { getRptIdStringFromPayment } from "../utils/rptId"; import { ServiceId } from "../../../../definitions/backend/ServiceId"; +import { + SendOpeningSource, + SendUserType +} from "../../pushNotifications/analytics"; export type MessagePaymentBottomSheetProps = { messageId: string; payments: ReadonlyArray; presentPaymentsBottomSheetRef: MutableRefObject<(() => void) | undefined>; serviceId: ServiceId; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; }; export const MessagePaymentBottomSheet = ({ messageId, payments, presentPaymentsBottomSheetRef, - serviceId + serviceId, + sendOpeningSource, + sendUserType }: MessagePaymentBottomSheetProps) => { const dispatch = useIODispatch(); const windowHeight = Dimensions.get("window").height; @@ -42,6 +50,8 @@ export const MessagePaymentBottomSheet = ({ noSpaceOnTop={index === 0} serviceId={serviceId} willNavigateToPayment={() => dismiss()} + sendOpeningSource={sendOpeningSource} + sendUserType={sendUserType} /> ); })} diff --git a/ts/features/pn/components/MessagePayments.tsx b/ts/features/pn/components/MessagePayments.tsx index 3b1dda5032f..e63ebb9277e 100644 --- a/ts/features/pn/components/MessagePayments.tsx +++ b/ts/features/pn/components/MessagePayments.tsx @@ -24,6 +24,10 @@ import PN_ROUTES from "../navigation/routes"; import { paymentsButtonStateSelector } from "../store/reducers/payments"; import { canShowMorePaymentsLink } from "../utils"; import { getRptIdStringFromPayment } from "../utils/rptId"; +import { + SendOpeningSource, + SendUserType +} from "../../pushNotifications/analytics"; const styles = StyleSheet.create({ morePaymentsSkeletonContainer: { @@ -35,7 +39,7 @@ const styles = StyleSheet.create({ } }); -type MessagePaymentsProps = { +export type MessagePaymentsProps = { messageId: string; isCancelled: boolean; payments: ReadonlyArray | undefined; @@ -43,6 +47,8 @@ type MessagePaymentsProps = { maxVisiblePaymentCount: number; presentPaymentsBottomSheetRef: MutableRefObject<(() => void) | undefined>; serviceId: ServiceId; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; }; const readonlyArrayHasNoData = (maybeArray: ReadonlyArray | undefined) => @@ -98,7 +104,9 @@ export const MessagePayments = ({ completedPaymentNoticeCodes, maxVisiblePaymentCount, presentPaymentsBottomSheetRef, - serviceId + serviceId, + sendOpeningSource, + sendUserType }: MessagePaymentsProps) => { const navigation = useNavigation(); const theme = useIOTheme(); @@ -185,6 +193,8 @@ export const MessagePayments = ({ rptId={rptId} noticeNumber={payment.noticeCode} serviceId={serviceId} + sendOpeningSource={sendOpeningSource} + sendUserType={sendUserType} /> ); })} diff --git a/ts/features/pn/components/TimelineListItem.tsx b/ts/features/pn/components/TimelineListItem.tsx index 16391ed462f..5364ec29be4 100644 --- a/ts/features/pn/components/TimelineListItem.tsx +++ b/ts/features/pn/components/TimelineListItem.tsx @@ -17,6 +17,10 @@ import { trackPNShowTimeline, trackPNTimelineExternal } from "../analytics"; import { handleItemOnPress } from "../../../utils/url"; import { useIOSelector } from "../../../store/hooks"; import { pnFrontendUrlSelector } from "../../../store/reducers/backendStatus/remoteConfig"; +import { + SendOpeningSource, + SendUserType +} from "../../pushNotifications/analytics"; import { Timeline, TimelineItemProps } from "./Timeline"; const topBottomSheetMargin = 122; @@ -25,6 +29,8 @@ const timelineItemHeight = 70; export type TimelineListItemProps = { history: NotificationStatusHistory; + sendOpeningSource: SendOpeningSource; + sendUserType: SendUserType; }; const generateTimelineData = ( @@ -41,7 +47,11 @@ const generateTimelineData = ( status: notificationStatusToTimelineStatus(historyItem.status) })); -export const TimelineListItem = ({ history }: TimelineListItemProps) => { +export const TimelineListItem = ({ + history, + sendOpeningSource, + sendUserType +}: TimelineListItemProps) => { const [footerHeight, setFooterHeight] = useState(181); const windowHeight = Dimensions.get("window").height; const snapPoint = Math.min( @@ -70,10 +80,11 @@ export const TimelineListItem = ({ history }: TimelineListItemProps) => { } onPress={() => { if (sendExternalUrl) { - trackPNTimelineExternal(); + trackPNTimelineExternal(sendOpeningSource, sendUserType); handleItemOnPress(sendExternalUrl)(); } }} + testID="timeline_listitem_bottom_menu_alert" /> ), @@ -87,10 +98,11 @@ export const TimelineListItem = ({ history }: TimelineListItemProps) => { icon="history" label={I18n.t("features.pn.details.timeline.menuTitle")} onPress={() => { - trackPNShowTimeline(); + trackPNShowTimeline(sendOpeningSource, sendUserType); present(); }} variant="primary" + testID="timeline_listitem_bottom_menu" /> {bottomSheet} diff --git a/ts/features/pn/components/__mocks__/F24ListBottomSheetLink.tsx b/ts/features/pn/components/__mocks__/F24ListBottomSheetLink.tsx new file mode 100644 index 00000000000..dc7bf3288ff --- /dev/null +++ b/ts/features/pn/components/__mocks__/F24ListBottomSheetLink.tsx @@ -0,0 +1,19 @@ +import { View } from "react-native"; +import { F24ListBottomSheetLinkProps } from "../F24ListBottomSheetLink"; + +export const F24ListBottomSheetLink = ({ + f24List, + messageId, + serviceId, + sendOpeningSource, + sendUserType +}: F24ListBottomSheetLinkProps) => ( + + {"Mock F24ListBottomSheetLink"} + {`Item count: ${f24List.length}`} + {`Message Id: ${messageId}`} + {`Service Id: ${serviceId}`} + {`Opening Source: ${sendOpeningSource}`} + {`User Type: ${sendUserType}`} + +); diff --git a/ts/features/pn/components/__mocks__/F24Section.tsx b/ts/features/pn/components/__mocks__/F24Section.tsx new file mode 100644 index 00000000000..0d49188f3f2 --- /dev/null +++ b/ts/features/pn/components/__mocks__/F24Section.tsx @@ -0,0 +1,19 @@ +import { View } from "react-native"; +import { F24SectionProps } from "../F24Section"; + +export const F24Section = ({ + isCancelled, + messageId, + serviceId, + sendOpeningSource, + sendUserType +}: F24SectionProps) => ( + + {`Mock F24Section`} + {`Message Id: ${messageId}`} + {`Service Id: ${serviceId}`} + {`Cancelled: ${isCancelled}`} + {`Opening Source: ${sendOpeningSource}`} + {`User Type: ${sendUserType}`} + +); diff --git a/ts/features/pn/components/__mocks__/MessageBottomMenu.tsx b/ts/features/pn/components/__mocks__/MessageBottomMenu.tsx index 027ee5b9f81..dcb4a85f0a1 100644 --- a/ts/features/pn/components/__mocks__/MessageBottomMenu.tsx +++ b/ts/features/pn/components/__mocks__/MessageBottomMenu.tsx @@ -7,7 +7,9 @@ export const MessageBottomMenu = ({ iun, messageId, paidNoticeCodes, - payments + payments, + sendOpeningSource, + sendUserType }: MessageBottomMenuProps) => ( <> Mock MessageBottomMenu @@ -39,5 +41,7 @@ export const MessageBottomMenu = ({ {payment.noticeCode} ))} + {`Opening Source: ${sendOpeningSource}`} + {`User Type: ${sendUserType}`} ); diff --git a/ts/features/pn/components/__mocks__/MessageCancelledContent.tsx b/ts/features/pn/components/__mocks__/MessageCancelledContent.tsx new file mode 100644 index 00000000000..d762449c8eb --- /dev/null +++ b/ts/features/pn/components/__mocks__/MessageCancelledContent.tsx @@ -0,0 +1,17 @@ +import { View } from "react-native"; +import { MessageCancelledContentProps } from "../MessageCancelledContent"; + +export const MessageCancelledContent = ({ + isCancelled, + paidNoticeCodes, + payments +}: MessageCancelledContentProps) => ( + + {`Mock MessageCancelledContent`} + {`Is cancelled: ${isCancelled}`} + {`Paid notice codes count: ${ + paidNoticeCodes?.length ?? "undefined" + }`} + {`Payments count: ${payments?.length ?? "undefined"}`} + +); diff --git a/ts/features/pn/components/__mocks__/MessageDetails.tsx b/ts/features/pn/components/__mocks__/MessageDetails.tsx index 04a342980ad..926c34b29a8 100644 --- a/ts/features/pn/components/__mocks__/MessageDetails.tsx +++ b/ts/features/pn/components/__mocks__/MessageDetails.tsx @@ -5,7 +5,10 @@ export const MessageDetails = ({ message, messageId, serviceId, - payments + payments, + isAARMessage, + sendOpeningSource, + sendUserType }: MessageDetailsProps) => ( Mock MessageDetails @@ -67,5 +70,8 @@ export const MessageDetails = ({ {payment.noticeCode} ))} + {`Is AAR: ${isAARMessage}`} + {`Opening Source: ${sendOpeningSource}`} + {`User Type: ${sendUserType}`} ); diff --git a/ts/features/pn/components/__mocks__/MessageDetailsContent.tsx b/ts/features/pn/components/__mocks__/MessageDetailsContent.tsx new file mode 100644 index 00000000000..c35328c4337 --- /dev/null +++ b/ts/features/pn/components/__mocks__/MessageDetailsContent.tsx @@ -0,0 +1,13 @@ +import { View } from "react-native"; +import { MessageDetailsContentProps } from "../MessageDetailsContent"; + +export const MessageDetailsContent = ({ + message +}: MessageDetailsContentProps) => ( + + {`Mock MessageDetailsContent`} + ${`Abstract: ${message.abstract}`} + ${`IUN: ${message.iun}`} + ${`Sender Denomination: ${message.senderDenomination}`} + +); diff --git a/ts/features/pn/components/__mocks__/MessageFooter.tsx b/ts/features/pn/components/__mocks__/MessageFooter.tsx new file mode 100644 index 00000000000..03bd28bc704 --- /dev/null +++ b/ts/features/pn/components/__mocks__/MessageFooter.tsx @@ -0,0 +1,27 @@ +import { View } from "react-native"; +import { MessageFooterProps } from "../MessageFooter"; + +export const MessageFooter = ({ + isCancelled, + maxVisiblePaymentCount, + messageId, + onMeasure, + payments, + presentPaymentsBottomSheetRef, + sendOpeningSource, + sendUserType +}: MessageFooterProps) => ( + + {`Mock MessageFooterProps`} + {`Is cancelled: ${isCancelled}`} + {`Max Payments: ${maxVisiblePaymentCount}`} + {`Message Id: ${messageId}`} + {`On measure: ${onMeasure}`} + {`Payment Count: ${payments?.length ?? "none"}`} + {`Bottom Sheet: ${ + presentPaymentsBottomSheetRef ? "defined" : "undefined" + }`} + {`Open Source: ${sendOpeningSource}`} + {`User Type: ${sendUserType}`} + +); diff --git a/ts/features/pn/components/__mocks__/MessagePaymentBottomSheet.tsx b/ts/features/pn/components/__mocks__/MessagePaymentBottomSheet.tsx new file mode 100644 index 00000000000..8b02e55c52e --- /dev/null +++ b/ts/features/pn/components/__mocks__/MessagePaymentBottomSheet.tsx @@ -0,0 +1,23 @@ +import { View } from "react-native"; +import { MessagePaymentBottomSheetProps } from "../MessagePaymentBottomSheet"; + +export const MessagePaymentBottomSheet = ({ + messageId, + payments, + presentPaymentsBottomSheetRef, + serviceId, + sendOpeningSource, + sendUserType +}: MessagePaymentBottomSheetProps) => ( + + {`Mock MessagePaymentBottomSheet`} + {`Message Id: ${messageId}`} + {`Payment Count: ${payments.length}`} + {`Bottom Sheet Ref: ${ + presentPaymentsBottomSheetRef ? "defined" : "undefined" + }`} + {`Service Id: ${serviceId}`} + {`Opening Source: ${sendOpeningSource}`} + {`User Type: ${sendUserType}`} + +); diff --git a/ts/features/pn/components/__mocks__/MessagePayments.tsx b/ts/features/pn/components/__mocks__/MessagePayments.tsx new file mode 100644 index 00000000000..fd26cf01e0b --- /dev/null +++ b/ts/features/pn/components/__mocks__/MessagePayments.tsx @@ -0,0 +1,31 @@ +import { View } from "react-native"; +import { MessagePaymentsProps } from "../MessagePayments"; + +export const MessagePayments = ({ + completedPaymentNoticeCodes, + isCancelled, + maxVisiblePaymentCount, + messageId, + payments, + presentPaymentsBottomSheetRef, + serviceId, + sendOpeningSource, + sendUserType +}: MessagePaymentsProps) => ( + + {`Mock MessagePayments`} + {`Completed payments: ${ + completedPaymentNoticeCodes?.length ?? "none" + }`} + {`Cancelled: ${isCancelled}`} + {`Max Payment Count: ${maxVisiblePaymentCount}`} + {`Message Id: ${messageId}`} + {`Payments: ${payments?.length ?? "none"}`} + {`Bottom Sheet ref: ${ + presentPaymentsBottomSheetRef ? "defined" : "undefined" + }`} + {`Service Id: ${serviceId}`} + {`Opening Source: ${sendOpeningSource}`} + {`User Type: ${sendUserType}`} + +); diff --git a/ts/features/pn/components/__mocks__/TimelineListItem.tsx b/ts/features/pn/components/__mocks__/TimelineListItem.tsx index ce318cc6ae2..d31e9fe0545 100644 --- a/ts/features/pn/components/__mocks__/TimelineListItem.tsx +++ b/ts/features/pn/components/__mocks__/TimelineListItem.tsx @@ -1,7 +1,11 @@ import { View } from "react-native"; import { TimelineListItemProps } from "../TimelineListItem"; -export const TimelineListItem = ({ history }: TimelineListItemProps) => ( +export const TimelineListItem = ({ + history, + sendOpeningSource, + sendUserType +}: TimelineListItemProps) => ( <> {history.map((pieceOfHistory, index) => ( @@ -17,5 +21,7 @@ export const TimelineListItem = ({ history }: TimelineListItemProps) => ( {pieceOfHistory.status} ))} + {`Opening Source: ${sendOpeningSource}`} + {`User Type: ${sendUserType}`} ); diff --git a/ts/features/pn/components/__test__/F24ListBottomSheetLink.test.tsx b/ts/features/pn/components/__test__/F24ListBottomSheetLink.test.tsx index 6f7e1197bbc..1c2bde7f8ea 100644 --- a/ts/features/pn/components/__test__/F24ListBottomSheetLink.test.tsx +++ b/ts/features/pn/components/__test__/F24ListBottomSheetLink.test.tsx @@ -1,10 +1,18 @@ import { createStore } from "redux"; +import { fireEvent } from "@testing-library/react-native"; import { applicationChangeState } from "../../../../store/actions/application"; import { appReducer } from "../../../../store/reducers"; import { renderScreenWithNavigationStoreContext } from "../../../../utils/testWrapper"; import { F24ListBottomSheetLink } from "../F24ListBottomSheetLink"; import { ThirdPartyAttachment } from "../../../../../definitions/backend/ThirdPartyAttachment"; import { ServiceId } from "../../../../../definitions/backend/ServiceId"; +import PN_ROUTES from "../../navigation/routes"; +import { + SendOpeningSource, + SendUserType +} from "../../../pushNotifications/analytics"; +import * as ANALYTICS from "../../analytics"; +import * as IO_BOTTOM_SHEET from "../../../../utils/hooks/bottomSheet"; const numberToThirdPartyAttachment = (index: number) => ({ @@ -12,25 +20,84 @@ const numberToThirdPartyAttachment = (index: number) => url: `https://domain.url/doc${index}.pdf` } as ThirdPartyAttachment); +const f24Lists: ReadonlyArray> = [ + [], + [{ ...numberToThirdPartyAttachment(1) }], + [ + { ...numberToThirdPartyAttachment(1) }, + { ...numberToThirdPartyAttachment(2) } + ] +]; +const sendOpeningSources: ReadonlyArray = [ + "aar", + "message", + "not_set" +]; +const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" +]; + describe("F24ListBottomSheetLink", () => { - it("should be snapshot for an 0 items F24 list", () => { - const zeroF24List = [] as ReadonlyArray; - const component = renderComponent(zeroF24List); - expect(component.toJSON()).toMatchSnapshot(); - }); - it("should be snapshot for an 1 item F24 list", () => { - const oneF24List = [...Array(1).keys()].map(numberToThirdPartyAttachment); - const component = renderComponent(oneF24List); - expect(component.toJSON()).toMatchSnapshot(); - }); - it("should be snapshot for a 10 items F24 list", () => { - const oneF24List = [...Array(10).keys()].map(numberToThirdPartyAttachment); - const component = renderComponent(oneF24List); - expect(component.toJSON()).toMatchSnapshot(); + afterEach(() => { + jest.resetAllMocks(); + jest.restoreAllMocks(); }); + f24Lists.forEach(f24List => + sendOpeningSources.forEach(sendOpeningSource => + sendUserTypes.forEach(sendUserType => { + it(`should match snapshot (${f24List.length} items, opening source ${sendOpeningSource}, user type ${sendUserType})`, () => { + const component = renderComponent( + f24List, + sendOpeningSource, + sendUserType + ); + expect(component.toJSON()).toMatchSnapshot(); + }); + }) + ) + ); + sendOpeningSources.forEach(sendOpeningSource => + sendUserTypes.forEach(sendUserType => { + it(`should call trackPNShowF24 with proper parameters (opening source ${sendOpeningSource}, user type ${sendUserType})`, () => { + const spiedOnMockedTrackPNShowF24 = jest + .spyOn(ANALYTICS, "trackPNShowF24") + .mockImplementation(); + const refUseIOBottomSheetModal = IO_BOTTOM_SHEET.useIOBottomSheetModal; + jest + .spyOn(IO_BOTTOM_SHEET, "useIOBottomSheetModal") + .mockImplementation(props => { + const { bottomSheet } = refUseIOBottomSheetModal(props); + return { + bottomSheet, + dismiss: jest.fn(), + present: jest.fn() + }; + }); + const component = renderComponent([], sendOpeningSource, sendUserType); + + const button = component.getByTestId( + "f24_list_bottomsheet_link_button" + ); + fireEvent.press(button); + + expect(spiedOnMockedTrackPNShowF24.mock.calls.length).toBe(1); + expect(spiedOnMockedTrackPNShowF24.mock.calls[0].length).toBe(2); + expect(spiedOnMockedTrackPNShowF24.mock.calls[0][0]).toBe( + sendOpeningSource + ); + expect(spiedOnMockedTrackPNShowF24.mock.calls[0][1]).toBe(sendUserType); + }); + }) + ); }); -const renderComponent = (f24List: ReadonlyArray) => { +const renderComponent = ( + f24List: ReadonlyArray, + openingSource: SendOpeningSource, + userType: SendUserType +) => { const initialState = appReducer(undefined, applicationChangeState("active")); const store = createStore(appReducer, initialState as any); @@ -40,9 +107,11 @@ const renderComponent = (f24List: ReadonlyArray) => { f24List={f24List} messageId={"01HS94671EXDWDESDJB3NCBYPM"} serviceId={"01JKAGWVQRFE1P8QAHZS743M90" as ServiceId} + sendOpeningSource={openingSource} + sendUserType={userType} /> ), - "DUMMY", + PN_ROUTES.MESSAGE_DETAILS, {}, store ); diff --git a/ts/features/pn/components/__test__/F24Section.test.tsx b/ts/features/pn/components/__test__/F24Section.test.tsx index 82a7f597dfa..19c42fe6cd5 100644 --- a/ts/features/pn/components/__test__/F24Section.test.tsx +++ b/ts/features/pn/components/__test__/F24Section.test.tsx @@ -7,109 +7,128 @@ import { ServiceId } from "../../../../../definitions/backend/ServiceId"; import * as thirdPartyById from "../../../messages/store/reducers/thirdPartyById"; import { ThirdPartyAttachment } from "../../../../../definitions/backend/ThirdPartyAttachment"; import { ATTACHMENT_CATEGORY } from "../../../messages/types/attachmentCategory"; -import { mockAccessibilityInfo } from "../../../../utils/testAccessibility"; +import PN_ROUTES from "../../navigation/routes"; +import { + SendOpeningSource, + SendUserType +} from "../../../pushNotifications/analytics"; -const generateOneAttachmentArray = () => [ - { - id: "1", - url: "https://no.url/doc.pdf" - } as ThirdPartyAttachment +jest.mock( + "../../../messages/components/MessageDetail/MessageDetailsAttachmentItem" +); +jest.mock("../F24ListBottomSheetLink"); + +const thirdPartyAttachmentLists: ReadonlyArray< + ReadonlyArray +> = [ + [], + [ + { + id: "1", + url: "https://no.url/doc.pdf" + } as ThirdPartyAttachment + ], + [ + { + id: "1", + url: "https://no.url/docF24.pdf", + category: ATTACHMENT_CATEGORY.F24 + } as ThirdPartyAttachment + ], + [ + { + id: "1", + url: "https://no.url/doc.pdf" + } as ThirdPartyAttachment, + { + id: "2", + url: "https://no.url/docF24.pdf", + category: ATTACHMENT_CATEGORY.F24 + } as ThirdPartyAttachment + ], + [ + { + id: "1", + url: "https://no.url/docF24_1.pdf", + category: ATTACHMENT_CATEGORY.F24 + } as ThirdPartyAttachment, + { + id: "2", + url: "https://no.url/docF24_2.pdf", + category: ATTACHMENT_CATEGORY.F24 + } as ThirdPartyAttachment + ], + [ + { + id: "1", + url: "https://no.url/docF24_1.pdf", + category: ATTACHMENT_CATEGORY.F24 + } as ThirdPartyAttachment, + { + id: "2", + url: "https://no.url/doc.pdf" + } as ThirdPartyAttachment, + { + id: "3", + url: "https://no.url/docF24_3.pdf", + category: ATTACHMENT_CATEGORY.F24 + } as ThirdPartyAttachment + ] ]; -const generateThreeAttachmentArray = () => [ - { - id: "1", - url: "https://no.url/doc.pdf" - } as ThirdPartyAttachment, - { - id: "2", - url: "https://no.url/docF24.pdf", - category: ATTACHMENT_CATEGORY.F24 - } as ThirdPartyAttachment, - { - id: "3", - url: "https://no.url/cod.pdf" - } as ThirdPartyAttachment + +const sendOpeningSources: ReadonlyArray = [ + "aar", + "message", + "not_set" ]; -const generateFourAttachmentArray = () => [ - { - id: "1", - url: "https://no.url/doc.pdf" - } as ThirdPartyAttachment, - { - id: "2", - url: "https://no.url/docF24.pdf", - category: ATTACHMENT_CATEGORY.F24 - } as ThirdPartyAttachment, - { - id: "3", - url: "https://no.url/cod.pdf" - } as ThirdPartyAttachment, - { - id: "4", - url: "https://no.url/f24Doc.pdf", - category: ATTACHMENT_CATEGORY.F24 - } as ThirdPartyAttachment +const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" ]; +// Vuoto, un documento, un f24, un f24+doc, due f24, duef24+doc + describe("F24Section", () => { beforeEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); - mockAccessibilityInfo(false); - }); - it("should match snapshot when there are no F24", () => { - jest - .spyOn(thirdPartyById, "thirdPartyMessageAttachments") - .mockImplementation((_state, _messageId) => generateOneAttachmentArray()); - const component = renderComponent(); - expect(component.toJSON()).toMatchSnapshot(); - }); - it("should match snapshot when there are no F24 and the message is cancelled", () => { - jest - .spyOn(thirdPartyById, "thirdPartyMessageAttachments") - .mockImplementation((_state, _messageId) => generateOneAttachmentArray()); - const component = renderComponent(true); - expect(component.toJSON()).toMatchSnapshot(); - }); - it("should match snapshot when there is a single F24", () => { - jest - .spyOn(thirdPartyById, "thirdPartyMessageAttachments") - .mockImplementation((_state, _messageId) => - generateThreeAttachmentArray() - ); - const component = renderComponent(); - expect(component.toJSON()).toMatchSnapshot(); - }); - it("should match snapshot when there is a single F24 and the message is cancelled", () => { - jest - .spyOn(thirdPartyById, "thirdPartyMessageAttachments") - .mockImplementation((_state, _messageId) => - generateThreeAttachmentArray() - ); - const component = renderComponent(true); - expect(component.toJSON()).toMatchSnapshot(); - }); - it("should match snapshot when there are more than one F24", () => { - jest - .spyOn(thirdPartyById, "thirdPartyMessageAttachments") - .mockImplementation((_state, _messageId) => - generateFourAttachmentArray() - ); - const component = renderComponent(); - expect(component.toJSON()).toMatchSnapshot(); - }); - it("should match snapshot when there are more than one F24 and the message is cancelled", () => { - jest - .spyOn(thirdPartyById, "thirdPartyMessageAttachments") - .mockImplementation((_state, _messageId) => - generateFourAttachmentArray() - ); - const component = renderComponent(true); - expect(component.toJSON()).toMatchSnapshot(); }); + thirdPartyAttachmentLists.forEach(thirdPartyAttachmentList => + [undefined, false, true].forEach(isCancelled => + sendOpeningSources.forEach(sendOpeningSource => + sendUserTypes.forEach(sendUserType => { + it(`should match snapshot (list: [${thirdPartyAttachmentList + .map( + thirdPartyAttachment => + thirdPartyAttachment.category ?? "undefined" + ) + .join( + " " + )}], cancelled ${isCancelled}, opening source ${sendOpeningSource}, user type ${sendUserType})`, () => { + jest + .spyOn(thirdPartyById, "thirdPartyMessageAttachments") + .mockImplementation( + (_state, _messageId) => thirdPartyAttachmentList + ); + const component = renderComponent( + isCancelled, + sendOpeningSource, + sendUserType + ); + expect(component.toJSON()).toMatchSnapshot(); + }); + }) + ) + ) + ); }); -const renderComponent = (isCancelled: boolean = false) => { +const renderComponent = ( + isCancelled: boolean | undefined, + openingSource: SendOpeningSource, + userType: SendUserType +) => { const initialState = appReducer(undefined, applicationChangeState("active")); const store = createStore(appReducer, initialState as any); @@ -119,9 +138,11 @@ const renderComponent = (isCancelled: boolean = false) => { messageId={"01HS1ANR1SDPN3BP51X3G74T64"} serviceId={"01HS1ANWT4N83QGATCXYMXDP8M" as ServiceId} isCancelled={isCancelled} + sendOpeningSource={openingSource} + sendUserType={userType} /> ), - "DUMMY", + PN_ROUTES.MESSAGE_DETAILS, {}, store ); diff --git a/ts/features/pn/components/__test__/MessageBottomMenu.test.tsx b/ts/features/pn/components/__test__/MessageBottomMenu.test.tsx index b9adc6a9c51..55c6ec4c632 100644 --- a/ts/features/pn/components/__test__/MessageBottomMenu.test.tsx +++ b/ts/features/pn/components/__test__/MessageBottomMenu.test.tsx @@ -795,6 +795,8 @@ const renderComponent = ( messageId={"01HVPB9XYZMWNEPTDKZJ8ZJV28"} paidNoticeCodes={paidNoticeCodes} payments={payments} + sendOpeningSource={"not_set"} + sendUserType={"not_set"} /> ), PN_ROUTES.MESSAGE_DETAILS, diff --git a/ts/features/pn/components/__test__/MessageDetails.test.tsx b/ts/features/pn/components/__test__/MessageDetails.test.tsx index 756ae3d1da4..f49e48a2a80 100644 --- a/ts/features/pn/components/__test__/MessageDetails.test.tsx +++ b/ts/features/pn/components/__test__/MessageDetails.test.tsx @@ -1,116 +1,149 @@ import * as O from "fp-ts/lib/Option"; import { pipe } from "fp-ts/lib/function"; -import I18n from "i18next"; import { ComponentProps } from "react"; import configureMockStore from "redux-mock-store"; import { applicationChangeState } from "../../../../store/actions/application"; import { appReducer } from "../../../../store/reducers"; import { GlobalState } from "../../../../store/reducers/types"; import { renderScreenWithNavigationStoreContext } from "../../../../utils/testWrapper"; -import { serviceId_1 } from "../../../messages/__mocks__/messages"; import * as MSG_DETAILS_HEADER from "../../../messages/components/MessageDetail/MessageDetailsHeader"; import { thirdPartyMessage } from "../../__mocks__/pnMessage"; import { toPNMessage } from "../../store/types/transformers"; import { PNMessage } from "../../store/types/types"; import { MessageDetails } from "../MessageDetails"; +import PN_ROUTES from "../../navigation/routes"; +import { ServiceId } from "../../../../../definitions/services/ServiceId"; +import { NotificationPaymentInfo } from "../../../../../definitions/pn/NotificationPaymentInfo"; +import { + SendOpeningSource, + SendUserType +} from "../../../pushNotifications/analytics"; +jest.mock("../MessageCancelledContent"); +jest.mock("../MessageDetailsContent"); jest.mock( "../../../messages/components/MessageDetail/MessageDetailsAttachments" ); +jest.mock("../MessagePayments"); +jest.mock("../F24Section"); jest.mock("../MessageBottomMenu"); +jest.mock("../MessageFooter"); +jest.mock("../MessagePaymentBottomSheet"); -const pnMessage = pipe(thirdPartyMessage, toPNMessage, O.toUndefined)!; +const mockMessageId = "messageId1"; +const mockServiceId = "serviceId" as ServiceId; -describe("MessageDetails component", () => { - it("should match the snapshot with default props", () => { - const { component } = renderComponent( - generateComponentProperties(pnMessage) - ); - expect(component).toMatchSnapshot(); - }); +const sendOpeningSources: ReadonlyArray = [ + "aar", + "message", + "not_set" +]; +const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" +]; - it("should display the legalMessage tag", () => { - const { component } = renderComponent( - generateComponentProperties(pnMessage) - ); - expect( - component.queryByText(I18n.t("features.pn.details.badge.legalValue")) - ).not.toBeNull(); - }); - - it("should display the attachment tag if there are attachments", () => { - const { component } = renderComponent( - generateComponentProperties(pnMessage) - ); - expect(component.queryByTestId("attachment-tag")).not.toBeNull(); - }); - - it("should NOT display the attachment tag if there are no attachments", () => { - const { component } = renderComponent( - generateComponentProperties({ - ...pnMessage, - attachments: [] - }) - ); - expect(component.queryByTestId("attachment-tag")).toBeNull(); +describe("MessageDetails component", () => { + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); }); + // eslint-disable-next-line sonarjs/cognitive-complexity describe("isAARMessage logic", () => { beforeEach(() => { jest.clearAllMocks(); }); - [true, false].forEach(isAARMessage => { - it(`should ${ - isAARMessage ? "" : "NOT" - } display the message date when isAARMessage is ${isAARMessage}`, () => { - const headerSpy = jest.spyOn( - MSG_DETAILS_HEADER, - "MessageDetailsHeader" - ); - renderComponent({ - ...generateComponentProperties(pnMessage), - isAARMessage - }); - const mockCalls = headerSpy.mock.calls[0][0]; - expect(mockCalls).toBeDefined(); - const passedDate = mockCalls.createdAt; + [true, false].forEach(isAARMessage => + sendOpeningSources.forEach(sendOpeningSource => + sendUserTypes.forEach(sendUserType => { + it(`should ${ + isAARMessage ? "" : "NOT" + } display the message date when isAARMessage is ${isAARMessage}, opening source ${sendOpeningSource}, user type ${sendUserType}`, () => { + const pnMessage = pipe( + thirdPartyMessage, + toPNMessage, + O.toUndefined + )!; + const headerSpy = jest.spyOn( + MSG_DETAILS_HEADER, + "MessageDetailsHeader" + ); + const messageId = isAARMessage ? pnMessage.iun : mockMessageId; + const props = generateComponentProperties( + messageId, + pnMessage, + mockServiceId, + isAARMessage, + sendOpeningSource, + sendUserType + ); + renderComponent(props); + const mockCalls = headerSpy.mock.calls[0][0]; + expect(mockCalls).toBeDefined(); + const passedDate = mockCalls.createdAt; - if (isAARMessage) { - expect(passedDate).toBeUndefined(); - } else { - expect(passedDate).toEqual(pnMessage.created_at); - } - }); + if (isAARMessage) { + expect(passedDate).toBeUndefined(); + } else { + expect(passedDate).toEqual(pnMessage.created_at); + } + }); - it(`should ${ - isAARMessage ? "NOT " : "" - }allow navigation to service details when isAARMessage is ${isAARMessage}`, () => { - const headerSpy = jest.spyOn( - MSG_DETAILS_HEADER, - "MessageDetailsHeader" - ); - renderComponent({ - ...generateComponentProperties(pnMessage), - isAARMessage - }); - const mockCalls = headerSpy.mock.calls[0][0]; - expect(mockCalls).toBeDefined(); - const canNavigateToServiceDetails = - mockCalls.canNavigateToServiceDetails; - if (isAARMessage) { - expect(canNavigateToServiceDetails).toBe(false); - } else { - expect(canNavigateToServiceDetails).toBe(true); - } - }); - }); + it(`should ${ + isAARMessage ? "NOT " : "" + }allow navigation to service details when isAARMessage is ${isAARMessage}, opening source ${sendOpeningSource}, user type ${sendUserType}`, () => { + const pnMessage = pipe( + thirdPartyMessage, + toPNMessage, + O.toUndefined + )!; + const headerSpy = jest.spyOn( + MSG_DETAILS_HEADER, + "MessageDetailsHeader" + ); + const messageId = isAARMessage ? pnMessage.iun : mockMessageId; + const props = generateComponentProperties( + messageId, + pnMessage, + mockServiceId, + isAARMessage, + sendOpeningSource, + sendUserType + ); + renderComponent(props); + const mockCalls = headerSpy.mock.calls[0][0]; + expect(mockCalls).toBeDefined(); + const canNavigateToServiceDetails = + mockCalls.canNavigateToServiceDetails; + if (isAARMessage) { + expect(canNavigateToServiceDetails).toBe(false); + } else { + expect(canNavigateToServiceDetails).toBe(true); + } + }); + }) + ) + ); }); }); -const generateComponentProperties = (message: PNMessage) => ({ - messageId: "01HRYR6C761DGH3S84HBBXMMKT", +const generateComponentProperties = ( + messageId: string, + message: PNMessage, + serviceId: ServiceId, + isAARMessage: boolean, + sendOpeningSource: SendOpeningSource, + sendUserType: SendUserType, + payments?: ReadonlyArray +): ComponentProps => ({ + messageId, message, - payments: undefined, - serviceId: serviceId_1 + payments, + serviceId, + isAARMessage, + sendOpeningSource, + sendUserType }); const renderComponent = (props: ComponentProps) => { @@ -121,7 +154,7 @@ const renderComponent = (props: ComponentProps) => { return { component: renderScreenWithNavigationStoreContext( () => , - "DUMMY_ROUTE", + PN_ROUTES.MESSAGE_DETAILS, {}, store ), diff --git a/ts/features/pn/components/__test__/MessageFooter.test.tsx b/ts/features/pn/components/__test__/MessageFooter.test.tsx index 289f4eadd53..931329d1a1e 100644 --- a/ts/features/pn/components/__test__/MessageFooter.test.tsx +++ b/ts/features/pn/components/__test__/MessageFooter.test.tsx @@ -5,7 +5,6 @@ import { renderScreenWithNavigationStoreContext } from "../../../../utils/testWr import { MessageFooter } from "../MessageFooter"; import * as standardPayments from "../../../messages/store/reducers/payments"; import * as payments from "../../store/reducers/payments"; -import { ServiceId } from "../../../../../definitions/backend/ServiceId"; import { mockAccessibilityInfo } from "../../../../utils/testAccessibility"; describe("MessageFooter", () => { @@ -62,12 +61,13 @@ const renderScreen = ( () => ( void 0} + sendOpeningSource={"aar"} + sendUserType={"recipient"} /> ), "DUMMY", diff --git a/ts/features/pn/components/__test__/MessagePaymentBottomSheet.test.tsx b/ts/features/pn/components/__test__/MessagePaymentBottomSheet.test.tsx index 8a9c980b94e..a6fdbca7435 100644 --- a/ts/features/pn/components/__test__/MessagePaymentBottomSheet.test.tsx +++ b/ts/features/pn/components/__test__/MessagePaymentBottomSheet.test.tsx @@ -103,6 +103,8 @@ const renderComponent = ( payments={payments} presentPaymentsBottomSheetRef={mockPresentPaymentsBottomSheetRef} serviceId={"01J5X3CYV736B41KSZS8DYR75Q" as ServiceId} + sendOpeningSource={"message"} + sendUserType={"recipient"} /> ), PN_ROUTES.MESSAGE_DETAILS, diff --git a/ts/features/pn/components/__test__/MessagePayments.test.tsx b/ts/features/pn/components/__test__/MessagePayments.test.tsx index 0c4f473d905..47a2237a83e 100644 --- a/ts/features/pn/components/__test__/MessagePayments.test.tsx +++ b/ts/features/pn/components/__test__/MessagePayments.test.tsx @@ -527,6 +527,8 @@ const renderComponent = ( payments={payments} presentPaymentsBottomSheetRef={mockPresentPaymentsBottomSheetRef} serviceId={"01J5X3DFDZJ9AJ6CW89WY8QS4N" as ServiceId} + sendOpeningSource={"message"} + sendUserType={"recipient"} /> ), PN_ROUTES.MESSAGE_DETAILS, diff --git a/ts/features/pn/components/__test__/TimelineListItem.test.tsx b/ts/features/pn/components/__test__/TimelineListItem.test.tsx index f27747c1645..49ffa5292fd 100644 --- a/ts/features/pn/components/__test__/TimelineListItem.test.tsx +++ b/ts/features/pn/components/__test__/TimelineListItem.test.tsx @@ -1,5 +1,6 @@ import * as O from "fp-ts/lib/Option"; import { createStore } from "redux"; +import { fireEvent, render } from "@testing-library/react-native"; import { appReducer } from "../../../../store/reducers"; import { applicationChangeState } from "../../../../store/actions/application"; import { renderScreenWithNavigationStoreContext } from "../../../../utils/testWrapper"; @@ -8,26 +9,151 @@ import PN_ROUTES from "../../navigation/routes"; import { NotificationStatusHistory } from "../../../../../definitions/pn/NotificationStatusHistory"; import { GlobalState } from "../../../../store/reducers/types"; import { BackendStatus } from "../../../../../definitions/content/BackendStatus"; +import { + SendOpeningSource, + SendUserType +} from "../../../pushNotifications/analytics"; +import * as ANALYTICS from "../../analytics"; +import * as BOTTOM_SHEET from "../../../../utils/hooks/bottomSheet"; +import * as URL_UTILS from "../../../../utils/url"; jest.mock("../Timeline"); +const mockFrontendUrl = "https://www.domain.com/sendUrl"; + +const sendOpeningSources: ReadonlyArray = [ + "aar", + "message", + "not_set" +]; +const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" +]; + describe("TimelineListItem", () => { + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); it("Should match snapshot, no history, no link", () => { - const component = renderComponent([], false); + const component = renderComponent([], false, "not_set", "not_set"); expect(component.toJSON()).toMatchSnapshot(); }); it("Should match snapshot, no history, with link", () => { - const component = renderComponent([]); + const component = renderComponent([], true, "not_set", "not_set"); expect(component.toJSON()).toMatchSnapshot(); }); it("Should match snapshot, all handled-status items history, no link", () => { - const component = renderComponent(fullHistory(), false); + const component = renderComponent( + fullHistory(), + false, + "not_set", + "not_set" + ); expect(component.toJSON()).toMatchSnapshot(); }); it("Should match snapshot, all handled-status items history, with link", () => { - const component = renderComponent(fullHistory(), true); + const component = renderComponent( + fullHistory(), + true, + "not_set", + "not_set" + ); expect(component.toJSON()).toMatchSnapshot(); }); + sendOpeningSources.forEach(openingSource => + sendUserTypes.forEach(userType => { + it(`Should call 'trackPNShowTimeline' upon press (source ${openingSource} user ${userType})`, () => { + const refUseIOBottomSheetModal = BOTTOM_SHEET.useIOBottomSheetModal; + jest + .spyOn(BOTTOM_SHEET, "useIOBottomSheetModal") + .mockImplementation(props => { + const { bottomSheet } = refUseIOBottomSheetModal(props); + return { present: jest.fn(), bottomSheet, dismiss: jest.fn() }; + }); + + const spiedOnMockedTrackPNShowTimeline = jest + .spyOn(ANALYTICS, "trackPNShowTimeline") + .mockImplementation(); + + const component = renderComponent( + fullHistory(), + true, + openingSource, + userType + ); + + const pressable = component.getByTestId( + "timeline_listitem_bottom_menu" + ); + fireEvent.press(pressable); + + expect(spiedOnMockedTrackPNShowTimeline.mock.calls.length).toBe(1); + expect(spiedOnMockedTrackPNShowTimeline.mock.calls[0].length).toBe(2); + expect(spiedOnMockedTrackPNShowTimeline.mock.calls[0][0]).toBe( + openingSource + ); + expect(spiedOnMockedTrackPNShowTimeline.mock.calls[0][1]).toBe( + userType + ); + }); + }) + ); + sendOpeningSources.forEach(openingSource => + sendUserTypes.forEach(userType => { + it(`Should call 'trackPNTimelineExternal' when tapping the internal bottom sheet CTA (source ${openingSource} user ${userType})`, () => { + const refUseIOBottomSheetModal = BOTTOM_SHEET.useIOBottomSheetModal; + const spiedOnMockedUseIOBottomSheetModal = jest + .spyOn(BOTTOM_SHEET, "useIOBottomSheetModal") + .mockImplementation(props => { + const { bottomSheet } = refUseIOBottomSheetModal(props); + return { present: jest.fn(), bottomSheet, dismiss: jest.fn() }; + }); + const spiedOnMockedHandleItemOnPress = jest + .spyOn(URL_UTILS, "handleItemOnPress") + .mockImplementation(_input => () => undefined); + + const spiedOnMockedTrackPNTimelineExternal = jest + .spyOn(ANALYTICS, "trackPNTimelineExternal") + .mockImplementation(); + + renderComponent(fullHistory(), true, openingSource, userType); + + // Unfortunately, bottom sheet's footer is not rendered since we have a mock + // in the jest.setup file that replaces the main view with a modal (that does + // not have the footer property). In order to render the footer, we have to + // extract the original property and render it indipendently + const bottomSheetProps = + spiedOnMockedUseIOBottomSheetModal.mock.calls[0][0]; + const bottomSheetFooter = bottomSheetProps.footer; + const renderedBottomSheetFooter = render(<>{bottomSheetFooter}); + + const pressable = renderedBottomSheetFooter.getByTestId( + "timeline_listitem_bottom_menu_alert" + ); + fireEvent.press(pressable); + + expect(spiedOnMockedTrackPNTimelineExternal.mock.calls.length).toBe(1); + expect(spiedOnMockedTrackPNTimelineExternal.mock.calls[0].length).toBe( + 2 + ); + expect(spiedOnMockedTrackPNTimelineExternal.mock.calls[0][0]).toBe( + openingSource + ); + expect(spiedOnMockedTrackPNTimelineExternal.mock.calls[0][1]).toBe( + userType + ); + + expect(spiedOnMockedHandleItemOnPress.mock.calls.length).toBe(1); + expect(spiedOnMockedHandleItemOnPress.mock.calls[0].length).toBe(1); + expect(spiedOnMockedHandleItemOnPress.mock.calls[0][0]).toBe( + mockFrontendUrl + ); + }); + }) + ); }); const fullHistory = (): NotificationStatusHistory => [ @@ -85,7 +211,9 @@ const fullHistory = (): NotificationStatusHistory => [ const renderComponent = ( history: NotificationStatusHistory, - frontendUrlDefined: boolean = true + frontendUrlDefined: boolean, + sendOpeningSource: SendOpeningSource, + sendUserType: SendUserType ) => { const initialState = appReducer(undefined, applicationChangeState("active")); const finalState: GlobalState = { @@ -106,7 +234,7 @@ const renderComponent = ( enabled: false }, pn: { - frontend_url: "https://www.domain.com/sendUrl" + frontend_url: mockFrontendUrl }, itw: { enabled: true, @@ -120,7 +248,13 @@ const renderComponent = ( }; const store = createStore(appReducer, finalState as any); return renderScreenWithNavigationStoreContext( - () => , + () => ( + + ), PN_ROUTES.MESSAGE_DETAILS, {}, store diff --git a/ts/features/pn/components/__test__/__snapshots__/F24ListBottomSheetLink.test.tsx.snap b/ts/features/pn/components/__test__/__snapshots__/F24ListBottomSheetLink.test.tsx.snap index 19de329abd0..7bbfee08db7 100644 --- a/ts/features/pn/components/__test__/__snapshots__/F24ListBottomSheetLink.test.tsx.snap +++ b/ts/features/pn/components/__test__/__snapshots__/F24ListBottomSheetLink.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`F24ListBottomSheetLink should be snapshot for a 10 items F24 list 1`] = ` +exports[`F24ListBottomSheetLink should match snapshot (0 items, opening source aar, user type mandatory) 1`] = ` - DUMMY + PN_ROUTES_MESSAGE_DETAILS - - - - - - 0 - - - - PDF - - - - - - - - - - - - - + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (0 items, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (0 items, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (0 items, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (0 items, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (0 items, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (0 items, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (0 items, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (0 items, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (1 items, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (1 items, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (1 items, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (1 items, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (1 items, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (1 items, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (1 items, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (1 items, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (1 items, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (2 items, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + 2 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (2 items, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + 2 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (2 items, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + + + + + 1 + + + + PDF + + + + + + + + + + + + + + + + + + 2 + + + + PDF + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (2 items, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + Vedi modelli F24 + + + + + + + + + - + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (2 items, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + - - - - - 3 - - - - PDF - - - - - - - - - - - - + + > + Vedi modelli F24 + + + + + + + - 4 + 1 - 5 + 2 + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (2 items, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + > + Vedi modelli F24 + + + + + + + - 6 + 1 - 7 + 2 + + + + + + + + + + + + + + +`; + +exports[`F24ListBottomSheetLink should match snapshot (2 items, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + > + Vedi modelli F24 + + + + + + + - 8 + 1 - 9 + 2 `; -exports[`F24ListBottomSheetLink should be snapshot for an 0 items F24 list 1`] = ` +exports[`F24ListBottomSheetLink should match snapshot (2 items, opening source not_set, user type not_set) 1`] = ` - DUMMY + PN_ROUTES_MESSAGE_DETAILS + + + + Vedi modelli F24 + + + + + - - + + + + + + 1 + + + + PDF + + + + + + + + + + + + + - + - Vedi modelli F24 - - - - - - - + ] + } + > + + + + 2 + + + + PDF + + + + + + + + + + + `; -exports[`F24ListBottomSheetLink should be snapshot for an 1 item F24 list 1`] = ` +exports[`F24ListBottomSheetLink should match snapshot (2 items, opening source not_set, user type recipient) 1`] = ` - DUMMY + PN_ROUTES_MESSAGE_DETAILS + + + + + 1 + + + + PDF + + + + + + + + + + + + + - 0 + 2 - DUMMY + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled false, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled false, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled false, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled false, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled false, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled false, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled false, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled false, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled true, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled true, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled true, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled true, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled true, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled true, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled true, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled true, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled true, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled undefined, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled undefined, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled undefined, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled undefined, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled undefined, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled undefined, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled undefined, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled undefined, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [], cancelled undefined, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled false, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled false, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled false, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled false, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled false, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled false, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled false, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled false, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled false, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled true, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled true, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled true, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled true, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled true, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled true, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled true, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled true, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled true, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled undefined, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled undefined, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled undefined, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled undefined, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled undefined, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled undefined, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled undefined, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled undefined, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 F24], cancelled undefined, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled false, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled false, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled false, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled false, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled false, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled false, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled false, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled false, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled false, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled true, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled true, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled true, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled true, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled true, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled true, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled true, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled true, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled true, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled undefined, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled undefined, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled undefined, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: aar + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled undefined, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled undefined, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled undefined, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: message + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled undefined, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: mandatory + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled undefined, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: not_set + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24 undefined F24], cancelled undefined, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + + Mock F24ListBottomSheetLink + + + Item count: 2 + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Opening Source: not_set + + + User Type: recipient + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled false, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled false, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled false, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled false, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled false, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled false, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled false, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled false, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled false, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled true, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled true, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled true, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled true, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled true, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled true, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled true, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled true, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled true, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled undefined, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled undefined, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled undefined, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled undefined, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled undefined, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled undefined, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled undefined, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled undefined, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [F24], cancelled undefined, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 1 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled false, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled false, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled false, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled false, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled false, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled false, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled false, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled false, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled false, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled true, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled true, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled true, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled true, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled true, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled true, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled true, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled true, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled true, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled undefined, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled undefined, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled undefined, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source aar + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled undefined, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled undefined, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled undefined, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source message + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled undefined, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type mandatory + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled undefined, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type not_set + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined F24], cancelled undefined, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + Modelli F24 + + + + + + + Se preferisci, puoi pagare questa notifica tramite F24. + + + + Mock MessageDetailsAttachmentItem + + + + Attachment category: F24 + + + Attachment content-type: undefined + + + Attachment id: 2 + + + Attachment name: undefined + + + Attachment url: https://no.url/docF24.pdf + + + + Has no bottom spacer + + + Is not disabled + + + Send Opening Source not_set + + + Send User Type recipient + + + Message Id: 01HS1ANR1SDPN3BP51X3G74T64 + + + Service Id: 01HS1ANWT4N83QGATCXYMXDP8M + + + Has no onPreNavigate callback + + - - - - - Modelli F24 - - - - - - + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled false, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled false, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled false, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled false, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled false, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled false, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled false, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled false, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled false, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled true, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled true, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled true, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled true, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled true, opening source message, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + - Se preferisci, puoi pagare questa notifica tramite F24. - - + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled true, opening source message, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + - + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled true, opening source not_set, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled true, opening source not_set, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled true, opening source not_set, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled undefined, opening source aar, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + - - - - Vedi modelli F24 - - - - - + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled undefined, opening source aar, user type not_set) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled undefined, opening source aar, user type recipient) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + - - - - - - - - 2 - - - - PDF - - - - - - - - - - - - - - - - - - 4 - - - - PDF - - - - - - - - - - - - - - - - + + + + + + + + + + +`; + +exports[`F24Section should match snapshot (list: [undefined], cancelled undefined, opening source message, user type mandatory) 1`] = ` + + + + + + + + + + + + + + + PN_ROUTES_MESSAGE_DETAILS + + + + + + + + + + + + + + + + - + } + /> @@ -1079,7 +69138,7 @@ exports[`F24Section should match snapshot when there are more than one F24 1`] = `; -exports[`F24Section should match snapshot when there are more than one F24 and the message is cancelled 1`] = ` +exports[`F24Section should match snapshot (list: [undefined], cancelled undefined, opening source message, user type not_set) 1`] = ` - DUMMY + PN_ROUTES_MESSAGE_DETAILS `; -exports[`F24Section should match snapshot when there are no F24 1`] = ` +exports[`F24Section should match snapshot (list: [undefined], cancelled undefined, opening source message, user type recipient) 1`] = ` - DUMMY + PN_ROUTES_MESSAGE_DETAILS `; -exports[`F24Section should match snapshot when there are no F24 and the message is cancelled 1`] = ` +exports[`F24Section should match snapshot (list: [undefined], cancelled undefined, opening source not_set, user type mandatory) 1`] = ` - DUMMY + PN_ROUTES_MESSAGE_DETAILS `; -exports[`F24Section should match snapshot when there is a single F24 1`] = ` +exports[`F24Section should match snapshot (list: [undefined], cancelled undefined, opening source not_set, user type not_set) 1`] = ` - DUMMY + PN_ROUTES_MESSAGE_DETAILS - - - - - - Modelli F24 - - - - - - - Se preferisci, puoi pagare questa notifica tramite F24. - - - - - - - - 2 - - - - PDF - - - - - - - - - - - - - + /> @@ -2897,7 +70650,7 @@ exports[`F24Section should match snapshot when there is a single F24 1`] = ` `; -exports[`F24Section should match snapshot when there is a single F24 and the message is cancelled 1`] = ` +exports[`F24Section should match snapshot (list: [undefined], cancelled undefined, opening source not_set, user type recipient) 1`] = ` - DUMMY + PN_ROUTES_MESSAGE_DETAILS + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -1052,6 +1058,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -1641,6 +1653,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -2202,6 +2220,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -2763,6 +2787,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -3324,6 +3354,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -3885,6 +3921,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -4446,6 +4488,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -5007,6 +5055,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -5568,6 +5622,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -6129,6 +6189,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -6718,6 +6784,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -7279,6 +7351,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -7975,6 +8053,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -8671,6 +8755,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -9367,6 +9457,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -10063,6 +10159,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -10759,6 +10861,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -11455,6 +11563,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -12016,6 +12130,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -12605,6 +12725,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -13166,6 +13292,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -13772,6 +13904,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -14378,6 +14516,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -14984,6 +15128,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -15590,6 +15740,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -16196,6 +16352,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -16802,6 +16964,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -17363,6 +17531,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -17952,6 +18126,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -18513,6 +18693,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -19074,6 +19260,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -19635,6 +19827,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -20196,6 +20394,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -20757,6 +20961,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -21318,6 +21528,12 @@ exports[`MessageBottomMenu should match snapshot, all handled-status items histo PAID + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -21769,6 +21985,12 @@ exports[`MessageBottomMenu should match snapshot, no history, empty payments, ca ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -22220,6 +22442,12 @@ exports[`MessageBottomMenu should match snapshot, no history, empty payments, ca ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -22699,6 +22927,12 @@ exports[`MessageBottomMenu should match snapshot, no history, empty payments, ca ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -23150,6 +23384,12 @@ exports[`MessageBottomMenu should match snapshot, no history, empty payments, no ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -23601,6 +23841,12 @@ exports[`MessageBottomMenu should match snapshot, no history, empty payments, no ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -24052,6 +24298,12 @@ exports[`MessageBottomMenu should match snapshot, no history, empty payments, no ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -24503,6 +24755,12 @@ exports[`MessageBottomMenu should match snapshot, no history, empty payments, un ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -24954,6 +25212,12 @@ exports[`MessageBottomMenu should match snapshot, no history, empty payments, un ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -25405,6 +25669,12 @@ exports[`MessageBottomMenu should match snapshot, no history, empty payments, un ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -25856,6 +26126,12 @@ exports[`MessageBottomMenu should match snapshot, no history, multiple payments, ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -26307,6 +26583,12 @@ exports[`MessageBottomMenu should match snapshot, no history, multiple payments, ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -26786,6 +27068,12 @@ exports[`MessageBottomMenu should match snapshot, no history, multiple payments, ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -27237,6 +27525,12 @@ exports[`MessageBottomMenu should match snapshot, no history, multiple payments, ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -27823,6 +28117,12 @@ exports[`MessageBottomMenu should match snapshot, no history, multiple payments, ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -28409,6 +28709,12 @@ exports[`MessageBottomMenu should match snapshot, no history, multiple payments, ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -28995,6 +29301,12 @@ exports[`MessageBottomMenu should match snapshot, no history, multiple payments, ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -29581,6 +29893,12 @@ exports[`MessageBottomMenu should match snapshot, no history, multiple payments, ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -30167,6 +30485,12 @@ exports[`MessageBottomMenu should match snapshot, no history, multiple payments, ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -30753,6 +31077,12 @@ exports[`MessageBottomMenu should match snapshot, no history, one payment, cance ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -31204,6 +31534,12 @@ exports[`MessageBottomMenu should match snapshot, no history, one payment, cance ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -31683,6 +32019,12 @@ exports[`MessageBottomMenu should match snapshot, no history, one payment, cance ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -32134,6 +32476,12 @@ exports[`MessageBottomMenu should match snapshot, no history, one payment, not c ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -32630,6 +32978,12 @@ exports[`MessageBottomMenu should match snapshot, no history, one payment, not c ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -33126,6 +33480,12 @@ exports[`MessageBottomMenu should match snapshot, no history, one payment, not c ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -33622,6 +33982,12 @@ exports[`MessageBottomMenu should match snapshot, no history, one payment, undef ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -34118,6 +34484,12 @@ exports[`MessageBottomMenu should match snapshot, no history, one payment, undef ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -34614,6 +34986,12 @@ exports[`MessageBottomMenu should match snapshot, no history, one payment, undef ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -35110,6 +35488,12 @@ exports[`MessageBottomMenu should match snapshot, no history, undefined payments ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -35561,6 +35945,12 @@ exports[`MessageBottomMenu should match snapshot, no history, undefined payments ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -36040,6 +36430,12 @@ exports[`MessageBottomMenu should match snapshot, no history, undefined payments ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -36491,6 +36887,12 @@ exports[`MessageBottomMenu should match snapshot, no history, undefined payments ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -36942,6 +37344,12 @@ exports[`MessageBottomMenu should match snapshot, no history, undefined payments ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -37393,6 +37801,12 @@ exports[`MessageBottomMenu should match snapshot, no history, undefined payments ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -37844,6 +38258,12 @@ exports[`MessageBottomMenu should match snapshot, no history, undefined payments ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -38295,6 +38715,12 @@ exports[`MessageBottomMenu should match snapshot, no history, undefined payments ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp @@ -38746,6 +39172,12 @@ exports[`MessageBottomMenu should match snapshot, no history, undefined payments ] } > + + Opening Source: not_set + + + User Type: not_set + Mock NeedHelp diff --git a/ts/features/pn/components/__test__/__snapshots__/MessageDetails.test.tsx.snap b/ts/features/pn/components/__test__/__snapshots__/MessageDetails.test.tsx.snap deleted file mode 100644 index 9be65af1f15..00000000000 --- a/ts/features/pn/components/__test__/__snapshots__/MessageDetails.test.tsx.snap +++ /dev/null @@ -1,770 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`MessageDetails component should match the snapshot with default props 1`] = ` - - - - - - - - - - - - - - - DUMMY_ROUTE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Valore legale - - - - - - - - - - - ######## subject ######## - - - 01 gen 2020, 00:00 - - - - - - Hai - - ricevuto una notifica SEND: è una comunicazione a valore legale inviata da - - Sender denomination - - - . Consulta i documenti allegati per scoprire tutti i dettagli. - -Se è previsto un pagamento, puoi farlo ora da IO con il tuo metodo preferito. - - - - Mock MessageDetailsAttachments - - - Has Banner - - - Is not disabled - - - Is SEND - - - Message Id: 01HRYR6C761DGH3S84HBBXMMKT - - - Service Id: service_one - - - - - - - Mock MessageBottomMenu - - - 731143-7-0317-8200-0 - - - 01HRYR6C761DGH3S84HBBXMMKT - - - - - - - - - - - - - - -`; diff --git a/ts/features/pn/components/__test__/__snapshots__/TimelineListItem.test.tsx.snap b/ts/features/pn/components/__test__/__snapshots__/TimelineListItem.test.tsx.snap index dc1d0697d07..de2f3e6b885 100644 --- a/ts/features/pn/components/__test__/__snapshots__/TimelineListItem.test.tsx.snap +++ b/ts/features/pn/components/__test__/__snapshots__/TimelineListItem.test.tsx.snap @@ -399,6 +399,7 @@ exports[`TimelineListItem Should match snapshot, all handled-status items histor onResponderTerminationRequest={[Function]} onStartShouldSetResponder={[Function]} onTouchEnd={[Function]} + testID="timeline_listitem_bottom_menu" > void) | undefined> + aarBottomSheetRef: RefObject<(() => void) | undefined>, + userType: SendUserType ) => { const { setOptions, goBack } = useIONavigation(); const startSupportRequest = useOfflineToastGuard(useStartSupportRequest({})); @@ -64,6 +73,7 @@ const useCorrectHeader = ( firstAction: { icon: "closeLarge", onPress: () => { + trackSendAarNotificationClosure(userType); aarBottomSheetRef.current?.(); }, accessibilityLabel: I18n.t("global.buttons.close"), @@ -78,7 +88,8 @@ const useCorrectHeader = ( onPress: startSupportRequest, accessibilityLabel: I18n.t( "global.accessibility.contextualHelp.open.label" - ) + ), + testID: "support_close_button" }, goBack, backAccessibilityLabel: I18n.t("global.buttons.back") @@ -99,25 +110,22 @@ export const MessageDetailsScreen = () => { // Be aware that when this screen displays an AAR message, messageId and IUN have // the same value. When displaying SEND's notifications via IO Messages, messageId // and IUN have differente values - const { messageId, serviceId, firstTimeOpening, isAarMessage } = route.params; + const { + messageId, + serviceId, + firstTimeOpening, + isAarMessage = false + } = route.params; const aarBottomSheetRef = useRef<() => void>(undefined); - useCorrectHeader(!!isAarMessage, aarBottomSheetRef); - - const androidBackButtonCallback = useCallback(() => { - if (isAarMessage) { - aarBottomSheetRef.current?.(); - return true; - } - return false; - }, [isAarMessage]); - - useHardwareBackButton(androidBackButtonCallback); - const currentFiscalCode = useIOSelector(profileFiscalCodeSelector); const sendMessagePot = useIOSelector(state => pnMessageFromIdSelector(state, messageId) ); + const isAARDelegate = useIOSelector(state => + isAarMessageDelegatedSelector(state, messageId) + ); + const sendMessageOrUndefined = O.getOrElseW(() => undefined)( pot.getOrElse(sendMessagePot, O.none) ); @@ -129,10 +137,29 @@ export const MessageDetailsScreen = () => { ); const paymentsCount = payments?.length ?? 0; + const sendOpeningSource: SendOpeningSource = isAarMessage ? "aar" : "message"; + const sendUserType: SendUserType = isAarMessage + ? isAARDelegate + ? "mandatory" + : "recipient" + : "not_set"; + const androidBackButtonCallback = useCallback(() => { + if (isAarMessage) { + trackSendAarNotificationClosure(sendUserType); + aarBottomSheetRef.current?.(); + return true; + } + return false; + }, [isAarMessage, sendUserType]); + + useHardwareBackButton(androidBackButtonCallback); + useCorrectHeader(isAarMessage, aarBottomSheetRef, sendUserType); + useEffect(() => { dispatch( startPNPaymentStatusTracking({ - isAARNotification: !!isAarMessage, + openingSource: sendOpeningSource, + userType: sendUserType, messageId }) ); @@ -145,7 +172,9 @@ export const MessageDetailsScreen = () => { paymentsCount, firstTimeOpening, isCancelled, - containsF24 + containsF24, + sendOpeningSource, + sendUserType ); if (sendMessageOrUndefined == null && isAarMessage) { @@ -166,11 +195,13 @@ export const MessageDetailsScreen = () => { }, [ dispatch, firstTimeOpening, + isAarMessage, messageId, - sendMessagePot, paymentsCount, - isAarMessage, - sendMessageOrUndefined + sendMessageOrUndefined, + sendMessagePot, + sendOpeningSource, + sendUserType ]); const store = useIOStore(); @@ -212,11 +243,13 @@ export const MessageDetailsScreen = () => { serviceId={serviceId} payments={payments} isAARMessage={isAarMessage} + sendOpeningSource={sendOpeningSource} + sendUserType={sendUserType} /> {isAarMessage && ( )} diff --git a/ts/features/pn/screens/__test__/MessageDetailsScreen.test.tsx b/ts/features/pn/screens/__test__/MessageDetailsScreen.test.tsx index f2ecb192896..17a3c97e969 100644 --- a/ts/features/pn/screens/__test__/MessageDetailsScreen.test.tsx +++ b/ts/features/pn/screens/__test__/MessageDetailsScreen.test.tsx @@ -2,6 +2,7 @@ import * as pot from "@pagopa/ts-commons/lib/pot"; import * as O from "fp-ts/lib/Option"; import { Action, Store } from "redux"; import configureMockStore from "redux-mock-store"; +import { fireEvent } from "@testing-library/react-native"; import { applicationChangeState } from "../../../../store/actions/application"; import { appReducer } from "../../../../store/reducers"; import { GlobalState } from "../../../../store/reducers/types"; @@ -25,7 +26,13 @@ import { sendAarMockStateFactory } from "../../aar/utils/testUtils"; import PN_ROUTES from "../../navigation/routes"; import { startPNPaymentStatusTracking } from "../../store/actions"; import { MessageDetailsScreen } from "../MessageDetailsScreen"; -import * as analytics from "../../aar/analytics"; +import * as REDUCERS from "../../store/reducers"; +import { PNMessage } from "../../store/types/types"; +import * as AAR_SELECTORS from "../../aar/store/selectors"; +import { ATTACHMENT_CATEGORY } from "../../../messages/types/attachmentCategory"; +import * as AAR_ANALYTICS from "../../aar/analytics"; +import * as SEND_ANALYTICS from "../../analytics"; +import * as HARDWARE_BACK_BUTTON from "../../../../hooks/useHardwareBackButton"; const mockDispatch = jest.fn(); jest.mock("react-redux", () => ({ @@ -34,18 +41,21 @@ jest.mock("react-redux", () => ({ })); jest.mock("../../components/MessageDetails"); +jest.mock("../../aar/components/SendAARMessageDetailBottomSheetComponent"); describe("MessageDetailsScreen", () => { beforeEach(() => { jest.clearAllMocks(); + jest.restoreAllMocks(); }); + // eslint-disable-next-line sonarjs/cognitive-complexity [true, false].forEach(isAar => { it(`should match the snapshot when there is an error${ isAar ? "and dispatch trackSendAARFailure" : "" }`, () => { const spiedOnMockedTrackSendAARFailure = jest - .spyOn(analytics, "trackSendAARFailure") + .spyOn(AAR_ANALYTICS, "trackSendAARFailure") .mockImplementation(); const sequenceOfActions: ReadonlyArray = [ applicationChangeState("active") @@ -68,7 +78,7 @@ describe("MessageDetailsScreen", () => { const mockStore = configureMockStore(); const store: Store = mockStore(state); - const { component } = renderComponent(store, isAar); + const { component } = renderComponent(store, false, isAar); expect(component).toMatchSnapshot(); if (isAar) { @@ -87,7 +97,7 @@ describe("MessageDetailsScreen", () => { it(`should match the snapshot when everything went fine -- aar:${isAar} and not dispatch trackSendAARFailure`, () => { const spiedOnMockedTrackSendAARFailure = jest - .spyOn(analytics, "trackSendAARFailure") + .spyOn(AAR_ANALYTICS, "trackSendAARFailure") .mockImplementation(); jest .spyOn(commonSelectors, "profileFiscalCodeSelector") @@ -111,55 +121,313 @@ describe("MessageDetailsScreen", () => { const mockStore = configureMockStore(); const store: Store = mockStore(state); - const { component } = renderComponent(store, isAar); + const { component } = renderComponent(store, false, isAar); expect(component).toMatchSnapshot(); expect(spiedOnMockedTrackSendAARFailure.mock.calls.length).toBe(0); }); + + [false, true].forEach(firstTimeOpening => + [0, 1].forEach(paymentCount => + [false, true].forEach(isCancelled => + [false, true].forEach(containsF24 => { + const fakeProfileFiscalCode = "XXXYYY99Z00A123B"; + const sendMessage = { + notificationStatusHistory: [], + isCancelled, + recipients: + paymentCount > 0 + ? [{ taxId: fakeProfileFiscalCode, payment: {} }] + : [], + attachments: containsF24 + ? [ + { + category: ATTACHMENT_CATEGORY.F24 + } + ] + : [] + } as unknown as PNMessage; + [ + pot.none, + pot.noneLoading, + pot.noneUpdating(O.none), + pot.noneError(Error()), + pot.some(O.none), + pot.some(O.some(sendMessage)), + pot.someLoading(O.none), + pot.someLoading(O.some(sendMessage)), + pot.someUpdating(O.none, O.some(sendMessage)), + pot.someUpdating(O.some(sendMessage), O.none), + pot.someError(O.none, Error()), + pot.someError(O.some(sendMessage), Error()) + ].forEach(messagePot => + [false, true].forEach(isDelegate => { + const isSomePot = pot.isSome(messagePot); + const isSomeOption = + isSomePot && O.isSome(pot.getOrElse(messagePot, O.none)); + const potOptionDescription = isSomePot + ? `pot ${messagePot.kind} option ${ + isSomeOption ? "some" : "none" + }` + : `pot ${messagePot.kind}`; + it(`should ${ + messagePot.kind === "PotSome" ? "" : "not " + }call 'trackPNUxSuccess' with proper parameters (${potOptionDescription} isAAR ${isAar} firstTimeOpening ${firstTimeOpening} paymentCount ${paymentCount} isCancelled ${isCancelled} containsF24 ${containsF24} isDelegate ${isDelegate})`, () => { + jest + .spyOn(commonSelectors, "profileFiscalCodeSelector") + .mockImplementation(_state => fakeProfileFiscalCode); + jest + .spyOn(REDUCERS, "pnMessageFromIdSelector") + .mockImplementation((_state, _id) => messagePot); + jest + .spyOn(AAR_SELECTORS, "isAarMessageDelegatedSelector") + .mockImplementation((_state, _messageId) => isDelegate); + const spiedOnMockedTrackPNExSuccess = jest + .spyOn(SEND_ANALYTICS, "trackPNUxSuccess") + .mockImplementation(); + + const globalState = appReducer( + undefined, + applicationChangeState("active") + ); + const mockStore = configureMockStore(); + const store: Store = mockStore(globalState); + + renderComponent(store, firstTimeOpening, isAar); + + if (messagePot.kind === "PotSome") { + expect( + spiedOnMockedTrackPNExSuccess.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackPNExSuccess.mock.calls[0].length + ).toBe(6); + expect(spiedOnMockedTrackPNExSuccess.mock.calls[0][0]).toBe( + isSomeOption ? paymentCount : 0 + ); + expect(spiedOnMockedTrackPNExSuccess.mock.calls[0][1]).toBe( + firstTimeOpening + ); + expect(spiedOnMockedTrackPNExSuccess.mock.calls[0][2]).toBe( + isSomeOption ? isCancelled : false + ); + expect(spiedOnMockedTrackPNExSuccess.mock.calls[0][3]).toBe( + isSomeOption ? containsF24 : false + ); + expect(spiedOnMockedTrackPNExSuccess.mock.calls[0][4]).toBe( + isAar ? "aar" : "message" + ); + expect(spiedOnMockedTrackPNExSuccess.mock.calls[0][5]).toBe( + !isAar + ? "not_set" + : isDelegate + ? "mandatory" + : "recipient" + ); + } else { + expect( + spiedOnMockedTrackPNExSuccess.mock.calls.length + ).toBe(0); + } + }); + }) + ); + }) + ) + ) + ); }); [false, true].forEach(isAARNotification => { - it(`should dispatch startPNPaymentStatusTracking (isAARNotification ${isAARNotification})`, () => { - const state = { - entities: { - messages: { - thirdPartyById: {} - } - }, - features: { - connectivityStatus: {}, - ingress: {}, - itWallet: { - issuance: { - integrityKeyTag: O.none + [false, true].forEach(isDelegate => { + it(`should dispatch startPNPaymentStatusTracking (isAARNotification ${isAARNotification} isDelegate ${isDelegate})`, () => { + const state = { + entities: { + messages: { + thirdPartyById: {} } }, - pn: { - aarFlow: isAARNotification - ? sendAarMockStateFactory.displayingNotificationData() - : sendAarMockStateFactory.none() - } - }, - remoteConfig: O.none, - profile: pot.none - } as GlobalState; - const mockStore = configureMockStore(); - const store: Store = mockStore(state); + features: { + connectivityStatus: {}, + ingress: {}, + itWallet: { + issuance: { + integrityKeyTag: O.none + } + }, + pn: { + aarFlow: isAARNotification + ? sendAarMockStateFactory.displayingNotificationData() + : sendAarMockStateFactory.none() + } + }, + remoteConfig: O.none, + profile: pot.none + } as GlobalState; + const mockStore = configureMockStore(); + const store: Store = mockStore(state); - renderComponent(store, isAARNotification); + jest + .spyOn(AAR_SELECTORS, "isAarMessageDelegatedSelector") + .mockImplementation((_state, _messageId) => isDelegate); - expect(mockDispatch.mock.calls.length).toBe(1); - expect(mockDispatch.mock.calls[0].length).toBe(1); - expect(mockDispatch.mock.calls[0][0]).toEqual( - startPNPaymentStatusTracking({ - isAARNotification, - messageId: message_1.id - }) - ); + renderComponent(store, false, isAARNotification); + + expect(mockDispatch.mock.calls.length).toBe(1); + expect(mockDispatch.mock.calls[0].length).toBe(1); + expect(mockDispatch.mock.calls[0][0]).toEqual( + startPNPaymentStatusTracking({ + openingSource: isAARNotification ? "aar" : "message", + userType: isAARNotification + ? isDelegate + ? "mandatory" + : "recipient" + : "not_set", + messageId: message_1.id + }) + ); + }); }); }); + + [undefined, false, true].forEach(isAarMessage => + [false, true].forEach(isDelegate => + it(`should ${ + isAarMessage ? "" : "not " + }call trackSendAarNotificationClosure with proper parameters upon pressing the android back button (is AAR message ${isAarMessage}, is delegate ${isDelegate})`, () => { + const baseState = appReducer( + undefined, + applicationChangeState("active") + ); + const mockStore = configureMockStore(); + const store: Store = mockStore(baseState); + + const sendMessage = { + attachments: [], + created_at: new Date(), + iun: "A IUN", + notificationStatusHistory: [], + recipients: [], + subject: "A subject" + } as unknown as PNMessage; + const sendMessagePotOption = pot.some(O.some(sendMessage)); + + jest + .spyOn(commonSelectors, "profileFiscalCodeSelector") + .mockImplementation(_state => "XXXYYY99Z88W777I"); + jest + .spyOn(REDUCERS, "pnMessageFromIdSelector") + .mockImplementation((_state, _id) => sendMessagePotOption); + jest + .spyOn(AAR_SELECTORS, "isAarMessageDelegatedSelector") + .mockImplementation((_state, _messageId) => isDelegate); + const spiedOnMockedTrackSendAARNotificationClosure = jest + .spyOn(AAR_ANALYTICS, "trackSendAarNotificationClosure") + .mockImplementation(); + const spiedOnMockedUseHardwareBackButton = jest + .spyOn(HARDWARE_BACK_BUTTON, "useHardwareBackButton") + .mockImplementation(); + + renderComponent(store, false, !!isAarMessage); + + expect(spiedOnMockedUseHardwareBackButton.mock.calls.length).toBe(1); + expect(spiedOnMockedUseHardwareBackButton.mock.calls[0].length).toBe(1); + expect( + spiedOnMockedUseHardwareBackButton.mock.calls[0][0] + ).toBeDefined(); + + const useHardwareBackButtonCallback = + spiedOnMockedUseHardwareBackButton.mock.calls[0][0]; + expect(typeof useHardwareBackButtonCallback).toBe("function"); + const result = useHardwareBackButtonCallback(); + + if (isAarMessage) { + expect( + spiedOnMockedTrackSendAARNotificationClosure.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackSendAARNotificationClosure.mock.calls[0].length + ).toBe(1); + expect( + spiedOnMockedTrackSendAARNotificationClosure.mock.calls[0][0] + ).toBe(isDelegate ? "mandatory" : "recipient"); + expect(result).toBe(true); + } else { + expect( + spiedOnMockedTrackSendAARNotificationClosure.mock.calls.length + ).toBe(0); + expect(result).toBe(false); + } + }) + ) + ); + + [undefined, false, true].forEach(isAarMessage => + [false, true].forEach(isDelegate => + it(`should ${ + isAarMessage ? "" : "not " + }call trackSendAarNotificationClosure with proper parameters upon pressing the header's close button (is AAR message ${isAarMessage}, is delegate ${isDelegate})`, () => { + const baseState = appReducer( + undefined, + applicationChangeState("active") + ); + const mockStore = configureMockStore(); + const store: Store = mockStore(baseState); + + const sendMessage = { + attachments: [], + created_at: new Date(), + iun: "A IUN", + notificationStatusHistory: [], + recipients: [], + subject: "A subject" + } as unknown as PNMessage; + const sendMessagePotOption = pot.some(O.some(sendMessage)); + + jest + .spyOn(commonSelectors, "profileFiscalCodeSelector") + .mockImplementation(_state => "XXXYYY99Z88W777I"); + jest + .spyOn(REDUCERS, "pnMessageFromIdSelector") + .mockImplementation((_state, _id) => sendMessagePotOption); + jest + .spyOn(AAR_SELECTORS, "isAarMessageDelegatedSelector") + .mockImplementation((_state, _messageId) => isDelegate); + const spiedOnMockedTrackSendAARNotificationClosure = jest + .spyOn(AAR_ANALYTICS, "trackSendAarNotificationClosure") + .mockImplementation(); + + const { component } = renderComponent(store, false, !!isAarMessage); + + if (isAarMessage) { + const headerCloseButton = component.getByTestId("AAR_close_button"); + fireEvent.press(headerCloseButton); + + expect( + spiedOnMockedTrackSendAARNotificationClosure.mock.calls.length + ).toBe(1); + expect( + spiedOnMockedTrackSendAARNotificationClosure.mock.calls[0].length + ).toBe(1); + expect( + spiedOnMockedTrackSendAARNotificationClosure.mock.calls[0][0] + ).toBe(isDelegate ? "mandatory" : "recipient"); + } else { + component.getByTestId("support_close_button"); + + expect( + spiedOnMockedTrackSendAARNotificationClosure.mock.calls.length + ).toBe(0); + } + }) + ) + ); }); -const renderComponent = (store: Store, isAAr: boolean) => { +const renderComponent = ( + store: Store, + firstTimeOpening: boolean, + isAAr: boolean +) => { const { id, sender_service_id } = message_1; return { @@ -167,7 +435,7 @@ const renderComponent = (store: Store, isAAr: boolean) => { MessageDetailsScreen, PN_ROUTES.MESSAGE_DETAILS, { - firstTimeOpening: false, + firstTimeOpening, messageId: id, serviceId: sender_service_id, isAarMessage: isAAr diff --git a/ts/features/pn/screens/__test__/__snapshots__/MessageDetailsScreen.test.tsx.snap b/ts/features/pn/screens/__test__/__snapshots__/MessageDetailsScreen.test.tsx.snap index 8608ed959b4..c0ed6336c33 100644 --- a/ts/features/pn/screens/__test__/__snapshots__/MessageDetailsScreen.test.tsx.snap +++ b/ts/features/pn/screens/__test__/__snapshots__/MessageDetailsScreen.test.tsx.snap @@ -156,7 +156,7 @@ exports[`MessageDetailsScreen should match the snapshot when everything went fin service_one + + Is AAR: false + + + Opening Source: message + + + User Type: not_set + + + Is AAR: true + + + Opening Source: aar + + + User Type: recipient + + + + + Mock SendAARMessageDetailBottomSheetComponent + + + Ref container: set to jest.fn() internally + + + User type: recipient + - - - - - - - - - - - - - Conserva il codice QR, ti servirà per rileggere la notifica in app - - - - - - - - - - - - - Puoi inquadrarlo oppure caricare una sua foto su IO - - - - - - - - - - - - - Tutte le tue notifiche sono disponibili sul sito di SEND - Notifiche Digitali - - - - Vai sul sito di SEND - - - - - - - - - - Torna alla notifica - - - - - - - - - - - Chiudi la notifica - - - - - - - - - - - { }); }); + const sendOpeningSources: ReadonlyArray = [ + "aar", + "message", + "not_set" + ]; + const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" + ]; + describe("startPNPaymentStatusTracking", () => { - [false, true].forEach(isAARNotification => { - it(`should create a start tracking action with the provided messageId and isAARNotification: ${isAARNotification}`, () => { - const messageId = "message-123"; + sendOpeningSources.forEach(sendOpeningSource => { + sendUserTypes.forEach(sendUserType => { + it(`should create a start tracking action with the provided messageId (opening source: ${sendOpeningSource}, user type ${sendUserType})`, () => { + const messageId = "message-123"; - const action = startPNPaymentStatusTracking({ - isAARNotification, - messageId - }); + const action = startPNPaymentStatusTracking({ + openingSource: sendOpeningSource, + userType: sendUserType, + messageId + }); - expect(action).toEqual({ - type: "PN_START_TRACKING_PAYMENT_STATUS", - payload: { isAARNotification, messageId } + expect(action).toEqual({ + type: "PN_START_TRACKING_PAYMENT_STATUS", + payload: { + openingSource: sendOpeningSource, + userType: sendUserType, + messageId + } + }); }); }); }); diff --git a/ts/features/pn/store/actions/index.ts b/ts/features/pn/store/actions/index.ts index 01bd5c8c477..c6d6fc7fc88 100644 --- a/ts/features/pn/store/actions/index.ts +++ b/ts/features/pn/store/actions/index.ts @@ -4,6 +4,10 @@ import { createAsyncAction, createStandardAction } from "typesafe-actions"; +import { + SendOpeningSource, + SendUserType +} from "../../../pushNotifications/analytics"; type TogglePnActivationRequestPaylad = { value: boolean; @@ -12,7 +16,8 @@ type TogglePnActivationRequestPaylad = { }; type PNPaymentStatusTracking = { - isAARNotification: boolean; + openingSource: SendOpeningSource; + userType: SendUserType; messageId: string; }; diff --git a/ts/features/pn/store/sagas/__tests__/watchPaymentStatusSaga.test.ts b/ts/features/pn/store/sagas/__tests__/watchPaymentStatusSaga.test.ts index 8b2623e494e..255f0bd4350 100644 --- a/ts/features/pn/store/sagas/__tests__/watchPaymentStatusSaga.test.ts +++ b/ts/features/pn/store/sagas/__tests__/watchPaymentStatusSaga.test.ts @@ -15,6 +15,10 @@ import { getRptIdStringFromPayment } from "../../../utils/rptId"; import { NotificationPaymentInfo } from "../../../../../../definitions/pn/NotificationPaymentInfo"; import { paymentStatisticsForMessageUncachedSelector } from "../../../../messages/store/reducers/payments"; import { trackPNPaymentStatus } from "../../../analytics"; +import { + SendOpeningSource, + SendUserType +} from "../../../../pushNotifications/analytics"; describe("watchPaymentStatusSaga", () => { afterEach(() => { @@ -92,123 +96,167 @@ describe("watchPaymentStatusSaga", () => { ] }; + const sendOpeningSources: ReadonlyArray = [ + "aar", + "message", + "not_set" + ]; + const sendUserTypes: ReadonlyArray = [ + "mandatory", + "not_set", + "recipient" + ]; + describe("watchPaymentStatusForMixpanelTracking", () => { - [false, true].forEach(isAARNotification => { - it(`should follow proper flow (isAARNotification: ${isAARNotification})`, () => { - testSaga( - watchPaymentStatusForMixpanelTracking, - startPNPaymentStatusTracking({ isAARNotification, messageId }) - ) - .next() - .select(profileFiscalCodeSelector) - .next(taxId) - .select(pnMessageFromIdSelector, messageId) - .next(pnMessage) - .call( - paymentsFromPNMessagePot, - isAARNotification ? undefined : taxId, - pnMessage + sendOpeningSources.forEach(sendOpeningSource => { + sendUserTypes.forEach(sendUserType => { + it(`should follow proper flow (opening source: ${sendOpeningSource}, user type ${sendUserType})`, () => { + testSaga( + watchPaymentStatusForMixpanelTracking, + startPNPaymentStatusTracking({ + openingSource: sendOpeningSource, + userType: sendUserType, + messageId + }) ) - .next(pnMessage.recipients.map(rec => rec.payment)) - .race({ - polling: call( - testable!.generateSENDMessagePaymentStatistics, - messageId, - 6, - pnMessage.recipients - .slice(0, 5) - .map(rec => - getRptIdStringFromPayment( - rec.payment as NotificationPaymentInfo + .next() + .select(profileFiscalCodeSelector) + .next(taxId) + .select(pnMessageFromIdSelector, messageId) + .next(pnMessage) + .call( + paymentsFromPNMessagePot, + sendOpeningSource === "message" ? taxId : undefined, + pnMessage + ) + .next(pnMessage.recipients.map(rec => rec.payment)) + .race({ + polling: call( + testable!.generateSENDMessagePaymentStatistics, + sendOpeningSource, + sendUserType, + messageId, + 6, + pnMessage.recipients + .slice(0, 5) + .map(rec => + getRptIdStringFromPayment( + rec.payment as NotificationPaymentInfo + ) ) - ) - ), - cancelAction: take(cancelPNPaymentStatusTracking) - }) - .next(cancelPNPaymentStatusTracking) - .isDone(); + ), + cancelAction: take(cancelPNPaymentStatusTracking) + }) + .next(cancelPNPaymentStatusTracking) + .isDone(); + }); }); }); }); describe("generateSENDMessagePaymentStatistics", () => { - it("should do nothing if payment count is zero", () => { - testSaga(testable!.generateSENDMessagePaymentStatistics, messageId, 0, [ - paymentId1 - ]) - .next() - .isDone(); - }); - it("should do nothing if payment Ids is an empty array", () => { - testSaga(testable!.generateSENDMessagePaymentStatistics, messageId, 1, []) - .next() - .isDone(); - }); - it("should keep waiting if payments are not ready", () => { - const paymentIds = [ - paymentId1, - paymentId2, - paymentId3, - paymentId4, - paymentId5 - ]; - testSaga( - testable!.generateSENDMessagePaymentStatistics, - messageId, - 6, - paymentIds - ) - .next() - .select( - paymentStatisticsForMessageUncachedSelector, - messageId, - 6, - paymentIds - ) - .next(undefined) - .delay(500) - .next() - .select( - paymentStatisticsForMessageUncachedSelector, - messageId, - 6, - paymentIds - ); - }); - it("should call tracking method when payments are ready", () => { - const paymentIds = [ - paymentId1, - paymentId2, - paymentId3, - paymentId4, - paymentId5 - ]; - const paymentStatistics = { - paymentCount: 6, - unpaidCount: 1, - paidCount: 1, - errorCount: 1, - expiredCount: 1, - revokedCount: 1, - ongoingCount: 0 - }; - testSaga( - testable!.generateSENDMessagePaymentStatistics, - messageId, - 6, - paymentIds - ) - .next() - .select( - paymentStatisticsForMessageUncachedSelector, - messageId, - 6, - paymentIds - ) - .next(paymentStatistics) - .call(trackPNPaymentStatus, paymentStatistics) - .next() - .isDone(); + sendOpeningSources.forEach(sendOpeningSource => { + sendUserTypes.forEach(sendUserType => { + it(`should do nothing if payment count is zero (opening source: ${sendOpeningSource}, user type ${sendUserType})`, () => { + testSaga( + testable!.generateSENDMessagePaymentStatistics, + sendOpeningSource, + sendUserType, + messageId, + 0, + [paymentId1] + ) + .next() + .isDone(); + }); + it(`should do nothing if payment Ids is an empty array (opening source: ${sendOpeningSource}, user type ${sendUserType})`, () => { + testSaga( + testable!.generateSENDMessagePaymentStatistics, + sendOpeningSource, + sendUserType, + messageId, + 1, + [] + ) + .next() + .isDone(); + }); + it(`should keep waiting if payments are not ready (opening source: ${sendOpeningSource}, user type ${sendUserType})`, () => { + const paymentIds = [ + paymentId1, + paymentId2, + paymentId3, + paymentId4, + paymentId5 + ]; + testSaga( + testable!.generateSENDMessagePaymentStatistics, + sendOpeningSource, + sendUserType, + messageId, + 6, + paymentIds + ) + .next() + .select( + paymentStatisticsForMessageUncachedSelector, + messageId, + 6, + paymentIds + ) + .next(undefined) + .delay(500) + .next() + .select( + paymentStatisticsForMessageUncachedSelector, + messageId, + 6, + paymentIds + ); + }); + it(`should call tracking method when payments are ready (opening source: ${sendOpeningSource}, user type ${sendUserType})`, () => { + const paymentIds = [ + paymentId1, + paymentId2, + paymentId3, + paymentId4, + paymentId5 + ]; + const paymentStatistics = { + paymentCount: 6, + unpaidCount: 1, + paidCount: 1, + errorCount: 1, + expiredCount: 1, + revokedCount: 1, + ongoingCount: 0 + }; + testSaga( + testable!.generateSENDMessagePaymentStatistics, + sendOpeningSource, + sendUserType, + messageId, + 6, + paymentIds + ) + .next() + .select( + paymentStatisticsForMessageUncachedSelector, + messageId, + 6, + paymentIds + ) + .next(paymentStatistics) + .call( + trackPNPaymentStatus, + paymentStatistics, + sendOpeningSource, + sendUserType + ) + .next() + .isDone(); + }); + }); }); }); }); diff --git a/ts/features/pn/store/sagas/watchPaymentStatusSaga.ts b/ts/features/pn/store/sagas/watchPaymentStatusSaga.ts index a5e58d450e4..6956baef451 100644 --- a/ts/features/pn/store/sagas/watchPaymentStatusSaga.ts +++ b/ts/features/pn/store/sagas/watchPaymentStatusSaga.ts @@ -11,6 +11,10 @@ import { trackPNPaymentStatus } from "../../analytics"; import { getRptIdStringFromPayment } from "../../utils/rptId"; import { paymentStatisticsForMessageUncachedSelector } from "../../../messages/store/reducers/payments"; import { isTestEnv } from "../../../../utils/environment"; +import { + SendOpeningSource, + SendUserType +} from "../../../pushNotifications/analytics"; /** * This saga is used to track a mixpanel event which is a report of @@ -21,13 +25,12 @@ import { isTestEnv } from "../../../../utils/environment"; export function* watchPaymentStatusForMixpanelTracking( action: ActionType ) { - const { isAARNotification, messageId } = action.payload; + const { openingSource, userType, messageId } = action.payload; const currentFiscalCode = yield* select(profileFiscalCodeSelector); const message = yield* select(pnMessageFromIdSelector, messageId); - const fiscalCodeOrUndefined = isAARNotification - ? undefined - : currentFiscalCode; + const fiscalCodeOrUndefined = + openingSource === "message" ? currentFiscalCode : undefined; const payments = yield* call( paymentsFromPNMessagePot, fiscalCodeOrUndefined, @@ -42,6 +45,8 @@ export function* watchPaymentStatusForMixpanelTracking( yield* race({ polling: call( generateSENDMessagePaymentStatistics, + openingSource, + userType, messageId, paymentCount, visibleRPTIds @@ -51,6 +56,8 @@ export function* watchPaymentStatusForMixpanelTracking( } function* generateSENDMessagePaymentStatistics( + openingSource: SendOpeningSource, + userType: SendUserType, messageId: string, paymentCount: number, paymentsRpdIds: ReadonlyArray @@ -71,7 +78,12 @@ function* generateSENDMessagePaymentStatistics( yield* delay(500); } else { // Payment statistics are ready, track them - yield* call(trackPNPaymentStatus, paymentStatistics); + yield* call( + trackPNPaymentStatus, + paymentStatistics, + openingSource, + userType + ); // Exit the loop and end the saga return; } diff --git a/ts/features/pushNotifications/analytics/index.ts b/ts/features/pushNotifications/analytics/index.ts index 86357be02de..2b0b61ea6c4 100644 --- a/ts/features/pushNotifications/analytics/index.ts +++ b/ts/features/pushNotifications/analytics/index.ts @@ -107,8 +107,8 @@ export const trackSystemNotificationPermissionScreenOutcome = ( const props = buildEventProperties("UX", "action", { flow, outcome, - send_user: sendUser, - opening_source: sendOpeningSource + opening_source: sendOpeningSource, + send_user: sendUser }); void mixpanelTrack(eventName, props); }; diff --git a/ts/features/pushNotifications/hooks/__tests__/usePushNotificationEngagement.test.tsx b/ts/features/pushNotifications/hooks/__tests__/usePushNotificationEngagement.test.tsx index 44a96fa2097..1bc2a309016 100644 --- a/ts/features/pushNotifications/hooks/__tests__/usePushNotificationEngagement.test.tsx +++ b/ts/features/pushNotifications/hooks/__tests__/usePushNotificationEngagement.test.tsx @@ -175,6 +175,7 @@ describe("UseEngamentScreenFocusLogic", () => { ) ) ); + it('should subscribe to a "change" appstate event, and unsubscribe on unmount', () => { const removeMock = jest.fn(); const eventListenerMock = jest diff --git a/ts/features/pushNotifications/screens/PushNotificationEngagementScreen.tsx b/ts/features/pushNotifications/screens/PushNotificationEngagementScreen.tsx index db940552d5b..966a108d341 100644 --- a/ts/features/pushNotifications/screens/PushNotificationEngagementScreen.tsx +++ b/ts/features/pushNotifications/screens/PushNotificationEngagementScreen.tsx @@ -57,9 +57,9 @@ export const PushNotificationEngagementScreen = ({ return ( ); @@ -72,10 +72,10 @@ type Props = { const PushNotificationEngagementScreenContent = ({ flow, + onPressActivate, sendOpeningSource, sendUserType, - shouldSetSecurityAdviceUponLeaving, - onPressActivate + shouldSetSecurityAdviceUponLeaving }: Props) => { const dispatch = useIODispatch(); const { popToTop, setOptions } = useIONavigation(); diff --git a/ts/features/pushNotifications/screens/SystemNotificationPermissionsScreen.tsx b/ts/features/pushNotifications/screens/SystemNotificationPermissionsScreen.tsx index d68744275ec..0dcb8d5caeb 100644 --- a/ts/features/pushNotifications/screens/SystemNotificationPermissionsScreen.tsx +++ b/ts/features/pushNotifications/screens/SystemNotificationPermissionsScreen.tsx @@ -16,7 +16,12 @@ export const SystemNotificationPermissionsScreen = () => { const navigation = useIONavigation(); const onDismiss = useCallback(() => { - trackSystemNotificationPermissionScreenOutcome("dismiss", "authentication"); + trackSystemNotificationPermissionScreenOutcome( + "dismiss", + "authentication", + "not_set", + "not_set" + ); navigation.goBack(); }, [navigation]); @@ -36,7 +41,11 @@ export const SystemNotificationPermissionsScreen = () => { ) }); - trackSystemNotificationPermissionScreenShown("authentication"); + trackSystemNotificationPermissionScreenShown( + "authentication", + "not_set", + "not_set" + ); dispatch(setEngagementScreenShown()); }, [dispatch, navigation, onDismiss]); @@ -52,7 +61,9 @@ export const SystemNotificationPermissionsScreen = () => { onPress: () => { trackSystemNotificationPermissionScreenOutcome( "activate", - "authentication" + "authentication", + "not_set", + "not_set" ); openSystemNotificationSettingsScreen(); navigation.goBack(); diff --git a/ts/features/pushNotifications/screens/__tests__/PushNotificationEngagementScreen.test.tsx b/ts/features/pushNotifications/screens/__tests__/PushNotificationEngagementScreen.test.tsx index 0511a4afe1a..c30eecf36a9 100644 --- a/ts/features/pushNotifications/screens/__tests__/PushNotificationEngagementScreen.test.tsx +++ b/ts/features/pushNotifications/screens/__tests__/PushNotificationEngagementScreen.test.tsx @@ -61,6 +61,7 @@ describe("PushNotificationEngagementScreen", () => { const screen = renderScreen(); expect(screen.toJSON()).toMatchSnapshot(); }); + notificationModalFlowList.forEach(flow => sendOpeningSourceList.forEach(sendOpeningSource => sendUserTypeList.forEach(sendUserType => diff --git a/ts/features/pushNotifications/screens/__tests__/SystemNotificationPermissionsScreen.test.tsx b/ts/features/pushNotifications/screens/__tests__/SystemNotificationPermissionsScreen.test.tsx index 60d8d2061f0..1778a455d7f 100644 --- a/ts/features/pushNotifications/screens/__tests__/SystemNotificationPermissionsScreen.test.tsx +++ b/ts/features/pushNotifications/screens/__tests__/SystemNotificationPermissionsScreen.test.tsx @@ -49,8 +49,10 @@ describe("SystemNotificationPermissionsScreen", () => { renderScreen(); expect(analyticsMock.mock.calls.length).toBe(1); - expect(analyticsMock.mock.calls[0].length).toBe(1); + expect(analyticsMock.mock.calls[0].length).toBe(3); expect(analyticsMock.mock.calls[0][0]).toBe("authentication"); + expect(analyticsMock.mock.calls[0][1]).toBe("not_set"); + expect(analyticsMock.mock.calls[0][2]).toBe("not_set"); expect(mockDispatch.mock.calls.length).toBe(1); expect(mockDispatch.mock.calls[0].length).toBe(1); @@ -88,9 +90,11 @@ describe("SystemNotificationPermissionsScreen", () => { onPressFunction(); expect(analyticsMock.mock.calls.length).toBe(1); - expect(analyticsMock.mock.calls[0].length).toBe(2); + expect(analyticsMock.mock.calls[0].length).toBe(4); expect(analyticsMock.mock.calls[0][0]).toBe("dismiss"); expect(analyticsMock.mock.calls[0][1]).toBe("authentication"); + expect(analyticsMock.mock.calls[0][2]).toBe("not_set"); + expect(analyticsMock.mock.calls[0][3]).toBe("not_set"); expect(settingsSpy.mock.calls.length).toBe(0); expect(mockGoBack.mock.calls.length).toBe(1); @@ -111,9 +115,11 @@ describe("SystemNotificationPermissionsScreen", () => { fireEvent.press(xCloseButton); expect(analyticsMock.mock.calls.length).toBe(1); - expect(analyticsMock.mock.calls[0].length).toBe(2); + expect(analyticsMock.mock.calls[0].length).toBe(4); expect(analyticsMock.mock.calls[0][0]).toBe("activate"); expect(analyticsMock.mock.calls[0][1]).toBe("authentication"); + expect(analyticsMock.mock.calls[0][2]).toBe("not_set"); + expect(analyticsMock.mock.calls[0][3]).toBe("not_set"); expect(settingsSpy.mock.calls.length).toBe(1); expect(settingsSpy.mock.calls[0].length).toBe(0); @@ -135,9 +141,11 @@ describe("SystemNotificationPermissionsScreen", () => { fireEvent.press(xCloseButton); expect(analyticsMock.mock.calls.length).toBe(1); - expect(analyticsMock.mock.calls[0].length).toBe(2); + expect(analyticsMock.mock.calls[0].length).toBe(4); expect(analyticsMock.mock.calls[0][0]).toBe("dismiss"); expect(analyticsMock.mock.calls[0][1]).toBe("authentication"); + expect(analyticsMock.mock.calls[0][2]).toBe("not_set"); + expect(analyticsMock.mock.calls[0][3]).toBe("not_set"); expect(settingsSpy.mock.calls.length).toBe(0); expect(mockGoBack.mock.calls.length).toBe(1);