@tellescope/sdk 2.0.0-beta.1 → 2.0.0-beta.2

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.
Files changed (293) hide show
  1. package/CLAUDE.md +24 -0
  2. package/env.example +6 -0
  3. package/lib/cjs/sdk.d.ts +373 -3
  4. package/lib/cjs/sdk.d.ts.map +1 -1
  5. package/lib/cjs/sdk.js.map +1 -1
  6. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts +22 -0
  7. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts.map +1 -0
  8. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.js +506 -0
  9. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.js.map +1 -0
  10. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts +3 -1
  11. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -1
  12. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js +3 -1
  13. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js.map +1 -1
  14. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts +3 -1
  15. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -1
  16. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js +3 -1
  17. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -1
  18. package/lib/cjs/tests/api_tests/form_vital_reading.test.d.ts +7 -0
  19. package/lib/cjs/tests/api_tests/form_vital_reading.test.d.ts.map +1 -0
  20. package/lib/cjs/tests/api_tests/form_vital_reading.test.js +461 -0
  21. package/lib/cjs/tests/api_tests/form_vital_reading.test.js.map +1 -0
  22. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.d.ts +26 -0
  23. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.d.ts.map +1 -0
  24. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.js +232 -0
  25. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.js.map +1 -0
  26. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.d.ts +34 -0
  27. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.d.ts.map +1 -0
  28. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.js +243 -0
  29. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.js.map +1 -0
  30. package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts +3 -1
  31. package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -1
  32. package/lib/cjs/tests/api_tests/load_threads_care_team.test.js +3 -1
  33. package/lib/cjs/tests/api_tests/load_threads_care_team.test.js.map +1 -1
  34. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts +3 -1
  35. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts.map +1 -1
  36. package/lib/cjs/tests/api_tests/organization_signup.test.js +3 -1
  37. package/lib/cjs/tests/api_tests/organization_signup.test.js.map +1 -1
  38. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.d.ts +7 -0
  39. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.d.ts.map +1 -0
  40. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.js +571 -0
  41. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.js.map +1 -0
  42. package/lib/cjs/tests/api_tests/programs.test.d.ts +3 -1
  43. package/lib/cjs/tests/api_tests/programs.test.d.ts.map +1 -1
  44. package/lib/cjs/tests/api_tests/programs.test.js +73 -17
  45. package/lib/cjs/tests/api_tests/programs.test.js.map +1 -1
  46. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.d.ts +7 -0
  47. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.d.ts.map +1 -0
  48. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.js +733 -0
  49. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.js.map +1 -0
  50. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +3 -1
  51. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -1
  52. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +3 -1
  53. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -1
  54. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +3 -1
  55. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -1
  56. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js +3 -1
  57. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -1
  58. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts +3 -1
  59. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -1
  60. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js +3 -1
  61. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -1
  62. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts +3 -1
  63. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -1
  64. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js +3 -1
  65. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -1
  66. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts.map +1 -1
  67. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js +424 -39
  68. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js.map +1 -1
  69. package/lib/cjs/tests/api_tests/security/register_business_id_injection.test.js +2 -2
  70. package/lib/cjs/tests/api_tests/security/register_business_id_injection.test.js.map +1 -1
  71. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +3 -1
  72. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -1
  73. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +3 -1
  74. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -1
  75. package/lib/cjs/tests/api_tests/session_for_join_link.test.d.ts +10 -0
  76. package/lib/cjs/tests/api_tests/session_for_join_link.test.d.ts.map +1 -0
  77. package/lib/cjs/tests/api_tests/session_for_join_link.test.js +147 -0
  78. package/lib/cjs/tests/api_tests/session_for_join_link.test.js.map +1 -0
  79. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
  80. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js +191 -88
  81. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
  82. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.d.ts +17 -0
  83. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.d.ts.map +1 -0
  84. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.js +219 -0
  85. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.js.map +1 -0
  86. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.d.ts +5 -0
  87. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.d.ts.map +1 -0
  88. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.js +396 -0
  89. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.js.map +1 -0
  90. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts +3 -1
  91. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts.map +1 -1
  92. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.js +3 -1
  93. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.js.map +1 -1
  94. package/lib/cjs/tests/api_tests/totp_mfa.test.d.ts.map +1 -1
  95. package/lib/cjs/tests/api_tests/totp_mfa.test.js +37 -31
  96. package/lib/cjs/tests/api_tests/totp_mfa.test.js.map +1 -1
  97. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts +3 -1
  98. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -1
  99. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js +3 -1
  100. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js.map +1 -1
  101. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts +3 -1
  102. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -1
  103. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js +3 -1
  104. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -1
  105. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts +3 -1
  106. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -1
  107. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js +3 -1
  108. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js.map +1 -1
  109. package/lib/cjs/tests/api_tests/vitl_push.test.d.ts +7 -0
  110. package/lib/cjs/tests/api_tests/vitl_push.test.d.ts.map +1 -0
  111. package/lib/cjs/tests/api_tests/vitl_push.test.js +341 -0
  112. package/lib/cjs/tests/api_tests/vitl_push.test.js.map +1 -0
  113. package/lib/cjs/tests/setup_isolated.d.ts +48 -0
  114. package/lib/cjs/tests/setup_isolated.d.ts.map +1 -1
  115. package/lib/cjs/tests/setup_isolated.js +119 -1
  116. package/lib/cjs/tests/setup_isolated.js.map +1 -1
  117. package/lib/cjs/tests/tests.d.ts.map +1 -1
  118. package/lib/cjs/tests/tests.js +374 -292
  119. package/lib/cjs/tests/tests.js.map +1 -1
  120. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.d.ts +2 -0
  121. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.d.ts.map +1 -0
  122. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.js +201 -0
  123. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.js.map +1 -0
  124. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.d.ts +3 -0
  125. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.d.ts.map +1 -0
  126. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.js +120 -0
  127. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.js.map +1 -0
  128. package/lib/cjs/tests/webhooks_tests.js +44 -34
  129. package/lib/cjs/tests/webhooks_tests.js.map +1 -1
  130. package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  131. package/lib/esm/sdk.d.ts +373 -3
  132. package/lib/esm/sdk.d.ts.map +1 -1
  133. package/lib/esm/sdk.js.map +1 -1
  134. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts +22 -0
  135. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts.map +1 -0
  136. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.js +501 -0
  137. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.js.map +1 -0
  138. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts +3 -1
  139. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -1
  140. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js +2 -0
  141. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js.map +1 -1
  142. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts +3 -1
  143. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -1
  144. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js +2 -0
  145. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -1
  146. package/lib/esm/tests/api_tests/form_vital_reading.test.d.ts +7 -0
  147. package/lib/esm/tests/api_tests/form_vital_reading.test.d.ts.map +1 -0
  148. package/lib/esm/tests/api_tests/form_vital_reading.test.js +456 -0
  149. package/lib/esm/tests/api_tests/form_vital_reading.test.js.map +1 -0
  150. package/lib/esm/tests/api_tests/journey_statistics_cache.test.d.ts +26 -0
  151. package/lib/esm/tests/api_tests/journey_statistics_cache.test.d.ts.map +1 -0
  152. package/lib/esm/tests/api_tests/journey_statistics_cache.test.js +227 -0
  153. package/lib/esm/tests/api_tests/journey_statistics_cache.test.js.map +1 -0
  154. package/lib/esm/tests/api_tests/journey_step_manual_count.test.d.ts +34 -0
  155. package/lib/esm/tests/api_tests/journey_step_manual_count.test.d.ts.map +1 -0
  156. package/lib/esm/tests/api_tests/journey_step_manual_count.test.js +238 -0
  157. package/lib/esm/tests/api_tests/journey_step_manual_count.test.js.map +1 -0
  158. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts +3 -1
  159. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -1
  160. package/lib/esm/tests/api_tests/load_threads_care_team.test.js +2 -0
  161. package/lib/esm/tests/api_tests/load_threads_care_team.test.js.map +1 -1
  162. package/lib/esm/tests/api_tests/organization_signup.test.d.ts +3 -1
  163. package/lib/esm/tests/api_tests/organization_signup.test.d.ts.map +1 -1
  164. package/lib/esm/tests/api_tests/organization_signup.test.js +2 -0
  165. package/lib/esm/tests/api_tests/organization_signup.test.js.map +1 -1
  166. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.d.ts +7 -0
  167. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.d.ts.map +1 -0
  168. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.js +566 -0
  169. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.js.map +1 -0
  170. package/lib/esm/tests/api_tests/programs.test.d.ts +3 -1
  171. package/lib/esm/tests/api_tests/programs.test.d.ts.map +1 -1
  172. package/lib/esm/tests/api_tests/programs.test.js +72 -16
  173. package/lib/esm/tests/api_tests/programs.test.js.map +1 -1
  174. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.d.ts +7 -0
  175. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.d.ts.map +1 -0
  176. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.js +728 -0
  177. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.js.map +1 -0
  178. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +3 -1
  179. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -1
  180. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +2 -0
  181. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -1
  182. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +3 -1
  183. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -1
  184. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js +2 -0
  185. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -1
  186. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts +3 -1
  187. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -1
  188. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js +2 -0
  189. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -1
  190. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts +3 -1
  191. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -1
  192. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js +2 -0
  193. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -1
  194. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts.map +1 -1
  195. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js +424 -39
  196. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js.map +1 -1
  197. package/lib/esm/tests/api_tests/security/register_business_id_injection.test.js +2 -2
  198. package/lib/esm/tests/api_tests/security/register_business_id_injection.test.js.map +1 -1
  199. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +3 -1
  200. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -1
  201. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +2 -0
  202. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -1
  203. package/lib/esm/tests/api_tests/session_for_join_link.test.d.ts +10 -0
  204. package/lib/esm/tests/api_tests/session_for_join_link.test.d.ts.map +1 -0
  205. package/lib/esm/tests/api_tests/session_for_join_link.test.js +142 -0
  206. package/lib/esm/tests/api_tests/session_for_join_link.test.js.map +1 -0
  207. package/lib/esm/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
  208. package/lib/esm/tests/api_tests/set_fields_order_templates.test.js +191 -88
  209. package/lib/esm/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
  210. package/lib/esm/tests/api_tests/stripe_checkout_items.test.d.ts +17 -0
  211. package/lib/esm/tests/api_tests/stripe_checkout_items.test.d.ts.map +1 -0
  212. package/lib/esm/tests/api_tests/stripe_checkout_items.test.js +214 -0
  213. package/lib/esm/tests/api_tests/stripe_checkout_items.test.js.map +1 -0
  214. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.d.ts +5 -0
  215. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.d.ts.map +1 -0
  216. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.js +388 -0
  217. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.js.map +1 -0
  218. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts +3 -1
  219. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts.map +1 -1
  220. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.js +2 -0
  221. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.js.map +1 -1
  222. package/lib/esm/tests/api_tests/totp_mfa.test.d.ts.map +1 -1
  223. package/lib/esm/tests/api_tests/totp_mfa.test.js +37 -31
  224. package/lib/esm/tests/api_tests/totp_mfa.test.js.map +1 -1
  225. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts +3 -1
  226. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -1
  227. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js +2 -0
  228. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js.map +1 -1
  229. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts +3 -1
  230. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -1
  231. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js +2 -0
  232. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -1
  233. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts +3 -1
  234. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -1
  235. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js +2 -0
  236. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js.map +1 -1
  237. package/lib/esm/tests/api_tests/vitl_push.test.d.ts +7 -0
  238. package/lib/esm/tests/api_tests/vitl_push.test.d.ts.map +1 -0
  239. package/lib/esm/tests/api_tests/vitl_push.test.js +333 -0
  240. package/lib/esm/tests/api_tests/vitl_push.test.js.map +1 -0
  241. package/lib/esm/tests/setup_isolated.d.ts +48 -0
  242. package/lib/esm/tests/setup_isolated.d.ts.map +1 -1
  243. package/lib/esm/tests/setup_isolated.js +114 -0
  244. package/lib/esm/tests/setup_isolated.js.map +1 -1
  245. package/lib/esm/tests/tests.d.ts.map +1 -1
  246. package/lib/esm/tests/tests.js +375 -293
  247. package/lib/esm/tests/tests.js.map +1 -1
  248. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.d.ts +2 -0
  249. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.d.ts.map +1 -0
  250. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.js +174 -0
  251. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.js.map +1 -0
  252. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.d.ts +3 -0
  253. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.d.ts.map +1 -0
  254. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.js +117 -0
  255. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.js.map +1 -0
  256. package/lib/esm/tests/webhooks_tests.js +44 -34
  257. package/lib/esm/tests/webhooks_tests.js.map +1 -1
  258. package/lib/tsconfig.tsbuildinfo +1 -1
  259. package/package.json +12 -11
  260. package/src/sdk.ts +3 -2
  261. package/src/tests/api_tests/booking_prevent_upcoming_duplicate.test.ts +541 -0
  262. package/src/tests/api_tests/enduser_fields_sync.test.ts +4 -0
  263. package/src/tests/api_tests/enduser_observations_auto_review.test.ts +4 -0
  264. package/src/tests/api_tests/form_vital_reading.test.ts +393 -0
  265. package/src/tests/api_tests/journey_statistics_cache.test.ts +237 -0
  266. package/src/tests/api_tests/journey_step_manual_count.test.ts +220 -0
  267. package/src/tests/api_tests/load_threads_care_team.test.ts +4 -0
  268. package/src/tests/api_tests/organization_signup.test.ts +4 -0
  269. package/src/tests/api_tests/phone_embed_leave_message.test.ts +541 -0
  270. package/src/tests/api_tests/programs.test.ts +351 -0
  271. package/src/tests/api_tests/public_form_case_insensitive_match.test.ts +632 -0
  272. package/src/tests/api_tests/security/add-to-journey-foreign-enduserid.test.ts +4 -0
  273. package/src/tests/api_tests/security/appointment-reschedule-ownership.test.ts +4 -0
  274. package/src/tests/api_tests/security/file-link-session-confinement.test.ts +4 -0
  275. package/src/tests/api_tests/security/form-logic-js-execution.test.ts +4 -0
  276. package/src/tests/api_tests/security/formsort_webhook_auth_field_lock.test.ts +225 -0
  277. package/src/tests/api_tests/security/register_business_id_injection.test.ts +2 -2
  278. package/src/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.ts +4 -0
  279. package/src/tests/api_tests/session_for_join_link.test.ts +99 -0
  280. package/src/tests/api_tests/set_fields_order_templates.test.ts +94 -9
  281. package/src/tests/api_tests/stripe_checkout_items.test.ts +186 -0
  282. package/src/tests/api_tests/tickets_bulk_assign_from_queue.test.ts +4 -0
  283. package/src/tests/api_tests/totp_mfa.test.ts +10 -5
  284. package/src/tests/api_tests/trigger_contains_matching.test.ts +4 -0
  285. package/src/tests/api_tests/user_logs_restore_deleted.test.ts +4 -0
  286. package/src/tests/api_tests/vital_review_trigger_action.test.ts +455 -0
  287. package/src/tests/api_tests/vitl_push.test.ts +323 -0
  288. package/src/tests/setup_isolated.ts +140 -0
  289. package/src/tests/tests.ts +124 -30
  290. package/src/tests/unit_tests/isolated_suite_discovery.test.ts +178 -0
  291. package/src/tests/unit_tests/programs_conditional_logic.test.ts +189 -0
  292. package/src/tests/webhooks_tests.ts +6 -1
  293. package/test_generated.pdf +0 -0
@@ -0,0 +1,2 @@
1
+ export declare const isolated_suite_discovery_unit_tests: () => Promise<void>;
2
+ //# sourceMappingURL=isolated_suite_discovery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolated_suite_discovery.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit_tests/isolated_suite_discovery.test.ts"],"names":[],"mappings":"AAoEA,eAAO,MAAM,mCAAmC,qBAgG/C,CAAA"}
@@ -0,0 +1,174 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ 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;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ require('source-map-support').install();
38
+ import * as fs from "fs";
39
+ import * as path from "path";
40
+ import { assert, log_header, } from "@tellescope/testing";
41
+ import { discover_isolated_suites, isolated_suites_root, parse_test_parallelism, DEFAULT_TEST_PARALLELISM, ISOLATED_SUITE_EXPORT, } from "../setup_isolated";
42
+ /**
43
+ * Guard for the auto-discovering dispatcher (run_discovered_isolated_suites).
44
+ *
45
+ * Discovery walks the COMPILED tree (lib/cjs/tests/api_tests), so the failure mode the old
46
+ * hand-maintained arrays did not have is a suite that silently stops running: a `.test.ts` enrolls
47
+ * itself, the build no-ops, and the dispatcher never sees it. Nothing else in the suite would
48
+ * notice. So the first check here compares the enrolled SOURCE files against what discovery
49
+ * actually loaded, in both directions — a missing one means a stale build (`npm run check:build`),
50
+ * an extra one means a compiled orphan of a deleted test.
51
+ *
52
+ * The other two checks protect the dispatcher's own invariants: names are the only handle on a
53
+ * suite in the output, and a suite that is both discovered and awaited by name in tests.ts would
54
+ * provision its tenants and run twice.
55
+ */
56
+ // compiled location is <sdk>/lib/cjs/tests/unit_tests, so four levels up is the package root
57
+ var SRC_TESTS = path.resolve(__dirname, '..', '..', '..', '..', 'src', 'tests');
58
+ /**
59
+ * Relative paths of every source file under `root` that enrolls itself, split by whether discovery
60
+ * could ever see it. Discovery only loads `*.test.js` under `api_tests`, so a marker anywhere else
61
+ * is a suite that silently never runs — hence `unreachable`, which is an error rather than a miss.
62
+ */
63
+ var enrolled_source_files = function (root) {
64
+ var discoverable = [];
65
+ var unreachable = [];
66
+ var walk = function (dir, prefix) {
67
+ for (var _i = 0, _a = fs.readdirSync(dir, { withFileTypes: true }); _i < _a.length; _i++) {
68
+ var entry = _a[_i];
69
+ var relative = prefix ? "".concat(prefix, "/").concat(entry.name) : entry.name;
70
+ if (entry.isDirectory()) {
71
+ walk(path.join(dir, entry.name), relative);
72
+ continue;
73
+ }
74
+ if (!entry.name.endsWith('.ts') || entry.name.endsWith('.d.ts'))
75
+ continue;
76
+ var source = fs.readFileSync(path.join(dir, entry.name), 'utf8');
77
+ if (!new RegExp("^export const ".concat(ISOLATED_SUITE_EXPORT, "\\b"), 'm').test(source))
78
+ continue;
79
+ var inApiTests = relative === 'api_tests' || relative.indexOf('api_tests/') === 0;
80
+ if (inApiTests && entry.name.endsWith('.test.ts')) {
81
+ discoverable.push(relative.replace(/^api_tests\//, ''));
82
+ }
83
+ else {
84
+ unreachable.push(relative);
85
+ }
86
+ }
87
+ };
88
+ walk(root, '');
89
+ return { discoverable: discoverable.sort(), unreachable: unreachable.sort() };
90
+ };
91
+ export var isolated_suite_discovery_unit_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
92
+ var discovered, discoveredFiles, _a, discoverable, unreachable, enrolled_1, missing, extra, byName, _i, discovered_1, s, duplicateNames, testsPath, testsSource, doubleRun, _b, discovered_2, suite, loaded, _c, _d, exported, parallelismCases, _e, parallelismCases_1, _f, raw, expected, actual;
93
+ return __generator(this, function (_g) {
94
+ log_header("Isolated suite discovery");
95
+ discovered = discover_isolated_suites() // throws on a malformed descriptor or a duplicate name
96
+ ;
97
+ discoveredFiles = discovered.map(function (s) { return s.file; }).sort();
98
+ if (!fs.existsSync(SRC_TESTS)) {
99
+ // Published package, not the monorepo — there is no source tree to compare against.
100
+ console.log(" SKIPPED source comparison: no source tree at ".concat(SRC_TESTS));
101
+ }
102
+ else {
103
+ _a = enrolled_source_files(SRC_TESTS), discoverable = _a.discoverable, unreachable = _a.unreachable;
104
+ enrolled_1 = discoverable.map(function (f) { return f.replace(/\.ts$/, '.js'); });
105
+ // Scanning all of src/tests, not just api_tests: an ISOLATED_SUITE outside the discovered tree
106
+ // (wrong directory, or a filename that is not *.test.ts) would never run and nothing else would say so.
107
+ assert(unreachable.length === 0, "exports ".concat(ISOLATED_SUITE_EXPORT, " where discovery can never see it (must be api_tests/**/*.test.ts): ").concat(unreachable.join(', ')), "every ".concat(ISOLATED_SUITE_EXPORT, " in src/tests lives where discovery looks"));
108
+ missing = enrolled_1.filter(function (f) { return discoveredFiles.indexOf(f) === -1; });
109
+ extra = discoveredFiles.filter(function (f) { return enrolled_1.indexOf(f) === -1; });
110
+ assert(missing.length === 0, "enrolled in src but NOT discovered (stale lib/cjs? run npm run check:build -- --fix): ".concat(missing.join(', ')), "every src file exporting ".concat(ISOLATED_SUITE_EXPORT, " is discovered (").concat(enrolled_1.length, ")"));
111
+ assert(extra.length === 0, "discovered but not enrolled in any src file (compiled orphan? delete lib/cjs and rebuild): ".concat(extra.join(', ')), 'every discovered suite has a source file');
112
+ }
113
+ assert(discovered.length > 0, "no isolated suites discovered under ".concat(isolated_suites_root()), 'suites were discovered');
114
+ byName = {};
115
+ for (_i = 0, discovered_1 = discovered; _i < discovered_1.length; _i++) {
116
+ s = discovered_1[_i];
117
+ byName[s.name] = (byName[s.name] || []).concat(s.file);
118
+ }
119
+ duplicateNames = Object.keys(byName).filter(function (n) { return byName[n].length > 1; });
120
+ assert(duplicateNames.length === 0, "duplicate suite names: ".concat(duplicateNames.map(function (n) { return "".concat(JSON.stringify(n), " in ").concat(byName[n].join(' and ')); }).join('; ')), "suite names are unique (".concat(discovered.length, ")"));
121
+ testsPath = path.join(SRC_TESTS, 'tests.ts');
122
+ if (!fs.existsSync(testsPath)) {
123
+ console.log(" SKIPPED tests.ts comparison: not found at ".concat(testsPath));
124
+ }
125
+ else {
126
+ testsSource = fs.readFileSync(testsPath, 'utf8');
127
+ doubleRun = [];
128
+ for (_b = 0, discovered_2 = discovered; _b < discovered_2.length; _b++) {
129
+ suite = discovered_2[_b];
130
+ loaded = require(path.join(isolated_suites_root(), suite.file));
131
+ for (_c = 0, _d = Object.keys(loaded); _c < _d.length; _c++) {
132
+ exported = _d[_c];
133
+ if (exported === ISOLATED_SUITE_EXPORT)
134
+ continue; // every enrolled file exports this one
135
+ if (new RegExp("\\bawait\\s+".concat(exported, "\\s*\\(")).test(testsSource)) {
136
+ doubleRun.push("".concat(exported, " (api_tests/").concat(suite.file, ", discovered as \"").concat(suite.name, "\")"));
137
+ }
138
+ }
139
+ }
140
+ assert(doubleRun.length === 0, "awaited directly in tests.ts as well as discovered, so it would run twice: ".concat(doubleRun.join(', ')), 'no discovered suite is also awaited directly in tests.ts');
141
+ }
142
+ parallelismCases = [
143
+ [undefined, DEFAULT_TEST_PARALLELISM],
144
+ ['', DEFAULT_TEST_PARALLELISM],
145
+ [' ', DEFAULT_TEST_PARALLELISM],
146
+ ['abc', DEFAULT_TEST_PARALLELISM],
147
+ ['0', DEFAULT_TEST_PARALLELISM],
148
+ ['-1', DEFAULT_TEST_PARALLELISM],
149
+ ['2.5', DEFAULT_TEST_PARALLELISM],
150
+ ['1', 1],
151
+ [' 3 ', 3],
152
+ ['16', 16],
153
+ ];
154
+ for (_e = 0, parallelismCases_1 = parallelismCases; _e < parallelismCases_1.length; _e++) {
155
+ _f = parallelismCases_1[_e], raw = _f[0], expected = _f[1];
156
+ actual = parse_test_parallelism(raw);
157
+ assert(actual === expected, "TEST_PARALLELISM=".concat(JSON.stringify(raw), " parsed as ").concat(actual, ", expected ").concat(expected), "TEST_PARALLELISM=".concat(JSON.stringify(raw), " \u2192 ").concat(expected));
158
+ }
159
+ return [2 /*return*/];
160
+ });
161
+ }); };
162
+ // Allow running this test file independently
163
+ if (require.main === module) {
164
+ isolated_suite_discovery_unit_tests()
165
+ .then(function () {
166
+ console.log("Isolated suite discovery unit tests completed successfully");
167
+ process.exit(0);
168
+ })
169
+ .catch(function (error) {
170
+ console.error("Isolated suite discovery unit tests failed:", error);
171
+ process.exit(1);
172
+ });
173
+ }
174
+ //# sourceMappingURL=isolated_suite_discovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolated_suite_discovery.test.js","sourceRoot":"","sources":["../../../../src/tests/unit_tests/isolated_suite_discovery.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const run_all: () => void;
2
+ export { run_all as programs_conditional_logic_unit_tests };
3
+ //# sourceMappingURL=programs_conditional_logic.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programs_conditional_logic.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit_tests/programs_conditional_logic.test.ts"],"names":[],"mappings":"AA4KA,QAAA,MAAM,OAAO,YAUZ,CAAA;AAMD,OAAO,EAAE,OAAO,IAAI,qCAAqC,EAAE,CAAA"}
@@ -0,0 +1,117 @@
1
+ import { evaluate_conditional_logic_for_enduser_fields, validate_custom_field_references } from "@tellescope/utilities";
2
+ /**
3
+ * Unit coverage for the `Programs` key in evaluate_conditional_logic_for_enduser_fields — the V1
4
+ * evaluator that triggers, journeys and phone-tree branches all run on.
5
+ *
6
+ * `{ Programs: { $in: 'CHF' } }` means "has a program named CHF"; adding `$status` means "...whose
7
+ * status is S", bound to that same program entry. Comparison is exact string throughout, matching the
8
+ * shipped Order Status Equals / Vital Update program filters.
9
+ *
10
+ * The round-trip between this and the saved V2 Mongo filter is covered separately, by
11
+ * packages/private/webapp/src/__tests__/programs_condition_filter.test.ts.
12
+ */
13
+ var failures = 0;
14
+ var passed = 0;
15
+ var assert = function (name, actual, expected) {
16
+ if (actual === expected) {
17
+ passed++;
18
+ console.log(" \u2713 ".concat(name));
19
+ }
20
+ else {
21
+ failures++;
22
+ console.error(" \u2717 ".concat(name, " \u2014 expected ").concat(expected, ", got ").concat(actual));
23
+ }
24
+ };
25
+ var with_programs = function (programs) { return ({ programs: programs }); };
26
+ var matches = function (programs, value) { return (evaluate_conditional_logic_for_enduser_fields(with_programs(programs), { $and: [{ condition: { Programs: value } }] })); };
27
+ var CHF_ACTIVE = [{ name: 'CHF', status: 'active' }];
28
+ var CHF_COMPLETED = [{ name: 'CHF', status: 'completed' }];
29
+ var CHF_NO_STATUS = [{ name: 'CHF' }];
30
+ var TWO = [{ name: 'CHF', status: 'completed' }, { name: 'Diabetes', status: 'active' }];
31
+ var run_is_in_tests = function () {
32
+ console.log("\n[Programs / Is In]");
33
+ assert("matches a patient with that program", matches(CHF_ACTIVE, { $in: 'CHF' }), true);
34
+ assert("does not match a patient with a different program", matches([{ name: 'Diabetes' }], { $in: 'CHF' }), false);
35
+ assert("does not match a patient with no programs", matches([], { $in: 'CHF' }), false);
36
+ assert("does not match a patient whose programs are unset", matches(undefined, { $in: 'CHF' }), false);
37
+ assert("matches one program among several", matches(TWO, { $in: 'Diabetes' }), true);
38
+ // exact string comparison — deliberately NOT case-insensitive
39
+ assert("name comparison is case sensitive", matches(CHF_ACTIVE, { $in: 'chf' }), false);
40
+ assert("name comparison does not substring match", matches(CHF_ACTIVE, { $in: 'CH' }), false);
41
+ assert("a name with spaces and punctuation matches exactly", matches([{ name: 'Post-Op Care' }], { $in: 'Post-Op Care' }), true);
42
+ };
43
+ var run_status_tests = function () {
44
+ console.log("\n[Programs / $status]");
45
+ assert("name + status both match", matches(CHF_ACTIVE, { $in: 'CHF', $status: 'active' }), true);
46
+ assert("name matches but status does not", matches(CHF_COMPLETED, { $in: 'CHF', $status: 'active' }), false);
47
+ assert("status matches but name does not", matches(CHF_ACTIVE, { $in: 'Diabetes', $status: 'active' }), false);
48
+ assert("a program with no status is not matched by a status condition", matches(CHF_NO_STATUS, { $in: 'CHF', $status: 'active' }), false);
49
+ assert("a blank status means any status", matches(CHF_COMPLETED, { $in: 'CHF', $status: '' }), true);
50
+ assert("an omitted status means any status", matches(CHF_NO_STATUS, { $in: 'CHF' }), true);
51
+ assert("status comparison is case sensitive", matches(CHF_ACTIVE, { $in: 'CHF', $status: 'Active' }), false);
52
+ // name and status must come from the SAME program, which is the whole point of one paired key
53
+ assert("does not match when the name and the status come from different programs", matches(TWO, { $in: 'CHF', $status: 'active' }), false);
54
+ // $status serialised FIRST — the generic Object.keys(value)[0] operator dispatch would pick $status
55
+ // here and fall through to false, so the Programs branch must read $in/$nin by name
56
+ assert("$status before $in still evaluates as Is In", matches(CHF_ACTIVE, { $status: 'active', $in: 'CHF' }), true);
57
+ assert("$status before $nin still evaluates as Is Not In", matches(CHF_ACTIVE, { $status: 'active', $nin: 'CHF' }), false);
58
+ };
59
+ var run_is_not_in_tests = function () {
60
+ console.log("\n[Programs / Is Not In]");
61
+ assert("does not match a patient with that program", matches(CHF_ACTIVE, { $nin: 'CHF' }), false);
62
+ assert("matches a patient with a different program", matches([{ name: 'Diabetes' }], { $nin: 'CHF' }), true);
63
+ assert("matches a patient with no programs", matches([], { $nin: 'CHF' }), true);
64
+ assert("matches a patient whose programs are unset", matches(undefined, { $nin: 'CHF' }), true);
65
+ assert("negates the name+status pair", matches(CHF_ACTIVE, { $nin: 'CHF', $status: 'active' }), false);
66
+ assert("matches when the name is present but the status differs", matches(CHF_COMPLETED, { $nin: 'CHF', $status: 'active' }), true);
67
+ };
68
+ var run_unconfigured_tests = function () {
69
+ console.log("\n[Programs / unconfigured]");
70
+ // An unfinished condition must match nobody in BOTH directions. This deliberately DIVERGES from
71
+ // Journeys rather than copying it: `{ Journeys: { $nin: '' } }` matches everybody (the blank id is
72
+ // simply absent from enduser.journeys). Failing open on $nin would fire a trigger for every patient.
73
+ assert("a blank name matches nobody under Is In", matches(CHF_ACTIVE, { $in: '' }), false);
74
+ assert("a blank name matches nobody under Is Not In", matches(CHF_ACTIVE, { $nin: '' }), false);
75
+ assert("a blank name matches nobody even with no programs", matches([], { $nin: '' }), false);
76
+ assert("a value with no operator matches nobody", matches(CHF_ACTIVE, { $status: 'active' }), false);
77
+ // the branch is narrowed to $in/$nin, so any other object condition under a key named 'Programs'
78
+ // falls through to the generic custom-field handler — which is what the V2 translator does too
79
+ assert("a non-$in/$nin operator falls through instead of being swallowed", matches(CHF_ACTIVE, { $isSet: 'Value' }), false);
80
+ };
81
+ var run_other_conditions_unaffected = function () {
82
+ console.log("\n[Programs / coexistence with Care Type and Stage]");
83
+ var enduser = {
84
+ programs: CHF_ACTIVE,
85
+ fields: { 'Care Type': 'RPM', 'Care Stage': 'Onboarding' },
86
+ };
87
+ var evaluate = function (conditions) { return (evaluate_conditional_logic_for_enduser_fields(enduser, conditions)); };
88
+ assert("an existing Care Type condition is unaffected", evaluate({ $and: [{ condition: { 'Care Type': 'RPM' } }] }), true);
89
+ assert("Care Stage and Programs can be combined in one filter", evaluate({ $and: [{ condition: { 'Care Stage': 'Onboarding' } }, { condition: { Programs: { $in: 'CHF' } } }] }), true);
90
+ assert("the combined filter fails when the Programs half fails", evaluate({ $and: [{ condition: { 'Care Stage': 'Onboarding' } }, { condition: { Programs: { $in: 'Diabetes' } } }] }), false);
91
+ assert("an $or over Care Type and Programs matches on either half", evaluate({ $or: [{ condition: { 'Care Type': 'Nope' } }, { condition: { Programs: { $in: 'CHF' } } }] }), true);
92
+ };
93
+ var run_custom_field_validation_tests = function () {
94
+ console.log("\n[Programs is a built-in field]");
95
+ // without 'Programs' in BUILT_IN_FIELDS, the trigger and journey validation hooks flag every program
96
+ // condition as a reference to a custom field that no longer exists
97
+ var conditions = { $and: [{ condition: { Programs: { $in: 'CHF', $status: 'active' } } }] };
98
+ assert("a Programs condition is not reported as a missing custom field", validate_custom_field_references(conditions, new Set()).length === 0, true);
99
+ assert("a genuinely missing custom field is still reported", validate_custom_field_references({ $and: [{ condition: { deletedField: 'x' } }] }, new Set()).includes('deletedField'), true);
100
+ };
101
+ var run_all = function () {
102
+ console.log("Running programs_conditional_logic unit tests");
103
+ run_is_in_tests();
104
+ run_status_tests();
105
+ run_is_not_in_tests();
106
+ run_unconfigured_tests();
107
+ run_other_conditions_unaffected();
108
+ run_custom_field_validation_tests();
109
+ console.log("\nResults: ".concat(passed, " passed, ").concat(failures, " failed"));
110
+ if (failures > 0)
111
+ process.exit(1);
112
+ };
113
+ if (require.main === module) {
114
+ run_all();
115
+ }
116
+ export { run_all as programs_conditional_logic_unit_tests };
117
+ //# sourceMappingURL=programs_conditional_logic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programs_conditional_logic.test.js","sourceRoot":"","sources":["../../../../src/tests/unit_tests/programs_conditional_logic.test.ts"],"names":[],"mappings":"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"}
@@ -845,81 +845,91 @@ var run_tests = function () { return __awaiter(void 0, void 0, void 0, function
845
845
  return [4 /*yield*/, reset_test_tenant(sdk)];
846
846
  case 3:
847
847
  _k.sent();
848
- return [4 /*yield*/, nonAdminSdk.authenticate(nonAdminEmail, nonAdminPassword)];
848
+ return [4 /*yield*/, nonAdminSdk.authenticate(nonAdminEmail, nonAdminPassword)
849
+ // as in setup_tests: booking cancel/reschedule below would otherwise email the host for real
850
+ ];
849
851
  case 4:
850
852
  _k.sent();
851
- return [4 /*yield*/, async_test('configure webhook is admin only', function () { return nonAdminSdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { shouldError: true, onError: function (e) { return e.message === "Inaccessible" || e.message === "Admin access only"; } })];
853
+ // as in setup_tests: booking cancel/reschedule below would otherwise email the host for real
854
+ return [4 /*yield*/, Promise.all([
855
+ sdk.api.users.updateOne(sdk.userInfo.id, { notificationEmailsDisabled: true }),
856
+ sdk.api.users.updateOne(nonAdminSdk.userInfo.id, { notificationEmailsDisabled: true }),
857
+ ]).catch(console.error)];
852
858
  case 5:
859
+ // as in setup_tests: booking cancel/reschedule below would otherwise email the host for real
853
860
  _k.sent();
854
- return [4 /*yield*/, async_test('update webhook is admin only', function () { return nonAdminSdk.api.webhooks.update({ subscriptionUpdates: fullSubscription }); }, { shouldError: true, onError: function (e) { return e.message === "Inaccessible" || e.message === "Admin access only"; } })];
861
+ return [4 /*yield*/, async_test('configure webhook is admin only', function () { return nonAdminSdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { shouldError: true, onError: function (e) { return e.message === "Inaccessible" || e.message === "Admin access only"; } })];
855
862
  case 6:
856
863
  _k.sent();
857
- return [4 /*yield*/, async_test('configure webhook', function () { return sdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { onResult: function (_) { return true; } })];
864
+ return [4 /*yield*/, async_test('update webhook is admin only', function () { return nonAdminSdk.api.webhooks.update({ subscriptionUpdates: fullSubscription }); }, { shouldError: true, onError: function (e) { return e.message === "Inaccessible" || e.message === "Admin access only"; } })];
858
865
  case 7:
866
+ _k.sent();
867
+ return [4 /*yield*/, async_test('configure webhook', function () { return sdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { onResult: function (_) { return true; } })];
868
+ case 8:
859
869
  _k.sent();
860
870
  return [4 /*yield*/, async_test('configure webhook (overwrite)', function () { return sdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { onResult: function () { return true; } }
861
871
  // { shouldError: true, onError: e => e.message === "Only one webhook configuration is supported per organization. Use /update-webooks to update your configuration." }
862
872
  )];
863
- case 8:
873
+ case 9:
864
874
  _k.sent();
865
875
  return [4 /*yield*/, async_test('get initial webhook configuration', function () { return sdk.api.webhooks.get_configuration({}); }, { onResult: function (r) { var _a; return r.url === webhookURL && object_is_empty((_a = r.subscriptions) !== null && _a !== void 0 ? _a : {}); } })];
866
- case 9:
876
+ case 10:
867
877
  _k.sent();
868
878
  return [4 /*yield*/, async_test('update webhook (set empty subscription)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: {} }); }, { onResult: function (_) { return true; } })];
869
- case 10:
879
+ case 11:
870
880
  _k.sent();
871
881
  return [4 /*yield*/, async_test('update webhook (set partial subscription)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: { chats: { create: true } } }); }, { onResult: function (_) { return true; } })];
872
- case 11:
882
+ case 12:
873
883
  _k.sent();
874
884
  return [4 /*yield*/, async_test('update webhook (set subscriptions)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: fullSubscription }); }, { onResult: function (_) { return true; } })];
875
- case 12:
885
+ case 13:
876
886
  _k.sent();
877
887
  return [4 /*yield*/, async_test('update webhook invalid model', function () { return sdk.api.webhooks.update({ subscriptionUpdates: { notAModel: { create: false } } }); }, { shouldError: true, onError: function (e) { return e.message === "Error parsing field subscriptionUpdates: Got unexpected field(s) [notAModel]"; } })];
878
- case 13:
888
+ case 14:
879
889
  _k.sent();
880
890
  return [4 /*yield*/, async_test('get initial webhook configuration after updates', function () { return sdk.api.webhooks.get_configuration({}); }, { onResult: function (r) { return r.url === webhookURL && objects_equivalent(r.subscriptions, fullSubscription); } })];
881
- case 14:
891
+ case 15:
882
892
  _k.sent();
883
893
  return [4 /*yield*/, self_serve_appointment_booking_tests()
884
894
  // reset to only poartial / testing fields
885
895
  // todo: subscribe in individual tests to avoid issues in ordering of tests / subscriptions
886
896
  ];
887
- case 15:
897
+ case 16:
888
898
  _k.sent();
889
899
  // reset to only poartial / testing fields
890
900
  // todo: subscribe in individual tests to avoid issues in ordering of tests / subscriptions
891
901
  return [4 /*yield*/, sdk.api.webhooks.update({ subscriptionUpdates: __assign(__assign({}, emptySubscription), { chats: { create: true }, meetings: { create: true, update: true, delete: false } })
892
902
  })];
893
- case 16:
903
+ case 17:
894
904
  // reset to only poartial / testing fields
895
905
  // todo: subscribe in individual tests to avoid issues in ordering of tests / subscriptions
896
906
  _k.sent();
897
907
  log_header("Webhooks Tests with Subscriptions");
898
908
  return [4 /*yield*/, test_automation_webhooks()];
899
- case 17:
909
+ case 18:
900
910
  _k.sent();
901
911
  _a = tests;
902
912
  _b = [];
903
913
  for (_c in _a)
904
914
  _b.push(_c);
905
915
  _i = 0;
906
- _k.label = 18;
907
- case 18:
908
- if (!(_i < _b.length)) return [3 /*break*/, 21];
916
+ _k.label = 19;
917
+ case 19:
918
+ if (!(_i < _b.length)) return [3 /*break*/, 22];
909
919
  _c = _b[_i];
910
- if (!(_c in _a)) return [3 /*break*/, 20];
920
+ if (!(_c in _a)) return [3 /*break*/, 21];
911
921
  t = _c;
912
922
  return [4 /*yield*/, ((_h = tests[t]) === null || _h === void 0 ? void 0 : _h.call(tests, true))];
913
- case 19:
914
- _k.sent();
915
- _k.label = 20;
916
923
  case 20:
917
- _i++;
918
- return [3 /*break*/, 18];
924
+ _k.sent();
925
+ _k.label = 21;
919
926
  case 21:
927
+ _i++;
928
+ return [3 /*break*/, 19];
929
+ case 22:
920
930
  finalLength = handledEvents.length;
921
931
  return [4 /*yield*/, async_test('update webhook (set subscriptions empty)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: __assign({}, emptySubscription) }); }, { onResult: function (_) { return true; } })];
922
- case 22:
932
+ case 23:
923
933
  _k.sent();
924
934
  log_header("Webhooks Tests without Subscriptions");
925
935
  _d = tests;
@@ -927,23 +937,23 @@ var run_tests = function () { return __awaiter(void 0, void 0, void 0, function
927
937
  for (_f in _d)
928
938
  _e.push(_f);
929
939
  _g = 0;
930
- _k.label = 23;
931
- case 23:
932
- if (!(_g < _e.length)) return [3 /*break*/, 26];
940
+ _k.label = 24;
941
+ case 24:
942
+ if (!(_g < _e.length)) return [3 /*break*/, 27];
933
943
  _f = _e[_g];
934
- if (!(_f in _d)) return [3 /*break*/, 25];
944
+ if (!(_f in _d)) return [3 /*break*/, 26];
935
945
  t = _f;
936
946
  if (tests[t] === tests.calendarEventReminders) {
937
- return [3 /*break*/, 25]; // don't require subscription / can't unsubscribe
947
+ return [3 /*break*/, 26]; // don't require subscription / can't unsubscribe
938
948
  }
939
949
  return [4 /*yield*/, ((_j = tests[t]) === null || _j === void 0 ? void 0 : _j.call(tests, false))];
940
- case 24:
941
- _k.sent();
942
- _k.label = 25;
943
950
  case 25:
944
- _g++;
945
- return [3 /*break*/, 23];
951
+ _k.sent();
952
+ _k.label = 26;
946
953
  case 26:
954
+ _g++;
955
+ return [3 /*break*/, 24];
956
+ case 27:
947
957
  assert(finalLength === handledEvents.length, 'length changed after subscriptions', 'No webhooks posted when no subscription');
948
958
  return [2 /*return*/];
949
959
  }