workos 8.0.0 → 9.0.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.
Files changed (359) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +1 -1
  3. data/.github/workflows/docs.yml +5 -2
  4. data/.github/workflows/lint.yml +1 -1
  5. data/.github/workflows/release-please.yml +176 -5
  6. data/.github/workflows/release.yml +1 -1
  7. data/.last-synced-sha +1 -1
  8. data/.oagen-manifest.json +129 -34
  9. data/.release-please-manifest.json +1 -1
  10. data/CHANGELOG.md +66 -0
  11. data/Gemfile.lock +4 -4
  12. data/README.md +19 -0
  13. data/docs/V7_MIGRATION_GUIDE.md +21 -0
  14. data/lib/workos/actions.rb +1 -1
  15. data/lib/workos/api_keys/api_key.rb +3 -0
  16. data/lib/workos/api_keys/api_key_created.rb +5 -5
  17. data/lib/workos/api_keys/api_key_created_data.rb +3 -0
  18. data/lib/workos/api_keys/api_key_revoked.rb +5 -5
  19. data/lib/workos/api_keys/create_organization_api_key.rb +5 -2
  20. data/lib/workos/api_keys/organization_api_key.rb +3 -0
  21. data/lib/workos/api_keys/organization_api_key_with_value.rb +3 -0
  22. data/lib/workos/api_keys.rb +4 -1
  23. data/lib/workos/audit_logs/audit_log_action.rb +2 -7
  24. data/lib/workos/audit_logs/audit_log_export.rb +2 -7
  25. data/lib/workos/audit_logs/audit_log_schema.rb +11 -2
  26. data/lib/workos/audit_logs/{audit_log_schema_json_actor.rb → audit_log_schema_actor_input.rb} +1 -1
  27. data/lib/workos/audit_logs/audit_log_schema_input.rb +25 -0
  28. data/lib/workos/audit_logs/audit_log_schema_target.rb +16 -1
  29. data/lib/workos/{types/radar_type.rb → audit_logs/audit_log_schema_target_input.rb} +1 -3
  30. data/lib/workos/audit_logs.rb +16 -16
  31. data/lib/workos/authorization/permission_created.rb +5 -5
  32. data/lib/workos/authorization/permission_deleted.rb +5 -5
  33. data/lib/workos/authorization/permission_updated.rb +5 -5
  34. data/lib/workos/authorization/role_created.rb +5 -5
  35. data/lib/workos/authorization/role_deleted.rb +5 -5
  36. data/lib/workos/authorization/role_updated.rb +5 -5
  37. data/lib/workos/authorization.rb +28 -12
  38. data/lib/workos/base_client.rb +71 -5
  39. data/lib/workos/client.rb +6 -6
  40. data/lib/workos/connect/connect_application.rb +12 -0
  41. data/lib/workos/{audit_logs/audit_log_schema_json_target.rb → connect/connect_application_redirect_uri.rb} +7 -7
  42. data/lib/workos/directory_sync/dsync_activated.rb +5 -5
  43. data/lib/workos/directory_sync/dsync_deactivated.rb +5 -5
  44. data/lib/workos/directory_sync/dsync_deleted.rb +5 -5
  45. data/lib/workos/directory_sync/dsync_group_created.rb +5 -5
  46. data/lib/workos/directory_sync/dsync_group_deleted.rb +5 -5
  47. data/lib/workos/directory_sync/dsync_group_updated.rb +5 -5
  48. data/lib/workos/directory_sync/dsync_group_user_added.rb +5 -5
  49. data/lib/workos/directory_sync/dsync_group_user_removed.rb +5 -5
  50. data/lib/workos/directory_sync/dsync_user_created.rb +5 -5
  51. data/lib/workos/directory_sync/dsync_user_deleted.rb +5 -5
  52. data/lib/workos/directory_sync/dsync_user_updated.rb +5 -5
  53. data/lib/workos/encryptors/aes_gcm.rb +19 -5
  54. data/lib/workos/feature_flags/flag_created.rb +5 -5
  55. data/lib/workos/feature_flags/flag_deleted.rb +5 -5
  56. data/lib/workos/feature_flags/flag_rule_updated.rb +5 -5
  57. data/lib/workos/feature_flags/flag_rule_updated_context_configured_target_organization.rb +1 -16
  58. data/lib/workos/feature_flags/flag_rule_updated_context_previous_attribute_context_configured_target_organization.rb +1 -1
  59. data/lib/workos/feature_flags/flag_updated.rb +5 -5
  60. data/lib/workos/inflections.rb +4 -1
  61. data/lib/workos/organization_domains/organization_domain_created.rb +5 -5
  62. data/lib/workos/organization_domains/organization_domain_deleted.rb +5 -5
  63. data/lib/workos/organization_domains/organization_domain_updated.rb +5 -5
  64. data/lib/workos/organization_domains/organization_domain_verification_failed.rb +5 -5
  65. data/lib/workos/organization_domains/organization_domain_verified.rb +5 -5
  66. data/lib/workos/organization_membership_service.rb +273 -0
  67. data/lib/workos/organizations/audit_logs_retention.rb +2 -7
  68. data/lib/workos/organizations/organization_created.rb +5 -5
  69. data/lib/workos/organizations/organization_deleted.rb +5 -5
  70. data/lib/workos/organizations/organization_membership_created.rb +5 -5
  71. data/lib/workos/organizations/organization_membership_deleted.rb +5 -5
  72. data/lib/workos/organizations/organization_membership_updated.rb +5 -5
  73. data/lib/workos/organizations/organization_role_created.rb +5 -5
  74. data/lib/workos/organizations/organization_role_deleted.rb +5 -5
  75. data/lib/workos/organizations/organization_role_updated.rb +5 -5
  76. data/lib/workos/organizations/organization_updated.rb +5 -5
  77. data/lib/workos/radar/radar_standalone_assess_request.rb +2 -8
  78. data/lib/workos/radar.rb +6 -12
  79. data/lib/workos/session.rb +28 -7
  80. data/lib/workos/session_manager.rb +24 -1
  81. data/lib/workos/shared/connect_application_m2m.rb +46 -0
  82. data/lib/workos/shared/connect_application_oauth.rb +58 -0
  83. data/lib/workos/shared/connect_application_oauth_redirect_uris.rb +22 -0
  84. data/lib/workos/shared/error_response.rb +18 -0
  85. data/lib/workos/shared/group_created.rb +5 -5
  86. data/lib/workos/shared/group_deleted.rb +5 -5
  87. data/lib/workos/shared/group_member_added.rb +5 -5
  88. data/lib/workos/shared/group_member_removed.rb +5 -5
  89. data/lib/workos/shared/group_updated.rb +5 -5
  90. data/lib/workos/shared/pipe_connected_account.rb +46 -0
  91. data/lib/workos/{audit_logs/audit_log_export_json.rb → shared/pipes_connected_account_connected.rb} +10 -10
  92. data/lib/workos/shared/pipes_connected_account_disconnected.rb +34 -0
  93. data/lib/workos/shared/pipes_connected_account_reauthorization_needed.rb +34 -0
  94. data/lib/workos/shared/waitlist_user_approved.rb +5 -5
  95. data/lib/workos/shared/waitlist_user_created.rb +5 -5
  96. data/lib/workos/shared/waitlist_user_denied.rb +5 -5
  97. data/lib/workos/sso/connection_activated.rb +5 -5
  98. data/lib/workos/sso/connection_deactivated.rb +5 -5
  99. data/lib/workos/sso/connection_deleted.rb +5 -5
  100. data/lib/workos/sso/connection_saml_certificate_renewal_required.rb +5 -5
  101. data/lib/workos/sso/connection_saml_certificate_renewed.rb +5 -5
  102. data/lib/workos/types/create_webhook_endpoint_events.rb +4 -1
  103. data/lib/workos/types/pipe_connected_account_state.rb +13 -0
  104. data/lib/workos/types/{radar_action.rb → radar_list_action.rb} +1 -1
  105. data/lib/workos/types/radar_list_type.rb +18 -0
  106. data/lib/workos/types/radar_standalone_assess_request_action.rb +1 -7
  107. data/lib/workos/types/radar_standalone_response_blocklist_type.rb +1 -10
  108. data/lib/workos/types/radar_standalone_response_control.rb +1 -3
  109. data/lib/workos/types/user_management_authentication_screen_hint.rb +1 -5
  110. data/{rbi/workos/types/request_options.rbi → lib/workos/types/vault_order.rb} +4 -3
  111. data/lib/workos/types/webhook_endpoint_status.rb +1 -5
  112. data/lib/workos/user_management/action_authentication_denied.rb +6 -6
  113. data/lib/workos/user_management/action_user_registration_denied.rb +6 -6
  114. data/lib/workos/user_management/authentication_email_verification_failed.rb +5 -5
  115. data/lib/workos/user_management/authentication_email_verification_succeeded.rb +5 -5
  116. data/lib/workos/user_management/authentication_magic_auth_failed.rb +5 -5
  117. data/lib/workos/user_management/authentication_magic_auth_succeeded.rb +5 -5
  118. data/lib/workos/user_management/authentication_mfa_failed.rb +5 -5
  119. data/lib/workos/user_management/authentication_mfa_succeeded.rb +5 -5
  120. data/lib/workos/user_management/authentication_oauth_failed.rb +5 -5
  121. data/lib/workos/user_management/authentication_oauth_succeeded.rb +5 -5
  122. data/lib/workos/user_management/authentication_passkey_failed.rb +5 -5
  123. data/lib/workos/user_management/authentication_passkey_succeeded.rb +5 -5
  124. data/lib/workos/user_management/authentication_password_failed.rb +5 -5
  125. data/lib/workos/user_management/authentication_password_succeeded.rb +5 -5
  126. data/lib/workos/user_management/authentication_radar_risk_detected.rb +5 -5
  127. data/lib/workos/user_management/authentication_sso_failed.rb +5 -5
  128. data/lib/workos/user_management/authentication_sso_started.rb +5 -5
  129. data/lib/workos/user_management/authentication_sso_succeeded.rb +5 -5
  130. data/lib/workos/user_management/authentication_sso_timed_out.rb +5 -5
  131. data/lib/workos/user_management/create_user_api_key.rb +5 -2
  132. data/lib/workos/user_management/email_verification_created.rb +5 -5
  133. data/lib/workos/user_management/invitation_accepted.rb +5 -5
  134. data/lib/workos/user_management/invitation_created.rb +5 -5
  135. data/lib/workos/user_management/invitation_resent.rb +5 -5
  136. data/lib/workos/user_management/invitation_revoked.rb +5 -5
  137. data/lib/workos/user_management/magic_auth_created.rb +5 -5
  138. data/lib/workos/user_management/password_reset_created.rb +5 -5
  139. data/lib/workos/user_management/password_reset_succeeded.rb +5 -5
  140. data/lib/workos/user_management/session_created.rb +5 -5
  141. data/lib/workos/user_management/session_revoked.rb +5 -5
  142. data/lib/workos/user_management/user_api_key.rb +3 -0
  143. data/lib/workos/user_management/user_api_key_with_value.rb +3 -0
  144. data/lib/workos/user_management/user_created.rb +5 -5
  145. data/lib/workos/user_management/user_deleted.rb +5 -5
  146. data/lib/workos/user_management/user_updated.rb +5 -5
  147. data/lib/workos/user_management.rb +11 -214
  148. data/lib/workos/vault/actor.rb +22 -0
  149. data/lib/workos/vault/create_data_key_request.rb +18 -0
  150. data/lib/workos/vault/create_data_key_response.rb +28 -0
  151. data/lib/workos/vault/create_object_request.rb +25 -0
  152. data/lib/workos/vault/decrypt_request.rb +18 -0
  153. data/lib/workos/vault/decrypt_response.rb +22 -0
  154. data/lib/workos/vault/delete_object_response.rb +22 -0
  155. data/lib/workos/vault/object.rb +28 -0
  156. data/lib/workos/vault/object_metadata.rb +37 -0
  157. data/lib/workos/{audit_logs/audit_log_action_json.rb → vault/object_summary.rb} +4 -10
  158. data/lib/workos/vault/object_version.rb +31 -0
  159. data/lib/workos/vault/object_without_value.rb +25 -0
  160. data/lib/workos/vault/rekey_request.rb +22 -0
  161. data/lib/workos/vault/update_object_request.rb +22 -0
  162. data/lib/workos/vault/vault_byok_key_deleted.rb +5 -5
  163. data/lib/workos/vault/vault_byok_key_verification_completed.rb +5 -5
  164. data/lib/workos/vault/vault_data_created.rb +5 -5
  165. data/lib/workos/vault/vault_data_deleted.rb +5 -5
  166. data/lib/workos/vault/vault_data_read.rb +5 -5
  167. data/lib/workos/vault/vault_data_updated.rb +5 -5
  168. data/lib/workos/vault/vault_dek_decrypted.rb +5 -5
  169. data/lib/workos/vault/vault_dek_read.rb +5 -5
  170. data/lib/workos/vault/vault_kek_created.rb +5 -5
  171. data/lib/workos/vault/vault_metadata_read.rb +5 -5
  172. data/lib/workos/vault/vault_names_listed.rb +5 -5
  173. data/lib/workos/vault/version_list_response.rb +22 -0
  174. data/lib/workos/vault.rb +273 -139
  175. data/lib/workos/version.rb +1 -1
  176. data/lib/workos/webhooks/webhook_endpoint.rb +2 -7
  177. data/lib/workos/webhooks.rb +8 -9
  178. data/lib/workos.rb +1 -0
  179. data/rbi/workos/action_authentication_denied.rbi +10 -10
  180. data/rbi/workos/action_user_registration_denied.rbi +10 -10
  181. data/rbi/workos/actor.rbi +30 -0
  182. data/rbi/workos/api_key.rbi +6 -0
  183. data/rbi/workos/api_key_created.rbi +6 -6
  184. data/rbi/workos/api_key_created_data.rbi +6 -0
  185. data/rbi/workos/api_key_revoked.rbi +6 -6
  186. data/rbi/workos/api_key_revoked_data.rbi +6 -0
  187. data/rbi/workos/api_keys.rbi +2 -1
  188. data/rbi/workos/audit_log_action.rbi +1 -0
  189. data/rbi/workos/audit_log_export.rbi +1 -0
  190. data/rbi/workos/audit_log_schema.rbi +18 -0
  191. data/rbi/workos/{audit_log_schema_json_actor.rbi → audit_log_schema_actor_input.rbi} +1 -1
  192. data/rbi/workos/audit_log_schema_input.rbi +36 -0
  193. data/rbi/workos/{audit_log_schema_json_target.rbi → audit_log_schema_target_input.rbi} +1 -1
  194. data/rbi/workos/audit_logs.rbi +9 -9
  195. data/rbi/workos/audit_logs_retention.rbi +1 -0
  196. data/rbi/workos/authentication_email_verification_failed.rbi +6 -6
  197. data/rbi/workos/authentication_email_verification_succeeded.rbi +6 -6
  198. data/rbi/workos/authentication_magic_auth_failed.rbi +6 -6
  199. data/rbi/workos/authentication_magic_auth_succeeded.rbi +6 -6
  200. data/rbi/workos/authentication_mfa_failed.rbi +6 -6
  201. data/rbi/workos/authentication_mfa_succeeded.rbi +6 -6
  202. data/rbi/workos/authentication_oauth_failed.rbi +6 -6
  203. data/rbi/workos/authentication_oauth_succeeded.rbi +6 -6
  204. data/rbi/workos/authentication_passkey_failed.rbi +6 -6
  205. data/rbi/workos/authentication_passkey_succeeded.rbi +6 -6
  206. data/rbi/workos/authentication_password_failed.rbi +6 -6
  207. data/rbi/workos/authentication_password_succeeded.rbi +6 -6
  208. data/rbi/workos/authentication_radar_risk_detected.rbi +6 -6
  209. data/rbi/workos/authentication_sso_failed.rbi +6 -6
  210. data/rbi/workos/authentication_sso_started.rbi +6 -6
  211. data/rbi/workos/authentication_sso_succeeded.rbi +6 -6
  212. data/rbi/workos/authentication_sso_timed_out.rbi +6 -6
  213. data/rbi/workos/authorization.rbi +9 -5
  214. data/rbi/workos/client.rbi +6 -3
  215. data/rbi/workos/connect_application.rbi +0 -12
  216. data/rbi/workos/{webhook_endpoint_json.rbi → connect_application_m2m.rbi} +23 -11
  217. data/rbi/workos/connect_application_oauth.rbi +102 -0
  218. data/rbi/workos/connect_application_oauth_redirect_uris.rbi +30 -0
  219. data/rbi/workos/connection_activated.rbi +6 -6
  220. data/rbi/workos/connection_deactivated.rbi +6 -6
  221. data/rbi/workos/connection_deleted.rbi +6 -6
  222. data/rbi/workos/connection_saml_certificate_renewal_required.rbi +6 -6
  223. data/rbi/workos/connection_saml_certificate_renewed.rbi +6 -6
  224. data/rbi/workos/{audit_logs_retention_json.rbi → create_data_key_request.rbi} +5 -5
  225. data/rbi/workos/create_data_key_response.rbi +42 -0
  226. data/rbi/workos/create_object_request.rbi +36 -0
  227. data/rbi/workos/create_organization_api_key.rbi +6 -0
  228. data/rbi/workos/create_user_api_key.rbi +6 -0
  229. data/rbi/workos/decrypt_request.rbi +24 -0
  230. data/rbi/workos/decrypt_response.rbi +30 -0
  231. data/rbi/workos/delete_object_response.rbi +30 -0
  232. data/rbi/workos/dsync_activated.rbi +6 -6
  233. data/rbi/workos/dsync_deactivated.rbi +6 -6
  234. data/rbi/workos/dsync_deleted.rbi +6 -6
  235. data/rbi/workos/dsync_group_created.rbi +6 -6
  236. data/rbi/workos/dsync_group_deleted.rbi +6 -6
  237. data/rbi/workos/dsync_group_updated.rbi +6 -6
  238. data/rbi/workos/dsync_group_user_added.rbi +6 -6
  239. data/rbi/workos/dsync_group_user_removed.rbi +6 -6
  240. data/rbi/workos/dsync_user_created.rbi +6 -6
  241. data/rbi/workos/dsync_user_deleted.rbi +6 -6
  242. data/rbi/workos/dsync_user_updated.rbi +6 -6
  243. data/rbi/workos/email_verification_created.rbi +6 -6
  244. data/rbi/workos/error_response.rbi +24 -0
  245. data/rbi/workos/flag_created.rbi +6 -6
  246. data/rbi/workos/flag_deleted.rbi +6 -6
  247. data/rbi/workos/flag_rule_updated.rbi +6 -6
  248. data/rbi/workos/flag_updated.rbi +6 -6
  249. data/rbi/workos/group_created.rbi +6 -6
  250. data/rbi/workos/group_deleted.rbi +6 -6
  251. data/rbi/workos/group_member_added.rbi +6 -6
  252. data/rbi/workos/group_member_removed.rbi +6 -6
  253. data/rbi/workos/group_updated.rbi +6 -6
  254. data/rbi/workos/invitation_accepted.rbi +6 -6
  255. data/rbi/workos/invitation_created.rbi +6 -6
  256. data/rbi/workos/invitation_resent.rbi +6 -6
  257. data/rbi/workos/invitation_revoked.rbi +6 -6
  258. data/rbi/workos/magic_auth_created.rbi +6 -6
  259. data/rbi/workos/object.rbi +42 -0
  260. data/rbi/workos/object_metadata.rbi +60 -0
  261. data/rbi/workos/object_summary.rbi +36 -0
  262. data/rbi/workos/{audit_log_action_json.rbi → object_version.rbi} +17 -17
  263. data/rbi/workos/object_without_value.rbi +36 -0
  264. data/rbi/workos/organization_api_key.rbi +6 -0
  265. data/rbi/workos/organization_api_key_with_value.rbi +6 -0
  266. data/rbi/workos/organization_created.rbi +6 -6
  267. data/rbi/workos/organization_deleted.rbi +6 -6
  268. data/rbi/workos/organization_domain_created.rbi +6 -6
  269. data/rbi/workos/organization_domain_deleted.rbi +6 -6
  270. data/rbi/workos/organization_domain_updated.rbi +6 -6
  271. data/rbi/workos/organization_domain_verification_failed.rbi +6 -6
  272. data/rbi/workos/organization_domain_verified.rbi +6 -6
  273. data/rbi/workos/organization_membership_created.rbi +6 -6
  274. data/rbi/workos/organization_membership_deleted.rbi +6 -6
  275. data/rbi/workos/organization_membership_service.rbi +114 -0
  276. data/rbi/workos/organization_membership_updated.rbi +6 -6
  277. data/rbi/workos/organization_role_created.rbi +6 -6
  278. data/rbi/workos/organization_role_deleted.rbi +6 -6
  279. data/rbi/workos/organization_role_updated.rbi +6 -6
  280. data/rbi/workos/organization_updated.rbi +6 -6
  281. data/rbi/workos/password_reset_created.rbi +6 -6
  282. data/rbi/workos/password_reset_succeeded.rbi +6 -6
  283. data/rbi/workos/permission_created.rbi +6 -6
  284. data/rbi/workos/permission_deleted.rbi +6 -6
  285. data/rbi/workos/permission_updated.rbi +6 -6
  286. data/rbi/workos/pipe_connected_account.rbi +78 -0
  287. data/rbi/workos/{audit_log_export_json.rbi → pipes_connected_account_connected.rbi} +11 -11
  288. data/rbi/workos/pipes_connected_account_disconnected.rbi +54 -0
  289. data/rbi/workos/pipes_connected_account_reauthorization_needed.rbi +54 -0
  290. data/rbi/workos/radar.rbi +1 -3
  291. data/rbi/workos/radar_standalone_assess_request.rbi +0 -12
  292. data/rbi/workos/rekey_request.rbi +30 -0
  293. data/rbi/workos/role_created.rbi +6 -6
  294. data/rbi/workos/role_deleted.rbi +6 -6
  295. data/rbi/workos/role_updated.rbi +6 -6
  296. data/rbi/workos/session_created.rbi +6 -6
  297. data/rbi/workos/session_manager.rbi +1 -1
  298. data/rbi/workos/session_revoked.rbi +6 -6
  299. data/rbi/workos/update_object_request.rbi +30 -0
  300. data/rbi/workos/user_api_key.rbi +6 -0
  301. data/rbi/workos/user_api_key_with_value.rbi +6 -0
  302. data/rbi/workos/user_created.rbi +6 -6
  303. data/rbi/workos/user_deleted.rbi +6 -6
  304. data/rbi/workos/user_management.rbi +2 -90
  305. data/rbi/workos/user_updated.rbi +6 -6
  306. data/rbi/workos/vault.rbi +70 -95
  307. data/rbi/workos/vault_byok_key_deleted.rbi +6 -6
  308. data/rbi/workos/vault_byok_key_verification_completed.rbi +6 -6
  309. data/rbi/workos/vault_data_created.rbi +6 -6
  310. data/rbi/workos/vault_data_deleted.rbi +6 -6
  311. data/rbi/workos/vault_data_read.rbi +6 -6
  312. data/rbi/workos/vault_data_updated.rbi +6 -6
  313. data/rbi/workos/vault_dek_decrypted.rbi +6 -6
  314. data/rbi/workos/vault_dek_read.rbi +6 -6
  315. data/rbi/workos/vault_kek_created.rbi +6 -6
  316. data/rbi/workos/vault_metadata_read.rbi +6 -6
  317. data/rbi/workos/vault_names_listed.rbi +6 -6
  318. data/rbi/workos/waitlist_user_approved.rbi +6 -6
  319. data/rbi/workos/waitlist_user_created.rbi +6 -6
  320. data/rbi/workos/waitlist_user_denied.rbi +6 -6
  321. data/rbi/workos/webhook_endpoint.rbi +1 -0
  322. data/rbi/workos/webhooks.rbi +2 -2
  323. data/renovate.json +1 -1
  324. data/test/workos/test_actions.rb +9 -0
  325. data/test/workos/test_base_client.rb +44 -0
  326. data/test/workos/test_encryptors_aes_gcm.rb +16 -1
  327. data/test/workos/test_model_round_trip.rb +577 -212
  328. data/test/workos/test_organization_membership_service.rb +107 -0
  329. data/test/workos/test_session.rb +43 -4
  330. data/test/workos/test_user_management.rb +0 -74
  331. data/test/workos/test_vault.rb +91 -87
  332. data/test/workos/test_webhook_verify.rb +11 -0
  333. metadata +65 -41
  334. data/lib/workos/audit_logs/audit_log_schema_json.rb +0 -34
  335. data/lib/workos/organizations/audit_logs_retention_json.rb +0 -18
  336. data/lib/workos/types/audit_log_export_json_state.rb +0 -14
  337. data/lib/workos/types/webhook_endpoint_json_status.rb +0 -9
  338. data/lib/workos/user_management_organization_membership_groups.rb +0 -60
  339. data/lib/workos/webhooks/webhook_endpoint_json.rb +0 -40
  340. data/rbi/workos/actions.rbi +0 -48
  341. data/rbi/workos/audit_log_schema_json.rbi +0 -54
  342. data/rbi/workos/base_client.rbi +0 -132
  343. data/rbi/workos/configuration.rbi +0 -68
  344. data/rbi/workos/encryptors/aes_gcm.rbi +0 -19
  345. data/rbi/workos/errors.rbi +0 -43
  346. data/rbi/workos/hash_provider.rbi +0 -18
  347. data/rbi/workos/passwordless.rbi +0 -47
  348. data/rbi/workos/public_client.rbi +0 -12
  349. data/rbi/workos/session.rbi +0 -43
  350. data/rbi/workos/types/api_response.rbi +0 -29
  351. data/rbi/workos/types/base_model.rbi +0 -22
  352. data/rbi/workos/types/list_struct.rbi +0 -89
  353. data/rbi/workos/user_management_organization_membership_groups.rbi +0 -25
  354. data/rbi/workos/util.rbi +0 -12
  355. data/test/workos/test_user_management_organization_membership_groups.rb +0 -33
  356. /data/lib/workos/{user_management → organization_membership}/create_user_organization_membership.rb +0 -0
  357. /data/lib/workos/{user_management → organization_membership}/organization_membership.rb +0 -0
  358. /data/lib/workos/{user_management → organization_membership}/update_user_organization_membership.rb +0 -0
  359. /data/lib/workos/{user_management → organization_membership}/user_organization_membership.rb +0 -0
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file is auto-generated by oagen. Do not edit.
4
+
5
+ require "test_helper"
6
+
7
+ class OrganizationMembershipServiceTest < Minitest::Test
8
+ include FixtureHelper
9
+
10
+ def setup
11
+ @client = WorkOS::Client.new(api_key: "sk_test_123")
12
+ end
13
+
14
+ def test_list_organization_memberships_returns_expected_result
15
+ stub_request(:get, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships(\?|\z)})
16
+ .to_return(body: '{"data": [], "list_metadata": {}}', status: 200)
17
+ result = @client.organization_membership.list_organization_memberships
18
+ assert_kind_of WorkOS::Types::ListStruct, result
19
+ end
20
+
21
+ def test_create_organization_membership_returns_expected_result
22
+ stub_request(:post, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships(\?|\z)})
23
+ .with(body: hash_including("user_id" => "stub", "organization_id" => "stub", "role_slug" => "stub"))
24
+ .to_return(body: "{}", status: 200)
25
+ result = @client.organization_membership.create_organization_membership(user_id: "stub", organization_id: "stub", role: WorkOS::OrganizationMembershipService::RoleSingle.new(role_slug: "stub"))
26
+ refute_nil result
27
+ end
28
+
29
+ def test_create_organization_membership_with_role_multiple_returns_expected_result
30
+ stub_request(:post, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships(\?|\z)})
31
+ .with(body: hash_including("user_id" => "stub", "organization_id" => "stub", "role_slugs" => ["stub"]))
32
+ .to_return(body: "{}", status: 200)
33
+ result = @client.organization_membership.create_organization_membership(user_id: "stub", organization_id: "stub", role: WorkOS::OrganizationMembershipService::RoleMultiple.new(role_slugs: ["stub"]))
34
+ refute_nil result
35
+ end
36
+
37
+ def test_get_organization_membership_returns_expected_result
38
+ stub_request(:get, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)})
39
+ .to_return(body: "{}", status: 200)
40
+ result = @client.organization_membership.get_organization_membership(id: "stub")
41
+ refute_nil result
42
+ end
43
+
44
+ def test_update_organization_membership_returns_expected_result
45
+ stub_request(:put, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)})
46
+ .with(body: hash_including("role_slug" => "stub"))
47
+ .to_return(body: "{}", status: 200)
48
+ result = @client.organization_membership.update_organization_membership(id: "stub", role: WorkOS::OrganizationMembershipService::RoleSingle.new(role_slug: "stub"))
49
+ refute_nil result
50
+ end
51
+
52
+ def test_update_organization_membership_with_role_multiple_returns_expected_result
53
+ stub_request(:put, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)})
54
+ .with(body: hash_including("role_slugs" => ["stub"]))
55
+ .to_return(body: "{}", status: 200)
56
+ result = @client.organization_membership.update_organization_membership(id: "stub", role: WorkOS::OrganizationMembershipService::RoleMultiple.new(role_slugs: ["stub"]))
57
+ refute_nil result
58
+ end
59
+
60
+ def test_delete_organization_membership_returns_expected_result
61
+ stub_request(:delete, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)})
62
+ .to_return(body: "{}", status: 200)
63
+ result = @client.organization_membership.delete_organization_membership(id: "stub")
64
+ assert_nil result
65
+ end
66
+
67
+ def test_deactivate_organization_membership_returns_expected_result
68
+ stub_request(:put, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub/deactivate(\?|\z)})
69
+ .to_return(body: "{}", status: 200)
70
+ result = @client.organization_membership.deactivate_organization_membership(id: "stub")
71
+ refute_nil result
72
+ end
73
+
74
+ def test_reactivate_organization_membership_returns_expected_result
75
+ stub_request(:put, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub/reactivate(\?|\z)})
76
+ .to_return(body: "{}", status: 200)
77
+ result = @client.organization_membership.reactivate_organization_membership(id: "stub")
78
+ refute_nil result
79
+ end
80
+
81
+ def test_list_organization_membership_groups_returns_expected_result
82
+ stub_request(:get, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub/groups(\?|\z)})
83
+ .to_return(body: '{"data": [], "list_metadata": {}}', status: 200)
84
+ result = @client.organization_membership.list_organization_membership_groups(om_id: "stub")
85
+ assert_kind_of WorkOS::Types::ListStruct, result
86
+ end
87
+
88
+ # Parameterized authentication error tests (one per endpoint).
89
+ [
90
+ {name: :list_organization_memberships, verb: :get, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships(\?|\z)}},
91
+ {name: :create_organization_membership, verb: :post, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships(\?|\z)}, args: {user_id: "stub", organization_id: "stub", role: WorkOS::OrganizationMembershipService::RoleSingle.new(role_slug: "stub")}},
92
+ {name: :get_organization_membership, verb: :get, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)}, args: {id: "stub"}},
93
+ {name: :update_organization_membership, verb: :put, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)}, args: {id: "stub", role: WorkOS::OrganizationMembershipService::RoleSingle.new(role_slug: "stub")}},
94
+ {name: :delete_organization_membership, verb: :delete, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)}, args: {id: "stub"}},
95
+ {name: :deactivate_organization_membership, verb: :put, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub/deactivate(\?|\z)}, args: {id: "stub"}},
96
+ {name: :reactivate_organization_membership, verb: :put, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub/reactivate(\?|\z)}, args: {id: "stub"}},
97
+ {name: :list_organization_membership_groups, verb: :get, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub/groups(\?|\z)}, args: {om_id: "stub"}}
98
+ ].each do |spec|
99
+ define_method("test_#{spec[:name]}_raises_authentication_error_on_401") do
100
+ stub_request(spec[:verb], spec[:url])
101
+ .to_return(body: '{"message": "Unauthorized"}', status: 401)
102
+ assert_raises(WorkOS::AuthenticationError) do
103
+ @client.organization_membership.send(spec[:name], **(spec[:args] || {}))
104
+ end
105
+ end
106
+ end
107
+ end
@@ -26,11 +26,27 @@ class SessionTest < Minitest::Test
26
26
 
27
27
  def test_unseal_with_wrong_key_raises
28
28
  sealed = @sm.seal_data({"x" => 1}, PASSWORD)
29
+ # Wrong key is the same length (>= 32 bytes) so the length guard doesn't
30
+ # short-circuit; we want to assert the underlying cipher rejection.
29
31
  assert_raises(OpenSSL::Cipher::CipherError) do
30
- @sm.unseal_data(sealed, "wrong-password")
32
+ @sm.unseal_data(sealed, "wrong-cookie-password-32-bytes--")
31
33
  end
32
34
  end
33
35
 
36
+ def test_unseal_with_short_key_raises_argument_error
37
+ sealed = @sm.seal_data({"x" => 1}, PASSWORD)
38
+ assert_raises(ArgumentError) { @sm.unseal_data(sealed, "too-short") }
39
+ end
40
+
41
+ def test_seal_with_short_key_raises_argument_error
42
+ assert_raises(ArgumentError) { @sm.seal_data({"x" => 1}, "too-short") }
43
+ end
44
+
45
+ def test_session_load_requires_min_length_cookie_password
46
+ short = "x" * 31
47
+ assert_raises(ArgumentError) { @sm.load(seal_data: "x", cookie_password: short) }
48
+ end
49
+
34
50
  def test_unseal_rejects_short_payload
35
51
  assert_raises(ArgumentError) do
36
52
  @sm.unseal_data(Base64.strict_encode64("short"), PASSWORD)
@@ -334,6 +350,19 @@ class SessionTest < Minitest::Test
334
350
  assert_equal WorkOS::SessionManager::INVALID_SESSION_COOKIE, result.reason
335
351
  end
336
352
 
353
+ def test_refresh_raises_argument_error_for_short_cookie_password_override
354
+ sealed = @sm.seal_data({"access_token" => "at", "refresh_token" => "rt"}, PASSWORD)
355
+ session = @sm.load(seal_data: sealed, cookie_password: PASSWORD)
356
+ err = assert_raises(ArgumentError) { session.refresh(cookie_password: "x" * 31) }
357
+ assert_match(/at least 32 bytes/, err.message)
358
+ end
359
+
360
+ def test_refresh_raises_argument_error_for_empty_cookie_password_override
361
+ sealed = @sm.seal_data({"access_token" => "at", "refresh_token" => "rt"}, PASSWORD)
362
+ session = @sm.load(seal_data: sealed, cookie_password: PASSWORD)
363
+ assert_raises(ArgumentError) { session.refresh(cookie_password: "") }
364
+ end
365
+
337
366
  def test_refresh_returns_error_when_no_refresh_token
338
367
  sealed = @sm.seal_data({"access_token" => "at_only"}, PASSWORD)
339
368
  result = @sm.refresh(seal_data: sealed, cookie_password: PASSWORD)
@@ -361,7 +390,7 @@ class SessionTest < Minitest::Test
361
390
  assert_requested(stub)
362
391
  end
363
392
 
364
- def test_refresh_returns_error_on_malformed_access_token_without_mutating_state
393
+ def test_refresh_persists_seal_data_even_when_access_token_decode_fails
365
394
  rsa, pub = signing_key_pair
366
395
  old_access = make_jwt({"sid" => "session_old", "exp" => Time.now.to_i - 60}, rsa)
367
396
  sealed = @sm.seal_data({"access_token" => old_access, "refresh_token" => "rt_old", "user" => {"id" => "u_1"}}, PASSWORD)
@@ -383,8 +412,18 @@ class SessionTest < Minitest::Test
383
412
  assert_kind_of WorkOS::SessionManager::RefreshError, result
384
413
  refute result.authenticated
385
414
 
386
- # Session state should not have been mutated
387
- assert_equal sealed, session.seal_data
415
+ # Session state IS updated to the freshly-sealed cookie before decode runs,
416
+ # so a transient JWT/JWKS failure leaves a usable seal the caller can
417
+ # re-#authenticate against rather than half-updated state pinned to the
418
+ # stale (already-rotated) refresh token.
419
+ refute_equal sealed, session.seal_data
420
+ refute_nil session.seal_data
421
+
422
+ # The rotated cookie is also reachable through the RefreshError result, so a
423
+ # caller that doesn't retain the Session object across requests (typical in
424
+ # a Rails request cycle) can still write the new cookie back to the browser
425
+ # rather than re-sending the now-revoked refresh token on the next request.
426
+ assert_equal session.seal_data, result.sealed_session
388
427
  end
389
428
 
390
429
  # --- Session constructor validation ---------------------------------------
@@ -373,73 +373,6 @@ class UserManagementTest < Minitest::Test
373
373
  refute_nil result
374
374
  end
375
375
 
376
- def test_list_organization_memberships_returns_expected_result
377
- stub_request(:get, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships(\?|\z)})
378
- .to_return(body: '{"data": [], "list_metadata": {}}', status: 200)
379
- result = @client.user_management.list_organization_memberships
380
- assert_kind_of WorkOS::Types::ListStruct, result
381
- end
382
-
383
- def test_create_organization_membership_returns_expected_result
384
- stub_request(:post, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships(\?|\z)})
385
- .with(body: hash_including("user_id" => "stub", "organization_id" => "stub", "role_slug" => "stub"))
386
- .to_return(body: "{}", status: 200)
387
- result = @client.user_management.create_organization_membership(user_id: "stub", organization_id: "stub", role: WorkOS::UserManagement::RoleSingle.new(role_slug: "stub"))
388
- refute_nil result
389
- end
390
-
391
- def test_create_organization_membership_with_role_multiple_returns_expected_result
392
- stub_request(:post, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships(\?|\z)})
393
- .with(body: hash_including("user_id" => "stub", "organization_id" => "stub", "role_slugs" => ["stub"]))
394
- .to_return(body: "{}", status: 200)
395
- result = @client.user_management.create_organization_membership(user_id: "stub", organization_id: "stub", role: WorkOS::UserManagement::RoleMultiple.new(role_slugs: ["stub"]))
396
- refute_nil result
397
- end
398
-
399
- def test_get_organization_membership_returns_expected_result
400
- stub_request(:get, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)})
401
- .to_return(body: "{}", status: 200)
402
- result = @client.user_management.get_organization_membership(id: "stub")
403
- refute_nil result
404
- end
405
-
406
- def test_update_organization_membership_returns_expected_result
407
- stub_request(:put, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)})
408
- .with(body: hash_including("role_slug" => "stub"))
409
- .to_return(body: "{}", status: 200)
410
- result = @client.user_management.update_organization_membership(id: "stub", role: WorkOS::UserManagement::RoleSingle.new(role_slug: "stub"))
411
- refute_nil result
412
- end
413
-
414
- def test_update_organization_membership_with_role_multiple_returns_expected_result
415
- stub_request(:put, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)})
416
- .with(body: hash_including("role_slugs" => ["stub"]))
417
- .to_return(body: "{}", status: 200)
418
- result = @client.user_management.update_organization_membership(id: "stub", role: WorkOS::UserManagement::RoleMultiple.new(role_slugs: ["stub"]))
419
- refute_nil result
420
- end
421
-
422
- def test_delete_organization_membership_returns_expected_result
423
- stub_request(:delete, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)})
424
- .to_return(body: "{}", status: 200)
425
- result = @client.user_management.delete_organization_membership(id: "stub")
426
- assert_nil result
427
- end
428
-
429
- def test_deactivate_organization_membership_returns_expected_result
430
- stub_request(:put, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub/deactivate(\?|\z)})
431
- .to_return(body: "{}", status: 200)
432
- result = @client.user_management.deactivate_organization_membership(id: "stub")
433
- refute_nil result
434
- end
435
-
436
- def test_reactivate_organization_membership_returns_expected_result
437
- stub_request(:put, %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub/reactivate(\?|\z)})
438
- .to_return(body: "{}", status: 200)
439
- result = @client.user_management.reactivate_organization_membership(id: "stub")
440
- refute_nil result
441
- end
442
-
443
376
  def test_create_redirect_uri_returns_expected_result
444
377
  stub_request(:post, %r{\Ahttps://api\.workos\.com/user_management/redirect_uris(\?|\z)})
445
378
  .to_return(body: "{}", status: 200)
@@ -509,13 +442,6 @@ class UserManagementTest < Minitest::Test
509
442
  {name: :update_jwt_template, verb: :put, url: %r{\Ahttps://api\.workos\.com/user_management/jwt_template(\?|\z)}, args: {content: "stub"}},
510
443
  {name: :create_magic_auth, verb: :post, url: %r{\Ahttps://api\.workos\.com/user_management/magic_auth(\?|\z)}, args: {email: "stub"}},
511
444
  {name: :get_magic_auth, verb: :get, url: %r{\Ahttps://api\.workos\.com/user_management/magic_auth/stub(\?|\z)}, args: {id: "stub"}},
512
- {name: :list_organization_memberships, verb: :get, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships(\?|\z)}},
513
- {name: :create_organization_membership, verb: :post, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships(\?|\z)}, args: {user_id: "stub", organization_id: "stub", role: WorkOS::UserManagement::RoleSingle.new(role_slug: "stub")}},
514
- {name: :get_organization_membership, verb: :get, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)}, args: {id: "stub"}},
515
- {name: :update_organization_membership, verb: :put, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)}, args: {id: "stub", role: WorkOS::UserManagement::RoleSingle.new(role_slug: "stub")}},
516
- {name: :delete_organization_membership, verb: :delete, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub(\?|\z)}, args: {id: "stub"}},
517
- {name: :deactivate_organization_membership, verb: :put, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub/deactivate(\?|\z)}, args: {id: "stub"}},
518
- {name: :reactivate_organization_membership, verb: :put, url: %r{\Ahttps://api\.workos\.com/user_management/organization_memberships/stub/reactivate(\?|\z)}, args: {id: "stub"}},
519
445
  {name: :create_redirect_uri, verb: :post, url: %r{\Ahttps://api\.workos\.com/user_management/redirect_uris(\?|\z)}, args: {uri: "stub"}},
520
446
  {name: :list_user_authorized_applications, verb: :get, url: %r{\Ahttps://api\.workos\.com/user_management/users/stub/authorized_applications(\?|\z)}, args: {user_id: "stub"}},
521
447
  {name: :delete_user_authorized_application, verb: :delete, url: %r{\Ahttps://api\.workos\.com/user_management/users/stub/authorized_applications/stub(\?|\z)}, args: {application_id: "stub", user_id: "stub"}},
@@ -1,119 +1,118 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # @oagen-ignore-file
3
+ # This file is auto-generated by oagen. Do not edit.
4
+
4
5
  require "test_helper"
5
6
  require "base64"
6
7
 
7
8
  class VaultTest < Minitest::Test
9
+ include FixtureHelper
10
+
8
11
  def setup
9
- @client = WorkOS::Client.new(api_key: "sk_test_vault")
12
+ @client = WorkOS::Client.new(api_key: "sk_test_123")
10
13
  end
11
14
 
12
- def test_vault_accessor_exists
13
- assert_kind_of WorkOS::Vault, @client.vault
15
+ def test_create_data_key_returns_expected_result
16
+ stub_request(:post, %r{\Ahttps://api\.workos\.com/vault/v1/keys/data-key(\?|\z)})
17
+ .to_return(body: "{}", status: 200)
18
+ result = @client.vault.create_data_key(context: {})
19
+ refute_nil result
14
20
  end
15
21
 
16
- def test_create_object_returns_metadata
17
- body = {
18
- "id" => "obj_01", "key_id" => "key_01", "version_id" => "v1",
19
- "context" => {"tenant" => "t1"}, "environment_id" => "env_1",
20
- "updated_at" => "2026-04-15T00:00:00Z",
21
- "updated_by" => {"id" => "u1", "name" => "alice"}
22
- }
23
- stub_request(:post, "https://api.workos.com/vault/v1/kv")
24
- .with(body: hash_including("name" => "secret", "value" => "hello"))
25
- .to_return(status: 200, body: body.to_json)
26
-
27
- meta = @client.vault.create_object(name: "secret", value: "hello", key_context: {"tenant" => "t1"})
28
- assert_equal "obj_01", meta.id
29
- assert_equal "v1", meta.version_id
30
- assert_equal "alice", meta.updated_by.name
22
+ def test_create_decrypt_returns_expected_result
23
+ stub_request(:post, %r{\Ahttps://api\.workos\.com/vault/v1/keys/decrypt(\?|\z)})
24
+ .to_return(body: "{}", status: 200)
25
+ result = @client.vault.create_decrypt(keys: "stub")
26
+ refute_nil result
31
27
  end
32
28
 
33
- def test_read_object_returns_decrypted_value
34
- body = {
35
- "id" => "obj_01", "name" => "secret", "value" => "hello",
36
- "metadata" => {
37
- "id" => "obj_01", "key_id" => "k", "version_id" => "v",
38
- "context" => {}, "environment_id" => "env",
39
- "updated_at" => "x", "updated_by" => {"id" => "u", "name" => "n"}
40
- }
41
- }
42
- stub_request(:get, "https://api.workos.com/vault/v1/kv/obj_01")
43
- .to_return(status: 200, body: body.to_json)
44
-
45
- obj = @client.vault.read_object(object_id: "obj_01")
46
- assert_equal "hello", obj.value
47
- assert_equal "secret", obj.name
29
+ def test_create_rekey_returns_expected_result
30
+ stub_request(:post, %r{\Ahttps://api\.workos\.com/vault/v1/keys/rekey(\?|\z)})
31
+ .to_return(body: "{}", status: 200)
32
+ result = @client.vault.create_rekey(context: {}, encrypted_keys: "stub")
33
+ refute_nil result
48
34
  end
49
35
 
50
- def test_list_objects_returns_digests
51
- body = {"data" => [{"id" => "o1", "name" => "a", "updated_at" => "x"}, {"id" => "o2", "name" => "b", "updated_at" => "y"}]}
52
- stub_request(:get, /vault\/v1\/kv\?/).to_return(status: 200, body: body.to_json)
53
-
54
- digests = @client.vault.list_objects(limit: 10)
55
- assert_equal 2, digests.size
56
- assert_equal "o1", digests.first.id
36
+ def test_list_kv_returns_expected_result
37
+ stub_request(:get, %r{\Ahttps://api\.workos\.com/vault/v1/kv(\?|\z)})
38
+ .to_return(body: '{"data": [], "list_metadata": {}}', status: 200)
39
+ result = @client.vault.list_kv
40
+ assert_kind_of WorkOS::Types::ListStruct, result
57
41
  end
58
42
 
59
- def test_list_object_versions
60
- body = {"data" => [{"id" => "v1", "created_at" => "x", "current_version" => true}]}
61
- stub_request(:get, "https://api.workos.com/vault/v1/kv/obj_1/versions").to_return(status: 200, body: body.to_json)
62
-
63
- versions = @client.vault.list_object_versions(object_id: "obj_1")
64
- assert_equal 1, versions.size
65
- assert versions.first.current_version
43
+ def test_create_kv_returns_expected_result
44
+ stub_request(:post, %r{\Ahttps://api\.workos\.com/vault/v1/kv(\?|\z)})
45
+ .to_return(body: "{}", status: 200)
46
+ result = @client.vault.create_kv(key_context: {}, name: "stub", value: "stub")
47
+ refute_nil result
66
48
  end
67
49
 
68
- def test_get_object_metadata
69
- body = {"id" => "obj_1", "name" => "n", "metadata" => {
70
- "id" => "obj_1", "key_id" => "k", "version_id" => "v",
71
- "context" => {}, "environment_id" => "env",
72
- "updated_at" => "x", "updated_by" => {"id" => "u", "name" => "n"}
73
- }}
74
- stub_request(:get, "https://api.workos.com/vault/v1/kv/obj_1/metadata").to_return(status: 200, body: body.to_json)
75
-
76
- obj = @client.vault.get_object_metadata(object_id: "obj_1")
77
- assert_nil obj.value
78
- assert_equal "obj_1", obj.metadata.id
50
+ def test_get_name_returns_expected_result
51
+ stub_request(:get, %r{\Ahttps://api\.workos\.com/vault/v1/kv/name/stub(\?|\z)})
52
+ .to_return(body: "{}", status: 200)
53
+ result = @client.vault.get_name(name: "stub")
54
+ refute_nil result
79
55
  end
80
56
 
81
- def test_delete_object_returns_nil
82
- stub_request(:delete, "https://api.workos.com/vault/v1/kv/obj_1").to_return(status: 200, body: "")
83
- assert_nil @client.vault.delete_object(object_id: "obj_1")
57
+ def test_get_kv_returns_expected_result
58
+ stub_request(:get, %r{\Ahttps://api\.workos\.com/vault/v1/kv/stub(\?|\z)})
59
+ .to_return(body: "{}", status: 200)
60
+ result = @client.vault.get_kv(id: "stub")
61
+ refute_nil result
84
62
  end
85
63
 
86
- def test_update_object_with_version_check
87
- body = {"id" => "obj_1", "name" => "n", "value" => "newval", "metadata" => nil}
88
- stub_request(:put, "https://api.workos.com/vault/v1/kv/obj_1")
89
- .with(body: hash_including("value" => "newval", "version_check" => "v1"))
90
- .to_return(status: 200, body: body.to_json)
91
-
92
- obj = @client.vault.update_object(object_id: "obj_1", value: "newval", version_check: "v1")
93
- assert_equal "newval", obj.value
64
+ def test_update_kv_returns_expected_result
65
+ stub_request(:put, %r{\Ahttps://api\.workos\.com/vault/v1/kv/stub(\?|\z)})
66
+ .to_return(body: "{}", status: 200)
67
+ result = @client.vault.update_kv(id: "stub", value: "stub")
68
+ refute_nil result
94
69
  end
95
70
 
96
- def test_create_data_key
97
- body = {"context" => {"t" => "1"}, "id" => "dek_1", "data_key" => Base64.strict_encode64("k" * 32), "encrypted_keys" => Base64.strict_encode64("blob")}
98
- stub_request(:post, "https://api.workos.com/vault/v1/keys/data-key")
99
- .with(body: hash_including("context" => {"t" => "1"}))
100
- .to_return(status: 200, body: body.to_json)
71
+ def test_delete_kv_returns_expected_result
72
+ stub_request(:delete, %r{\Ahttps://api\.workos\.com/vault/v1/kv/stub(\?|\z)})
73
+ .to_return(body: "{}", status: 200)
74
+ result = @client.vault.delete_kv(id: "stub")
75
+ refute_nil result
76
+ end
101
77
 
102
- pair = @client.vault.create_data_key(key_context: {"t" => "1"})
103
- assert_equal "dek_1", pair.data_key.id
104
- assert_equal "blob", Base64.decode64(pair.encrypted_keys)
78
+ def test_list_kv_metadata_returns_expected_result
79
+ stub_request(:get, %r{\Ahttps://api\.workos\.com/vault/v1/kv/stub/metadata(\?|\z)})
80
+ .to_return(body: "{}", status: 200)
81
+ result = @client.vault.list_kv_metadata(id: "stub")
82
+ refute_nil result
105
83
  end
106
84
 
107
- def test_decrypt_data_key
108
- body = {"id" => "dek_1", "data_key" => Base64.strict_encode64("k" * 32)}
109
- stub_request(:post, "https://api.workos.com/vault/v1/keys/decrypt")
110
- .with(body: hash_including("keys" => "abc"))
111
- .to_return(status: 200, body: body.to_json)
85
+ def test_list_kv_versions_returns_expected_result
86
+ stub_request(:get, %r{\Ahttps://api\.workos\.com/vault/v1/kv/stub/versions(\?|\z)})
87
+ .to_return(body: '{"data": [], "list_metadata": {}}', status: 200)
88
+ result = @client.vault.list_kv_versions(id: "stub")
89
+ assert_kind_of WorkOS::Types::ListStruct, result
90
+ end
112
91
 
113
- dk = @client.vault.decrypt_data_key(keys: "abc")
114
- assert_equal "dek_1", dk.id
92
+ # Parameterized authentication error tests (one per endpoint).
93
+ [
94
+ {name: :create_data_key, verb: :post, url: %r{\Ahttps://api\.workos\.com/vault/v1/keys/data-key(\?|\z)}, args: {context: {}}},
95
+ {name: :create_decrypt, verb: :post, url: %r{\Ahttps://api\.workos\.com/vault/v1/keys/decrypt(\?|\z)}, args: {keys: "stub"}},
96
+ {name: :create_rekey, verb: :post, url: %r{\Ahttps://api\.workos\.com/vault/v1/keys/rekey(\?|\z)}, args: {context: {}, encrypted_keys: "stub"}},
97
+ {name: :list_kv, verb: :get, url: %r{\Ahttps://api\.workos\.com/vault/v1/kv(\?|\z)}},
98
+ {name: :create_kv, verb: :post, url: %r{\Ahttps://api\.workos\.com/vault/v1/kv(\?|\z)}, args: {key_context: {}, name: "stub", value: "stub"}},
99
+ {name: :get_name, verb: :get, url: %r{\Ahttps://api\.workos\.com/vault/v1/kv/name/stub(\?|\z)}, args: {name: "stub"}},
100
+ {name: :get_kv, verb: :get, url: %r{\Ahttps://api\.workos\.com/vault/v1/kv/stub(\?|\z)}, args: {id: "stub"}},
101
+ {name: :update_kv, verb: :put, url: %r{\Ahttps://api\.workos\.com/vault/v1/kv/stub(\?|\z)}, args: {id: "stub", value: "stub"}},
102
+ {name: :delete_kv, verb: :delete, url: %r{\Ahttps://api\.workos\.com/vault/v1/kv/stub(\?|\z)}, args: {id: "stub"}},
103
+ {name: :list_kv_metadata, verb: :get, url: %r{\Ahttps://api\.workos\.com/vault/v1/kv/stub/metadata(\?|\z)}, args: {id: "stub"}},
104
+ {name: :list_kv_versions, verb: :get, url: %r{\Ahttps://api\.workos\.com/vault/v1/kv/stub/versions(\?|\z)}, args: {id: "stub"}}
105
+ ].each do |spec|
106
+ define_method("test_#{spec[:name]}_raises_authentication_error_on_401") do
107
+ stub_request(spec[:verb], spec[:url])
108
+ .to_return(body: '{"message": "Unauthorized"}', status: 401)
109
+ assert_raises(WorkOS::AuthenticationError) do
110
+ @client.vault.send(spec[:name], **(spec[:args] || {}))
111
+ end
112
+ end
115
113
  end
116
114
 
115
+ # @oagen-ignore-start — client-side AES-GCM encrypt/decrypt tests (hand-maintained)
117
116
  def test_local_encrypt_then_decrypt_roundtrip
118
117
  plaintext_key = "k" * 32
119
118
  create_resp = {"context" => {"t" => "1"}, "id" => "dek_1",
@@ -125,7 +124,7 @@ class VaultTest < Minitest::Test
125
124
  stub_request(:post, "https://api.workos.com/vault/v1/keys/decrypt").to_return(status: 200, body: decrypt_resp.to_json)
126
125
 
127
126
  payload = "the quick brown fox"
128
- encrypted = @client.vault.encrypt(data: payload, key_context: {"t" => "1"})
127
+ encrypted = @client.vault.encrypt(data: payload, context: {"t" => "1"})
129
128
  refute_equal payload, encrypted
130
129
 
131
130
  plaintext = @client.vault.decrypt(encrypted_data: encrypted)
@@ -140,7 +139,7 @@ class VaultTest < Minitest::Test
140
139
  stub_request(:post, "https://api.workos.com/vault/v1/keys/data-key").to_return(status: 200, body: create_resp.to_json)
141
140
  stub_request(:post, "https://api.workos.com/vault/v1/keys/decrypt").to_return(status: 200, body: decrypt_resp.to_json)
142
141
 
143
- encrypted = @client.vault.encrypt(data: "secret", key_context: {}, associated_data: "tenant=42")
142
+ encrypted = @client.vault.encrypt(data: "secret", context: {}, associated_data: "tenant=42")
144
143
  plaintext = @client.vault.decrypt(encrypted_data: encrypted, associated_data: "tenant=42")
145
144
  assert_equal "secret", plaintext
146
145
 
@@ -148,4 +147,9 @@ class VaultTest < Minitest::Test
148
147
  @client.vault.decrypt(encrypted_data: encrypted, associated_data: "wrong")
149
148
  end
150
149
  end
150
+ # @oagen-ignore-end
151
+
152
+ # @oagen-ignore-start — client-side encrypt/decrypt test requires
153
+ require "base64"
154
+ # @oagen-ignore-end
151
155
  end
@@ -60,6 +60,17 @@ class WebhookVerifyTest < Minitest::Test
60
60
  assert_match(/Timestamp outside the tolerance zone/, err.message)
61
61
  end
62
62
 
63
+ def test_verify_header_raises_on_future_timestamp
64
+ payload = '{"x":1}'
65
+ future_ts = now_ms + (10 * 60 * 1000) # 10 minutes ahead
66
+ sig = OpenSSL::HMAC.hexdigest("SHA256", SECRET, "#{future_ts}.#{payload}")
67
+ header = "t=#{future_ts}, v1=#{sig}"
68
+ err = assert_raises(WorkOS::SignatureVerificationError) do
69
+ @webhooks.verify_header(payload: payload, sig_header: header, secret: SECRET, tolerance: 60)
70
+ end
71
+ assert_match(/Timestamp outside the tolerance zone/, err.message)
72
+ end
73
+
63
74
  def test_verify_header_raises_on_malformed_header
64
75
  assert_raises(WorkOS::SignatureVerificationError) do
65
76
  @webhooks.verify_header(payload: "{}", sig_header: "garbage", secret: SECRET)