@tellescope/sdk 1.256.15 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +5 -0
- package/env.example +39 -0
- package/lib/cjs/enduser.d.ts +1 -0
- package/lib/cjs/enduser.d.ts.map +1 -1
- package/lib/cjs/sdk.d.ts +5 -3
- package/lib/cjs/sdk.d.ts.map +1 -1
- package/lib/cjs/sdk.js +1 -0
- package/lib/cjs/sdk.js.map +1 -1
- package/lib/cjs/session.d.ts +1 -0
- package/lib/cjs/session.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/active_patient_count.test.js +1 -1
- package/lib/cjs/tests/api_tests/active_patient_count.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/appointment_rescheduled_trigger.test.js +1 -1
- package/lib/cjs/tests/api_tests/appointment_rescheduled_trigger.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/calendar_event_limits.test.js +5 -5
- package/lib/cjs/tests/api_tests/calendar_event_limits.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/calendar_event_references_update.test.js +1 -1
- package/lib/cjs/tests/api_tests/calendar_event_references_update.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/enduser_cross_access_isolation.test.js +1 -1
- package/lib/cjs/tests/api_tests/enduser_cross_access_isolation.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts +21 -0
- package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js +215 -0
- package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/enduser_login_rate_limits.test.js +6 -6
- package/lib/cjs/tests/api_tests/enduser_login_rate_limits.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/enduser_session_invalidation.test.js +3 -3
- package/lib/cjs/tests/api_tests/enduser_session_invalidation.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts +32 -0
- package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/load_threads_care_team.test.js +257 -0
- package/lib/cjs/tests/api_tests/load_threads_care_team.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/managed_content_enduser_access.test.js +1 -1
- package/lib/cjs/tests/api_tests/managed_content_enduser_access.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/managed_content_file_access.test.js +1 -1
- package/lib/cjs/tests/api_tests/managed_content_file_access.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/mdi_webhooks.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/mdi_webhooks.test.js +21 -8
- package/lib/cjs/tests/api_tests/mdi_webhooks.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/nutrition_tracking.test.js +1 -1
- package/lib/cjs/tests/api_tests/nutrition_tracking.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/openloop_webhooks.test.js +1 -1
- package/lib/cjs/tests/api_tests/openloop_webhooks.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/programs.test.d.ts +5 -0
- package/lib/cjs/tests/api_tests/programs.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/programs.test.js +370 -0
- package/lib/cjs/tests/api_tests/programs.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/programs_trigger_filters.test.d.ts +5 -0
- package/lib/cjs/tests/api_tests/programs_trigger_filters.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/programs_trigger_filters.test.js +295 -0
- package/lib/cjs/tests/api_tests/programs_trigger_filters.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.js +1 -1
- package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +42 -0
- package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js +484 -0
- package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.js +1 -1
- package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +1 -1
- package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.js +1 -1
- package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.js +1 -1
- package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts +5 -0
- package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js +357 -0
- package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.js +2 -2
- package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +32 -0
- package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +297 -0
- package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +4 -1
- package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/templated_message_date_fields.test.d.ts +3 -0
- package/lib/cjs/tests/api_tests/templated_message_date_fields.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/templated_message_date_fields.test.js +202 -0
- package/lib/cjs/tests/api_tests/templated_message_date_fields.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.d.ts +3 -0
- package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.js +233 -0
- package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/templated_message_links.test.d.ts +3 -0
- package/lib/cjs/tests/api_tests/templated_message_links.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/templated_message_links.test.js +235 -0
- package/lib/cjs/tests/api_tests/templated_message_links.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/time_tracks.test.js +1 -1
- package/lib/cjs/tests/api_tests/time_tracks.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts +5 -0
- package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js +395 -0
- package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts +5 -0
- package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js +471 -0
- package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/user_portal_settings.test.js +1 -1
- package/lib/cjs/tests/api_tests/user_portal_settings.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/validation_behavior_locks.test.d.ts +2 -0
- package/lib/cjs/tests/api_tests/validation_behavior_locks.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/validation_behavior_locks.test.js +233 -0
- package/lib/cjs/tests/api_tests/validation_behavior_locks.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts +5 -0
- package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js +569 -0
- package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js.map +1 -0
- package/lib/cjs/tests/public_endpoint_tests.js +3 -2
- package/lib/cjs/tests/public_endpoint_tests.js.map +1 -1
- package/lib/cjs/tests/setup.d.ts +16 -0
- package/lib/cjs/tests/setup.d.ts.map +1 -1
- package/lib/cjs/tests/setup.js +55 -8
- package/lib/cjs/tests/setup.js.map +1 -1
- package/lib/cjs/tests/setup_isolated.d.ts +9 -0
- package/lib/cjs/tests/setup_isolated.d.ts.map +1 -1
- package/lib/cjs/tests/setup_isolated.js +23 -2
- package/lib/cjs/tests/setup_isolated.js.map +1 -1
- package/lib/cjs/tests/socket_tests.d.ts.map +1 -1
- package/lib/cjs/tests/socket_tests.js +3 -2
- package/lib/cjs/tests/socket_tests.js.map +1 -1
- package/lib/cjs/tests/tests.d.ts.map +1 -1
- package/lib/cjs/tests/tests.js +182 -166
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/cjs/tests/unit_tests/trigger_title_partials.test.d.ts +3 -0
- package/lib/cjs/tests/unit_tests/trigger_title_partials.test.d.ts.map +1 -0
- package/lib/cjs/tests/unit_tests/trigger_title_partials.test.js +118 -0
- package/lib/cjs/tests/unit_tests/trigger_title_partials.test.js.map +1 -0
- package/lib/cjs/tests/webhooks_tests.js +3 -2
- package/lib/cjs/tests/webhooks_tests.js.map +1 -1
- package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/esm/enduser.d.ts +2 -0
- package/lib/esm/enduser.d.ts.map +1 -1
- package/lib/esm/sdk.d.ts +8 -5
- package/lib/esm/sdk.d.ts.map +1 -1
- package/lib/esm/sdk.js +1 -0
- package/lib/esm/sdk.js.map +1 -1
- package/lib/esm/session.d.ts +2 -0
- package/lib/esm/session.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/active_patient_count.test.js +1 -1
- package/lib/esm/tests/api_tests/active_patient_count.test.js.map +1 -1
- package/lib/esm/tests/api_tests/appointment_rescheduled_trigger.test.js +1 -1
- package/lib/esm/tests/api_tests/appointment_rescheduled_trigger.test.js.map +1 -1
- package/lib/esm/tests/api_tests/calendar_event_limits.test.js +5 -5
- package/lib/esm/tests/api_tests/calendar_event_limits.test.js.map +1 -1
- package/lib/esm/tests/api_tests/calendar_event_references_update.test.js +1 -1
- package/lib/esm/tests/api_tests/calendar_event_references_update.test.js.map +1 -1
- package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.js +1 -1
- package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.js.map +1 -1
- package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts +21 -0
- package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/enduser_fields_sync.test.js +210 -0
- package/lib/esm/tests/api_tests/enduser_fields_sync.test.js.map +1 -0
- package/lib/esm/tests/api_tests/enduser_login_rate_limits.test.js +7 -7
- package/lib/esm/tests/api_tests/enduser_login_rate_limits.test.js.map +1 -1
- package/lib/esm/tests/api_tests/enduser_session_invalidation.test.js +4 -4
- package/lib/esm/tests/api_tests/enduser_session_invalidation.test.js.map +1 -1
- package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts +32 -0
- package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/load_threads_care_team.test.js +252 -0
- package/lib/esm/tests/api_tests/load_threads_care_team.test.js.map +1 -0
- package/lib/esm/tests/api_tests/managed_content_enduser_access.test.js +1 -1
- package/lib/esm/tests/api_tests/managed_content_enduser_access.test.js.map +1 -1
- package/lib/esm/tests/api_tests/managed_content_file_access.test.js +1 -1
- package/lib/esm/tests/api_tests/managed_content_file_access.test.js.map +1 -1
- package/lib/esm/tests/api_tests/mdi_webhooks.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/mdi_webhooks.test.js +21 -8
- package/lib/esm/tests/api_tests/mdi_webhooks.test.js.map +1 -1
- package/lib/esm/tests/api_tests/nutrition_tracking.test.js +1 -1
- package/lib/esm/tests/api_tests/nutrition_tracking.test.js.map +1 -1
- package/lib/esm/tests/api_tests/openloop_webhooks.test.js +1 -1
- package/lib/esm/tests/api_tests/openloop_webhooks.test.js.map +1 -1
- package/lib/esm/tests/api_tests/programs.test.d.ts +5 -0
- package/lib/esm/tests/api_tests/programs.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/programs.test.js +365 -0
- package/lib/esm/tests/api_tests/programs.test.js.map +1 -0
- package/lib/esm/tests/api_tests/programs_trigger_filters.test.d.ts +5 -0
- package/lib/esm/tests/api_tests/programs_trigger_filters.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/programs_trigger_filters.test.js +290 -0
- package/lib/esm/tests/api_tests/programs_trigger_filters.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.js +1 -1
- package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.js.map +1 -1
- package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +42 -0
- package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js +479 -0
- package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js +1 -1
- package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -1
- package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +1 -1
- package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -1
- package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js +1 -1
- package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js.map +1 -1
- package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js +1 -1
- package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -1
- package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts +5 -0
- package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js +349 -0
- package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.js +3 -3
- package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.js.map +1 -1
- package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +32 -0
- package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +292 -0
- package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +4 -1
- package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -1
- package/lib/esm/tests/api_tests/templated_message_date_fields.test.d.ts +3 -0
- package/lib/esm/tests/api_tests/templated_message_date_fields.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/templated_message_date_fields.test.js +198 -0
- package/lib/esm/tests/api_tests/templated_message_date_fields.test.js.map +1 -0
- package/lib/esm/tests/api_tests/templated_message_link_in_href.test.d.ts +3 -0
- package/lib/esm/tests/api_tests/templated_message_link_in_href.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/templated_message_link_in_href.test.js +229 -0
- package/lib/esm/tests/api_tests/templated_message_link_in_href.test.js.map +1 -0
- package/lib/esm/tests/api_tests/templated_message_links.test.d.ts +3 -0
- package/lib/esm/tests/api_tests/templated_message_links.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/templated_message_links.test.js +231 -0
- package/lib/esm/tests/api_tests/templated_message_links.test.js.map +1 -0
- package/lib/esm/tests/api_tests/time_tracks.test.js +1 -1
- package/lib/esm/tests/api_tests/time_tracks.test.js.map +1 -1
- package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts +5 -0
- package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/trigger_contains_matching.test.js +390 -0
- package/lib/esm/tests/api_tests/trigger_contains_matching.test.js.map +1 -0
- package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts +5 -0
- package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js +466 -0
- package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -0
- package/lib/esm/tests/api_tests/user_portal_settings.test.js +1 -1
- package/lib/esm/tests/api_tests/user_portal_settings.test.js.map +1 -1
- package/lib/esm/tests/api_tests/validation_behavior_locks.test.d.ts +2 -0
- package/lib/esm/tests/api_tests/validation_behavior_locks.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/validation_behavior_locks.test.js +229 -0
- package/lib/esm/tests/api_tests/validation_behavior_locks.test.js.map +1 -0
- package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts +5 -0
- package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js +564 -0
- package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js.map +1 -0
- package/lib/esm/tests/public_endpoint_tests.js +3 -2
- package/lib/esm/tests/public_endpoint_tests.js.map +1 -1
- package/lib/esm/tests/setup.d.ts +16 -0
- package/lib/esm/tests/setup.d.ts.map +1 -1
- package/lib/esm/tests/setup.js +53 -7
- package/lib/esm/tests/setup.js.map +1 -1
- package/lib/esm/tests/setup_isolated.d.ts +9 -0
- package/lib/esm/tests/setup_isolated.d.ts.map +1 -1
- package/lib/esm/tests/setup_isolated.js +21 -1
- package/lib/esm/tests/setup_isolated.js.map +1 -1
- package/lib/esm/tests/socket_tests.d.ts.map +1 -1
- package/lib/esm/tests/socket_tests.js +3 -2
- package/lib/esm/tests/socket_tests.js.map +1 -1
- package/lib/esm/tests/tests.d.ts.map +1 -1
- package/lib/esm/tests/tests.js +182 -166
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/esm/tests/unit_tests/trigger_title_partials.test.d.ts +3 -0
- package/lib/esm/tests/unit_tests/trigger_title_partials.test.d.ts.map +1 -0
- package/lib/esm/tests/unit_tests/trigger_title_partials.test.js +115 -0
- package/lib/esm/tests/unit_tests/trigger_title_partials.test.js.map +1 -0
- package/lib/esm/tests/webhooks_tests.js +3 -2
- package/lib/esm/tests/webhooks_tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +22 -19
- package/src/sdk.ts +5 -1
- package/src/tests/api_tests/active_patient_count.test.ts +1 -1
- package/src/tests/api_tests/appointment_rescheduled_trigger.test.ts +1 -1
- package/src/tests/api_tests/calendar_event_references_update.test.ts +1 -1
- package/src/tests/api_tests/enduser_cross_access_isolation.test.ts +1 -1
- package/src/tests/api_tests/enduser_login_rate_limits.test.ts +7 -7
- package/src/tests/api_tests/enduser_session_invalidation.test.ts +4 -4
- package/src/tests/api_tests/managed_content_enduser_access.test.ts +1 -1
- package/src/tests/api_tests/managed_content_file_access.test.ts +1 -1
- package/src/tests/api_tests/mdi_webhooks.test.ts +9 -0
- package/src/tests/api_tests/nutrition_tracking.test.ts +1 -1
- package/src/tests/api_tests/openloop_webhooks.test.ts +1 -1
- package/src/tests/api_tests/security/allowed-paths-confinement.test.ts +1 -1
- package/src/tests/api_tests/security/booking-info-idor-token-mint.test.ts +1 -1
- package/src/tests/api_tests/security/enduser-ai-summary-trust-gate.test.ts +1 -1
- package/src/tests/api_tests/security/enduser-cross-create.test.ts +1 -1
- package/src/tests/api_tests/security/enduser-write-restrictions.test.ts +1 -1
- package/src/tests/api_tests/security/file-link-session-confinement.test.ts +291 -0
- package/src/tests/api_tests/security/invite-user-enumeration.test.ts +3 -3
- package/src/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.ts +197 -0
- package/src/tests/api_tests/security/sanitize-user-html-with-iframes.test.ts +4 -1
- package/src/tests/api_tests/templated_message_date_fields.test.ts +146 -0
- package/src/tests/api_tests/templated_message_links.test.ts +192 -0
- package/src/tests/api_tests/time_tracks.test.ts +1 -1
- package/src/tests/api_tests/user_portal_settings.test.ts +1 -1
- package/src/tests/api_tests/validation_behavior_locks.test.ts +204 -0
- package/src/tests/public_endpoint_tests.ts +3 -2
- package/src/tests/setup.ts +43 -7
- package/src/tests/setup_isolated.ts +10 -0
- package/src/tests/socket_tests.ts +3 -2
- package/src/tests/tests.ts +12 -2
- package/src/tests/webhooks_tests.ts +4 -2
- package/test_generated.pdf +0 -0
- package/tsconfig.cjs.json +17 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.templated_message_link_in_href_tests = void 0;
|
|
40
|
+
require('source-map-support').install();
|
|
41
|
+
var setup_isolated_1 = require("../setup_isolated");
|
|
42
|
+
var host = process.env.API_URL || 'http://localhost:8080';
|
|
43
|
+
/**
|
|
44
|
+
* Coverage for what `get_templated_message` does with a `{url}[text]` link template that sits in
|
|
45
|
+
* ATTRIBUTE position rather than in body text.
|
|
46
|
+
*
|
|
47
|
+
* `replaceLinks` scans the html as a flat string and, for every link template it finds, substitutes a
|
|
48
|
+
* complete `<a href="<tracking url>">text</a>` element. In body text that is the whole point. Inside an
|
|
49
|
+
* attribute it corrupts the document:
|
|
50
|
+
*
|
|
51
|
+
* <a href="{https://x.com}[Click]" target="_blank" style="...">Button</a>
|
|
52
|
+
* became
|
|
53
|
+
* <a href="<a href="https://api.../r/TOKEN">Click</a>" target="_blank" style="...">Button</a>
|
|
54
|
+
*
|
|
55
|
+
* An html parser ends that start tag at the inner `">`, so the href value and every attribute after it
|
|
56
|
+
* render as visible text in the recipient's mail client — a styled CTA button turns into a paragraph of
|
|
57
|
+
* markup. That is what was reported from staging: a button reading
|
|
58
|
+
* `https://google.com/m" target="_blank" style="display:inline-block; ...;"> View Details`.
|
|
59
|
+
*
|
|
60
|
+
* A link template reaches an href either because the author put one there, or because they used a merge
|
|
61
|
+
* field there: every link resolver in `message_templating.ts` (`{{forms.<id>.link}}`,
|
|
62
|
+
* `{{portal.link.<page>}}`, `{{files.<id>.link}}`, ...) returns the `{url}[text]` form, not a URL, so
|
|
63
|
+
* `href="{{forms.<id>.link}}"` lands in the same place. `[$LINK_ONLY]` was the only way to avoid it, and
|
|
64
|
+
* nothing told an author it existed.
|
|
65
|
+
*
|
|
66
|
+
* Now a template in attribute position resolves to the bare tracking URL — tracked exactly as before,
|
|
67
|
+
* with the author's own anchor, styling and target left intact.
|
|
68
|
+
*
|
|
69
|
+
* End-to-end through the endpoint on purpose: `replaceLinks` is module-private, and this is the same
|
|
70
|
+
* endpoint the worker calls through `api_bridge.get_templated_message` on every outbound email.
|
|
71
|
+
*
|
|
72
|
+
* Runs standalone or as part of the main suite:
|
|
73
|
+
* npm run test:modular -- api_tests/templated_message_link_in_href
|
|
74
|
+
*/
|
|
75
|
+
var LINK = 'https://example.com/landing-page';
|
|
76
|
+
/** The reported shape: a table-based email CTA whose href holds a link template. */
|
|
77
|
+
var BUTTON_HTML = function (linkTemplate) { return ("<td align=\"center\" style=\"border-radius: 30px;\">"
|
|
78
|
+
+ "<a href=\"".concat(linkTemplate, "\" target=\"_blank\" style=\"display:inline-block; padding: 14px 36px; color:#ffffff;\">View Details</a>")
|
|
79
|
+
+ "</td>"); };
|
|
80
|
+
/** A tracked link is `<portal or api url>/r/<token>`; the token itself is not predictable. */
|
|
81
|
+
var TRACKING_URL_EXP = /https?:\/\/[^\s"'<>]+\/r\/[A-Za-z0-9_-]+/;
|
|
82
|
+
var templated_message_link_in_href_checks = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
83
|
+
var checks, tenant, sdk_1, userId_1, enduser_1, templated, attributeHTML, cases, _i, cases_1, _a, label, message, html, bodyTemplate, _b, bodyHTML, bodyText, afterStrayBracket, strayHTML, linkOnlyHTML, mixed, mixedHTML, control;
|
|
84
|
+
return __generator(this, function (_c) {
|
|
85
|
+
switch (_c.label) {
|
|
86
|
+
case 0:
|
|
87
|
+
checks = [];
|
|
88
|
+
return [4 /*yield*/, (0, setup_isolated_1.setup_isolated_tenant)({ users: [{ isAdmin: true }] })];
|
|
89
|
+
case 1:
|
|
90
|
+
tenant = _c.sent();
|
|
91
|
+
_c.label = 2;
|
|
92
|
+
case 2:
|
|
93
|
+
_c.trys.push([2, , 13, 15]);
|
|
94
|
+
sdk_1 = tenant.sdk;
|
|
95
|
+
userId_1 = tenant.users[0].id;
|
|
96
|
+
return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Link', lname: 'Href' })];
|
|
97
|
+
case 3:
|
|
98
|
+
enduser_1 = _c.sent();
|
|
99
|
+
templated = function (message, html) { return sdk_1.api.templates.get_templated_message({
|
|
100
|
+
enduserId: enduser_1.id,
|
|
101
|
+
userId: userId_1,
|
|
102
|
+
channel: 'Email',
|
|
103
|
+
message: message,
|
|
104
|
+
html: html,
|
|
105
|
+
}); };
|
|
106
|
+
attributeHTML = BUTTON_HTML("{".concat(LINK, "}[").concat(LINK, "]"));
|
|
107
|
+
cases = [
|
|
108
|
+
{ label: 'plaintext carries the template too (composer HTML mode)', message: attributeHTML },
|
|
109
|
+
{ label: 'plaintext differs from html', message: 'View details at our site' },
|
|
110
|
+
];
|
|
111
|
+
_i = 0, cases_1 = cases;
|
|
112
|
+
_c.label = 4;
|
|
113
|
+
case 4:
|
|
114
|
+
if (!(_i < cases_1.length)) return [3 /*break*/, 7];
|
|
115
|
+
_a = cases_1[_i], label = _a.label, message = _a.message;
|
|
116
|
+
return [4 /*yield*/, templated(message, attributeHTML)];
|
|
117
|
+
case 5:
|
|
118
|
+
html = (_c.sent()).html;
|
|
119
|
+
checks.push({
|
|
120
|
+
label: "no <a> is spliced inside the href \u2014 ".concat(label),
|
|
121
|
+
pass: !html.includes('href="<a') && !html.includes('</a>"'),
|
|
122
|
+
detail: "rendered ".concat(JSON.stringify(html)),
|
|
123
|
+
});
|
|
124
|
+
checks.push({
|
|
125
|
+
label: "the author's anchor stays a single well-formed tag \u2014 ".concat(label),
|
|
126
|
+
pass: (html.match(/<a\s/g) || []).length === 1 && (html.match(/<\/a>/g) || []).length === 1,
|
|
127
|
+
detail: "rendered ".concat(JSON.stringify(html)),
|
|
128
|
+
});
|
|
129
|
+
checks.push({
|
|
130
|
+
label: "the href is the tracking URL, and the anchor keeps target and style \u2014 ".concat(label),
|
|
131
|
+
pass: (new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\" target=\"_blank\" style=\"[^\"]+\">View Details</a>")).test(html)),
|
|
132
|
+
detail: "rendered ".concat(JSON.stringify(html)),
|
|
133
|
+
});
|
|
134
|
+
checks.push({
|
|
135
|
+
label: "click tracking still happens \u2014 ".concat(label),
|
|
136
|
+
pass: TRACKING_URL_EXP.test(html) && !html.includes(LINK),
|
|
137
|
+
detail: "rendered ".concat(JSON.stringify(html)),
|
|
138
|
+
});
|
|
139
|
+
_c.label = 6;
|
|
140
|
+
case 6:
|
|
141
|
+
_i++;
|
|
142
|
+
return [3 /*break*/, 4];
|
|
143
|
+
case 7:
|
|
144
|
+
bodyTemplate = "Read more here: {".concat(LINK, "}[Read more]");
|
|
145
|
+
return [4 /*yield*/, templated(bodyTemplate, "<p>".concat(bodyTemplate, "</p>"))];
|
|
146
|
+
case 8:
|
|
147
|
+
_b = _c.sent(), bodyHTML = _b.html, bodyText = _b.plaintext;
|
|
148
|
+
checks.push({
|
|
149
|
+
label: 'a link template in body text still becomes an anchor',
|
|
150
|
+
pass: new RegExp("<p>Read more here: <a href=\"".concat(TRACKING_URL_EXP.source, "\">Read more</a></p>")).test(bodyHTML),
|
|
151
|
+
detail: "rendered ".concat(JSON.stringify(bodyHTML)),
|
|
152
|
+
});
|
|
153
|
+
checks.push({
|
|
154
|
+
label: 'the plaintext version is unaffected by the html handling',
|
|
155
|
+
pass: /^Read more here: Read more \(https?:\/\/.+\/r\/[A-Za-z0-9_-]+\)$/.test(bodyText),
|
|
156
|
+
detail: "rendered ".concat(JSON.stringify(bodyText)),
|
|
157
|
+
});
|
|
158
|
+
afterStrayBracket = "<p>Tom & Jerry <3 \"quotes\" \u2014 {".concat(LINK, "}[Read more]</p>");
|
|
159
|
+
return [4 /*yield*/, templated('Tom & Jerry', afterStrayBracket)];
|
|
160
|
+
case 9:
|
|
161
|
+
strayHTML = (_c.sent()).html;
|
|
162
|
+
checks.push({
|
|
163
|
+
label: 'a stray < in body text does not downgrade the link after it',
|
|
164
|
+
pass: new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\">Read more</a>")).test(strayHTML),
|
|
165
|
+
detail: "rendered ".concat(JSON.stringify(strayHTML)),
|
|
166
|
+
});
|
|
167
|
+
return [4 /*yield*/, templated('Button', BUTTON_HTML("{".concat(LINK, "}[$LINK_ONLY]")))];
|
|
168
|
+
case 10:
|
|
169
|
+
linkOnlyHTML = (_c.sent()).html;
|
|
170
|
+
checks.push({
|
|
171
|
+
label: '[$LINK_ONLY] in an href behaves as it always has',
|
|
172
|
+
pass: (new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\" target=\"_blank\" style=\"[^\"]+\">View Details</a>")).test(linkOnlyHTML)
|
|
173
|
+
&& !linkOnlyHTML.includes('$LINK_ONLY')),
|
|
174
|
+
detail: "rendered ".concat(JSON.stringify(linkOnlyHTML)),
|
|
175
|
+
});
|
|
176
|
+
mixed = "<p>Or visit {".concat(LINK, "}[our site]</p>") + BUTTON_HTML("{".concat(LINK, "}[").concat(LINK, "]"));
|
|
177
|
+
return [4 /*yield*/, templated('Or visit our site', mixed)];
|
|
178
|
+
case 11:
|
|
179
|
+
mixedHTML = (_c.sent()).html;
|
|
180
|
+
checks.push({
|
|
181
|
+
label: 'body and attribute templates in one message each resolve correctly',
|
|
182
|
+
pass: ((mixedHTML.match(/<a\s/g) || []).length === 2
|
|
183
|
+
&& !mixedHTML.includes('href="<a')
|
|
184
|
+
&& new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\">our site</a>")).test(mixedHTML)),
|
|
185
|
+
detail: "rendered ".concat(JSON.stringify(mixedHTML)),
|
|
186
|
+
});
|
|
187
|
+
return [4 /*yield*/, templated('{{enduser.fname}} {{enduser.lname}}', '')];
|
|
188
|
+
case 12:
|
|
189
|
+
control = (_c.sent()).plaintext;
|
|
190
|
+
checks.push({
|
|
191
|
+
label: 'control: templating runs at all',
|
|
192
|
+
pass: control === 'Link Href',
|
|
193
|
+
detail: "rendered ".concat(JSON.stringify(control)),
|
|
194
|
+
});
|
|
195
|
+
return [2 /*return*/, checks];
|
|
196
|
+
case 13: return [4 /*yield*/, tenant.teardown()];
|
|
197
|
+
case 14:
|
|
198
|
+
_c.sent();
|
|
199
|
+
return [7 /*endfinally*/];
|
|
200
|
+
case 15: return [2 /*return*/];
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}); };
|
|
204
|
+
/** Asserting wrapper, for standalone runs and for sequential use in the suite. */
|
|
205
|
+
var templated_message_link_in_href_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
206
|
+
var _a, _b;
|
|
207
|
+
return __generator(this, function (_c) {
|
|
208
|
+
switch (_c.label) {
|
|
209
|
+
case 0:
|
|
210
|
+
_a = setup_isolated_1.assert_checks;
|
|
211
|
+
_b = ['Templated message link in href'];
|
|
212
|
+
return [4 /*yield*/, templated_message_link_in_href_checks()];
|
|
213
|
+
case 1:
|
|
214
|
+
_a.apply(void 0, _b.concat([_c.sent()]));
|
|
215
|
+
return [2 /*return*/];
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}); };
|
|
219
|
+
exports.templated_message_link_in_href_tests = templated_message_link_in_href_tests;
|
|
220
|
+
// Allow running this test file independently
|
|
221
|
+
if (require.main === module) {
|
|
222
|
+
console.log("\uD83C\uDF10 Using API URL: ".concat(host));
|
|
223
|
+
(0, exports.templated_message_link_in_href_tests)()
|
|
224
|
+
.then(function () {
|
|
225
|
+
console.log("✅ Templated message link in href test suite completed successfully");
|
|
226
|
+
process.exit(0);
|
|
227
|
+
})
|
|
228
|
+
.catch(function (error) {
|
|
229
|
+
console.error("❌ Templated message link in href test suite failed:", error);
|
|
230
|
+
process.exit(1);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=templated_message_link_in_href.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templated_message_link_in_href.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/templated_message_link_in_href.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templated_message_links.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/templated_message_links.test.ts"],"names":[],"mappings":"AA8KA,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,qBAExC,CAAA"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.templated_message_link_tests = void 0;
|
|
40
|
+
require('source-map-support').install();
|
|
41
|
+
var setup_isolated_1 = require("../setup_isolated");
|
|
42
|
+
var host = process.env.API_URL || 'http://localhost:8080';
|
|
43
|
+
/**
|
|
44
|
+
* Link templating through the real `templates.get_templated_message` — the same endpoint the worker
|
|
45
|
+
* calls on every outbound email and SMS.
|
|
46
|
+
*
|
|
47
|
+
* The exhaustive coverage of this path lives in the API's own module test
|
|
48
|
+
* (`packages/private/api/api/modules/message_templating.test.ts`), which stubs the database so a case
|
|
49
|
+
* costs microseconds. This suite exists to prove those stubs still describe the real thing: that a
|
|
50
|
+
* rendered link really is a `/r/<token>` redirect, and that `linkOpenTrackingIds` really is one id per
|
|
51
|
+
* redirect record created.
|
|
52
|
+
*
|
|
53
|
+
* Deliberately small. Every case here writes real `url_redirects` rows, and `teardown_tenant` does not
|
|
54
|
+
* remove them — that collection is in neither `schema` nor `getInternalQueries()` — so each extra case
|
|
55
|
+
* leaves rows behind in the database forever.
|
|
56
|
+
*
|
|
57
|
+
* Runs standalone or as part of the main suite:
|
|
58
|
+
* npm run test:modular -- api_tests/templated_message_links
|
|
59
|
+
*/
|
|
60
|
+
/** A tracked link is `<portal or api url>/r/<token>`; the token itself is not predictable. */
|
|
61
|
+
var REDIRECT = /https?:\/\/[^\s"'<>]+\/r\/[A-Za-z0-9_-]+/;
|
|
62
|
+
/** Bound on the one case that used to hang the request, so a regression fails instead of stalling. */
|
|
63
|
+
var CLIENT_WAIT_MS = 20000;
|
|
64
|
+
var LINK = 'https://example.com/landing';
|
|
65
|
+
var templated_message_link_checks = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
66
|
+
var checks, tenant, sdk_1, userId_1, enduser_1, templated, body, _a, html, plaintext, linkOpenTrackingIds, body, _b, html, linkOpenTrackingIds, body, _c, html, plaintext, linkOpenTrackingIds, form, body, _d, html, linkOpenTrackingIds, body, outcome, _e, html, linkOpenTrackingIds;
|
|
67
|
+
return __generator(this, function (_f) {
|
|
68
|
+
switch (_f.label) {
|
|
69
|
+
case 0:
|
|
70
|
+
checks = [];
|
|
71
|
+
return [4 /*yield*/, (0, setup_isolated_1.setup_isolated_tenant)({ users: [{ isAdmin: true }] })];
|
|
72
|
+
case 1:
|
|
73
|
+
tenant = _f.sent();
|
|
74
|
+
_f.label = 2;
|
|
75
|
+
case 2:
|
|
76
|
+
_f.trys.push([2, , 15, 17]);
|
|
77
|
+
sdk_1 = tenant.sdk;
|
|
78
|
+
userId_1 = tenant.users[0].id;
|
|
79
|
+
return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Link', lname: 'Templating' })];
|
|
80
|
+
case 3:
|
|
81
|
+
enduser_1 = _f.sent();
|
|
82
|
+
templated = function (message, html) { return sdk_1.api.templates.get_templated_message({
|
|
83
|
+
enduserId: enduser_1.id,
|
|
84
|
+
userId: userId_1,
|
|
85
|
+
channel: 'Email',
|
|
86
|
+
message: message,
|
|
87
|
+
html: html,
|
|
88
|
+
}); };
|
|
89
|
+
body = "Go: {".concat(LINK, "}[Click]");
|
|
90
|
+
return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
|
|
91
|
+
case 4:
|
|
92
|
+
_a = _f.sent(), html = _a.html, plaintext = _a.plaintext, linkOpenTrackingIds = _a.linkOpenTrackingIds;
|
|
93
|
+
checks.push({
|
|
94
|
+
label: 'html renders an anchor whose href is a /r/ redirect',
|
|
95
|
+
pass: new RegExp("^<p>Go: <a href=\"".concat(REDIRECT.source, "\">Click</a></p>$")).test(html),
|
|
96
|
+
detail: "rendered ".concat(JSON.stringify(html)),
|
|
97
|
+
});
|
|
98
|
+
checks.push({
|
|
99
|
+
label: 'plaintext appends the same redirect in parentheses',
|
|
100
|
+
pass: new RegExp("^Go: Click \\(".concat(REDIRECT.source, "\\)$")).test(plaintext),
|
|
101
|
+
detail: "rendered ".concat(JSON.stringify(plaintext)),
|
|
102
|
+
});
|
|
103
|
+
checks.push({
|
|
104
|
+
label: 'one link creates exactly one redirect record',
|
|
105
|
+
pass: linkOpenTrackingIds.length === 1,
|
|
106
|
+
detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
|
|
107
|
+
});
|
|
108
|
+
body = "One {".concat(LINK, "/a}[A], two {").concat(LINK, "/b}[B], three {").concat(LINK, "/c}[C]");
|
|
109
|
+
return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
|
|
110
|
+
case 5:
|
|
111
|
+
_b = _f.sent(), html = _b.html, linkOpenTrackingIds = _b.linkOpenTrackingIds;
|
|
112
|
+
checks.push({
|
|
113
|
+
label: 'every link in one message is replaced',
|
|
114
|
+
pass: (html.match(/<a href="/g) || []).length === 3 && !html.includes('{'),
|
|
115
|
+
detail: "rendered ".concat(JSON.stringify(html)),
|
|
116
|
+
});
|
|
117
|
+
checks.push({
|
|
118
|
+
label: 'three links create exactly three redirect records',
|
|
119
|
+
pass: linkOpenTrackingIds.length === 3,
|
|
120
|
+
detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
|
|
121
|
+
});
|
|
122
|
+
body = "Go: {".concat(LINK, "}[$LINK_ONLY]");
|
|
123
|
+
return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
|
|
124
|
+
case 6:
|
|
125
|
+
_c = _f.sent(), html = _c.html, plaintext = _c.plaintext, linkOpenTrackingIds = _c.linkOpenTrackingIds;
|
|
126
|
+
checks.push({
|
|
127
|
+
label: '$LINK_ONLY substitutes the bare redirect url',
|
|
128
|
+
pass: new RegExp("^<p>Go: ".concat(REDIRECT.source, "</p>$")).test(html)
|
|
129
|
+
&& new RegExp("^Go: ".concat(REDIRECT.source, "$")).test(plaintext),
|
|
130
|
+
detail: "html ".concat(JSON.stringify(html), ", plaintext ").concat(JSON.stringify(plaintext)),
|
|
131
|
+
});
|
|
132
|
+
checks.push({
|
|
133
|
+
label: '$LINK_ONLY still creates its redirect record',
|
|
134
|
+
pass: linkOpenTrackingIds.length === 1,
|
|
135
|
+
detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
|
|
136
|
+
});
|
|
137
|
+
return [4 /*yield*/, sdk_1.api.forms.createOne({ title: "Link templating ".concat(Date.now()) })];
|
|
138
|
+
case 7:
|
|
139
|
+
form = _f.sent();
|
|
140
|
+
_f.label = 8;
|
|
141
|
+
case 8:
|
|
142
|
+
_f.trys.push([8, , 10, 12]);
|
|
143
|
+
body = "Start here: {{forms.".concat(form.id, ".link:Begin}}");
|
|
144
|
+
return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
|
|
145
|
+
case 9:
|
|
146
|
+
_d = _f.sent(), html = _d.html, linkOpenTrackingIds = _d.linkOpenTrackingIds;
|
|
147
|
+
checks.push({
|
|
148
|
+
label: 'a form link merge field becomes an anchor on a redirect',
|
|
149
|
+
pass: new RegExp("^<p>Start here: <a href=\"".concat(REDIRECT.source, "\">Begin</a></p>$")).test(html),
|
|
150
|
+
detail: "rendered ".concat(JSON.stringify(html)),
|
|
151
|
+
});
|
|
152
|
+
checks.push({
|
|
153
|
+
label: 'the form link creates exactly one redirect record',
|
|
154
|
+
pass: linkOpenTrackingIds.length === 1,
|
|
155
|
+
detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
|
|
156
|
+
});
|
|
157
|
+
return [3 /*break*/, 12];
|
|
158
|
+
case 10: return [4 /*yield*/, sdk_1.api.forms.deleteOne(form.id)];
|
|
159
|
+
case 11:
|
|
160
|
+
_f.sent();
|
|
161
|
+
return [7 /*endfinally*/];
|
|
162
|
+
case 12:
|
|
163
|
+
body = "Go: {".concat(LINK, "} [Click]");
|
|
164
|
+
return [4 /*yield*/, Promise.race([
|
|
165
|
+
templated(body, "<p>".concat(body, "</p>")).then(function (r) { return r; }).catch(function (e) { var _a; return ({ error: (_a = e === null || e === void 0 ? void 0 : e.message) !== null && _a !== void 0 ? _a : String(e) }); }),
|
|
166
|
+
new Promise(function (resolve) { return setTimeout(function () { return resolve({ timedOut: true }); }, CLIENT_WAIT_MS); }),
|
|
167
|
+
])];
|
|
168
|
+
case 13:
|
|
169
|
+
outcome = _f.sent();
|
|
170
|
+
checks.push({
|
|
171
|
+
label: 'a template the server cannot replace still returns a response',
|
|
172
|
+
pass: !outcome.timedOut && !outcome.error,
|
|
173
|
+
detail: outcome.timedOut
|
|
174
|
+
? "no response within ".concat(CLIENT_WAIT_MS, "ms \u2014 the templating loop stopped terminating")
|
|
175
|
+
: outcome.error ? "errored: ".concat(outcome.error) : 'responded',
|
|
176
|
+
});
|
|
177
|
+
if (!outcome.timedOut && !outcome.error) {
|
|
178
|
+
checks.push({
|
|
179
|
+
label: 'it is left literal in both the html and the plaintext',
|
|
180
|
+
pass: outcome.html === "<p>".concat(body, "</p>") && outcome.plaintext === body,
|
|
181
|
+
detail: "html ".concat(JSON.stringify(outcome.html), ", plaintext ").concat(JSON.stringify(outcome.plaintext)),
|
|
182
|
+
});
|
|
183
|
+
checks.push({
|
|
184
|
+
label: 'and it creates no redirect records at all',
|
|
185
|
+
pass: outcome.linkOpenTrackingIds.length === 0,
|
|
186
|
+
detail: "linkOpenTrackingIds=".concat(JSON.stringify(outcome.linkOpenTrackingIds)),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return [4 /*yield*/, templated('No links here', '<p>No links here</p>')];
|
|
190
|
+
case 14:
|
|
191
|
+
_e = _f.sent(), html = _e.html, linkOpenTrackingIds = _e.linkOpenTrackingIds;
|
|
192
|
+
checks.push({
|
|
193
|
+
label: 'control: a body without link syntax is untouched and creates no records',
|
|
194
|
+
pass: html === '<p>No links here</p>' && linkOpenTrackingIds.length === 0,
|
|
195
|
+
detail: "rendered ".concat(JSON.stringify(html), ", linkOpenTrackingIds=").concat(JSON.stringify(linkOpenTrackingIds)),
|
|
196
|
+
});
|
|
197
|
+
return [2 /*return*/, checks];
|
|
198
|
+
case 15: return [4 /*yield*/, tenant.teardown()];
|
|
199
|
+
case 16:
|
|
200
|
+
_f.sent();
|
|
201
|
+
return [7 /*endfinally*/];
|
|
202
|
+
case 17: return [2 /*return*/];
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}); };
|
|
206
|
+
/** Asserting wrapper, for standalone runs and for sequential use in the suite. */
|
|
207
|
+
var templated_message_link_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
208
|
+
var _a, _b;
|
|
209
|
+
return __generator(this, function (_c) {
|
|
210
|
+
switch (_c.label) {
|
|
211
|
+
case 0:
|
|
212
|
+
_a = setup_isolated_1.assert_checks;
|
|
213
|
+
_b = ['Templated message links'];
|
|
214
|
+
return [4 /*yield*/, templated_message_link_checks()];
|
|
215
|
+
case 1:
|
|
216
|
+
_a.apply(void 0, _b.concat([_c.sent()]));
|
|
217
|
+
return [2 /*return*/];
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
}); };
|
|
221
|
+
exports.templated_message_link_tests = templated_message_link_tests;
|
|
222
|
+
// Allow running this test file independently
|
|
223
|
+
if (require.main === module) {
|
|
224
|
+
console.log("\uD83C\uDF10 Using API URL: ".concat(host));
|
|
225
|
+
(0, exports.templated_message_link_tests)()
|
|
226
|
+
.then(function () {
|
|
227
|
+
console.log("✅ Templated message link test suite completed successfully");
|
|
228
|
+
process.exit(0);
|
|
229
|
+
})
|
|
230
|
+
.catch(function (error) {
|
|
231
|
+
console.error("❌ Templated message link test suite failed:", error);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=templated_message_links.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templated_message_links.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/templated_message_links.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,7 +73,7 @@ var sdk_1 = require("../../sdk");
|
|
|
73
73
|
var testing_1 = require("@tellescope/testing");
|
|
74
74
|
var setup_1 = require("../setup");
|
|
75
75
|
var log = console.log;
|
|
76
|
-
var host = process.env.REACT_APP_TELLESCOPE_API_URL || 'http://localhost:8080';
|
|
76
|
+
var host = process.env.API_URL || process.env.REACT_APP_TELLESCOPE_API_URL || 'http://localhost:8080';
|
|
77
77
|
// Helper to assert that an async function throws an error
|
|
78
78
|
var assert_throws = function (fn, description) { return __awaiter(void 0, void 0, void 0, function () {
|
|
79
79
|
var e_1;
|