brightbox-cli 3.2.0 → 4.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 (418) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -0
  3. data/.github/workflows/ruby.yml +1 -1
  4. data/.gitignore +1 -1
  5. data/.rubocop.yml +70 -0
  6. data/CHANGELOG.md +71 -0
  7. data/Gemfile.lock +71 -42
  8. data/README +57 -33
  9. data/README.rdoc +1 -1
  10. data/brightbox-cli.gemspec +20 -33
  11. data/lib/brightbox-cli/accounts.rb +9 -11
  12. data/lib/brightbox-cli/api.rb +38 -36
  13. data/lib/brightbox-cli/cloud_ips.rb +8 -8
  14. data/lib/brightbox-cli/collaborating_account.rb +5 -5
  15. data/lib/brightbox-cli/collaboration.rb +1 -1
  16. data/lib/brightbox-cli/commands/accounts/{accept-invite.rb → accept_invite.rb} +2 -6
  17. data/lib/brightbox-cli/commands/accounts/default.rb +1 -2
  18. data/lib/brightbox-cli/commands/accounts/list.rb +6 -8
  19. data/lib/brightbox-cli/commands/accounts/remove.rb +2 -6
  20. data/lib/brightbox-cli/commands/accounts/{reset-ftp-password.rb → reset_ftp_password.rb} +6 -9
  21. data/lib/brightbox-cli/commands/accounts/show.rb +10 -13
  22. data/lib/brightbox-cli/commands/cloudips/create.rb +2 -5
  23. data/lib/brightbox-cli/commands/cloudips/destroy.rb +10 -14
  24. data/lib/brightbox-cli/commands/cloudips/list.rb +0 -2
  25. data/lib/brightbox-cli/commands/cloudips/map.rb +10 -13
  26. data/lib/brightbox-cli/commands/cloudips/show.rb +11 -14
  27. data/lib/brightbox-cli/commands/cloudips/unmap.rb +2 -4
  28. data/lib/brightbox-cli/commands/cloudips/update.rb +2 -4
  29. data/lib/brightbox-cli/commands/collaborations.rb +2 -3
  30. data/lib/brightbox-cli/commands/config/{client-add.rb → client_add.rb} +0 -3
  31. data/lib/brightbox-cli/commands/config/client_default.rb +18 -0
  32. data/lib/brightbox-cli/commands/config/{client-list.rb → client_list.rb} +1 -4
  33. data/lib/brightbox-cli/commands/config/{client-remove.rb → client_remove.rb} +0 -3
  34. data/lib/brightbox-cli/commands/config/{user-add.rb → user_add.rb} +1 -4
  35. data/lib/brightbox-cli/commands/firewall/{policies-apply.rb → policies_apply.rb} +2 -2
  36. data/lib/brightbox-cli/commands/firewall/{policies-create.rb → policies_create.rb} +2 -4
  37. data/lib/brightbox-cli/commands/firewall/{policies-destroy.rb → policies_destroy.rb} +0 -3
  38. data/lib/brightbox-cli/commands/firewall/{policies-list.rb → policies_list.rb} +0 -2
  39. data/lib/brightbox-cli/commands/firewall/{policies-remove.rb → policies_remove.rb} +2 -2
  40. data/lib/brightbox-cli/commands/firewall/{policies-show.rb → policies_show.rb} +6 -8
  41. data/lib/brightbox-cli/commands/firewall/{policies-update.rb → policies_update.rb} +2 -4
  42. data/lib/brightbox-cli/commands/firewall/{rules-create.rb → rules_create.rb} +6 -8
  43. data/lib/brightbox-cli/commands/firewall/{rules-destroy.rb → rules_destroy.rb} +0 -2
  44. data/lib/brightbox-cli/commands/firewall/{rules-list.rb → rules_list.rb} +0 -2
  45. data/lib/brightbox-cli/commands/firewall/{rules-show.rb → rules_show.rb} +7 -9
  46. data/lib/brightbox-cli/commands/firewall/{rules-update.rb → rules_update.rb} +7 -8
  47. data/lib/brightbox-cli/commands/groups/{add-server.rb → add_server.rb} +0 -2
  48. data/lib/brightbox-cli/commands/groups/create.rb +2 -3
  49. data/lib/brightbox-cli/commands/groups/destroy.rb +0 -2
  50. data/lib/brightbox-cli/commands/groups/list.rb +0 -1
  51. data/lib/brightbox-cli/commands/groups/move_servers.rb +2 -3
  52. data/lib/brightbox-cli/commands/groups/{remove-servers.rb → remove_servers.rb} +2 -4
  53. data/lib/brightbox-cli/commands/groups/show.rb +0 -2
  54. data/lib/brightbox-cli/commands/groups/update.rb +2 -3
  55. data/lib/brightbox-cli/commands/images/destroy.rb +0 -4
  56. data/lib/brightbox-cli/commands/images/list.rb +3 -5
  57. data/lib/brightbox-cli/commands/images/register.rb +9 -17
  58. data/lib/brightbox-cli/commands/images/show.rb +19 -20
  59. data/lib/brightbox-cli/commands/images/update.rb +12 -8
  60. data/lib/brightbox-cli/commands/lbs/{add-nodes.rb → add_nodes.rb} +0 -3
  61. data/lib/brightbox-cli/commands/lbs/create.rb +5 -7
  62. data/lib/brightbox-cli/commands/lbs/destroy.rb +0 -3
  63. data/lib/brightbox-cli/commands/lbs/list.rb +0 -1
  64. data/lib/brightbox-cli/commands/lbs/{remove-nodes.rb → remove_nodes.rb} +0 -3
  65. data/lib/brightbox-cli/commands/lbs/show.rb +20 -22
  66. data/lib/brightbox-cli/commands/lbs/update.rb +6 -9
  67. data/lib/brightbox-cli/commands/login.rb +13 -12
  68. data/lib/brightbox-cli/commands/servers/{activate-console.rb → activate_console.rb} +2 -5
  69. data/lib/brightbox-cli/commands/servers/create.rb +24 -25
  70. data/lib/brightbox-cli/commands/servers/destroy.rb +0 -3
  71. data/lib/brightbox-cli/commands/servers/list.rb +4 -5
  72. data/lib/brightbox-cli/commands/servers/show.rb +0 -2
  73. data/lib/brightbox-cli/commands/servers/shutdown.rb +0 -3
  74. data/lib/brightbox-cli/commands/servers/snapshot.rb +0 -4
  75. data/lib/brightbox-cli/commands/servers/start.rb +0 -4
  76. data/lib/brightbox-cli/commands/servers/stop.rb +0 -3
  77. data/lib/brightbox-cli/commands/servers/update.rb +5 -5
  78. data/lib/brightbox-cli/commands/sql/instances_create.rb +3 -6
  79. data/lib/brightbox-cli/commands/sql/instances_destroy.rb +0 -2
  80. data/lib/brightbox-cli/commands/sql/instances_list.rb +7 -9
  81. data/lib/brightbox-cli/commands/sql/instances_reset_password.rb +0 -1
  82. data/lib/brightbox-cli/commands/sql/instances_show.rb +0 -3
  83. data/lib/brightbox-cli/commands/sql/instances_snapshot.rb +0 -3
  84. data/lib/brightbox-cli/commands/sql/instances_update.rb +1 -3
  85. data/lib/brightbox-cli/commands/sql/snapshots_destroy.rb +0 -3
  86. data/lib/brightbox-cli/commands/sql/snapshots_list.rb +7 -9
  87. data/lib/brightbox-cli/commands/sql/snapshots_show.rb +12 -10
  88. data/lib/brightbox-cli/commands/sql/snapshots_update.rb +1 -3
  89. data/lib/brightbox-cli/commands/sql/types.rb +8 -15
  90. data/lib/brightbox-cli/commands/token.rb +0 -1
  91. data/lib/brightbox-cli/commands/types.rb +8 -14
  92. data/lib/brightbox-cli/commands/{user-collaborations.rb → user_collaborations.rb} +7 -8
  93. data/lib/brightbox-cli/commands/users/list.rb +0 -2
  94. data/lib/brightbox-cli/commands/users/show.rb +1 -3
  95. data/lib/brightbox-cli/commands/users/update.rb +3 -6
  96. data/lib/brightbox-cli/commands/zones.rb +7 -10
  97. data/lib/brightbox-cli/config/accounts.rb +18 -26
  98. data/lib/brightbox-cli/config/api_client.rb +12 -16
  99. data/lib/brightbox-cli/config/authentication_tokens.rb +39 -42
  100. data/lib/brightbox-cli/config/cache.rb +1 -0
  101. data/lib/brightbox-cli/config/clients.rb +8 -8
  102. data/lib/brightbox-cli/config/gpg_encrypted_passwords.rb +6 -8
  103. data/lib/brightbox-cli/config/password_helper.rb +33 -8
  104. data/lib/brightbox-cli/config/sections.rb +45 -29
  105. data/lib/brightbox-cli/config/two_factor_auth.rb +12 -11
  106. data/lib/brightbox-cli/config/two_factor_helper.rb +36 -0
  107. data/lib/brightbox-cli/config/user_application.rb +18 -18
  108. data/lib/brightbox-cli/config.rb +27 -23
  109. data/lib/brightbox-cli/connection_manager.rb +4 -2
  110. data/lib/brightbox-cli/database_server.rb +28 -29
  111. data/lib/brightbox-cli/database_snapshot.rb +1 -1
  112. data/lib/brightbox-cli/database_type.rb +6 -6
  113. data/lib/brightbox-cli/detailed_server.rb +43 -43
  114. data/lib/brightbox-cli/detailed_server_group.rb +1 -1
  115. data/lib/brightbox-cli/error_parser.rb +9 -9
  116. data/lib/brightbox-cli/firewall_policy.rb +2 -1
  117. data/lib/brightbox-cli/firewall_rule.rb +3 -3
  118. data/lib/brightbox-cli/firewall_rules.rb +3 -3
  119. data/lib/brightbox-cli/gli_global_hooks.rb +25 -27
  120. data/lib/brightbox-cli/images.rb +14 -12
  121. data/lib/brightbox-cli/load_balancers.rb +3 -6
  122. data/lib/brightbox-cli/logging.rb +14 -14
  123. data/lib/brightbox-cli/nilable_hash.rb +1 -1
  124. data/lib/brightbox-cli/ruby_core_ext.rb +3 -3
  125. data/lib/brightbox-cli/server_groups.rb +2 -2
  126. data/lib/brightbox-cli/servers.rb +6 -6
  127. data/lib/brightbox-cli/tables.rb +13 -15
  128. data/lib/brightbox-cli/types.rb +6 -6
  129. data/lib/brightbox-cli/user_collaboration.rb +5 -7
  130. data/lib/brightbox-cli/users.rb +1 -1
  131. data/lib/brightbox-cli/version.rb +1 -1
  132. data/lib/brightbox-cli/zones.rb +1 -1
  133. data/lib/brightbox_cli.rb +34 -33
  134. data/spec/brightbox_spec.rb +0 -1
  135. data/spec/cassettes/Brightbox_Account/_all/when_connected_using_an_application/returns_a_collection_of_Accounts.yml +5 -5
  136. data/spec/cassettes/Brightbox_Account/_all/when_connected_using_an_application/returns_resources_on_the_same_connection.yml +2 -2
  137. data/spec/cassettes/Brightbox_Account/_all/when_connected_using_an_client/returns_a_collection_of_Accounts.yml +4 -4
  138. data/spec/cassettes/Brightbox_Account/_all/when_connected_using_an_client/returns_resources_on_the_same_connection.yml +2 -2
  139. data/spec/cassettes/Brightbox_BBConfig/_add_section/when_config_exists_and_overwrite_duplicates_is_false/does_not_update_the_config_file.yml +12 -12
  140. data/spec/cassettes/Brightbox_BBConfig/_add_section/when_config_exists_and_overwrite_duplicates_is_true/does_not_update_the_config_file.yml +12 -12
  141. data/spec/cassettes/Brightbox_BBConfig/_add_section/when_first_and_only_client/saves_changes_to_the_config_file.yml +2 -2
  142. data/spec/cassettes/Brightbox_BBConfig/_add_section/when_first_and_only_client/saves_the_default_account.yml +2 -2
  143. data/spec/cassettes/Brightbox_BBConfig/_add_section/when_first_and_only_client/saves_the_new_client_as_the_default.yml +2 -2
  144. data/spec/cassettes/Brightbox_BBConfig/_find_or_set_default_account/when_client_is_not_authenticated/does_not_raise_an_error.yml +8 -8
  145. data/spec/cassettes/Brightbox_BBConfig/_find_or_set_default_account/when_client_may_access_one_account/updates_the_setting.yml +8 -8
  146. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_config_in_use_is_not_the_default/uses_correct_credentials.yml +1 -1
  147. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_using_a_user_app_with_a_cached_refresh_token/caches_the_new_tokens.yml +1 -1
  148. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_using_a_user_app_with_an_expired_refresh_token/caches_the_new_tokens.yml +2 -2
  149. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_using_a_user_app_with_no_tokens/caches_the_new_tokens.yml +1 -1
  150. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_using_a_user_app_with_no_tokens/prompts_user_to_retry_command.yml +1 -1
  151. data/spec/cassettes/Brightbox_BBConfig/_renew_tokens/when_using_an_API_client_with_no_tokens/caches_a_new_access_token.yml +1 -1
  152. data/spec/cassettes/Brightbox_BBConfig_add_login/when_altering_a_custom_option/does_not_alter_the_configuration.yml +6 -6
  153. data/spec/cassettes/Brightbox_BBConfig_add_login/when_altering_a_custom_option/updates_access_token.yml +6 -6
  154. data/spec/cassettes/Brightbox_BBConfig_add_login/when_altering_a_custom_option/updates_refresh_token.yml +6 -6
  155. data/spec/cassettes/Brightbox_BBConfig_add_login/when_configured_with_custom_options/does_not_alter_the_configuration.yml +6 -6
  156. data/spec/cassettes/Brightbox_BBConfig_add_login/when_configured_with_custom_options/updates_access_token.yml +6 -6
  157. data/spec/cassettes/Brightbox_BBConfig_add_login/when_configured_with_custom_options/updates_refresh_token.yml +6 -6
  158. data/spec/cassettes/Brightbox_BBConfig_add_login/when_logged_in_previously/does_not_alter_the_configuration.yml +9 -9
  159. data/spec/cassettes/Brightbox_BBConfig_add_login/when_logged_in_previously/updates_access_token.yml +9 -9
  160. data/spec/cassettes/Brightbox_BBConfig_add_login/when_logged_in_previously/updates_refresh_token.yml +9 -9
  161. data/spec/cassettes/Brightbox_BBConfig_add_login/when_no_config_exists/creates_the_configuration.yml +6 -6
  162. data/spec/cassettes/Brightbox_BBConfig_add_login/when_no_config_exists/refreshed_tokens.yml +6 -6
  163. data/spec/cassettes/Brightbox_BBConfig_add_login/when_using_an_email_and_suffix/creates_the_configuration.yml +6 -6
  164. data/spec/cassettes/Brightbox_BBConfig_add_login/when_using_an_email_and_suffix/refreshed_tokens.yml +6 -6
  165. data/spec/cassettes/Brightbox_CloudIP/_find_all_/when_a_Cloud_IP_exists/returns_a_suitable.yml +15 -15
  166. data/spec/cassettes/Brightbox_FirewallPolicy/_apply_to/should_apply_firewall_policy.yml +14 -14
  167. data/spec/cassettes/Brightbox_FirewallPolicy/_create/should_create_firewall_policy.yml +14 -14
  168. data/spec/cassettes/Brightbox_FirewallPolicy/_destroy/should_destroy_firewall_policy.yml +16 -16
  169. data/spec/cassettes/Brightbox_FirewallPolicy/_find_all_/when_a_policy_exists/should_list_firewall_policy.yml +13 -13
  170. data/spec/cassettes/Brightbox_FirewallPolicy/_find_or_call/when_a_policy_exists/should_show_firewall_policy.yml +11 -11
  171. data/spec/cassettes/Brightbox_FirewallRule/_create/when_policy_exists/creates_the_rule_successfully.yml +14 -14
  172. data/spec/cassettes/Brightbox_FirewallRule/_destroy/when_rule_exists/destroys_a_rule.yml +12 -12
  173. data/spec/cassettes/Brightbox_FirewallRule/_find/when_rule_exists/can_display_the_result.yml +14 -14
  174. data/spec/cassettes/Brightbox_FirewallRule/_from_policy/when_policy_exists_with_a_rule/lists_all_rules.yml +19 -19
  175. data/spec/cassettes/Brightbox_Server/_destroy/when_server_exists/should_work.yml +12 -12
  176. data/spec/cassettes/Brightbox_Server/_find_all_/when_a_server_exists/should_print_server_list.yml +15 -15
  177. data/spec/cassettes/Brightbox_Server/_show/when_server_exists/shows_detailed_attributes_of_a_server.yml +18 -18
  178. data/spec/cassettes/Brightbox_Server/_shutdown/should_work.yml +18 -18
  179. data/spec/cassettes/Brightbox_Server/_start/should_work.yml +24 -24
  180. data/spec/cassettes/Brightbox_Server/_stop/should_work.yml +18 -18
  181. data/spec/cassettes/Brightbox_Server/_update/when_passing_new_group_membership/should_update_with_group.yml +22 -22
  182. data/spec/cassettes/Brightbox_ServerGroup/_find_all_/when_a_group_exists/list_server_groups.yml +13 -13
  183. data/spec/cassettes/Firewall_policies/update/when_the_policy_does_not_exist/prints_error_to_STDERR.yml +3 -3
  184. data/spec/cassettes/brightbox_accounts/list/_when_access_token_expired_/does_not_report_invalid_token_errors.yml +30 -30
  185. data/spec/cassettes/brightbox_accounts/list/_when_both_tokens_expired_/does_not_report_invalid_token_errors.yml +9 -9
  186. data/spec/cassettes/brightbox_accounts/list/_when_invalid_tokens_/does_not_report_invalid_token_errors.yml +9 -9
  187. data/spec/cassettes/brightbox_accounts/list/_when_no_tokens_/does_not_report_invalid_token_errors.yml +27 -27
  188. data/spec/cassettes/brightbox_accounts/list/_when_no_tokens_/reports_they_were_updated.yml +7 -7
  189. data/spec/cassettes/brightbox_accounts/list/_when_no_tokens_and_password_incorrect_/does_not_report_invalid_token_errors.yml +7 -7
  190. data/spec/cassettes/brightbox_accounts/list/_when_no_tokens_and_password_incorrect_/reports_unable_to_authenticate.yml +6 -6
  191. data/spec/cassettes/brightbox_accounts/list/does_not_error.yml +3 -3
  192. data/spec/cassettes/brightbox_cloudips/map/when_destination_is_a_server_ID/passes_the_interface_identifier_to_the_API.yml +12 -12
  193. data/spec/cassettes/brightbox_cloudips/map/when_destination_is_another_value/passes_the_identifier_to_the_API.yml +7 -7
  194. data/spec/cassettes/brightbox_config/client_add/when_adding_a_new_client/does_not_error.yml +7 -7
  195. data/spec/cassettes/brightbox_config/client_add/when_adding_a_new_client/sets_up_the_config.yml +7 -7
  196. data/spec/cassettes/brightbox_config/client_add/when_new_client_is_first_and_only_client/does_not_change_the_default_client.yml +7 -7
  197. data/spec/cassettes/brightbox_config/client_add/when_new_client_is_first_and_only_client/does_not_error.yml +7 -7
  198. data/spec/cassettes/brightbox_config/client_add/when_new_client_is_first_and_only_client/sets_this_as_the_default_client.yml +7 -7
  199. data/spec/cassettes/brightbox_config/client_add/when_new_client_is_first_and_only_client/sets_up_the_config.yml +7 -7
  200. data/spec/cassettes/brightbox_config/user_add/when_NO_config_file_on_disk/sets_up_the_config.yml +5 -5
  201. data/spec/cassettes/brightbox_config/user_add/when_a_default_client_is_already_set/does_not_change_the_default_client.yml +2 -2
  202. data/spec/cassettes/brightbox_config/user_add/when_application_details_in_config/does_not_error.yml +2 -2
  203. data/spec/cassettes/brightbox_config/user_add/when_application_details_in_config/sets_up_the_config.yml +2 -2
  204. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_only_one_active_account/display_an_warning_about_preselected_default.yml +2 -2
  205. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_only_one_active_account/does_not_error.yml +2 -2
  206. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_only_one_active_account/selects_the_active_account_for_the_default.yml +2 -2
  207. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_only_one_active_account/sets_up_the_config.yml +2 -2
  208. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_to_multiple_accounts/display_an_warning_about_preselected_default.yml +2 -2
  209. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_to_multiple_accounts/does_not_error.yml +2 -2
  210. data/spec/cassettes/brightbox_config/user_add/when_application_has_access_to_multiple_accounts/sets_up_the_config.yml +2 -2
  211. data/spec/cassettes/brightbox_config/user_add/when_new_client_is_first_and_only_client/does_not_error.yml +2 -2
  212. data/spec/cassettes/brightbox_config/user_add/when_new_client_is_first_and_only_client/does_not_prompt_to_rerun_the_command.yml +2 -2
  213. data/spec/cassettes/brightbox_config/user_add/when_new_client_is_first_and_only_client/requests_access_tokens.yml +2 -2
  214. data/spec/cassettes/brightbox_config/user_add/when_new_client_is_first_and_only_client/sets_this_as_the_default_client.yml +2 -2
  215. data/spec/cassettes/brightbox_config/user_add/when_new_client_is_first_and_only_client/sets_up_the_config.yml +5 -5
  216. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments/does_not_error.yml +2 -2
  217. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments/does_not_prompt_to_rerun_the_command.yml +2 -2
  218. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments/requests_access_tokens.yml +2 -2
  219. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments/sets_up_the_config.yml +3 -3
  220. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments_and_api_url/does_not_error.yml +2 -2
  221. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments_and_api_url/requests_access_tokens.yml +2 -2
  222. data/spec/cassettes/brightbox_config/user_add/when_passing_in_required_arguments_and_api_url/sets_up_the_config.yml +2 -2
  223. data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/does_not_error.yml +6 -6
  224. data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/does_not_prompt_to_rerun_the_command.yml +6 -6
  225. data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/prompts_for_the_password.yml +6 -6
  226. data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/requests_access_tokens.yml +6 -6
  227. data/spec/cassettes/brightbox_login/when_alternative_client_credentials_are_given/sets_up_the_config.yml +6 -6
  228. data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/does_not_error.yml +6 -6
  229. data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/does_not_prompt_to_rerun_the_command.yml +6 -6
  230. data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/prompts_for_the_password.yml +6 -6
  231. data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/requests_access_tokens.yml +6 -6
  232. data/spec/cassettes/brightbox_login/when_custom_api/auth_URLs_are_given/sets_up_the_config.yml +6 -6
  233. data/spec/cassettes/brightbox_login/when_default_account_is_passed/does_not_error.yml +3 -3
  234. data/spec/cassettes/brightbox_login/when_default_account_is_passed/does_not_prompt_to_rerun_the_command.yml +3 -3
  235. data/spec/cassettes/brightbox_login/when_default_account_is_passed/prompts_for_the_password.yml +3 -3
  236. data/spec/cassettes/brightbox_login/when_default_account_is_passed/requests_access_tokens.yml +3 -3
  237. data/spec/cassettes/brightbox_login/when_default_account_is_passed/sets_up_the_config.yml +3 -3
  238. data/spec/cassettes/brightbox_login/when_no_config_is_present/does_not_error.yml +6 -6
  239. data/spec/cassettes/brightbox_login/when_no_config_is_present/does_not_prompt_to_rerun_the_command.yml +6 -6
  240. data/spec/cassettes/brightbox_login/when_no_config_is_present/requests_access_tokens.yml +6 -6
  241. data/spec/cassettes/brightbox_login/when_no_config_is_present/sets_up_the_config.yml +6 -6
  242. data/spec/cassettes/brightbox_login/when_no_password_is_given/does_not_error.yml +6 -6
  243. data/spec/cassettes/brightbox_login/when_no_password_is_given/does_not_prompt_to_rerun_the_command.yml +6 -6
  244. data/spec/cassettes/brightbox_login/when_no_password_is_given/prompts_for_the_password.yml +6 -6
  245. data/spec/cassettes/brightbox_login/when_no_password_is_given/requests_access_tokens.yml +6 -6
  246. data/spec/cassettes/brightbox_login/when_no_password_is_given/sets_up_the_config.yml +6 -6
  247. data/spec/cassettes/brightbox_sql_instances/create/--allow-access_10_0_0_0/correctly_sends_API_parameters.yml +313 -26
  248. data/spec/cassettes/brightbox_sql_instances/create/--allow-access_srv-12345_grp-12345/correctly_sends_API_parameters.yml +1204 -38
  249. data/spec/cassettes/brightbox_sql_instances/create/--engine_mysql/correctly_sends_API_parameters.yml +596 -26
  250. data/spec/cassettes/brightbox_sql_instances/create/--engine_mysql_--engine-version_5_6/correctly_sends_API_parameters.yml +63 -9
  251. data/spec/cassettes/brightbox_sql_instances/create/--engine_mysql_--engine-version_8_0/correctly_sends_API_parameters.yml +393 -0
  252. data/spec/cassettes/brightbox_sql_instances/create/--maintenance-weekday_5_--maintenance_hour_11/correctly_sends_API_parameters.yml +393 -0
  253. data/spec/cassettes/brightbox_sql_instances/create/--maintenance-weekday_thursday/correctly_sends_API_parameters.yml +393 -0
  254. data/spec/cassettes/brightbox_sql_instances/create/--snapshot_dbi-12345/includes_schedule_fields_in_response.yml +1466 -0
  255. data/spec/cassettes/brightbox_sql_instances/create/--snapshots-schedule_0_12_4_/includes_schedule_fields_in_response.yml +342 -0
  256. data/spec/cassettes/brightbox_sql_instances/create/without_arguments/reports_the_new_admin_password.yml +541 -26
  257. data/spec/cassettes/brightbox_sql_instances/create/without_arguments/reports_the_new_admin_username.yml +484 -26
  258. data/spec/cassettes/brightbox_sql_instances/snapshot/when_database_server_active/correctly_sends_API_parameters.yml +4 -4
  259. data/spec/cassettes/brightbox_sql_instances/snapshot/when_database_server_can_not_be_snapshotted/reports_an_error_to_the_user.yml +2 -2
  260. data/spec/cassettes/brightbox_sql_snapshots/list/when_resources_are_available/does_not_output_to_stderr.yml +2 -2
  261. data/spec/cassettes/brightbox_sql_snapshots/list/when_resources_are_available/outputs_table_details_to_stdout.yml +2 -2
  262. data/spec/cassettes/brightbox_sql_snapshots/show/when_resource_exists/does_not_output_to_stderr.yml +2 -2
  263. data/spec/commands/accounts/default_spec.rb +1 -2
  264. data/spec/commands/accounts/list_spec.rb +7 -8
  265. data/spec/commands/accounts/reset_ftp_password_spec.rb +1 -2
  266. data/spec/commands/accounts/show_spec.rb +1 -2
  267. data/spec/commands/cloudips/create_spec.rb +1 -2
  268. data/spec/commands/cloudips/destroy_spec.rb +1 -2
  269. data/spec/commands/cloudips/list_spec.rb +1 -2
  270. data/spec/commands/cloudips/map_spec.rb +2 -3
  271. data/spec/commands/cloudips/show_spec.rb +1 -2
  272. data/spec/commands/cloudips/unmap_spec.rb +1 -2
  273. data/spec/commands/cloudips/update_spec.rb +7 -8
  274. data/spec/commands/config/client_add_spec.rb +2 -3
  275. data/spec/commands/config/client_default_spec.rb +1 -2
  276. data/spec/commands/config/client_list_spec.rb +1 -2
  277. data/spec/commands/config/client_remove_spec.rb +1 -2
  278. data/spec/commands/config/user_add_spec.rb +3 -4
  279. data/spec/commands/firewall_policies/update_spec.rb +3 -3
  280. data/spec/commands/groups/add_server_spec.rb +1 -2
  281. data/spec/commands/groups/create_spec.rb +1 -2
  282. data/spec/commands/groups/destroy_spec.rb +1 -2
  283. data/spec/commands/groups/list_spec.rb +1 -2
  284. data/spec/commands/groups/move_servers_spec.rb +1 -2
  285. data/spec/commands/groups/remove_servers_spec.rb +1 -2
  286. data/spec/commands/groups/show_spec.rb +1 -2
  287. data/spec/commands/groups/update_spec.rb +1 -2
  288. data/spec/commands/images/destroy_spec.rb +1 -2
  289. data/spec/commands/images/list_spec.rb +62 -63
  290. data/spec/commands/images/locking_spec.rb +4 -4
  291. data/spec/commands/images/register_spec.rb +89 -3
  292. data/spec/commands/images/show_spec.rb +56 -4
  293. data/spec/commands/images/update_spec.rb +53 -3
  294. data/spec/commands/lbs/add_nodes_spec.rb +1 -2
  295. data/spec/commands/lbs/create_spec.rb +2 -3
  296. data/spec/commands/lbs/destroy_spec.rb +1 -2
  297. data/spec/commands/lbs/list_spec.rb +1 -2
  298. data/spec/commands/lbs/locking_spec.rb +4 -4
  299. data/spec/commands/lbs/remove_nodes_spec.rb +1 -2
  300. data/spec/commands/lbs/show_spec.rb +1 -2
  301. data/spec/commands/lbs/update_spec.rb +3 -4
  302. data/spec/commands/login_spec.rb +134 -30
  303. data/spec/commands/policies/apply_spec.rb +1 -2
  304. data/spec/commands/policies/create_spec.rb +1 -2
  305. data/spec/commands/policies/destroy_spec.rb +1 -2
  306. data/spec/commands/policies/list_spec.rb +1 -2
  307. data/spec/commands/policies/remove_spec.rb +1 -2
  308. data/spec/commands/policies/show_spec.rb +1 -2
  309. data/spec/commands/policies/update_spec.rb +1 -2
  310. data/spec/commands/rules/create_spec.rb +1 -2
  311. data/spec/commands/rules/destroy_spec.rb +1 -2
  312. data/spec/commands/rules/list_spec.rb +1 -2
  313. data/spec/commands/rules/show_spec.rb +1 -2
  314. data/spec/commands/rules/update_spec.rb +1 -2
  315. data/spec/commands/servers/activate_console_spec.rb +1 -2
  316. data/spec/commands/servers/create_spec.rb +10 -10
  317. data/spec/commands/servers/destroy_spec.rb +1 -2
  318. data/spec/commands/servers/list_spec.rb +1 -2
  319. data/spec/commands/servers/locking_spec.rb +4 -4
  320. data/spec/commands/servers/reboot_spec.rb +3 -4
  321. data/spec/commands/servers/reset_spec.rb +3 -4
  322. data/spec/commands/servers/show_spec.rb +1 -2
  323. data/spec/commands/servers/shutdown_spec.rb +1 -2
  324. data/spec/commands/servers/snapshot_spec.rb +1 -2
  325. data/spec/commands/servers/start_spec.rb +1 -2
  326. data/spec/commands/servers/stop_spec.rb +1 -2
  327. data/spec/commands/servers/update_spec.rb +1 -2
  328. data/spec/commands/sql/instances/create_spec.rb +58 -75
  329. data/spec/commands/sql/instances/locking_spec.rb +4 -4
  330. data/spec/commands/sql/instances/show_spec.rb +7 -7
  331. data/spec/commands/sql/instances/snapshot_spec.rb +2 -2
  332. data/spec/commands/sql/instances/update_spec.rb +8 -8
  333. data/spec/commands/sql/snapshots/list_spec.rb +1 -1
  334. data/spec/commands/sql/snapshots/locking_spec.rb +4 -4
  335. data/spec/commands/sql/snapshots/show_spec.rb +1 -1
  336. data/spec/commands/sql/types/list_spec.rb +1 -2
  337. data/spec/commands/types/list_spec.rb +1 -2
  338. data/spec/commands/users/list_spec.rb +1 -2
  339. data/spec/commands/users/show_spec.rb +1 -2
  340. data/spec/commands/users/update_spec.rb +1 -2
  341. data/spec/commands/zones/list_spec.rb +1 -2
  342. data/spec/configs/api_client.ini +1 -1
  343. data/spec/configs/user_app.ini +2 -2
  344. data/spec/spec_helper.rb +16 -3
  345. data/spec/support/authentication_helpers.rb +98 -0
  346. data/spec/support/config_helpers.rb +2 -4
  347. data/spec/support/password_prompt_helpers.rb +22 -1
  348. data/spec/support/server_helper.rb +5 -5
  349. data/spec/support/tmp_config.rb +1 -1
  350. data/spec/support/token_helpers.rb +2 -2
  351. data/spec/support/vcr.rb +3 -22
  352. data/spec/unit/brightbox/api/created_on_spec.rb +2 -2
  353. data/spec/unit/brightbox/api/fog_model_spec.rb +13 -13
  354. data/spec/unit/brightbox/api/klass_name_spec.rb +0 -1
  355. data/spec/unit/brightbox/api/method_missing_spec.rb +64 -0
  356. data/spec/unit/brightbox/api/require_account_spec.rb +0 -1
  357. data/spec/unit/brightbox/api/respond_to_spec.rb +71 -0
  358. data/spec/unit/brightbox/bb_config/access_token_filename_spec.rb +0 -1
  359. data/spec/unit/brightbox/bb_config/account_spec.rb +0 -1
  360. data/spec/unit/brightbox/bb_config/add_login_spec.rb +27 -28
  361. data/spec/unit/brightbox/bb_config/add_section_spec.rb +1 -2
  362. data/spec/unit/brightbox/bb_config/clear_default_client_spec.rb +0 -1
  363. data/spec/unit/brightbox/bb_config/client_id_spec.rb +0 -1
  364. data/spec/unit/brightbox/bb_config/client_name_spec.rb +0 -1
  365. data/spec/unit/brightbox/bb_config/config_directory_exists_spec.rb +0 -1
  366. data/spec/unit/brightbox/bb_config/config_directory_spec.rb +0 -1
  367. data/spec/unit/brightbox/bb_config/config_spec.rb +2 -3
  368. data/spec/unit/brightbox/bb_config/default_account_spec.rb +0 -1
  369. data/spec/unit/brightbox/bb_config/default_client_spec.rb +0 -1
  370. data/spec/unit/brightbox/bb_config/delete_section_spec.rb +0 -1
  371. data/spec/unit/brightbox/bb_config/find_or_set_default_account_spec.rb +4 -4
  372. data/spec/unit/brightbox/bb_config/refresh_token_filename_spec.rb +0 -1
  373. data/spec/unit/brightbox/bb_config/renew_tokens_spec.rb +3 -4
  374. data/spec/unit/brightbox/bb_config/save_default_account_spec.rb +0 -1
  375. data/spec/unit/brightbox/bb_config/save_spec.rb +0 -1
  376. data/spec/unit/brightbox/bb_config/section_names_spec.rb +1 -1
  377. data/spec/unit/brightbox/bb_config/to_fog_spec.rb +2 -2
  378. data/spec/unit/brightbox/collaborating_account/to_row_spec.rb +3 -3
  379. data/spec/unit/brightbox/config/api_client/to_fog_spec.rb +8 -8
  380. data/spec/unit/brightbox/config/api_client/valid_spec.rb +4 -4
  381. data/spec/unit/brightbox/config/discover_two_factor_pin_spec.rb +87 -0
  382. data/spec/unit/brightbox/config/section_name_deduplicator_spec.rb +1 -1
  383. data/spec/unit/brightbox/config/user_application/to_fog_spec.rb +10 -10
  384. data/spec/unit/brightbox/config/user_application/valid_spec.rb +3 -3
  385. data/spec/unit/brightbox/connection_manager/fetch_connection_spec.rb +1 -1
  386. data/spec/unit/brightbox/database_server/clean_arguments_spec.rb +1 -2
  387. data/spec/unit/brightbox/database_server/maintenance_window_spec.rb +0 -1
  388. data/spec/unit/brightbox/error_parser/pretty_print_spec.rb +0 -1
  389. data/spec/unit/brightbox/firewall_policy/apply_to_spec.rb +0 -1
  390. data/spec/unit/brightbox/firewall_policy/create_spec.rb +0 -1
  391. data/spec/unit/brightbox/firewall_policy/find_or_call_spec.rb +0 -1
  392. data/spec/unit/brightbox/firewall_policy/find_spec.rb +0 -1
  393. data/spec/unit/brightbox/firewall_rule/find_spec.rb +9 -9
  394. data/spec/unit/brightbox/firewall_rule/from_policy_spec.rb +4 -4
  395. data/spec/unit/brightbox/legacy/args_adjuster_spec.rb +20 -21
  396. data/spec/unit/brightbox/server/create_spec.rb +1 -2
  397. data/spec/unit/brightbox/server/start_spec.rb +2 -2
  398. data/spec/unit/brightbox/server/update_spec.rb +0 -1
  399. data/spec/unit/brightbox/user_collaboration/remove_spec.rb +0 -1
  400. data/spec/unit/nilable_hash_spec.rb +5 -5
  401. data/spec/unit/ruby_core_ext_spec.rb +3 -4
  402. data/spec/unit/temporary_home_spec.rb +1 -1
  403. data/spec/unit/tmp_config_spec.rb +0 -1
  404. metadata +132 -100
  405. data/.travis.yml +0 -8
  406. data/bin/brightbox-accounts +0 -13
  407. data/bin/brightbox-cloudips +0 -13
  408. data/bin/brightbox-config +0 -13
  409. data/bin/brightbox-firewall-policies +0 -13
  410. data/bin/brightbox-firewall-rules +0 -13
  411. data/bin/brightbox-groups +0 -13
  412. data/bin/brightbox-images +0 -13
  413. data/bin/brightbox-lbs +0 -13
  414. data/bin/brightbox-servers +0 -13
  415. data/bin/brightbox-types +0 -13
  416. data/bin/brightbox-users +0 -13
  417. data/bin/brightbox-zones +0 -13
  418. data/lib/brightbox-cli/commands/config/client-default.rb +0 -26
@@ -1,14 +1,13 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe "brightbox zones" do
4
-
5
4
  describe "list" do
6
5
  let(:output) { FauxIO.new { Brightbox.run(argv) } }
7
6
  let(:stdout) { output.stdout }
8
7
  let(:stderr) { output.stderr }
9
8
 
10
9
  context "" do
11
- let(:argv) { %w(zones list) }
10
+ let(:argv) { %w[zones list] }
12
11
 
13
12
  it "does not error" do
14
13
  expect { output }.to_not raise_error
@@ -2,7 +2,7 @@
2
2
  default_client = testing
3
3
 
4
4
  [testing]
5
- api_url = http://api.brightbox.dev
5
+ api_url = http://api.brightbox.localhost
6
6
  alias = testing
7
7
  client_id = cli-12345
8
8
  secret = qy6xxnvy4o0tgv5
@@ -4,7 +4,7 @@ default_client = testing
4
4
  [testing]
5
5
  alias = testing
6
6
  username = jason.null@brightbox.com
7
- api_url = http://api.brightbox.dev
8
- auth_url = http://api.brightbox.dev
7
+ api_url = http://api.brightbox.localhost
8
+ auth_url = http://api.brightbox.localhost
9
9
  default_account = acc-12345
10
10
 
data/spec/spec_helper.rb CHANGED
@@ -23,18 +23,31 @@ API_CLIENT_CONFIG_CONTENTS = File.read(File.join(File.dirname(__FILE__), "config
23
23
  USER_APP_CONFIG_CONTENTS = File.read(File.join(File.dirname(__FILE__), "configs/user_app.ini"))
24
24
 
25
25
  # Remember the $HOME of the test runner
26
- TEST_RUNNER_HOME = ENV["HOME"]
26
+ TEST_RUNNER_HOME = ENV.fetch("HOME", nil)
27
+
28
+ # Reduce the default fog timeout
29
+ Fog.timeout = 10
27
30
 
28
31
  RSpec.configure do |config|
29
32
  config.include CommonHelpers
30
33
  config.include ConfigHelpers
34
+ config.include AuthenticationHelpers
31
35
  config.include TokenHelpers
32
36
  config.include PasswordPromptHelpers
33
37
 
38
+ # Allows RSpec to persist some state between runs in order to support
39
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
40
+ # you configure your source control system to ignore this file.
41
+ config.example_status_persistence_file_path = "spec/examples.txt"
42
+
43
+ config.expect_with :rspec do |c|
44
+ c.max_formatted_output_length = nil
45
+ end
46
+
34
47
  config.before do
35
48
  # For each test, point to the testing endpoint to make it safer and easier to
36
- # record from dev endpoints. Devs can DNS api.brightbox.dev to their dev service
37
- stub_const("Brightbox::DEFAULT_API_ENDPOINT", ENV["BRIGHTBOX_API_URL"] || "http://api.brightbox.dev")
49
+ # record from dev endpoints. Devs can DNS api.brightbox.localhost to their dev service
50
+ stub_const("Brightbox::DEFAULT_API_ENDPOINT", ENV.fetch("BRIGHTBOX_API_URL", "http://api.brightbox.localhost"))
38
51
  # And set a sane terminal size for Hirb
39
52
  ENV["COLUMNS"] = "120"
40
53
  ENV["LINES"] = "120"
@@ -0,0 +1,98 @@
1
+ module AuthenticationHelpers
2
+ def api_url
3
+ "http://api.brightbox.localhost"
4
+ end
5
+
6
+ def stub_client_token_request
7
+ stub_request(:post, "http://api.brightbox.localhost/token").to_return(
8
+ :status => 200,
9
+ :body => '{"access_token":"44320b29286077c44f14c4efdfed70f63f4a8361","token_type":"Bearer","refresh_token":"759b2b28c228948a0ba5d07a89f39f9e268a95c0","scope":"infrastructure orbit","expires_in":7200}'
10
+ )
11
+ end
12
+
13
+ def stub_token_request(two_factor: false)
14
+ auth_response = {
15
+ status: 200,
16
+ body: {
17
+ access_token: "17e9282e40b8a2f1366107a068a1632bb65d3dec",
18
+ token_type: "Bearer",
19
+ refresh_token: "b77913a13cccfdd44294b4b161494a652d48b635",
20
+ scope: "infrastructure, orbit",
21
+ expires_in: 7200
22
+ }.to_json
23
+ }
24
+
25
+ if two_factor
26
+ stub_request(:post, "#{api_url}/token")
27
+ .with(
28
+ body: {
29
+ grant_type: "password",
30
+ username: "jason.null@brightbox.com",
31
+ password: "N:B3e%7Cmh"
32
+ }.to_json
33
+ )
34
+ .to_return(
35
+ status: 401,
36
+ headers: {
37
+ "X-Brightbox-OTP" => "required"
38
+ },
39
+ body: { error: "invalid_client" }.to_json
40
+ )
41
+
42
+ stub_request(:post, "#{api_url}/token")
43
+ .with(
44
+ headers: {
45
+ "X-Brightbox-OTP" => "123456"
46
+ },
47
+ body: {
48
+ grant_type: "password",
49
+ username: "jason.null@brightbox.com",
50
+ password: "N:B3e%7Cmh+123456"
51
+ }.to_json
52
+ )
53
+ .to_return(auth_response)
54
+ else
55
+ stub_request(:post, "#{api_url}/token")
56
+ .with(
57
+ body: {
58
+ grant_type: "password",
59
+ username: "jason.null@brightbox.com",
60
+ password: "N:B3e%7Cmh"
61
+ }.to_json
62
+ )
63
+ .to_return(auth_response)
64
+ end
65
+ end
66
+
67
+ def stub_accounts_request
68
+ stub_request(:get, "#{api_url}/1.0/accounts?nested=false")
69
+ .to_return(
70
+ status: 200,
71
+ headers: { "Content-Type": "application/json" },
72
+ body: [
73
+ {
74
+ id: "acc-12345",
75
+ resource_type: "account",
76
+ url: "https://api.gb1.brightbox.com/1.0/accounts/acc-12345",
77
+ name: "CLI test account",
78
+ status: "active",
79
+ ram_limit: 3_200_000,
80
+ ram_used: 0,
81
+ dbs_ram_limit: 32_768,
82
+ dbs_ram_used: 0,
83
+ cloud_ips_limit: 32,
84
+ cloud_ips_used: 0,
85
+ load_balancers_limit: 5,
86
+ load_balancers_used: 0,
87
+ owner: {
88
+ id: "usr-12345",
89
+ resource_type: "user",
90
+ url: "https://api.gb1.brightbox.com/1.0/users/usr-12345",
91
+ name: "Jason Null",
92
+ email_address: "jason.null@brightbox.com"
93
+ }
94
+ }
95
+ ].to_json
96
+ )
97
+ end
98
+ end
@@ -12,9 +12,7 @@ module ConfigHelpers
12
12
 
13
13
  # Load the contents into the expected location
14
14
  FileUtils.mkdir_p config.config_directory
15
- File.open(config.config_filename, "w") do |f|
16
- f.write contents
17
- end
15
+ File.write(config.config_filename, contents)
18
16
 
19
17
  config = Brightbox::BBConfig.new
20
18
 
@@ -33,6 +31,6 @@ module ConfigHelpers
33
31
  #
34
32
  def config_file_contents
35
33
  config = Brightbox::BBConfig.new
36
- IO.read(config.config_filename)
34
+ File.read(config.config_filename)
37
35
  end
38
36
  end
@@ -6,10 +6,31 @@ module PasswordPromptHelpers
6
6
  "N:B3e%7Cmh"
7
7
  end
8
8
 
9
+ # Intercepts HighLine prompts for a one-time password (OTP) used as part of
10
+ # two factor authentication (2FA). The prevents blocking the spec waiting for
11
+ # input.
12
+ #
13
+ def mock_otp_entry(otp = "123456")
14
+ input = instance_double(HighLine)
15
+
16
+ expect(input).to receive(:ask).with("Enter your two factor pin : ")
17
+ .once
18
+ .and_return(otp)
19
+
20
+ expect(HighLine).to receive(:new).once.and_return(input)
21
+ end
22
+
9
23
  # Intercepts HighLine prompting for a password and returns the testing default
10
24
  # or a specific value. Otherwise this blocks the specs.
11
25
  #
12
26
  def mock_password_entry(password = default_test_password)
13
- expect_any_instance_of(HighLine).to receive(:ask).at_least(:once).and_return(password)
27
+ input = instance_double(HighLine)
28
+
29
+ allow(input).to receive(:say).with("Your API credentials have expired, enter your password to update them.")
30
+ expect(input).to receive(:ask).with("Enter your password : ")
31
+ .once
32
+ .and_return(password)
33
+
34
+ expect(HighLine).to receive(:new).once.and_return(input)
14
35
  end
15
36
  end
@@ -3,11 +3,11 @@
3
3
  module ServerHelpers
4
4
  def server_params(name, _type = nil)
5
5
  {
6
- :image_id => "img-12345",
7
- :name => name,
8
- :zone_id => nil.to_s,
9
- :flavor_id => "typ-12345",
10
- :user_data => nil
6
+ :image_id => "img-12345",
7
+ :name => name,
8
+ :zone_id => nil.to_s,
9
+ :flavor_id => "typ-12345",
10
+ :user_data => nil
11
11
  }
12
12
  end
13
13
  end
@@ -7,6 +7,7 @@ require "fileutils"
7
7
  #
8
8
  class TmpConfig
9
9
  attr_reader :path
10
+
10
11
  # Creates a temporary directory and a "config" file within using the contents
11
12
  # of a passed String.
12
13
  #
@@ -19,7 +20,6 @@ class TmpConfig
19
20
  @file = File.open(File.join(@path, "config"), "w+")
20
21
  @file.write(contents)
21
22
  @file.close
22
- self
23
23
  end
24
24
 
25
25
  def close
@@ -3,12 +3,12 @@ require "securerandom"
3
3
  module TokenHelpers
4
4
  # Creates a cached access token for the config directly to disk
5
5
  def cache_access_token(config, token)
6
- File.open(config.access_token_filename, "w") { |f| f.write token }
6
+ File.write(config.access_token_filename, token)
7
7
  end
8
8
 
9
9
  # Creates a cached refresh token for the config directly to disk
10
10
  def cache_refresh_token(config, token)
11
- File.open(config.refresh_token_filename, "w") { |f| f.write token }
11
+ File.write(config.refresh_token_filename, token)
12
12
  end
13
13
 
14
14
  # Returns the cached access token for the config directly from disk
data/spec/support/vcr.rb CHANGED
@@ -8,8 +8,8 @@ VCR.configure do |vcr|
8
8
  vcr.configure_rspec_metadata!
9
9
  vcr.default_cassette_options = {
10
10
  :record => :none,
11
- #:record => :new_episodes,
12
- :match_requests_on => [:method, :path, :body],
11
+ # :record => :new_episodes,
12
+ :match_requests_on => %i[method path body],
13
13
  :update_content_length_header => true
14
14
  }
15
15
 
@@ -18,25 +18,6 @@ VCR.configure do |vcr|
18
18
 
19
19
  vcr.before_record do |interaction|
20
20
  host = URI.parse(interaction.request.uri).host
21
- interaction.request.uri.gsub!(host, "api.brightbox.dev")
22
-
23
- # Sanitise identifiers as best as we can
24
- # We need the poser of Regexp so filter_sensitive doesn't help
25
- %w(acc col cip fwp fwr grp img lba srv typ usr zon).each do |prefix|
26
- id_pattern = /#{prefix}-[0-9a-z]+/
27
- interaction.request.uri.gsub!(id_pattern, "#{prefix}-12345")
28
- interaction.request.body.gsub!(id_pattern, "#{prefix}-12345")
29
- interaction.response.body.gsub!(id_pattern, "#{prefix}-12345")
30
- end
21
+ interaction.request.uri.gsub!(host, "api.brightbox.localhost")
31
22
  end
32
23
  end
33
-
34
- VCR.turn_off!
35
-
36
- VCR.extend Module.new {
37
- def use_cassette(*args)
38
- VCR.turn_on!
39
- super
40
- VCR.turn_off!
41
- end
42
- }
@@ -4,8 +4,8 @@ describe Brightbox::Api, "#created_on" do
4
4
  subject(:api_model) { described_class.new(fog_model) }
5
5
  let(:fog_model) do
6
6
  double id: nil,
7
- attributes: attrs,
8
- created_at: attrs[:created_at]
7
+ attributes: attrs,
8
+ created_at: attrs[:created_at]
9
9
  end
10
10
 
11
11
  context "when initialised with no attributes" do
@@ -1,29 +1,29 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Brightbox::Api, "#fog_model" do
4
+ let(:fog_model) { Fog::Model.new }
5
+ let(:identifier) { "api-12345" }
6
+
7
+ before do
8
+ allow(fog_model).to receive(:id).and_return(identifier)
9
+ allow(fog_model).to receive(:attributes).and_return({})
10
+ end
4
11
 
5
12
  context "when initialised with a fog model" do
6
- before do
7
- @identifier = "api-12345"
8
- @fog_model = double
9
- expect(@fog_model).to receive(:id).and_return(@identifier)
10
- allow(@fog_model).to receive(:attributes).and_return({})
11
- end
13
+ subject(:instance) { described_class.new(fog_model) }
12
14
 
13
15
  it "returns the object" do
14
- @api_instance = Brightbox::Api.new(@fog_model)
15
- expect(@api_instance.fog_model).to eql(@fog_model)
16
+ expect(instance.fog_model).to eql(fog_model)
16
17
  end
17
18
  end
18
19
 
19
20
  context "when initialised with an identifier string" do
21
+ subject(:instance) { described_class.new(identifier) }
22
+
20
23
  it "attempts to find a resource" do
21
- @identifier = "api-12345"
22
- @fog_model = double
24
+ expect(Brightbox::Api).to receive(:find).with(identifier).and_return(fog_model)
23
25
 
24
- @api_instance = Brightbox::Api.new(@identifier)
25
- expect(Brightbox::Api).to receive(:find).with(@identifier).and_return(@fog_model)
26
- expect(@api_instance.fog_model).to eql(@fog_model)
26
+ expect(instance.fog_model).to eql(fog_model)
27
27
  end
28
28
  end
29
29
  end
@@ -1,7 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Brightbox::Api, ".klass_name" do
4
-
5
4
  context "when called on abstract class" do
6
5
  it "returns 'Api' as string" do
7
6
  expect(Brightbox::Api.klass_name).to eq("Api")
@@ -0,0 +1,64 @@
1
+ require "ostruct"
2
+ require "spec_helper"
3
+
4
+ RSpec.describe Brightbox::Api, "#method_missing" do
5
+ let(:fog_model) { Fog::Model.new }
6
+ let(:identifier) { "api-12345" }
7
+
8
+ before do
9
+ allow(fog_model).to receive(:id).and_return(identifier)
10
+ allow(fog_model).to receive(:attributes).and_return({})
11
+ end
12
+
13
+ context "when initialised with a fog model" do
14
+ subject(:instance) { described_class.new(fog_model) }
15
+
16
+ context "with a top level method" do
17
+ it do
18
+ expect(instance.to_s).to eq(identifier)
19
+ end
20
+ end
21
+
22
+ context "with a delegated method" do
23
+ let(:method_name) { :attributes }
24
+
25
+ it do
26
+ expect(instance.attributes).to eq({})
27
+ end
28
+ end
29
+
30
+ context "with unknown method" do
31
+ it do
32
+ expect { instance.onions }.to raise_error(NoMethodError)
33
+ end
34
+ end
35
+ end
36
+
37
+ context "when initialised with an identifier string" do
38
+ subject(:instance) { described_class.new(identifier) }
39
+
40
+ before do
41
+ allow(Brightbox::Api).to receive(:find).with(identifier).and_return(fog_model)
42
+ end
43
+
44
+ context "with a top level method" do
45
+ it do
46
+ expect(instance.to_s).to eq(identifier)
47
+ end
48
+ end
49
+
50
+ context "with a delegated method" do
51
+ let(:method_name) { :attributes }
52
+
53
+ it do
54
+ expect(instance.attributes).to eq({})
55
+ end
56
+ end
57
+
58
+ context "with unknown method" do
59
+ it do
60
+ expect { instance.onions }.to raise_error(NoMethodError)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,7 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Brightbox::Api, ".require_account?" do
4
-
5
4
  context "when on abstract class" do
6
5
  it "returns false" do
7
6
  expect(Brightbox::Api.require_account?).to be false
@@ -0,0 +1,71 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Brightbox::Api, "#respond_to?" do
4
+ let(:fog_model) { Fog::Model.new }
5
+ let(:identifier) { "api-12345" }
6
+
7
+ before do
8
+ allow(fog_model).to receive(:id).and_return(identifier)
9
+ allow(fog_model).to receive(:attributes).and_return({})
10
+ end
11
+
12
+ context "when initialised with a fog model" do
13
+ subject(:instance) { described_class.new(fog_model) }
14
+
15
+ context "with a top level method" do
16
+ let(:method_name) { :to_s }
17
+
18
+ it do
19
+ expect(instance.respond_to?(method_name)).to be(true)
20
+ end
21
+ end
22
+
23
+ context "with a delegated method" do
24
+ let(:method_name) { :attributes }
25
+
26
+ it do
27
+ expect(instance.respond_to?(method_name)).to be(true)
28
+ end
29
+ end
30
+
31
+ context "with unknown method" do
32
+ let(:method_name) { :onions }
33
+
34
+ it do
35
+ expect(instance.respond_to?(method_name)).to be(false)
36
+ end
37
+ end
38
+ end
39
+
40
+ context "when initialised with an identifier string" do
41
+ subject(:instance) { described_class.new(identifier) }
42
+
43
+ before do
44
+ allow(Brightbox::Api).to receive(:find).with(identifier).and_return(fog_model)
45
+ end
46
+
47
+ context "with a top level method" do
48
+ let(:method_name) { :to_s }
49
+
50
+ it do
51
+ expect(instance.respond_to?(method_name)).to be(true)
52
+ end
53
+ end
54
+
55
+ context "with a delegated method" do
56
+ let(:method_name) { :attributes }
57
+
58
+ it do
59
+ expect(instance.respond_to?(method_name)).to be(true)
60
+ end
61
+ end
62
+
63
+ context "with unknown method" do
64
+ let(:method_name) { :onions }
65
+
66
+ it do
67
+ expect(instance.respond_to?(method_name)).to be(false)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,7 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Brightbox::BBConfig do
4
-
5
4
  describe "#access_token_filename" do
6
5
  context "when using a custom directory" do
7
6
  before do
@@ -1,7 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Brightbox::BBConfig do
4
-
5
4
  describe "#account" do
6
5
  context "when passed as an option" do
7
6
  before do
@@ -5,21 +5,21 @@ describe Brightbox::BBConfig, "#add_login" do
5
5
 
6
6
  let(:email) { "jason.null@brightbox.com" }
7
7
  let(:password) { "N:B3e%7Cmh" }
8
- let(:api_url) { ENV["BRIGHTBOX_API_URL"] || "http://api.brightbox.dev" }
8
+ let(:api_url) { Brightbox::DEFAULT_API_ENDPOINT }
9
9
 
10
10
  context "when no config exists", vcr: true do
11
11
  let(:expected_config) do
12
- <<EOS
13
- [core]
14
- default_client = #{email}
12
+ <<~EOS
13
+ [core]
14
+ default_client = #{email}
15
15
 
16
- [#{email}]
17
- username = #{email}
18
- api_url = #{api_url}
19
- auth_url = #{api_url}
20
- default_account = acc-12345
16
+ [#{email}]
17
+ username = #{email}
18
+ api_url = #{api_url}
19
+ auth_url = #{api_url}
20
+ default_account = acc-12345
21
21
 
22
- EOS
22
+ EOS
23
23
  end
24
24
 
25
25
  before do
@@ -52,9 +52,9 @@ EOS
52
52
 
53
53
  it "does not alter the configuration" do
54
54
  FauxIO.new do
55
- expect {
55
+ expect do
56
56
  config.add_login(email, password)
57
- }.not_to change { config_file_contents }.from(original_config)
57
+ end.not_to change { config_file_contents }.from(original_config)
58
58
  end
59
59
  end
60
60
 
@@ -78,7 +78,7 @@ EOS
78
78
  context "when configured with custom options", vcr: true do
79
79
  let(:original_config) { config_file_contents }
80
80
 
81
- let(:custom_url) { ENV["BRIGHTBOX_API_URL"] || "http://api.brightbox.dev" }
81
+ let(:custom_url) { Brightbox::DEFAULT_API_ENDPOINT }
82
82
  let(:custom_app_id) { "app-23456" }
83
83
  let(:custom_app_secret) { "ho04hondtzjjdf4" }
84
84
  let(:custom_default_account) { "acc-23456" }
@@ -99,9 +99,9 @@ EOS
99
99
 
100
100
  it "does not alter the configuration" do
101
101
  FauxIO.new do
102
- expect {
102
+ expect do
103
103
  config.add_login(email, password)
104
- }.not_to change { config_file_contents }.from(original_config)
104
+ end.not_to change { config_file_contents }.from(original_config)
105
105
  end
106
106
 
107
107
  expect(config_file_contents).to match("[#{email}]")
@@ -132,7 +132,7 @@ EOS
132
132
  context "when altering a custom option", vcr: true do
133
133
  let(:original_config) { config_file_contents }
134
134
 
135
- let(:custom_url) { ENV["BRIGHTBOX_API_URL"] || "http://api.brightbox.dev" }
135
+ let(:custom_url) { Brightbox::DEFAULT_API_ENDPOINT }
136
136
  let(:custom_app_id) { "app-23456" }
137
137
  let(:custom_app_secret) { "ho04hondtzjjdf4" }
138
138
  let(:custom_default_account) { "acc-23456" }
@@ -153,9 +153,9 @@ EOS
153
153
 
154
154
  it "does not alter the configuration" do
155
155
  FauxIO.new do
156
- expect {
156
+ expect do
157
157
  config.add_login(email, password)
158
- }.not_to change { config_file_contents }.from(original_config)
158
+ end.not_to change { config_file_contents }.from(original_config)
159
159
  end
160
160
 
161
161
  expect(config_file_contents).to match("[#{email}]")
@@ -185,17 +185,17 @@ EOS
185
185
  context "when using an email and suffix", vcr: true do
186
186
  let(:client_name) { "#{email}/dev" }
187
187
  let(:expected_config) do
188
- <<EOS
189
- [core]
190
- default_client = #{client_name}
188
+ <<~EOS
189
+ [core]
190
+ default_client = #{client_name}
191
191
 
192
- [#{client_name}]
193
- username = #{email}
194
- api_url = #{api_url}
195
- auth_url = #{api_url}
196
- default_account = acc-12345
192
+ [#{client_name}]
193
+ username = #{email}
194
+ api_url = #{api_url}
195
+ auth_url = #{api_url}
196
+ default_account = acc-12345
197
197
 
198
- EOS
198
+ EOS
199
199
  end
200
200
 
201
201
  before do
@@ -218,5 +218,4 @@ EOS
218
218
  expect(cached_refresh_token(config)).to eq(config.refresh_token)
219
219
  end
220
220
  end
221
-
222
221
  end
@@ -1,7 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Brightbox::BBConfig do
4
-
5
4
  describe "#add_section" do
6
5
  context "when first and only client", vcr: true do
7
6
  let(:config) { Brightbox::BBConfig.new }
@@ -12,7 +11,7 @@ describe Brightbox::BBConfig do
12
11
  let(:options) do
13
12
  {
14
13
  :username => "jason.null@brightbox.com",
15
- :api_url => "http://api.brightbox.dev"
14
+ :api_url => "http://api.brightbox.localhost"
16
15
  }
17
16
  end
18
17
  let(:saved_config) { config_file_contents }