auth0 5.2.0 → 5.6.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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/CHANGELOG.md +48 -0
  4. data/Gemfile +1 -0
  5. data/README.md +10 -8
  6. data/auth0.gemspec +2 -1
  7. data/lib/auth0/api/authentication_endpoints.rb +40 -16
  8. data/lib/auth0/api/v2/actions.rb +210 -0
  9. data/lib/auth0/api/v2/branding.rb +0 -1
  10. data/lib/auth0/api/v2/grants.rb +49 -0
  11. data/lib/auth0/api/v2/logs.rb +2 -2
  12. data/lib/auth0/api/v2/organizations.rb +19 -3
  13. data/lib/auth0/api/v2/roles.rb +7 -3
  14. data/lib/auth0/api/v2.rb +4 -0
  15. data/lib/auth0/exception.rb +12 -0
  16. data/lib/auth0/mixins/api_token_struct.rb +0 -1
  17. data/lib/auth0/mixins/httpproxy.rb +77 -34
  18. data/lib/auth0/mixins/initializer.rb +2 -3
  19. data/lib/auth0/mixins/token_management.rb +32 -0
  20. data/lib/auth0/mixins/validation.rb +1 -1
  21. data/lib/auth0/mixins.rb +2 -0
  22. data/lib/auth0/version.rb +1 -1
  23. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_change_password/should_trigger_a_password_reset.yml +53 -23
  24. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_incorrect_email.yml +49 -18
  25. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_incorrect_password.yml +49 -18
  26. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_invalid_audience.yml +46 -15
  27. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_login_successfully_with_a_custom_audience.yml +49 -79
  28. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_login_successfully_with_a_default_scope.yml +49 -80
  29. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_saml_metadata/should_retrieve_SAML_metadata.yml +74 -21
  30. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_userinfo/should_fail_as_not_authorized.yml +53 -14
  31. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_userinfo/should_return_the_userinfo.yml +106 -48
  32. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_wsfed_metadata/should_retrieve_WSFED_metadata.yml +62 -19
  33. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/create_test_user.yml +57 -22
  34. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/delete_test_user.yml +38 -20
  35. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Blacklists/_add_token_to_blacklist/should_add_a_token_to_the_blacklist.yml +37 -19
  36. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Blacklists/_blacklisted_tokens/should_get_the_added_token_from_the_blacklist.yml +38 -23
  37. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_at_least_1_result.yml +42 -26
  38. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_the_test_client_grant.yml +42 -26
  39. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_delete_client_grant/should_delete_the_test_client_grant.yml +38 -20
  40. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_patch_client_grant/should_update_the_test_client_grant.yml +39 -27
  41. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/create_test_client.yml +44 -82
  42. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/create_test_client_grant.yml +39 -27
  43. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/delete_test_client.yml +38 -20
  44. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/delete_test_client_grant.yml +38 -20
  45. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/_filters/should_exclude_and_include_fields_properly.yml +43 -56
  46. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/_filters/should_include_the_specified_fields.yml +39 -28
  47. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/should_get_the_test_client.yml +43 -57
  48. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_exclude_fields_not_specified.yml +43 -24
  49. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_exclude_the_specified_fields.yml +236 -96
  50. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_include_the_specified_fields.yml +52 -27
  51. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_paginate_results.yml +39 -25
  52. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/should_get_at_least_one_client.yml +235 -96
  53. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_delete_client/should_delete_the_test_client_without_an_error.yml +38 -20
  54. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_patch_client/should_update_the_client_with_the_correct_attributes.yml +43 -57
  55. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/create_test_client.yml +45 -82
  56. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/_filters/should_exclude_the_fields_indicated.yml +15 -16
  57. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/_filters/should_include_the_fields_indicated.yml +15 -16
  58. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/should_find_the_correct_connection.yml +15 -16
  59. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_include_previously-created_connection_when_filtered.yml +14 -15
  60. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_should_exclude_the_fields_indicated_from_filtered_results.yml +14 -15
  61. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_should_include_the_fields_indicated_from_filtered_results.yml +14 -15
  62. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/should_include_the_previously_created_connection.yml +15 -15
  63. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/should_not_be_empty.yml +15 -15
  64. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_delete_connection/should_delete_the_connection.yml +15 -16
  65. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_delete_connection_user/should_delete_the_user_created.yml +29 -27
  66. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_update_connection/should_update_the_connection.yml +15 -16
  67. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/create_test_connection.yml +16 -17
  68. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/create_test_user.yml +40 -32
  69. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/create_test_credential.yml +40 -30
  70. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/create_test_user.yml +40 -32
  71. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/delete_test_user.yml +38 -20
  72. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_configure_provider/should_configure_a_new_email_provider.yml +37 -28
  73. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_delete_provider/should_delete_the_existing_email_provider_without_an_error.yml +37 -19
  74. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_delete_provider/should_throw_an_error_trying_to_get_the_email_provider.yml +34 -16
  75. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/_filters/should_get_the_existing_email_provider_with_specific_fields.yml +36 -27
  76. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/_filters/should_get_the_existing_email_provider_without_specific_fields.yml +36 -28
  77. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/should_get_the_existing_email_provider.yml +36 -28
  78. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_update_provider/should_update_the_existing_email_provider.yml +36 -28
  79. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/delete_existing_provider.yml +37 -19
  80. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_export_users_and_get_job/should_create_an_export_users_job_successfully.yml +38 -23
  81. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_export_users_and_get_job/should_get_the_export_users_job.yml +76 -46
  82. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_import_users_and_get_job/should_create_an_import_users_job_successfully.yml +46 -25
  83. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_import_users_and_get_job/should_get_the_import_users_job.yml +84 -48
  84. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_create_a_new_verification_email_job.yml +77 -47
  85. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_get_the_completed_verification_email.yml +116 -71
  86. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_reject_an_invalid_client_id.yml +76 -39
  87. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/delete_imported_user.yml +76 -43
  88. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/search_for_connection_id.yml +43 -23
  89. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_log/should_match_the_created_log_entry.yml +224 -196
  90. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_log/should_not_be_empty.yml +224 -196
  91. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_exclude_fields_not_specified.yml +38 -25
  92. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_exclude_the_specified_fields.yml +39 -39
  93. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_have_one_log_entry.yml +41 -40
  94. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_include_the_specified_fields.yml +38 -26
  95. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_from/should_take_one_log_entry.yml +229 -189
  96. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/create_test_user.yml +40 -32
  97. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_disabled_rule.yml +38 -20
  98. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_enabled_rule.yml +38 -20
  99. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_user.yml +38 -20
  100. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_delete_resource_server/should_delete_the_test_server_without_an_error.yml +38 -20
  101. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_patch_resource_server/should_update_the_resource_server_with_the_correct_attributes.yml +39 -24
  102. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_server/should_get_the_test_server.yml +39 -24
  103. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_get_the_test_server.yml +146 -23
  104. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_return_at_least_1_result.yml +146 -23
  105. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_return_the_first_page_of_one_result.yml +131 -24
  106. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/create_test_server.yml +40 -25
  107. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/delete_test_server.yml +38 -20
  108. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_add_role_permissions/should_add_a_Permission_to_the_Role_successfully.yml +39 -32
  109. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_add_role_users/should_add_a_User_to_the_Role_successfully.yml +38 -31
  110. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_delete_role/should_delete_the_Role_successfully.yml +42 -30
  111. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role/should_get_the_Role_successfully.yml +38 -30
  112. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_permissions/should_get_exactly_1_Permission.yml +37 -30
  113. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_permissions/should_get_the_added_Permission_from_the_Role_successfully.yml +37 -30
  114. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_users/should_get_exactly_1_User.yml +37 -30
  115. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_users/should_get_the_added_User_from_the_Role_successfully.yml +37 -30
  116. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_roles/should_get_the_Role_successfully.yml +37 -29
  117. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_remove_role_permissions/should_remove_a_Permission_from_the_Role_successfully.yml +39 -29
  118. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_update_role/should_update_the_Role_successfully.yml +37 -30
  119. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_api.yml +38 -31
  120. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_role.yml +39 -31
  121. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_user.yml +38 -31
  122. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/delete_test_api.yml +36 -26
  123. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/delete_test_user.yml +36 -26
  124. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_delete_rule/should_delete_the_test_disabled_rule_without_an_error.yml +38 -20
  125. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_delete_rule/should_delete_the_test_enabled_rule_without_an_error.yml +38 -20
  126. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_exclude_the_fields_not_specified.yml +40 -27
  127. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_exclude_the_specified_fields.yml +40 -27
  128. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_include_the_specified_fields.yml +39 -26
  129. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/should_get_a_specific_rule.yml +40 -27
  130. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_exclude_fields_not_specified.yml +80 -24
  131. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_include_the_specified_fields.yml +82 -25
  132. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_at_least_1_disabled_rule.yml +59 -27
  133. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_at_least_1_enabled_rule.yml +68 -26
  134. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_paginated_results.yml +78 -49
  135. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/should_return_at_least_1_rule.yml +84 -28
  136. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_update_rule/should_update_the_disabled_rule_to_be_enabled.yml +40 -27
  137. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/create_test_disabled_rule.yml +42 -29
  138. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/create_test_enabled_rule.yml +42 -29
  139. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Stats/_active_users/should_have_at_least_one_active_user.yml +38 -23
  140. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Stats/_daily_stats/should_have_at_least_one_stats_entry_for_the_timeframe.yml +38 -27
  141. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings/should_get_the_tenant_settings.yml +72 -59
  142. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings_with_specific_fields/should_exclude_a_field_not_requested.yml +38 -25
  143. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings_with_specific_fields/should_include_the_field_requested.yml +38 -25
  144. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_update_tenant_settings/should_revert_the_tenant_name.yml +72 -58
  145. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_update_tenant_settings/should_update_the_tenant_settings_with_a_new_tenant_name.yml +72 -58
  146. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/_post_email_verification/should_create_an_email_verification_ticket.yml +39 -26
  147. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/_post_password_change/should_create_a_password_change_ticket.yml +39 -26
  148. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/create_test_user.yml +40 -32
  149. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/delete_test_user.yml +38 -20
  150. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_add_user_permissions/should_add_a_Permissions_for_a_User_successfully.yml +39 -35
  151. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_add_user_roles/should_add_a_Role_to_a_User_successfully.yml +37 -25
  152. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user/should_delete_the_User_successfully.yml +36 -24
  153. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user/should_delete_the_secondary_User_successfully.yml +36 -24
  154. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user_provider/should_attempt_to_delete_the_MFA_provider_for_the_User.yml +36 -24
  155. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_enrollments/should_get_Enrollments_for_a_User_successfully.yml +37 -28
  156. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_permissions/should_get_exactly_1_Permission_for_a_User_successfully.yml +37 -28
  157. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_permissions/should_get_the_correct_Permission_for_a_User_successfully.yml +37 -28
  158. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_roles/should_get_Roles_for_a_User_successfully.yml +38 -28
  159. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_invalidate_browsers/should_invalidate_MFA_browsers_for_the_User_successfully.yml +36 -24
  160. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_link_user_account/should_link_two_Users_successfully.yml +38 -29
  161. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_patch_user/should_patch_the_User_successfully.yml +38 -28
  162. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_remove_user_permissions/should_remove_a_Permission_from_a_User_successfully.yml +39 -27
  163. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_remove_user_roles/should_remove_a_Role_from_a_User_successfully.yml +39 -27
  164. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_unlink_user_account/should_unlink_two_Users_successfully.yml +37 -28
  165. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_exclude_fields_not_indicated.yml +37 -28
  166. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_exclude_the_fields_indicated.yml +37 -28
  167. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_include_the_fields_indicated.yml +37 -28
  168. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/should_retrieve_the_created_user.yml +37 -28
  169. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user_logs/should_get_Logs_for_a_User_successfully.yml +42 -30
  170. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/is_expected_to_find_a_user_with_a_v2_search_engine_query.yml +36 -27
  171. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/is_expected_to_find_a_user_with_a_v3_search_engine_query.yml +36 -27
  172. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_exclude_the_indicated_fields_when_paginated.yml +36 -27
  173. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_include_the_indicated_fields_when_paginated.yml +36 -27
  174. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_not_include_other_fields_when_paginated.yml +36 -27
  175. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_return_the_correct_number_of_results_when_paginated.yml +36 -27
  176. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/should_have_at_least_one_user.yml +37 -27
  177. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_secondary_test_user.yml +38 -29
  178. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_api.yml +38 -29
  179. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_role.yml +39 -29
  180. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_user.yml +38 -29
  181. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/delete_test_api.yml +36 -24
  182. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/delete_test_role.yml +42 -28
  183. data/spec/integration/lib/auth0/api/v2/api_client_grants_spec.rb +0 -9
  184. data/spec/integration/lib/auth0/api/v2/api_connections_spec.rb +3 -3
  185. data/spec/integration/lib/auth0/api/v2/api_email_spec.rb +0 -31
  186. data/spec/integration/lib/auth0/api/v2/api_jobs_spec.rb +4 -4
  187. data/spec/integration/lib/auth0/api/v2/api_logs_spec.rb +5 -5
  188. data/spec/integration/lib/auth0/api/v2/api_roles_spec.rb +3 -3
  189. data/spec/integration/lib/auth0/api/v2/api_tickets_spec.rb +4 -4
  190. data/spec/integration/lib/auth0/api/v2/api_user_blocks_spec.rb +8 -5
  191. data/spec/integration/lib/auth0/api/v2/api_users_spec.rb +6 -33
  192. data/spec/lib/auth0/api/v2/actions_spec.rb +312 -0
  193. data/spec/lib/auth0/api/v2/grants_spec.rb +91 -0
  194. data/spec/lib/auth0/api/v2/organizations_spec.rb +31 -6
  195. data/spec/lib/auth0/api/v2/roles_spec.rb +5 -1
  196. data/spec/lib/auth0/client_spec.rb +3 -3
  197. data/spec/lib/auth0/mixins/httpproxy_spec.rb +320 -25
  198. data/spec/lib/auth0/mixins/initializer_spec.rb +87 -0
  199. data/spec/lib/auth0/mixins/token_management_spec.rb +125 -0
  200. data/spec/spec_helper.rb +1 -1
  201. data/spec/support/dummy_class_for_proxy.rb +2 -2
  202. data/spec/support/dummy_class_for_tokens.rb +17 -0
  203. metadata +30 -30
  204. data/.yardoc/checksums +0 -22
  205. data/.yardoc/complete +0 -0
  206. data/.yardoc/object_types +0 -0
  207. data/.yardoc/objects/root.dat +0 -0
  208. data/.yardoc/proxy_types +0 -0
  209. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Anomaly/_check_if_ip_is_blocked/should_return_200_response_code.yml +0 -65
  210. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Anomaly/_remove_ip_block/should_remove_an_IP_successfully.yml +0 -60
  211. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_the_first_page_of_one_result.yml +0 -66
  212. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_delete_device_credential/should_delete_the_test_credential_without_an_error.yml +0 -54
  213. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/_filter_by_type/should_exclude_the_test_credential.yml +0 -59
  214. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/should_have_at_least_1_entry.yml +0 -62
  215. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/should_include_the_test_credential.yml +0 -62
  216. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/delete_test_credential.yml +0 -54
  217. data/spec/integration/lib/auth0/api/v2/api_anomaly_spec.rb +0 -17
  218. data/spec/integration/lib/auth0/api/v2/api_device_credentials_spec.rb +0 -128
@@ -5,6 +5,9 @@ describe Auth0::Mixins::HTTPProxy do
5
5
  before :each do
6
6
  dummy_instance = DummyClassForProxy.new
7
7
  dummy_instance.extend(Auth0::Mixins::HTTPProxy)
8
+ dummy_instance.base_uri = "https://auth0.com"
9
+ dummy_instance.retry_count = 0
10
+
8
11
  @instance = dummy_instance
9
12
  @exception = DummyClassForRestClient.new
10
13
  end
@@ -14,7 +17,7 @@ describe Auth0::Mixins::HTTPProxy do
14
17
  it { expect(@instance).to respond_to(http_method.to_sym) }
15
18
  it "should call send http #{http_method} method to path defined through HTTP" do
16
19
  expect(RestClient::Request).to receive(:execute).with(method: http_method,
17
- url: '/test',
20
+ url: 'https://auth0.com/test',
18
21
  timeout: nil,
19
22
  headers: { params: {} },
20
23
  payload: nil)
@@ -24,7 +27,7 @@ describe Auth0::Mixins::HTTPProxy do
24
27
 
25
28
  it 'should not raise exception if data returned not in json format (should be fixed in v2)' do
26
29
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
27
- url: '/test',
30
+ url: 'https://auth0.com/test',
28
31
  timeout: nil,
29
32
  headers: { params: {} },
30
33
  payload: nil)
@@ -36,7 +39,7 @@ describe Auth0::Mixins::HTTPProxy do
36
39
  it "should raise Auth0::Unauthorized on send http #{http_method}
37
40
  method to path defined through HTTP when 401 status received" do
38
41
  expect(RestClient::Request).to receive(:execute).with(method: http_method,
39
- url: '/test',
42
+ url: 'https://auth0.com/test',
40
43
  timeout: nil,
41
44
  headers: { params: {} },
42
45
  payload: nil)
@@ -47,7 +50,7 @@ describe Auth0::Mixins::HTTPProxy do
47
50
  it "should raise Auth0::NotFound on send http #{http_method} method
48
51
  to path defined through HTTP when 404 status received" do
49
52
  expect(RestClient::Request).to receive(:execute).with(method: http_method,
50
- url: '/test',
53
+ url: 'https://auth0.com/test',
51
54
  timeout: nil,
52
55
  headers: { params: {} },
53
56
  payload: nil)
@@ -58,7 +61,7 @@ describe Auth0::Mixins::HTTPProxy do
58
61
  it "should raise Auth0::Unsupported on send http #{http_method} method
59
62
  to path defined through HTTP when 418 or other unknown status received" do
60
63
  expect(RestClient::Request).to receive(:execute).with(method: http_method,
61
- url: '/test',
64
+ url: 'https://auth0.com/test',
62
65
  timeout: nil,
63
66
  headers: { params: {} },
64
67
  payload: nil)
@@ -69,7 +72,7 @@ describe Auth0::Mixins::HTTPProxy do
69
72
  it "should raise Auth0::RequestTimeout on send http #{http_method} method
70
73
  to path defined through HTTP when RestClient::RequestTimeout received" do
71
74
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
72
- url: '/test',
75
+ url: 'https://auth0.com/test',
73
76
  timeout: nil,
74
77
  headers: { params: {} },
75
78
  payload: nil)
@@ -81,7 +84,7 @@ describe Auth0::Mixins::HTTPProxy do
81
84
  to path defined through HTTP when 400 status received" do
82
85
  @exception.response = StubResponse.new({}, false, 400)
83
86
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
84
- url: '/test',
87
+ url: 'https://auth0.com/test',
85
88
  timeout: nil,
86
89
  headers: { params: {} },
87
90
  payload: nil)
@@ -93,7 +96,7 @@ describe Auth0::Mixins::HTTPProxy do
93
96
  to path defined through HTTP when 403" do
94
97
  @exception.response = StubResponse.new({}, false, 403)
95
98
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
96
- url: '/test',
99
+ url: 'https://auth0.com/test',
97
100
  timeout: nil,
98
101
  headers: { params: {} },
99
102
  payload: nil)
@@ -110,7 +113,7 @@ describe Auth0::Mixins::HTTPProxy do
110
113
  }
111
114
  @exception.response = StubResponse.new({}, false, 429, headers)
112
115
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
113
- url: '/test',
116
+ url: 'https://auth0.com/test',
114
117
  timeout: nil,
115
118
  headers: { params: {} },
116
119
  payload: nil)
@@ -133,7 +136,7 @@ describe Auth0::Mixins::HTTPProxy do
133
136
  to path defined through HTTP when 500 received" do
134
137
  @exception.response = StubResponse.new({}, false, 500)
135
138
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
136
- url: '/test',
139
+ url: 'https://auth0.com/test',
137
140
  timeout: nil,
138
141
  headers: { params: {} },
139
142
  payload: nil)
@@ -141,14 +144,108 @@ describe Auth0::Mixins::HTTPProxy do
141
144
  expect { @instance.send(http_method, '/test') }.to raise_error(Auth0::ServerError)
142
145
  end
143
146
 
144
- it 'should escape path with Addressable::URI.escape' do
147
+ it 'should normalize path with Addressable::URI' do
145
148
  expect(RestClient::Request).to receive(:execute).with(method: http_method,
146
- url: '/te%20st',
149
+ url: 'https://auth0.com/te%20st%23test',
147
150
  timeout: nil,
148
151
  headers: { params: {} },
149
152
  payload: nil)
150
153
  .and_return(StubResponse.new({}, true, 200))
151
- expect { @instance.send(http_method, '/te st') }.not_to raise_error
154
+ expect { @instance.send(http_method, '/te st#test') }.not_to raise_error
155
+ end
156
+
157
+ context "when status 429 is recieved on send http #{http_method} method" do
158
+ it "should retry 3 times when retry_count is not set" do
159
+ retry_instance = DummyClassForProxy.new
160
+ retry_instance.extend(Auth0::Mixins::HTTPProxy)
161
+ retry_instance.base_uri = "https://auth0.com"
162
+
163
+ @exception.response = StubResponse.new({}, false, 429)
164
+ allow(RestClient::Request).to receive(:execute).with(method: http_method,
165
+ url: 'https://auth0.com/test',
166
+ timeout: nil,
167
+ headers: { params: {} },
168
+ payload: nil)
169
+ .and_raise(@exception)
170
+ expect(RestClient::Request).to receive(:execute).exactly(4).times
171
+
172
+ expect { retry_instance.send(http_method, '/test') }.to raise_error { |error|
173
+ expect(error).to be_a(Auth0::RateLimitEncountered)
174
+ }
175
+ end
176
+
177
+ it "should retry 2 times when retry_count is set to 2" do
178
+ retry_instance = DummyClassForProxy.new
179
+ retry_instance.extend(Auth0::Mixins::HTTPProxy)
180
+ retry_instance.base_uri = "https://auth0.com"
181
+ retry_instance.retry_count = 2
182
+
183
+ @exception.response = StubResponse.new({}, false, 429)
184
+ allow(RestClient::Request).to receive(:execute).with(method: http_method,
185
+ url: 'https://auth0.com/test',
186
+ timeout: nil,
187
+ headers: { params: {} },
188
+ payload: nil)
189
+ .and_raise(@exception)
190
+ expect(RestClient::Request).to receive(:execute).exactly(3).times
191
+
192
+ expect { retry_instance.send(http_method, '/test') }.to raise_error { |error|
193
+ expect(error).to be_a(Auth0::RateLimitEncountered)
194
+ }
195
+ end
196
+
197
+ it "should not retry when retry_count is set to 0" do
198
+ retry_instance = DummyClassForProxy.new
199
+ retry_instance.extend(Auth0::Mixins::HTTPProxy)
200
+ retry_instance.base_uri = "https://auth0.com"
201
+ retry_instance.retry_count = 0
202
+
203
+ @exception.response = StubResponse.new({}, false, 429)
204
+
205
+ allow(RestClient::Request).to receive(:execute).with(method: http_method,
206
+ url: 'https://auth0.com/test',
207
+ timeout: nil,
208
+ headers: { params: {} },
209
+ payload: nil)
210
+ .and_raise(@exception)
211
+
212
+ expect(RestClient::Request).to receive(:execute).exactly(1).times
213
+ expect { retry_instance.send(http_method, '/test') }.to raise_error { |error|
214
+ expect(error).to be_a(Auth0::RateLimitEncountered)
215
+ }
216
+ end
217
+
218
+ it "should have have random retry times grow with jitter backoff" do
219
+ retry_instance = DummyClassForProxy.new
220
+ retry_instance.extend(Auth0::Mixins::HTTPProxy)
221
+ retry_instance.base_uri = "https://auth0.com"
222
+ retry_instance.retry_count = 2
223
+ time_entries = []
224
+ @time_start
225
+
226
+ @exception.response = StubResponse.new({}, false, 429)
227
+ allow(RestClient::Request).to receive(:execute).with(method: http_method,
228
+ url: 'https://auth0.com/test',
229
+ timeout: nil,
230
+ headers: { params: {} },
231
+ payload: nil) do
232
+
233
+ time_entries.push(Time.now.to_f - @time_start.to_f)
234
+ @time_start = Time.now.to_f # restart the clock
235
+ raise @exception
236
+ end
237
+
238
+ @time_start = Time.now.to_f #start the clock
239
+ retry_instance.send(http_method, '/test') rescue nil
240
+ time_entries_first_set = time_entries.shift(time_entries.length)
241
+
242
+ retry_instance.send(http_method, '/test') rescue nil
243
+ time_entries.each_with_index do |entry, index|
244
+ if index > 0 #skip the first request
245
+ expect(entry != time_entries_first_set[index])
246
+ end
247
+ end
248
+ end
152
249
  end
153
250
  end
154
251
  end
@@ -158,7 +255,7 @@ describe Auth0::Mixins::HTTPProxy do
158
255
  it { expect(@instance).to respond_to(http_method.to_sym) }
159
256
  it "should call send http #{http_method} method to path defined through HTTP" do
160
257
  expect(RestClient::Request).to receive(:execute).with(method: http_method,
161
- url: '/test',
258
+ url: 'https://auth0.com/test',
162
259
  timeout: nil,
163
260
  headers: nil,
164
261
  payload: '{}')
@@ -168,7 +265,7 @@ describe Auth0::Mixins::HTTPProxy do
168
265
 
169
266
  it 'should not raise exception if data returned not in json format (should be fixed in v2)' do
170
267
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
171
- url: '/test',
268
+ url: 'https://auth0.com/test',
172
269
  timeout: nil,
173
270
  headers: nil,
174
271
  payload: '{}')
@@ -181,7 +278,7 @@ describe Auth0::Mixins::HTTPProxy do
181
278
  to path defined through HTTP when 401 status received" do
182
279
  @exception.response = StubResponse.new({}, false, 401)
183
280
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
184
- url: '/test',
281
+ url: 'https://auth0.com/test',
185
282
  timeout: nil,
186
283
  headers: nil,
187
284
  payload: '{}')
@@ -198,7 +295,7 @@ describe Auth0::Mixins::HTTPProxy do
198
295
  }
199
296
  @exception.response = StubResponse.new({}, false, 429,headers)
200
297
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
201
- url: '/test',
298
+ url: 'https://auth0.com/test',
202
299
  timeout: nil,
203
300
  headers: nil,
204
301
  payload: '{}')
@@ -221,7 +318,7 @@ describe Auth0::Mixins::HTTPProxy do
221
318
  to path defined through HTTP when 404 status received" do
222
319
  @exception.response = StubResponse.new({}, false, 404)
223
320
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
224
- url: '/test',
321
+ url: 'https://auth0.com/test',
225
322
  timeout: nil,
226
323
  headers: nil,
227
324
  payload: '{}')
@@ -233,7 +330,7 @@ describe Auth0::Mixins::HTTPProxy do
233
330
  to path defined through HTTP when 418 or other unknown status received" do
234
331
  @exception.response = StubResponse.new({}, false, 418)
235
332
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
236
- url: '/test',
333
+ url: 'https://auth0.com/test',
237
334
  timeout: nil,
238
335
  headers: nil,
239
336
  payload: '{}')
@@ -244,7 +341,7 @@ describe Auth0::Mixins::HTTPProxy do
244
341
  it "should raise Auth0::RequestTimeout on send http #{http_method} method
245
342
  to path defined through HTTP when RestClient::RequestTimeout received" do
246
343
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
247
- url: '/test',
344
+ url: 'https://auth0.com/test',
248
345
  timeout: nil,
249
346
  headers: nil,
250
347
  payload: '{}')
@@ -256,7 +353,7 @@ describe Auth0::Mixins::HTTPProxy do
256
353
  to path defined through HTTP when 400 status received" do
257
354
  @exception.response = StubResponse.new({}, false, 400)
258
355
  allow(RestClient::Request).to receive(:execute).with(method: http_method,
259
- url: '/test',
356
+ url: 'https://auth0.com/test',
260
357
  timeout: nil,
261
358
  headers: nil,
262
359
  payload: '{}')
@@ -267,7 +364,7 @@ describe Auth0::Mixins::HTTPProxy do
267
364
  it "should raise Auth0::ServerError on send http #{http_method} method
268
365
  to path defined through HTTP when 500 received" do
269
366
  @exception.response = StubResponse.new({}, false, 500)
270
- allow(RestClient::Request).to receive(:execute).with(method: http_method, url: '/test',
367
+ allow(RestClient::Request).to receive(:execute).with(method: http_method, url: 'https://auth0.com/test',
271
368
  timeout: nil,
272
369
  headers: nil,
273
370
  payload: '{}')
@@ -275,9 +372,9 @@ describe Auth0::Mixins::HTTPProxy do
275
372
  expect { @instance.send(http_method, '/test') }.to raise_error(Auth0::ServerError)
276
373
  end
277
374
 
278
- it 'should escape path with Addressable::URI.escape' do
375
+ it 'should normalize path with Addressable::URI' do
279
376
  expect(RestClient::Request).to receive(:execute).with(method: http_method,
280
- url: '/te%20st',
377
+ url: 'https://auth0.com/te%20st',
281
378
  timeout: nil,
282
379
  headers: nil,
283
380
  payload: '{}')
@@ -292,13 +389,211 @@ describe Auth0::Mixins::HTTPProxy do
292
389
  3241312' on property id (The user_id of the user to retrieve).",
293
390
  'errorCode' => 'invalid_uri')
294
391
  expect(RestClient::Request).to receive(:execute).with(method: http_method,
295
- url: '/test',
392
+ url: 'https://auth0.com/test',
296
393
  timeout: nil,
297
394
  headers: nil,
298
395
  payload: '{}')
299
396
  .and_return(StubResponse.new(res, true, 404))
300
397
  expect { @instance.send(http_method, '/test') }.to raise_error(Auth0::NotFound, res)
301
398
  end
399
+
400
+ context "when status 429 is recieved on send http #{http_method} method" do
401
+ it "should retry 3 times when retry_count is not set" do
402
+ retry_instance = DummyClassForProxy.new
403
+ retry_instance.extend(Auth0::Mixins::HTTPProxy)
404
+ retry_instance.base_uri = "https://auth0.com"
405
+
406
+ @exception.response = StubResponse.new({}, false, 429)
407
+ allow(RestClient::Request).to receive(:execute).with(method: http_method,
408
+ url: 'https://auth0.com/test',
409
+ timeout: nil,
410
+ headers: nil,
411
+ payload: '{}')
412
+ .and_raise(@exception)
413
+ expect(RestClient::Request).to receive(:execute).exactly(4).times
414
+
415
+ expect { retry_instance.send(http_method, '/test') }.to raise_error { |error|
416
+ expect(error).to be_a(Auth0::RateLimitEncountered)
417
+ }
418
+ end
419
+
420
+ it "should retry 2 times when retry_count is set to 2" do
421
+ retry_instance = DummyClassForProxy.new
422
+ retry_instance.extend(Auth0::Mixins::HTTPProxy)
423
+ retry_instance.base_uri = "https://auth0.com"
424
+ retry_instance.retry_count = 2
425
+
426
+ @exception.response = StubResponse.new({}, false, 429)
427
+ allow(RestClient::Request).to receive(:execute).with(method: http_method,
428
+ url: 'https://auth0.com/test',
429
+ timeout: nil,
430
+ headers: nil,
431
+ payload: '{}')
432
+ .and_raise(@exception)
433
+ expect(RestClient::Request).to receive(:execute).exactly(3).times
434
+
435
+ expect { retry_instance.send(http_method, '/test') }.to raise_error { |error|
436
+ expect(error).to be_a(Auth0::RateLimitEncountered)
437
+ }
438
+ end
439
+
440
+ it "should not retry when retry_count is set to 0" do
441
+ retry_instance = DummyClassForProxy.new
442
+ retry_instance.extend(Auth0::Mixins::HTTPProxy)
443
+ retry_instance.base_uri = "https://auth0.com"
444
+ retry_instance.retry_count = 0
445
+
446
+ @exception.response = StubResponse.new({}, false, 429)
447
+
448
+ allow(RestClient::Request).to receive(:execute).with(method: http_method,
449
+ url: 'https://auth0.com/test',
450
+ timeout: nil,
451
+ headers: nil,
452
+ payload: '{}')
453
+ .and_raise(@exception)
454
+
455
+ expect(RestClient::Request).to receive(:execute).exactly(1).times
456
+ expect { retry_instance.send(http_method, '/test') }.to raise_error { |error|
457
+ expect(error).to be_a(Auth0::RateLimitEncountered)
458
+ }
459
+ end
460
+
461
+ it "should have have random retry times grow with jitter backoff" do
462
+ retry_instance = DummyClassForProxy.new
463
+ retry_instance.extend(Auth0::Mixins::HTTPProxy)
464
+ retry_instance.base_uri = "https://auth0.com"
465
+ retry_instance.retry_count = 2
466
+ time_entries = []
467
+ @time_start
468
+
469
+ @exception.response = StubResponse.new({}, false, 429)
470
+ allow(RestClient::Request).to receive(:execute).with(method: http_method,
471
+ url: 'https://auth0.com/test',
472
+ timeout: nil,
473
+ headers: nil,
474
+ payload: '{}') do
475
+
476
+ time_entries.push(Time.now.to_f - @time_start.to_f)
477
+ @time_start = Time.now.to_f # restart the clock
478
+ raise @exception
479
+ end
480
+
481
+ @time_start = Time.now.to_f #start the clock
482
+ retry_instance.send(http_method, '/test') rescue nil
483
+ time_entries_first_set = time_entries.shift(time_entries.length)
484
+
485
+ retry_instance.send(http_method, '/test') rescue nil
486
+ time_entries.each_with_index do |entry, index|
487
+ if index > 0 #skip the first request
488
+ expect(entry != time_entries_first_set[index])
489
+ end
490
+ end
491
+ end
492
+ end
493
+ end
494
+ end
495
+
496
+ context "Renewing tokens" do
497
+ before :each do
498
+ @token_instance = DummyClassForTokens.new(
499
+ client_id: 'test-client-id',
500
+ client_secret: 'test-client-secret',
501
+ domain: 'auth0.com')
502
+ end
503
+
504
+ %i(get delete).each do |http_method|
505
+ context "for #{http_method}" do
506
+ it 'should renew the token' do
507
+ expect(RestClient::Request).to receive(:execute).with(hash_including(
508
+ method: :post,
509
+ url: 'https://auth0.com/oauth/token',
510
+ ) ).and_return(StubResponse.new({
511
+ "access_token" => "access_token",
512
+ "expires_in" => 86400},
513
+ true,
514
+ 200))
515
+
516
+ expect(RestClient::Request).to receive(:execute).with(hash_including(
517
+ method: http_method,
518
+ url: 'https://auth0.com/test',
519
+ headers: { params: {}, "Authorization" => "Bearer access_token" }
520
+ )).and_return(StubResponse.new('Some random text here', true, 200))
521
+
522
+ expect { @token_instance.send(http_method, '/test') }.not_to raise_error
523
+ end
524
+ end
525
+ end
526
+
527
+ %i(post put patch).each do |http_method|
528
+ context "for #{http_method}" do
529
+ it 'should renew the token' do
530
+ expect(RestClient::Request).to receive(:execute).with(hash_including(
531
+ method: :post,
532
+ url: 'https://auth0.com/oauth/token',
533
+ ) ).and_return(StubResponse.new({
534
+ "access_token" => "access_token",
535
+ "expires_in" => 86400},
536
+ true,
537
+ 200))
538
+
539
+ expect(RestClient::Request).to receive(:execute).with(hash_including(
540
+ method: http_method,
541
+ url: 'https://auth0.com/test',
542
+ headers: { "Authorization" => "Bearer access_token" }
543
+ )).and_return(StubResponse.new('Some random text here', true, 200))
544
+
545
+ expect { @token_instance.send(http_method, '/test') }.not_to raise_error
546
+ end
547
+ end
548
+ end
549
+ end
550
+
551
+ context "Using cached tokens" do
552
+ before :each do
553
+ @token_instance = DummyClassForTokens.new(
554
+ client_id: 'test-client-id',
555
+ client_secret: 'test-client-secret',
556
+ domain: 'auth0.com',
557
+ token: 'access_token',
558
+ token_expires_at: Time.now.to_i + 86400)
559
+ end
560
+
561
+ %i(get delete).each do |http_method|
562
+ context "for #{http_method}" do
563
+ it 'should use the cached token' do
564
+ expect(RestClient::Request).not_to receive(:execute).with(hash_including(
565
+ method: :post,
566
+ url: 'https://auth0.com/oauth/token',
567
+ ))
568
+
569
+ expect(RestClient::Request).to receive(:execute).with(hash_including(
570
+ method: http_method,
571
+ url: 'https://auth0.com/test',
572
+ headers: { params: {}, "Authorization" => "Bearer access_token" }
573
+ )).and_return(StubResponse.new('Some random text here', true, 200))
574
+
575
+ expect { @token_instance.send(http_method, '/test') }.not_to raise_error
576
+ end
577
+ end
578
+ end
579
+
580
+ %i(post put patch).each do |http_method|
581
+ context "for #{http_method}" do
582
+ it 'should use the cached token' do
583
+ expect(RestClient::Request).not_to receive(:execute).with(hash_including(
584
+ method: :post,
585
+ url: 'https://auth0.com/oauth/token',
586
+ ))
587
+
588
+ expect(RestClient::Request).to receive(:execute).with(hash_including(
589
+ method: http_method,
590
+ url: 'https://auth0.com/test',
591
+ headers: { "Authorization" => "Bearer access_token" }
592
+ )).and_return(StubResponse.new('Some random text here', true, 200))
593
+
594
+ expect { @token_instance.send(http_method, '/test') }.not_to raise_error
595
+ end
596
+ end
302
597
  end
303
598
  end
304
599
  end
@@ -1,18 +1,36 @@
1
1
  require 'spec_helper'
2
+ require 'timecop'
2
3
 
3
4
  class MockClass
4
5
  attr_reader :token
5
6
  include Auth0::Mixins::Initializer
6
7
  include Auth0::Mixins::HTTPProxy
7
8
  include Auth0::Mixins::Headers
9
+ include Auth0::Mixins::TokenManagement
8
10
  end
9
11
 
10
12
  describe Auth0::Mixins::Initializer do
11
13
  let(:params) { { namespace: 'samples.auth0.com' } }
12
14
  let(:instance) { DummyClassForProxy.send(:include, described_class).new(params) }
15
+ let(:time_now) { Time.now }
16
+
13
17
  context 'api v2' do
18
+ it 'sets retry_count when passed' do
19
+ params[:token] = '123'
20
+ params[:retry_count] = 10
21
+
22
+ expect(instance.instance_variable_get('@retry_count')).to eq(10)
23
+ end
24
+ end
25
+
26
+ context 'token initialization' do
14
27
  before do
15
28
  params[:api_version] = 2
29
+ Timecop.freeze(time_now)
30
+ end
31
+
32
+ after do
33
+ Timecop.return
16
34
  end
17
35
 
18
36
  it 'sets token when access_token is passed' do
@@ -26,5 +44,74 @@ describe Auth0::Mixins::Initializer do
26
44
 
27
45
  expect(instance.instance_variable_get('@token')).to eq('123')
28
46
  end
47
+
48
+ it 'fetches a token if none was given' do
49
+ params[:client_id] = client_id = 'test_client_id'
50
+ params[:client_secret] = client_secret = 'test_client_secret'
51
+ params[:api_identifier] = api_identifier = 'test'
52
+
53
+ payload = {
54
+ grant_type: 'client_credentials',
55
+ client_id: client_id,
56
+ client_secret: client_secret,
57
+ audience: api_identifier
58
+ }
59
+
60
+ expect(RestClient::Request).to receive(:execute).with(hash_including(
61
+ method: :post,
62
+ url: 'https://samples.auth0.com/oauth/token',
63
+ payload: payload.to_json
64
+ ))
65
+ .and_return(StubResponse.new({
66
+ "access_token" => "test",
67
+ "expires_in" => 86400},
68
+ true,
69
+ 200))
70
+
71
+ expect(instance.instance_variable_get('@token')).to eq('test')
72
+ expect(instance.instance_variable_get('@token_expires_at')).to eq(time_now.to_i + 86400)
73
+ end
74
+
75
+ it "doesn't get a new token if one was supplied using 'token'" do
76
+ params[:token] = 'access-token'
77
+
78
+ expect(RestClient::Request).not_to receive(:execute).with(hash_including(
79
+ method: :post,
80
+ url: 'https://samples.auth0.com/oauth/token',
81
+ ))
82
+
83
+ expect(instance.instance_variable_get('@token')).to eq('access-token')
84
+ expect(instance.instance_variable_get('@token_expires_at')).to eq(Time.now.to_i + 3600)
85
+ end
86
+
87
+ it "doesn't get a new token if one was supplied using 'access_token'" do
88
+ params[:access_token] = 'access-token'
89
+
90
+ expect(RestClient::Request).not_to receive(:execute).with(hash_including(
91
+ method: :post,
92
+ url: 'https://samples.auth0.com/oauth/token',
93
+ ))
94
+
95
+ expect(instance.instance_variable_get('@token')).to eq('access-token')
96
+ expect(instance.instance_variable_get('@token_expires_at')).to eq(Time.now.to_i + 3600)
97
+ end
98
+
99
+ it 'can supply token_expires_at option' do
100
+ params[:token] = 'access-token'
101
+ params[:token_expires_at] = time_now.to_i + 300
102
+
103
+ expect(RestClient::Request).not_to receive(:execute).with(hash_including(
104
+ method: :post,
105
+ url: 'https://samples.auth0.com/oauth/token',
106
+ ))
107
+
108
+ expect(instance.instance_variable_get('@token')).to eq('access-token')
109
+ expect(instance.instance_variable_get('@token_expires_at')).to eq(time_now.to_i + 300)
110
+ end
111
+
112
+ it 'throws if no token or credentials were given' do
113
+ params[:client_id] = 'test-client-id'
114
+ expect { instance }.to raise_error(Auth0::InvalidCredentials)
115
+ end
29
116
  end
30
117
  end